From d775fbb9ba092671c38ca216a05ec3ed989aba8b Mon Sep 17 00:00:00 2001 From: jze9 Date: Mon, 6 Apr 2026 18:44:02 +0500 Subject: [PATCH] tsett --- .dockerignore | 18 + .editorconfig | 18 + .env.example | 59 + .gitattributes | 11 + .gitignore | 19 + Dockerfile | 76 + README.md | 66 + TailAndPaws.sql | 1462 +++ app/Console/Kernel.php | 27 + app/Exceptions/Handler.php | 30 + .../Controllers/Admin/BrandsController.php | 122 + .../Admin/CategoriesController.php | 217 + .../Controllers/Admin/ContactController.php | 90 + .../Controllers/Admin/DashboardController.php | 31 + .../Controllers/Admin/OrdersController.php | 61 + .../Admin/PermissionsController.php | 107 + .../Controllers/Admin/ProductController.php | 722 ++ .../Controllers/Admin/RolesController.php | 109 + .../Controllers/Admin/UsersController.php | 133 + app/Http/Controllers/Auth/LoginController.php | 50 + .../Controllers/Auth/RegisterController.php | 63 + app/Http/Controllers/BrandController.php | 113 + app/Http/Controllers/CartController.php | 179 + app/Http/Controllers/CategoryController.php | 67 + app/Http/Controllers/Controller.php | 12 + app/Http/Controllers/HomeController.php | 53 + app/Http/Controllers/MenuController.php | 90 + app/Http/Controllers/OrderController.php | 35 + app/Http/Controllers/ProductsController.php | 39 + app/Http/Controllers/ProfileController.php | 97 + app/Http/Kernel.php | 69 + app/Http/Middleware/Authenticate.php | 17 + app/Http/Middleware/CheckPermission.php | 32 + app/Http/Middleware/CheckRole.php | 20 + app/Http/Middleware/EncryptCookies.php | 17 + .../PreventRequestsDuringMaintenance.php | 17 + .../Middleware/RedirectIfAuthenticated.php | 30 + app/Http/Middleware/TrimStrings.php | 19 + app/Http/Middleware/TrustHosts.php | 20 + app/Http/Middleware/TrustProxies.php | 28 + app/Http/Middleware/ValidateSignature.php | 22 + app/Http/Middleware/VerifyCsrfToken.php | 17 + app/Models/Brand.php | 62 + app/Models/CartItem.php | 97 + app/Models/Category.php | 243 + app/Models/Contact.php | 31 + app/Models/Order.php | 203 + app/Models/OrderItem.php | 65 + app/Models/Permission.php | 28 + app/Models/Product.php | 183 + app/Models/ProductAttribute.php | 16 + app/Models/ProductVariation.php | 160 + app/Models/Review.php | 74 + app/Models/Role.php | 32 + app/Models/User.php | 110 + app/Models/VariationAttribute.php | 16 + app/Models/VariationImage.php | 47 + app/Providers/AppServiceProvider.php | 25 + app/Providers/AuthServiceProvider.php | 29 + app/Providers/BroadcastServiceProvider.php | 19 + app/Providers/EventServiceProvider.php | 38 + app/Providers/MenuServiceProvider.php | 34 + app/Providers/RouteServiceProvider.php | 40 + artisan | 53 + bootstrap/app.php | 55 + bootstrap/cache/.gitignore | 2 + composer.json | 66 + composer.lock | 8146 +++++++++++++++++ config/app.php | 189 + config/auth.php | 115 + config/broadcasting.php | 71 + config/cache.php | 111 + config/cors.php | 34 + config/database.php | 151 + config/filesystems.php | 76 + config/hashing.php | 54 + config/logging.php | 131 + config/mail.php | 134 + config/queue.php | 109 + config/sanctum.php | 83 + config/services.php | 34 + config/session.php | 214 + config/view.php | 36 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + .../2014_10_12_000000_create_users_table.php | 32 + ...000_create_password_reset_tokens_table.php | 28 + ..._08_19_000000_create_failed_jobs_table.php | 32 + ...01_create_personal_access_tokens_table.php | 33 + .../2026_03_12_171109_create_roles_table.php | 29 + ..._03_12_171110_create_permissions_table.php | 30 + ...12_171111_create_permission_role_table.php | 31 + ...6_03_14_102454_create_categories_table.php | 45 + .../2026_03_14_124100_create_brands_table.php | 33 + ...026_03_14_124103_create_products_table.php | 40 + ...135714_create_product_variations_table.php | 44 + ...2026_03_14_201029_create_reviews_table.php | 43 + ...026_03_14_213006_create_contacts_table.php | 45 + ...3427_add_meta_fields_to_products_table.php | 30 + ..._03_16_191828_add_phone_to_users_table.php | 30 + ..._192010_add_email_index_to_users_table.php | 25 + ...3_18_192641_add_role_id_to_users_table.php | 29 + ..._fix_products_and_variations_structure.php | 73 + ...6_04_01_142406_create_cart_items_table.php | 28 + .../2026_04_01_142423_create_orders_table.php | 36 + ..._04_01_142428_create_order_items_table.php | 29 + database/seeders/BrandSeeder.php | 67 + database/seeders/CategorySeeder.php | 421 + database/seeders/DatabaseSeeder.php | 21 + database/seeders/ProductCatalogSeeder.php | 1651 ++++ .../seeders/RolesAndPermissionsSeeder.php | 279 + docker-compose.yml | 60 + docker/nginx/default.conf | 29 + docker/php/php.ini | 12 + docker/supervisord.conf | 23 + isUniqueConstraintError($e)) | 0 package-lock.json | 2552 ++++++ package.json | 22 + phpunit.xml | 32 + postcss.config.js | 6 + prepareBindings($bindings) | 0 public/.htaccess | 21 + public/assets/css/brand.css | 8 + public/assets/css/cart.css | 92 + public/assets/css/category.css | 103 + public/assets/css/checkout.css | 28 + public/assets/css/index.css | 153 + public/assets/css/login.css | 59 + public/assets/css/menu.css | 719 ++ public/assets/css/nouislider.min.css | 1 + public/assets/css/product.css | 61 + public/assets/css/profile.css | 76 + public/assets/fonts/ComicRelief-Bold.ttf | Bin 0 -> 93304 bytes public/assets/fonts/ComicRelief-Regular.ttf | Bin 0 -> 79064 bytes .../assets/images/brands/Royal-Canin-Logo.png | Bin 0 -> 171776 bytes public/assets/images/brands/abba.png | Bin 0 -> 12914 bytes public/assets/images/brands/alphapet.png | Bin 0 -> 117238 bytes public/assets/images/brands/grandin.png | Bin 0 -> 11282 bytes public/assets/images/brands/grandorf.jpg | Bin 0 -> 40136 bytes public/assets/images/brands/klicker.png | Bin 0 -> 1520181 bytes public/assets/images/brands/little-one.jpg | Bin 0 -> 35936 bytes public/assets/images/brands/ownat.png | Bin 0 -> 8754 bytes public/assets/images/brands/rogz.png | Bin 0 -> 17274 bytes public/assets/images/brands/rungo.jpeg | Bin 0 -> 60898 bytes public/assets/images/brands/rurri.png | Bin 0 -> 9462 bytes public/assets/images/brands/tetra.jpg | Bin 0 -> 9059 bytes public/assets/images/brands/triol.png | Bin 0 -> 12804 bytes .../images/categories/icons/default.svg | 3 + .../images/categories/icons/dlya-gryzunov.svg | 7 + .../images/categories/icons/dlya-koshek.svg | 7 + .../images/categories/icons/dlya-ptic.svg | 7 + .../images/categories/icons/dlya-ryb.svg | 7 + .../images/categories/icons/dlya-sobak.svg | 3 + .../images/categories/icons/yvavyavy.png | Bin 0 -> 9462 bytes .../categories/icons/zdorovie-i-uhod.svg | 7 + .../categories/images/aptecka_image.jpg | Bin 0 -> 228255 bytes .../images/categories/images/default.svg | 7 + .../categories/images/dlia-gryzunov_image.jpg | Bin 0 -> 944325 bytes .../categories/images/dlia-kosek_image.jpg | Bin 0 -> 695465 bytes .../categories/images/dlia-ptic_image.jpg | Bin 0 -> 766246 bytes .../categories/images/dlia-ryb_image.jpg | Bin 0 -> 828457 bytes .../categories/images/dlia-sobak_image.jpg | Bin 0 -> 1021144 bytes .../images/kletki-i-zerdocki_image.jpg | Bin 0 -> 211515 bytes .../images/korma-dlia-popugaev_image.jpg | Bin 0 -> 290763 bytes .../images/categories/images/korma_image.jpg | Bin 0 -> 313339 bytes .../categories/images/lakomstva_image.jpg | Bin 0 -> 311521 bytes .../images/oseiniki-i-povodki_image.jpg | Bin 0 -> 505517 bytes .../images/pauci-i-konservy_image.jpg | Bin 0 -> 716653 bytes .../categories/images/suxie-korma_image.jpg | Bin 0 -> 287957 bytes .../images/vitaminy-i-dobavki_image.jpg | Bin 0 -> 135066 bytes .../categories/images/vlaznye-korma_image.jpg | Bin 0 -> 589073 bytes .../images/zdorove-i-uxod_image.jpg | Bin 0 -> 646347 bytes .../images/icons/add-folder-svgrepo-com.svg | 7 + .../assets/images/icons/cart-svgrepo-com.svg | 7 + .../assets/images/icons/copy-svgrepo-com.svg | 7 + .../images/icons/delete-svgrepo-com.svg | 10 + .../icons/dropdown-arrow-svgrepo-com.svg | 7 + .../assets/images/icons/edit-svgrepo-com.svg | 7 + .../assets/images/icons/enter-svgrepo-com.svg | 7 + .../images/icons/logout-svgrepo-com.svg | 7 + .../assets/images/icons/menu-svgrepo-com.svg | 7 + .../assets/images/icons/save-svgrepo-com.svg | 7 + .../images/icons/search-svgrepo-com.svg | 7 + .../images/icons/settings-svgrepo-com.svg | 7 + .../social_media/telegram-svgrepo-com.svg | 7 + .../icons/social_media/vk-svgrepo-com.svg | 9 + .../social_media/whatsapp-svgrepo-com.svg | 7 + .../images/icons/star-alt-4-svgrepo-com.svg | 7 + .../icons/user-block-alt-svgrepo-com.svg | 7 + .../images/icons/user-pen-alt-svgrepo-com.svg | 7 + .../assets/images/icons/user-svgrepo-com.svg | 7 + public/assets/images/logo/favicon.svg | 11 + public/assets/images/logo/logo.svg | 11 + .../variation_49/0.webp | Bin 0 -> 36374 bytes .../variation_49/1.webp | Bin 0 -> 61186 bytes .../variation_50/0.webp | Bin 0 -> 52158 bytes .../variation_50/1.webp | Bin 0 -> 138144 bytes .../variation_127/0.webp | Bin 0 -> 37788 bytes .../variation_127/1.webp | Bin 0 -> 72792 bytes .../variation_127/2.webp | Bin 0 -> 60902 bytes .../variation_59/0.webp | Bin 0 -> 37788 bytes .../variation_59/1.webp | Bin 0 -> 72792 bytes .../variation_59/2.webp | Bin 0 -> 60902 bytes .../variation_59/3.webp | Bin 0 -> 37788 bytes .../variation_59/4.webp | Bin 0 -> 72792 bytes .../variation_59/5.webp | Bin 0 -> 60902 bytes .../variation_60/0.webp | Bin 0 -> 37788 bytes .../variation_60/1.webp | Bin 0 -> 72792 bytes .../variation_60/2.webp | Bin 0 -> 60902 bytes .../variation_60/3.webp | Bin 0 -> 37788 bytes .../variation_60/4.webp | Bin 0 -> 72792 bytes .../variation_60/5.webp | Bin 0 -> 60902 bytes .../variation_139/0.webp | Bin 0 -> 47254 bytes .../variation_139/1.webp | Bin 0 -> 60908 bytes .../variation_140/0.webp | Bin 0 -> 47254 bytes .../variation_140/1.webp | Bin 0 -> 60908 bytes .../variation_141/0.webp | Bin 0 -> 51376 bytes .../variation_141/1.webp | Bin 0 -> 63372 bytes .../variation_47/0.webp | Bin 0 -> 32342 bytes .../variation_47/1.webp | Bin 0 -> 67688 bytes .../variation_47/2.webp | Bin 0 -> 69986 bytes .../variation_48/0.webp | Bin 0 -> 32342 bytes .../variation_48/1.webp | Bin 0 -> 67688 bytes .../variation_48/2.webp | Bin 0 -> 69986 bytes public/assets/images/products/default.svg | 7 + .../variation_55/0.webp | Bin 0 -> 36306 bytes .../variation_55/1.webp | Bin 0 -> 62192 bytes .../variation_55/2.webp | Bin 0 -> 27762 bytes .../variation_56/0.webp | Bin 0 -> 36384 bytes .../variation_56/1.webp | Bin 0 -> 66956 bytes .../variation_56/2.webp | Bin 0 -> 30562 bytes .../variation_41/0.webp | Bin 0 -> 29336 bytes .../variation_41/1.webp | Bin 0 -> 57702 bytes .../variation_41/2.webp | Bin 0 -> 84278 bytes .../variation_42/0.jpeg | Bin 0 -> 53288 bytes .../variation_42/1.webp | Bin 0 -> 57702 bytes .../variation_42/2.webp | Bin 0 -> 84278 bytes .../variation_129/0.webp | Bin 0 -> 32226 bytes .../variation_129/1.webp | Bin 0 -> 62854 bytes .../variation_129/2.webp | Bin 0 -> 54644 bytes .../variation_130/0.webp | Bin 0 -> 32226 bytes .../variation_130/1.webp | Bin 0 -> 62854 bytes .../variation_130/2.webp | Bin 0 -> 54644 bytes .../variation_131/0.webp | Bin 0 -> 32226 bytes .../variation_131/1.webp | Bin 0 -> 62854 bytes .../variation_131/2.webp | Bin 0 -> 54644 bytes .../variation_132/0.webp | Bin 0 -> 46540 bytes .../variation_132/1.webp | Bin 0 -> 57032 bytes .../variation_132/2.webp | Bin 0 -> 54302 bytes .../variation_133/0.webp | Bin 0 -> 46540 bytes .../variation_133/1.webp | Bin 0 -> 57032 bytes .../variation_133/2.webp | Bin 0 -> 54302 bytes .../variation_134/0.webp | Bin 0 -> 39932 bytes .../variation_134/1.webp | Bin 0 -> 78318 bytes .../variation_134/2.webp | Bin 0 -> 58604 bytes .../variation_135/0.webp | Bin 0 -> 39932 bytes .../variation_135/1.webp | Bin 0 -> 78318 bytes .../variation_135/2.webp | Bin 0 -> 58604 bytes .../variation_136/0.webp | Bin 0 -> 39932 bytes .../variation_136/1.webp | Bin 0 -> 78318 bytes .../variation_136/2.webp | Bin 0 -> 58604 bytes .../variation_53/0.webp | Bin 0 -> 36852 bytes .../variation_53/1.webp | Bin 0 -> 75438 bytes .../variation_53/2.webp | Bin 0 -> 66052 bytes .../klicker-adult/variation_43/0.webp | Bin 0 -> 32230 bytes .../klicker-adult/variation_43/1.webp | Bin 0 -> 66008 bytes .../klicker-adult/variation_43/2.webp | Bin 0 -> 60048 bytes .../variation_67/0.webp | Bin 0 -> 94990 bytes .../variation_67/1.webp | Bin 0 -> 39198 bytes .../variation_67/2.webp | Bin 0 -> 189306 bytes .../variation_63/0.webp | Bin 0 -> 56412 bytes .../variation_63/1.webp | Bin 0 -> 31276 bytes .../variation_63/2.webp | Bin 0 -> 49426 bytes .../variation_64/0.webp | Bin 0 -> 56412 bytes .../variation_64/1.webp | Bin 0 -> 31276 bytes .../variation_64/2.webp | Bin 0 -> 49426 bytes .../variation_137/0.webp | Bin 0 -> 34474 bytes .../variation_137/1.webp | Bin 0 -> 78312 bytes .../variation_137/2.webp | Bin 0 -> 76128 bytes .../variation_138/0.webp | Bin 0 -> 30942 bytes .../variation_138/1.webp | Bin 0 -> 51546 bytes .../variation_138/2.webp | Bin 0 -> 105536 bytes .../variation_116/0.webp | Bin 0 -> 28928 bytes .../variation_116/1.webp | Bin 0 -> 48294 bytes .../variation_116/2.webp | Bin 0 -> 50084 bytes .../variation_117/0.webp | Bin 0 -> 28928 bytes .../variation_117/1.webp | Bin 0 -> 48294 bytes .../variation_117/2.webp | Bin 0 -> 50084 bytes .../variation_118/0.webp | Bin 0 -> 37446 bytes .../variation_118/1.webp | Bin 0 -> 69336 bytes .../variation_118/2.webp | Bin 0 -> 81832 bytes .../variation_119/0.webp | Bin 0 -> 37446 bytes .../variation_119/1.webp | Bin 0 -> 69336 bytes .../variation_119/2.webp | Bin 0 -> 81832 bytes .../variation_120/0.webp | Bin 0 -> 32840 bytes .../variation_120/1.webp | Bin 0 -> 69930 bytes .../variation_51/0.webp | Bin 0 -> 39976 bytes .../variation_51/1.webp | Bin 0 -> 57162 bytes .../variation_51/2.webp | Bin 0 -> 82230 bytes .../variation_52/0.webp | Bin 0 -> 39976 bytes .../variation_52/1.webp | Bin 0 -> 57162 bytes .../variation_52/2.webp | Bin 0 -> 82230 bytes .../variation_112/0.webp | Bin 0 -> 24044 bytes .../variation_112/1.webp | Bin 0 -> 75034 bytes .../variation_112/2.webp | Bin 0 -> 42118 bytes .../variation_115/0.webp | Bin 0 -> 24044 bytes .../variation_115/1.webp | Bin 0 -> 75034 bytes .../variation_115/2.webp | Bin 0 -> 42118 bytes .../variation_45/0.webp | Bin 0 -> 24044 bytes .../variation_45/1.webp | Bin 0 -> 75034 bytes .../variation_45/2.webp | Bin 0 -> 42118 bytes .../variation_45/3.webp | Bin 0 -> 24044 bytes .../variation_45/4.webp | Bin 0 -> 75034 bytes .../variation_45/5.webp | Bin 0 -> 42118 bytes .../variation_46/0.webp | Bin 0 -> 24044 bytes .../variation_46/1.webp | Bin 0 -> 75034 bytes .../variation_46/2.webp | Bin 0 -> 42118 bytes .../variation_46/3.webp | Bin 0 -> 24044 bytes .../variation_46/4.webp | Bin 0 -> 75034 bytes .../variation_46/5.webp | Bin 0 -> 42118 bytes .../variation_121/0.webp | Bin 0 -> 16538 bytes .../variation_121/1.webp | Bin 0 -> 84808 bytes .../variation_121/2.webp | Bin 0 -> 69920 bytes .../variation_121/3.webp | Bin 0 -> 43132 bytes .../variation_122/0.webp | Bin 0 -> 16538 bytes .../variation_122/1.webp | Bin 0 -> 69920 bytes .../variation_122/2.webp | Bin 0 -> 84808 bytes .../variation_122/3.webp | Bin 0 -> 43132 bytes .../variation_123/0.webp | Bin 0 -> 16538 bytes .../variation_123/1.webp | Bin 0 -> 84808 bytes .../variation_123/2.webp | Bin 0 -> 69920 bytes .../variation_123/3.webp | Bin 0 -> 43132 bytes .../variation_57/0.webp | Bin 0 -> 16538 bytes .../variation_57/1.webp | Bin 0 -> 69920 bytes .../variation_57/2.webp | Bin 0 -> 84808 bytes .../variation_57/3.webp | Bin 0 -> 43132 bytes .../variation_58/0.webp | Bin 0 -> 16538 bytes .../variation_58/1.webp | Bin 0 -> 69920 bytes .../variation_58/2.webp | Bin 0 -> 84808 bytes .../variation_58/3.webp | Bin 0 -> 43132 bytes .../variation_128/0.webp | Bin 0 -> 22288 bytes .../variation_69/0.webp | Bin 0 -> 24878 bytes .../variation_70/0.webp | Bin 0 -> 31152 bytes .../variation_22/0.webp | Bin 0 -> 16700 bytes .../variation_22/1.webp | Bin 0 -> 27698 bytes .../variation_23/0.webp | Bin 0 -> 21898 bytes .../variation_23/1.webp | Bin 0 -> 43870 bytes .../variation_61/0.webp | Bin 0 -> 35602 bytes public/assets/js/ajax-cart.js | 126 + public/assets/js/ajax-search.js | 78 + public/assets/js/current-year.js | 9 + public/assets/js/jquery-3.7.1.min.js | 2 + public/assets/js/jquery.maskedinput.min.js | 7 + public/assets/js/nouislider.min.js | 1 + public/assets/js/phone_mask.js | 3 + public/assets/js/update-cart-count.js | 8 + public/favicon.ico | 0 public/index.php | 55 + public/robots.txt | 2 + resources/css/app.css | 16 + resources/js/app.js | 7 + resources/js/bootstrap.js | 32 + resources/views/about.blade.php | 167 + resources/views/admin/brands/brands.blade.php | 160 + resources/views/admin/brands/edit.blade.php | 101 + .../admin/categories/categories.blade.php | 245 + .../views/admin/categories/edit.blade.php | 132 + resources/views/admin/contacts/edit.blade.php | 347 + resources/views/admin/dashboard.blade.php | 113 + resources/views/admin/orders/orders.blade.php | 82 + resources/views/admin/orders/show.blade.php | 109 + .../views/admin/partials/header.blade.php | 5 + .../views/admin/partials/mobile-nav.blade.php | 97 + .../views/admin/partials/sidebar.blade.php | 105 + .../views/admin/permissions/edit.blade.php | 74 + .../admin/permissions/permissions.blade.php | 118 + .../views/admin/products/create.blade.php | 650 ++ resources/views/admin/products/edit.blade.php | 832 ++ .../partials/variation-form.blade.php | 180 + .../views/admin/products/products.blade.php | 164 + resources/views/admin/roles/create.blade.php | 79 + resources/views/admin/roles/edit.blade.php | 91 + resources/views/admin/roles/roles.blade.php | 90 + resources/views/admin/users/create.blade.php | 100 + resources/views/admin/users/edit.blade.php | 98 + resources/views/admin/users/users.blade.php | 104 + resources/views/auth/login.blade.php | 51 + resources/views/auth/register.blade.php | 56 + resources/views/brands/brands.blade.php | 34 + resources/views/brands/show.blade.php | 180 + resources/views/cart/checkout.blade.php | 270 + resources/views/cart/show.blade.php | 299 + .../partials/categories-block.blade.php | 14 + .../categories/partials/ui-slider.blade.php | 94 + resources/views/categories/show.blade.php | 191 + resources/views/contacts.blade.php | 102 + resources/views/index.blade.php | 18 + resources/views/layouts/admin.blade.php | 44 + resources/views/layouts/app.blade.php | 125 + resources/views/maket.blade.php | 1 + .../index/carousel-discount.blade.php | 47 + .../partials/index/product-carousel.blade.php | 58 + .../partials/menu/catalog-megamenu.blade.php | 58 + resources/views/partials/menu/menu.blade.php | 125 + resources/views/privacy-policy.blade.php | 207 + .../products/partials/product-card.blade.php | 35 + resources/views/products/show.blade.php | 461 + resources/views/profile/edit.blade.php | 86 + resources/views/profile/order-show.blade.php | 97 + .../partials/profile-sidebar.blade.php | 28 + resources/views/profile/profile.blade.php | 101 + resources/views/search/results.blade.php | 81 + routes/api.php | 19 + routes/channels.php | 18 + routes/console.php | 19 + routes/web.php | 193 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tailwind.config.js | 17 + tests/CreatesApplication.php | 21 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 22 + 431 files changed, 31234 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 TailAndPaws.sql create mode 100644 app/Console/Kernel.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Admin/BrandsController.php create mode 100644 app/Http/Controllers/Admin/CategoriesController.php create mode 100644 app/Http/Controllers/Admin/ContactController.php create mode 100644 app/Http/Controllers/Admin/DashboardController.php create mode 100644 app/Http/Controllers/Admin/OrdersController.php create mode 100644 app/Http/Controllers/Admin/PermissionsController.php create mode 100644 app/Http/Controllers/Admin/ProductController.php create mode 100644 app/Http/Controllers/Admin/RolesController.php create mode 100644 app/Http/Controllers/Admin/UsersController.php create mode 100644 app/Http/Controllers/Auth/LoginController.php create mode 100644 app/Http/Controllers/Auth/RegisterController.php create mode 100644 app/Http/Controllers/BrandController.php create mode 100644 app/Http/Controllers/CartController.php create mode 100644 app/Http/Controllers/CategoryController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Controllers/MenuController.php create mode 100644 app/Http/Controllers/OrderController.php create mode 100644 app/Http/Controllers/ProductsController.php create mode 100644 app/Http/Controllers/ProfileController.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/CheckPermission.php create mode 100644 app/Http/Middleware/CheckRole.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustHosts.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/ValidateSignature.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Models/Brand.php create mode 100644 app/Models/CartItem.php create mode 100644 app/Models/Category.php create mode 100644 app/Models/Contact.php create mode 100644 app/Models/Order.php create mode 100644 app/Models/OrderItem.php create mode 100644 app/Models/Permission.php create mode 100644 app/Models/Product.php create mode 100644 app/Models/ProductAttribute.php create mode 100644 app/Models/ProductVariation.php create mode 100644 app/Models/Review.php create mode 100644 app/Models/Role.php create mode 100644 app/Models/User.php create mode 100644 app/Models/VariationAttribute.php create mode 100644 app/Models/VariationImage.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/MenuServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/hashing.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/sanctum.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/view.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/2014_10_12_000000_create_users_table.php create mode 100644 database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php create mode 100644 database/migrations/2019_08_19_000000_create_failed_jobs_table.php create mode 100644 database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php create mode 100644 database/migrations/2026_03_12_171109_create_roles_table.php create mode 100644 database/migrations/2026_03_12_171110_create_permissions_table.php create mode 100644 database/migrations/2026_03_12_171111_create_permission_role_table.php create mode 100644 database/migrations/2026_03_14_102454_create_categories_table.php create mode 100644 database/migrations/2026_03_14_124100_create_brands_table.php create mode 100644 database/migrations/2026_03_14_124103_create_products_table.php create mode 100644 database/migrations/2026_03_14_135714_create_product_variations_table.php create mode 100644 database/migrations/2026_03_14_201029_create_reviews_table.php create mode 100644 database/migrations/2026_03_14_213006_create_contacts_table.php create mode 100644 database/migrations/2026_03_14_213427_add_meta_fields_to_products_table.php create mode 100644 database/migrations/2026_03_16_191828_add_phone_to_users_table.php create mode 100644 database/migrations/2026_03_16_192010_add_email_index_to_users_table.php create mode 100644 database/migrations/2026_03_18_192641_add_role_id_to_users_table.php create mode 100644 database/migrations/2026_03_28_191947_fix_products_and_variations_structure.php create mode 100644 database/migrations/2026_04_01_142406_create_cart_items_table.php create mode 100644 database/migrations/2026_04_01_142423_create_orders_table.php create mode 100644 database/migrations/2026_04_01_142428_create_order_items_table.php create mode 100644 database/seeders/BrandSeeder.php create mode 100644 database/seeders/CategorySeeder.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/ProductCatalogSeeder.php create mode 100644 database/seeders/RolesAndPermissionsSeeder.php create mode 100644 docker-compose.yml create mode 100644 docker/nginx/default.conf create mode 100644 docker/php/php.ini create mode 100644 docker/supervisord.conf create mode 100644 isUniqueConstraintError($e)) create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 postcss.config.js create mode 100644 prepareBindings($bindings) create mode 100644 public/.htaccess create mode 100644 public/assets/css/brand.css create mode 100644 public/assets/css/cart.css create mode 100644 public/assets/css/category.css create mode 100644 public/assets/css/checkout.css create mode 100644 public/assets/css/index.css create mode 100644 public/assets/css/login.css create mode 100644 public/assets/css/menu.css create mode 100644 public/assets/css/nouislider.min.css create mode 100644 public/assets/css/product.css create mode 100644 public/assets/css/profile.css create mode 100644 public/assets/fonts/ComicRelief-Bold.ttf create mode 100644 public/assets/fonts/ComicRelief-Regular.ttf create mode 100644 public/assets/images/brands/Royal-Canin-Logo.png create mode 100644 public/assets/images/brands/abba.png create mode 100644 public/assets/images/brands/alphapet.png create mode 100644 public/assets/images/brands/grandin.png create mode 100644 public/assets/images/brands/grandorf.jpg create mode 100644 public/assets/images/brands/klicker.png create mode 100644 public/assets/images/brands/little-one.jpg create mode 100644 public/assets/images/brands/ownat.png create mode 100644 public/assets/images/brands/rogz.png create mode 100644 public/assets/images/brands/rungo.jpeg create mode 100644 public/assets/images/brands/rurri.png create mode 100644 public/assets/images/brands/tetra.jpg create mode 100644 public/assets/images/brands/triol.png create mode 100644 public/assets/images/categories/icons/default.svg create mode 100644 public/assets/images/categories/icons/dlya-gryzunov.svg create mode 100644 public/assets/images/categories/icons/dlya-koshek.svg create mode 100644 public/assets/images/categories/icons/dlya-ptic.svg create mode 100644 public/assets/images/categories/icons/dlya-ryb.svg create mode 100644 public/assets/images/categories/icons/dlya-sobak.svg create mode 100644 public/assets/images/categories/icons/yvavyavy.png create mode 100644 public/assets/images/categories/icons/zdorovie-i-uhod.svg create mode 100644 public/assets/images/categories/images/aptecka_image.jpg create mode 100644 public/assets/images/categories/images/default.svg create mode 100644 public/assets/images/categories/images/dlia-gryzunov_image.jpg create mode 100644 public/assets/images/categories/images/dlia-kosek_image.jpg create mode 100644 public/assets/images/categories/images/dlia-ptic_image.jpg create mode 100644 public/assets/images/categories/images/dlia-ryb_image.jpg create mode 100644 public/assets/images/categories/images/dlia-sobak_image.jpg create mode 100644 public/assets/images/categories/images/kletki-i-zerdocki_image.jpg create mode 100644 public/assets/images/categories/images/korma-dlia-popugaev_image.jpg create mode 100644 public/assets/images/categories/images/korma_image.jpg create mode 100644 public/assets/images/categories/images/lakomstva_image.jpg create mode 100644 public/assets/images/categories/images/oseiniki-i-povodki_image.jpg create mode 100644 public/assets/images/categories/images/pauci-i-konservy_image.jpg create mode 100644 public/assets/images/categories/images/suxie-korma_image.jpg create mode 100644 public/assets/images/categories/images/vitaminy-i-dobavki_image.jpg create mode 100644 public/assets/images/categories/images/vlaznye-korma_image.jpg create mode 100644 public/assets/images/categories/images/zdorove-i-uxod_image.jpg create mode 100644 public/assets/images/icons/add-folder-svgrepo-com.svg create mode 100644 public/assets/images/icons/cart-svgrepo-com.svg create mode 100644 public/assets/images/icons/copy-svgrepo-com.svg create mode 100644 public/assets/images/icons/delete-svgrepo-com.svg create mode 100644 public/assets/images/icons/dropdown-arrow-svgrepo-com.svg create mode 100644 public/assets/images/icons/edit-svgrepo-com.svg create mode 100644 public/assets/images/icons/enter-svgrepo-com.svg create mode 100644 public/assets/images/icons/logout-svgrepo-com.svg create mode 100644 public/assets/images/icons/menu-svgrepo-com.svg create mode 100644 public/assets/images/icons/save-svgrepo-com.svg create mode 100644 public/assets/images/icons/search-svgrepo-com.svg create mode 100644 public/assets/images/icons/settings-svgrepo-com.svg create mode 100644 public/assets/images/icons/social_media/telegram-svgrepo-com.svg create mode 100644 public/assets/images/icons/social_media/vk-svgrepo-com.svg create mode 100644 public/assets/images/icons/social_media/whatsapp-svgrepo-com.svg create mode 100644 public/assets/images/icons/star-alt-4-svgrepo-com.svg create mode 100644 public/assets/images/icons/user-block-alt-svgrepo-com.svg create mode 100644 public/assets/images/icons/user-pen-alt-svgrepo-com.svg create mode 100644 public/assets/images/icons/user-svgrepo-com.svg create mode 100644 public/assets/images/logo/favicon.svg create mode 100644 public/assets/images/logo/logo.svg create mode 100644 public/assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_49/0.webp create mode 100644 public/assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_49/1.webp create mode 100644 public/assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_50/0.webp create mode 100644 public/assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_50/1.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/0.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/1.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/2.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/0.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/1.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/2.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/3.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/4.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/5.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/0.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/1.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/2.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/3.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/4.webp create mode 100644 public/assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/5.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_139/0.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_139/1.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_140/0.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_140/1.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_141/0.webp create mode 100644 public/assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_141/1.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/0.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/1.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/2.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/0.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/1.webp create mode 100644 public/assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/2.webp create mode 100644 public/assets/images/products/default.svg create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/0.webp create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/1.webp create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/2.webp create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/0.webp create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/1.webp create mode 100644 public/assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/2.webp create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/0.webp create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/1.webp create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/2.webp create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/0.jpeg create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/1.webp create mode 100644 public/assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/2.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/0.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/1.webp create mode 100644 public/assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/2.webp create mode 100644 public/assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/0.webp create mode 100644 public/assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/1.webp create mode 100644 public/assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/2.webp create mode 100644 public/assets/images/products/klicker-adult/variation_43/0.webp create mode 100644 public/assets/images/products/klicker-adult/variation_43/1.webp create mode 100644 public/assets/images/products/klicker-adult/variation_43/2.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/0.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/1.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/2.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/0.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/1.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/2.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/0.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/1.webp create mode 100644 public/assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/2.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/0.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/1.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/2.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/0.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/1.webp create mode 100644 public/assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_120/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_120/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/2.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/0.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/1.webp create mode 100644 public/assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/2.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/0.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/1.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/2.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/0.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/1.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/2.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/0.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/1.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/2.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/3.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/4.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/5.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/0.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/1.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/2.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/3.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/4.webp create mode 100644 public/assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/5.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/0.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/1.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/2.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/3.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/0.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/1.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/2.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/3.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/0.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/1.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/2.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/3.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/0.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/1.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/2.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/3.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/0.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/1.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/2.webp create mode 100644 public/assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/3.webp create mode 100644 public/assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_128/0.webp create mode 100644 public/assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_69/0.webp create mode 100644 public/assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_70/0.webp create mode 100644 public/assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_22/0.webp create mode 100644 public/assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_22/1.webp create mode 100644 public/assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_23/0.webp create mode 100644 public/assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_23/1.webp create mode 100644 public/assets/images/products/tetra-min-holiday-korm-zele/variation_61/0.webp create mode 100644 public/assets/js/ajax-cart.js create mode 100644 public/assets/js/ajax-search.js create mode 100644 public/assets/js/current-year.js create mode 100644 public/assets/js/jquery-3.7.1.min.js create mode 100644 public/assets/js/jquery.maskedinput.min.js create mode 100644 public/assets/js/nouislider.min.js create mode 100644 public/assets/js/phone_mask.js create mode 100644 public/assets/js/update-cart-count.js create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/about.blade.php create mode 100644 resources/views/admin/brands/brands.blade.php create mode 100644 resources/views/admin/brands/edit.blade.php create mode 100644 resources/views/admin/categories/categories.blade.php create mode 100644 resources/views/admin/categories/edit.blade.php create mode 100644 resources/views/admin/contacts/edit.blade.php create mode 100644 resources/views/admin/dashboard.blade.php create mode 100644 resources/views/admin/orders/orders.blade.php create mode 100644 resources/views/admin/orders/show.blade.php create mode 100644 resources/views/admin/partials/header.blade.php create mode 100644 resources/views/admin/partials/mobile-nav.blade.php create mode 100644 resources/views/admin/partials/sidebar.blade.php create mode 100644 resources/views/admin/permissions/edit.blade.php create mode 100644 resources/views/admin/permissions/permissions.blade.php create mode 100644 resources/views/admin/products/create.blade.php create mode 100644 resources/views/admin/products/edit.blade.php create mode 100644 resources/views/admin/products/partials/variation-form.blade.php create mode 100644 resources/views/admin/products/products.blade.php create mode 100644 resources/views/admin/roles/create.blade.php create mode 100644 resources/views/admin/roles/edit.blade.php create mode 100644 resources/views/admin/roles/roles.blade.php create mode 100644 resources/views/admin/users/create.blade.php create mode 100644 resources/views/admin/users/edit.blade.php create mode 100644 resources/views/admin/users/users.blade.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/brands/brands.blade.php create mode 100644 resources/views/brands/show.blade.php create mode 100644 resources/views/cart/checkout.blade.php create mode 100644 resources/views/cart/show.blade.php create mode 100644 resources/views/categories/partials/categories-block.blade.php create mode 100644 resources/views/categories/partials/ui-slider.blade.php create mode 100644 resources/views/categories/show.blade.php create mode 100644 resources/views/contacts.blade.php create mode 100644 resources/views/index.blade.php create mode 100644 resources/views/layouts/admin.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/maket.blade.php create mode 100644 resources/views/partials/index/carousel-discount.blade.php create mode 100644 resources/views/partials/index/product-carousel.blade.php create mode 100644 resources/views/partials/menu/catalog-megamenu.blade.php create mode 100644 resources/views/partials/menu/menu.blade.php create mode 100644 resources/views/privacy-policy.blade.php create mode 100644 resources/views/products/partials/product-card.blade.php create mode 100644 resources/views/products/show.blade.php create mode 100644 resources/views/profile/edit.blade.php create mode 100644 resources/views/profile/order-show.blade.php create mode 100644 resources/views/profile/partials/profile-sidebar.blade.php create mode 100644 resources/views/profile/profile.blade.php create mode 100644 resources/views/search/results.blade.php create mode 100644 routes/api.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tailwind.config.js create mode 100644 tests/CreatesApplication.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a282f28 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +.git +.gitignore +node_modules +vendor +.env +.env.* +!.env.example +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +public/build +*.md +tests/ +phpunit.xml +docker-compose*.yml +.editorconfig +.styleci.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +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..ea0665b --- /dev/null +++ b/.env.example @@ -0,0 +1,59 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +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=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +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_APP_NAME="${APP_NAME}" +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..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.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 new file mode 100644 index 0000000..7fe978f --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ad15390 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,76 @@ +# ───────────────────────────────────────────── +# Stage 1: Build frontend assets +# ───────────────────────────────────────────── +FROM node:20-alpine AS node-builder + +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN npm ci + +COPY vite.config.js tailwind.config.js postcss.config.js ./ +COPY resources/ resources/ +COPY public/ public/ + +RUN npm run build + +# ───────────────────────────────────────────── +# Stage 2: PHP application +# ───────────────────────────────────────────── +FROM php:8.2-fpm-alpine AS app + +# System dependencies +RUN apk add --no-cache \ + nginx \ + supervisor \ + curl \ + libpng-dev \ + libjpeg-turbo-dev \ + libwebp-dev \ + freetype-dev \ + libzip-dev \ + oniguruma-dev \ + icu-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install \ + pdo_mysql \ + mbstring \ + gd \ + zip \ + bcmath \ + intl \ + opcache + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +# Copy composer files first for layer caching +COPY composer.json composer.lock ./ +RUN composer install --no-dev --no-scripts --optimize-autoloader --no-interaction + +# Copy application source +COPY . . + +# Copy built frontend assets from stage 1 +COPY --from=node-builder /app/public/build public/build + +# Laravel setup +RUN cp .env.example .env \ + && php artisan key:generate --force \ + && php artisan config:clear \ + && php artisan storage:link || true + +# Permissions +RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache \ + && chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache + +# Copy config files +COPY docker/nginx/default.conf /etc/nginx/http.d/default.conf +COPY docker/php/php.ini $PHP_INI_DIR/conf.d/app.ini +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +EXPOSE 80 + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a4c26b --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +

Laravel Logo

+ +

+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 thousands of 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 Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com/)** +- **[Tighten Co.](https://tighten.co)** +- **[WebReinvent](https://webreinvent.com/)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Jump24](https://jump24.co.uk)** +- **[Redberry](https://redberry.international/laravel/)** +- **[Active Logic](https://activelogic.com)** +- **[byte5](https://byte5.de)** +- **[OP.GG](https://op.gg)** + +## 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/TailAndPaws.sql b/TailAndPaws.sql new file mode 100644 index 0000000..abd95d3 --- /dev/null +++ b/TailAndPaws.sql @@ -0,0 +1,1462 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.0 +-- https://www.phpmyadmin.net/ +-- +-- Servidor: 127.0.0.1:3306 +-- Tiempo de generación: 06-04-2026 a las 16:37:55 +-- Versión del servidor: 10.4.26-MariaDB-log +-- Versión de PHP: 8.1.9 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Base de datos: `TailAndPaws` +-- + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `brands` +-- + +CREATE TABLE `brands` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logo` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `website` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `country` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT 1 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `brands` +-- + +INSERT INTO `brands` (`id`, `name`, `slug`, `description`, `logo`, `website`, `country`, `is_active`) VALUES +(1, 'Royal Canin', 'royal-canin', 'Премиальные корма для кошек и собак', 'Royal-Canin-Logo.png', 'https://www.royalcanin.com', 'Франция', 1), +(2, 'ABBA', 'abba', 'Качественные корма для домашних животных', 'abba.png', 'https://abba.ru', 'Россия', 1), +(3, 'RURRI', 'rurri', 'Одежда и амуниция для собак', 'rurri.png', NULL, 'Россия', 1), +(4, 'Ownat', 'ownat', 'Натуральные корма премиум-класса', 'ownat.png', 'https://www.ownat.com', 'Испания', 1), +(5, 'Grandin', 'grandin', 'Корма и лакомства для собак', 'grandin.png', 'https://www.grandin-pet.ru/', 'Россия', 1), +(6, 'Triol', 'triol', 'Российский производитель качественных кормов и лакомств для собак и кошек.', 'triol.png', 'https://triol.pet/', 'Россия', 1), +(10, 'Rungo', 'rungo', 'RUNGO – продукция предназначенная для качественного ухода за собаками.\r\n\r\nОдежда и аксессуары RUNGO соответствуют современным потребностям домашних животных и хозяев. Эти изделия отличаются высоким качеством, сохраняют свои технические характеристики и внешний вид в хорошем состоянии в течение длительного срока эксплуатации. В ассортимент RUNGO входят следующие группы товаров: светящиеся игрушки, маячки, ошейники, попоны и дождевики.\r\n\r\nС применением изделий RUNGO многие практические задачи будут решены быстро, точно и с комфортом.', 'rungo.jpeg', NULL, 'Россия', 1), +(11, 'Klicker', 'klicker', 'Турецкий бренд сухих и влажных кормов супер-премиум класса для кошек и собак, производимый компанией Hermos Pet Food с 2017 года. Корма производятся в Турции, являются беззерновыми, монопротеиновыми и экспортируются во многие страны.', 'klicker.png', NULL, 'Турция', 1), +(12, 'AlphaPet', 'alphapet', 'Российский бренд высококачественных кормов для собак и кошек классов суперпремиум и холистик. Продукция производится в России на современном оборудовании с высоким содержанием свежего мяса (до 95% во влажных рационах), разработанная с учетом физиологических потребностей животных и принципов здорового питания.', 'alphapet.png', 'https://alphapet.ru/', 'Россия', 1), +(13, 'Tetra', 'tetra', 'Мировой лидер в производстве товаров для аквариумистики, основанный в Германии, который первым разработал сухой корм для рыб в виде хлопьев', 'tetra.jpg', 'https://www.tetra.net/ru-ru', 'Германия', 1), +(14, 'Little One', 'little-one', 'Бренд Little One (корма и лакомства для грызунов и птиц) производится в России. Торговая марка принадлежит компании Mealberry, которая специализируется на выпуске товаров для мелких домашних животных. Продукция, включая корма, лакомства и витамины, широко представлена на российском рынке.', 'little-one.jpg', NULL, 'Россия', 1), +(15, 'GRANDORF', 'grandorf', 'Это бельгийский бренд высококачественных кормов класса холистик, предназначенных для кошек и собак. Продукция славится высоким содержанием мяса (до 70%), гипоаллергенными составами без кукурузы, пшеницы и субпродуктов, а также наличием живых пробиотиков для пищеварения. Подходит для животных с чувствительным ЖКТ.', 'grandorf.jpg', 'https://grandorf.ru/', 'Бельгия', 1), +(16, 'Rogz', 'rogz', 'Известный южноафриканский бренд товаров для домашних животных, основанный в 1995 году в Кейптауне Полом Фуллером и Ирен Раубенхаймер. Марка производит безопасные, функциональные и стильные аксессуары (ошейники, поводки, шлейки, игрушки) для собак и кошек, отличающиеся ярким дизайном и высоким качеством материалов.', 'rogz.png', 'https://rogz.com/', 'Южно-Африканская Республика', 1); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `cart_items` +-- + +CREATE TABLE `cart_items` ( + `id` bigint(20) UNSIGNED NOT NULL, + `user_id` bigint(20) UNSIGNED DEFAULT NULL, + `session_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `variation_id` bigint(20) UNSIGNED NOT NULL, + `quantity` int(11) NOT NULL DEFAULT 1, + `price` decimal(10,2) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `cart_items` +-- + +INSERT INTO `cart_items` (`id`, `user_id`, `session_id`, `variation_id`, `quantity`, `price`, `created_at`, `updated_at`) VALUES +(20, 1, 'FsRQjMKDSOThcwwPUvflAKIrh9FN4myyQTqA0M3B', 46, 1, '1999.00', '2026-04-06 06:51:52', '2026-04-06 06:51:52'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `categories` +-- + +CREATE TABLE `categories` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `parent_id` bigint(20) UNSIGNED DEFAULT NULL, + `sort_order` int(11) NOT NULL DEFAULT 0, + `is_active` tinyint(1) NOT NULL DEFAULT 1 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `categories` +-- + +INSERT INTO `categories` (`id`, `name`, `slug`, `description`, `icon`, `image`, `parent_id`, `sort_order`, `is_active`) VALUES +(1, 'Для собак', 'dlya-sobak', 'Всё необходимое для вашего четвероногого друга: от качественного питания до удобной амуниции и развивающих игрушек. Позаботьтесь о здоровье и счастье вашей собаки вместе с TailAndPaws!', 'dlya-sobak.svg', 'dlia-sobak_image.jpg', NULL, 10, 1), +(2, 'Корма', 'korma-dlya-sobak', 'Правильное питание — основа здоровья вашего питомца. У нас представлены корма премиум-класса для собак всех возрастов, пород и особенностей здоровья.', NULL, 'korma_image.jpg', 1, 10, 1), +(3, 'Сухие корма', 'suhie-korma', 'Сбалансированные сухие корма с высоким содержанием белка, витаминов и минералов. Удобный формат хранения и кормления для активных собак.', NULL, 'suxie-korma_image.jpg', 2, 10, 1), +(4, 'Влажные корма', 'vlazhnye-korma', 'Ароматные паштеты, кусочки в соусе и консервы, которые ваша собака полюбит с первого раза. Идеально для привередливых питомцев.', NULL, 'vlaznye-korma_image.jpg', 2, 20, 1), +(5, 'Диетическое питание', 'dieticheskoe-pitanie', 'Специализированные корма для собак с чувствительным пищеварением, аллергиями или особыми потребностями. Только одобренные ветеринарами формулы.', NULL, NULL, 2, 30, 1), +(6, 'Амуниция', 'amunitsiya', 'Качественная амуниция для комфортных прогулок и безопасного содержания. Ошейники, поводки, шлейки и аксессуары на любой вкус.', NULL, NULL, 1, 20, 1), +(7, 'Ошейники и поводки', 'osheyniki-i-povodki', 'Надёжные и стильные ошейники и поводки из качественных материалов. Регулируемые размеры, светоотражающие элементы и удобные застёжки.', NULL, 'oseiniki-i-povodki_image.jpg', 6, 10, 1), +(8, 'Намордники', 'namordniki', 'Безопасные и комфортные намордники для прогулок и посещения ветеринара. Различные размеры и материалы для любой породы.', NULL, NULL, 6, 20, 1), +(10, 'Игрушки', 'igrushki', 'Развивающие, интерактивные и просто весёлые игрушки для активных собак. Помогают направить энергию в мирное русло и укрепить связь с хозяином.', NULL, NULL, 1, 30, 1), +(11, 'Мячики и фрисби', 'myachiki-i-frisbi', 'Идеальный выбор для активных игр на свежем воздухе. Прочные мячики, летающие тарелки и снаряды для апортировки, которые выдержат любую нагрузку.', NULL, NULL, 10, 10, 1), +(12, 'Канаты и кости', 'kanaty-i-kosti', 'Прочные канатные игрушки и безопасные кости для жевания. Помогают чистить зубы, массировать дёсны и надолго увлечь питомца.', NULL, NULL, 10, 20, 1), +(13, 'Лежанки и домики', 'lezhanki-i-domiki', 'Уютные и тёплые места для отдыха вашего питомца. Выбирайте из широкого ассортимента лежанок и домиков для собак любых размеров.', 'lezhanki-i-domiki.svg', 'lezhanki-i-domiki.jpg', 1, 40, 1), +(14, 'Лежанки', 'lezhanki', 'Мягкие лежанки с ортопедическими свойствами для комфортного сна и отдыха. Съёмные чехлы, водоотталкивающие материалы — уют в каждой детали.', 'lezhanki.svg', 'lezhanki.jpg', 13, 10, 1), +(15, 'Домики', 'domiki', 'Уютные домики и будки, где ваш питомец будет чувствовать себя в полной безопасности. Для квартиры, дома или уличного содержания.', 'domiki.svg', 'domiki.jpg', 13, 20, 1), +(16, 'Миски и кормушки', 'miski-i-kormushki', 'Практичные миски и автоматические кормушки для правильного режима питания. Нержавеющая сталь, керамика, пластик — выбор за вами.', NULL, NULL, 1, 50, 1), +(17, 'Миски', 'miski', 'Удобные миски для воды и корма на любой вкус. С нескользящими ножками, подставками и регулируемой высотой для правильной осанки питомца.', 'miski.svg', 'miski.jpg', 16, 10, 1), +(18, 'Автокормушки', 'avtokormushki', 'Современные автоматические кормушки с программируемым временем подачи. Идеально для занятых хозяев и питомцев, которым нужен режим.', 'avtokormushki.svg', 'avtokormushki.jpg', 16, 20, 1), +(19, 'Для кошек', 'dlya-koshek', 'Всё, что нужно для счастливой и здоровой жизни вашей кошки. Корма премиум-класса, удобные наполнители, когтеточки и уютные домики.', 'dlya-koshek.svg', 'dlia-kosek_image.jpg', NULL, 20, 1), +(20, 'Корма', 'korma-dlya-koshek', 'Качественные корма для кошек всех возрастов. Сухие и влажные рационы, лакомства и специализированное питание для здоровья и долголетия.', 'korma-dlya-koshek.svg', 'korma-dlya-koshek.jpg', 19, 10, 1), +(21, 'Сухие корма', 'suhie-korma-dlya-koshek', 'Сбалансированные сухие корма с высоким содержанием таурина, витаминов и минералов. Для поддержания здоровья шерсти, зубов и пищеварения.', 'suhie-korma-dlya-koshek.svg', 'suxie-korma_image.jpg', 20, 10, 1), +(22, 'Паучи и консервы', 'pauchi-i-konservy', 'Аппетитные паучи и консервы в удобной порционной упаковке. Натуральный состав, высокое содержание мяса — идеальный выбор для гурманов.', 'pauchi-i-konservy.svg', 'pauci-i-konservy_image.jpg', 20, 20, 1), +(23, 'Лакомства', 'lakomstva-dlya-koshek', 'Вкусные и полезные лакомства для поощрения и разнообразия рациона. Палочки, подушечки, крема — ваша кошка будет в восторге!', 'lakomstva-dlya-koshek.svg', 'lakomstva_image.jpg', 20, 30, 1), +(24, 'Наполнители', 'napolniteli', 'Качественные наполнители для кошачьего туалета с отличной впитываемостью и контролем запаха. Выбирайте оптимальный вариант для вашего питомца.', 'napolniteli.svg', 'napolniteli.jpg', 19, 20, 1), +(25, 'Древесные', 'drevesnye', 'Экологичные древесные наполнители из натуральных материалов. Отличная абсорбция, приятный аромат и бережное отношение к природе.', 'drevesnye.svg', 'drevesnye.jpg', 24, 10, 1), +(26, 'Силикагелевые', 'silikagelevye', 'Современные силикагелевые наполнители с максимальной впитываемостью. Долго сохраняют сухость и нейтрализуют неприятные запахи.', 'silikagelevye.svg', 'silikagelevye.jpg', 24, 20, 1), +(27, 'Комкующиеся', 'komkuyuschiesya', 'Удобные комкующиеся наполнители на основе бентонитовой глины. Легко убирать, экономичный расход и отличный контроль запаха.', 'komkuyuschiesya.svg', 'komkuyuschiesya.jpg', 24, 30, 1), +(28, 'Когтеточки и домики', 'kogtetochki-i-domiki', 'Всё для активных и спокойных кошек. Когтеточки для стачивания когтей, уютные домики и развлекательные комплексы.', 'kogtetochki-i-domiki.svg', 'kogtetochki-i-domiki.jpg', 19, 30, 1), +(29, 'Когтеточки', 'kogtetochki', 'Качественные когтеточки разных форм и размеров. Спасите вашу мебель и подарите кошке любимое место для точения когтей.', 'kogtetochki.svg', 'kogtetochki.jpg', 28, 10, 1), +(30, 'Лежанки для кошек', 'lezhanki-dlya-koshek', 'Мягкие и тёплые лежанки для любимых кошек. Уютные места для сна и отдыха, которые так любят наши пушистые друзья.', 'lezhanki-dlya-koshek.svg', 'lezhanki-dlya-koshek.jpg', 28, 20, 1), +(31, 'Игровые комплексы', 'igrovye-kompleksy', 'Многоуровневые игровые комплексы с когтеточками, домиками и подвесными игрушками. Идеальное решение для активных кошек.', 'igrovye-kompleksy.svg', 'igrovye-kompleksy.jpg', 28, 30, 1), +(32, 'Для грызунов', 'dlya-gryzunov', 'Всё для комфортной жизни маленьких питомцев: хомяков, морских свинок, крыс и шиншилл. Качественные корма, уютные клетки и развивающие аксессуары.', 'dlya-gryzunov.svg', 'dlia-gryzunov_image.jpg', NULL, 30, 1), +(33, 'Корма', 'korma-dlya-gryzunov', 'Сбалансированные корма для грызунов с учётом их видовых потребностей. Зерновые смеси, сено, травяные гранулы и полезные лакомства.', 'korma-dlya-gryzunov.svg', 'korma-dlya-gryzunov.jpg', 32, 10, 1), +(34, 'Зерновые смеси', 'zernovye-smesi', 'Питательные зерновые смеси с добавлением овощей, фруктов и витаминов. Обеспечивают организм грызунов всеми необходимыми веществами.', 'zernovye-smesi.svg', 'zernovye-smesi.jpg', 33, 10, 1), +(35, 'Сено и травы', 'seno-i-travy', 'Ароматное сено и полезные травы для правильного пищеварения и стачивания зубов грызунов. Натуральные и экологически чистые продукты.', 'seno-i-travy.svg', 'seno-i-travy.jpg', 33, 20, 1), +(36, 'Лакомства', 'lakomstva-dlya-gryzunov', 'Вкусные и полезные лакомства для поощрения и разнообразия рациона. Палочки, сухофрукты, злаковые батончики — здоровое угощение для вашего питомца.', 'lakomstva-dlya-gryzunov.svg', 'lakomstva-dlya-gryzunov.jpg', 33, 30, 1), +(37, 'Клетки и аксессуары', 'kletki-i-aksessuary', 'Просторные клетки и всё необходимое для обустройства дома грызуна. Миски, поилки, домики, колеса для бега и другие аксессуары.', 'kletki-i-aksessuary.svg', 'kletki-i-aksessuary.jpg', 32, 20, 1), +(38, 'Клетки', 'kletki', 'Качественные клетки разных размеров с глубокими поддонами, удобными дверцами и аксессуарами в комплекте. Безопасные и комфортные.', 'kletki.svg', 'kletki.jpg', 37, 10, 1), +(39, 'Поилки и миски', 'poilki-i-miski', 'Удобные поилки и миски для грызунов. Автоматические поилки с шариковым механизмом, керамические миски, которые сложно перевернуть.', 'poilki-i-miski.svg', 'poilki-i-miski.jpg', 37, 20, 1), +(40, 'Наполнители', 'napolniteli-dlya-gryzunov', 'Безопасные наполнители для клеток грызунов. Древесные гранулы, кукурузный наполнитель, бумажные пеллеты — отличная абсорбция и контроль запаха.', 'napolniteli-dlya-gryzunov.svg', 'napolniteli-dlya-gryzunov.jpg', 37, 30, 1), +(41, 'Для птиц', 'dlya-ptic', 'Всё для пернатых друзей: от качественных кормов до просторных клеток и развивающих игрушек. Подарите своим птицам здоровую и счастливую жизнь.', 'dlya-ptic.svg', 'dlia-ptic_image.jpg', NULL, 40, 1), +(42, 'Корма', 'korma-dlya-ptic', 'Сбалансированные кормовые смеси для разных видов птиц. Попугаи, канарейки, амадины — подбирайте питание с учётом потребностей вашего питомца.', 'korma-dlya-ptic.svg', 'korma-dlya-ptic.jpg', 41, 10, 1), +(43, 'Корма для попугаев', 'korma-dlya-popugaev', 'Питательные смеси для попугаев всех видов. Злаки, орехи, семена, сухофрукты — всё для энергии, яркого оперения и долголетия.', 'korma-dlya-popugaev.svg', 'korma-dlia-popugaev_image.jpg', 42, 10, 1), +(44, 'Корма для канареек', 'korma-dlya-kanareek', 'Специализированные корма для канареек с высоким содержанием семян, витаминов и минералов. Для здоровья, красивого пения и яркого оперения.', 'korma-dlya-kanareek.svg', 'korma-dlya-kanareek.jpg', 42, 20, 1), +(45, 'Минеральные камни', 'mineralnye-kamni', 'Минеральные камни и сепии для стачивания клюва и восполнения запаса кальция. Необходимый элемент в клетке каждой птицы.', 'mineralnye-kamni.svg', 'mineralnye-kamni.jpg', 42, 30, 1), +(46, 'Аксессуары', 'aksessuary-dlya-ptic', 'Всё для обустройства комфортной жизни птиц. Удобные клетки, жердочки, купалки, игрушки и другие необходимые аксессуары.', 'aksessuary-dlya-ptic.svg', 'aksessuary-dlya-ptic.jpg', 41, 20, 1), +(47, 'Клетки и жердочки', 'kletki-i-zherdochki', 'Просторные клетки и удобные жердочки из натурального дерева. Обеспечивают комфортное пространство для жизни и возможность для полётов.', 'kletki-i-zherdochki.svg', 'kletki-i-zerdocki_image.jpg', 46, 10, 1), +(48, 'Игрушки для птиц', 'igrushki-dlya-ptic', 'Развивающие игрушки для птиц: качели, колокольчики, лесенки, зеркала. Стимулируют умственную активность и предотвращают скуку.', 'igrushki-dlya-ptic.svg', 'igrushki-dlya-ptic.jpg', 46, 20, 1), +(49, 'Для рыб', 'dlya-ryb', 'Всё для красивого и здорового аквариума. Качественные корма, современное оборудование, декорации и грунт — создайте подводный мир мечты.', 'dlya-ryb.svg', 'dlia-ryb_image.jpg', NULL, 50, 1), +(50, 'Корма для рыб', 'korma-dlya-ryb', 'Сбалансированные корма для аквариумных рыб. Хлопья, гранулы, таблетки для донных рыб — подбирайте питание по типу и размеру обитателей.', 'korma-dlya-ryb.svg', 'korma-dlya-ryb.jpg', 49, 10, 1), +(51, 'Аквариумы', 'akvariumy', 'Аквариумы разных форм и объёмов от проверенных производителей. Полный комплект с подсветкой, фильтром и крышкой для быстрого старта.', 'akvariumy.svg', 'akvariumy.jpg', 49, 20, 1), +(52, 'Фильтрация и помпы', 'filtratsiya-i-pompy', 'Надёжные фильтры, помпы и системы очистки воды. Обеспечивают биологическое, механическое и химическое очищение для здоровой экосистемы.', 'filtratsiya-i-pompy.svg', 'filtratsiya-i-pompy.jpg', 49, 30, 1), +(53, 'Освещение', 'osveschenie', 'Качественное освещение для аквариумов. Светодиодные лампы, люминесцентные светильники, которые подчёркивают красоту рыб и стимулируют рост растений.', 'osveschenie.svg', 'osveschenie.jpg', 49, 40, 1), +(54, 'Грунт и декор', 'grunt-i-dekor', 'Декоративный грунт, коряги, камни, искусственные и живые растения. Создайте уникальный дизайн вашего аквариума.', 'grunt-i-dekor.svg', 'grunt-i-dekor.jpg', 49, 50, 1), +(55, 'Здоровье и уход', 'zdorovie-i-uhod', 'Всё для здоровья и ухода за домашними питомцами. Шампуни, витамины, средства от паразитов и ветеринарные препараты для поддержания отличного самочувствия.', 'zdorovie-i-uhod.svg', 'zdorove-i-uxod_image.jpg', NULL, 60, 1), +(56, 'Шампуни и косметика', 'shampuni-i-kosmetika', 'Качественные шампуни, кондиционеры и косметические средства для ухода за шерстью, кожей, когтями и зубами ваших питомцев.', 'shampuni-i-kosmetika.svg', 'shampuni-i-kosmetika.jpg', 55, 10, 1), +(57, 'Витамины и добавки', 'vitaminy-i-dobavki', 'Витаминно-минеральные комплексы и биологически активные добавки для поддержания здоровья питомцев. Укрепление иммунитета, здоровье суставов, красивая шерсть.', 'vitaminy-i-dobavki.svg', 'vitaminy-i-dobavki_image.jpg', 55, 20, 1), +(58, 'Средства от паразитов', 'sredstva-ot-parazitov', 'Надёжная защита от блох, клещей, гельминтов и других паразитов. Капли, спреи, ошейники, таблетки — выбирайте удобный формат.', 'sredstva-ot-parazitov.svg', 'sredstva-ot-parazitov.jpg', 55, 30, 1), +(59, 'Аптечка', 'aptechka', 'Всё для домашней ветеринарной аптечки: перевязочные материалы, антисептики, средства для обработки ран, глаз, ушей. Будьте готовы к любым ситуациям.', 'aptechka.svg', 'aptecka_image.jpg', 55, 40, 1), +(60, 'Груминг', 'gruming', 'Инструменты для профессионального и домашнего груминга. Расчёски, щётки, пуходёрки, когтерезы, триммеры и машинки для стрижки.', 'gruming.svg', 'gruming.jpg', 55, 50, 1), +(65, 'Одежда', 'odezda', 'Стильная и функциональная одежда для собак всех пород. Дождевики, попоны, комбинезоны, свитера — защита от непогоды и яркий образ для вашего питомца.', NULL, NULL, 6, 40, 1); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `contacts` +-- + +CREATE TABLE `contacts` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Хвостики и лапки', + `description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logo` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `favicon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `phone` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `work_hours` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `telegram` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `whatsapp` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `vkontakte` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `meta_title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `meta_description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `meta_keywords` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `contacts` +-- + +INSERT INTO `contacts` (`id`, `name`, `description`, `logo`, `favicon`, `phone`, `email`, `address`, `work_hours`, `telegram`, `whatsapp`, `vkontakte`, `meta_title`, `meta_description`, `meta_keywords`, `created_at`, `updated_at`) VALUES +(1, 'Хвостики и лапки', NULL, 'logo.svg', 'favicon.svg', '+7(985)-070-56-33', 'tailandpaws_info@gmail.com', 'г. Челябинск, ул. Дружбы, д. 15', '10:00 - 18:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `failed_jobs` +-- + +CREATE TABLE `failed_jobs` ( + `id` bigint(20) UNSIGNED NOT NULL, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `migrations` +-- + +CREATE TABLE `migrations` ( + `id` int(10) UNSIGNED NOT NULL, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `batch` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `migrations` +-- + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES +(14, '2014_10_12_000000_create_users_table', 1), +(15, '2014_10_12_100000_create_password_reset_tokens_table', 1), +(16, '2019_08_19_000000_create_failed_jobs_table', 1), +(17, '2019_12_14_000001_create_personal_access_tokens_table', 1), +(18, '2026_03_12_171109_create_roles_table', 1), +(19, '2026_03_12_171110_create_permissions_table', 1), +(20, '2026_03_12_171110_create_role_user_table', 1), +(21, '2026_03_12_171111_create_permission_role_table', 1), +(22, '2026_03_14_102454_create_categories_table', 1), +(23, '2026_03_14_124100_create_brands_table', 1), +(24, '2026_03_14_124103_create_products_table', 1), +(25, '2026_03_14_135714_create_product_variations_table', 1), +(26, '2026_03_14_201029_create_reviews_table', 1), +(27, '2026_03_14_213006_create_contacts_table', 2), +(28, '2026_03_14_213427_add_meta_fields_to_products_table', 2), +(29, '2026_03_16_191828_add_phone_to_users_table', 3), +(30, '2026_03_16_192010_add_email_index_to_users_table', 3), +(31, '2026_03_18_191033_add_unique_constraint_to_role_user_table', 4), +(32, '2026_03_18_192641_add_role_id_to_users_table', 5), +(33, '2026_03_28_191947_fix_products_and_variations_structure', 6), +(34, '2026_04_01_142406_create_cart_items_table', 7), +(35, '2026_04_01_142423_create_orders_table', 7), +(36, '2026_04_01_142428_create_order_items_table', 7); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `orders` +-- + +CREATE TABLE `orders` ( + `id` bigint(20) UNSIGNED NOT NULL, + `order_number` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint(20) UNSIGNED DEFAULT NULL, + `customer_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `customer_email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `customer_phone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `shipping_address` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `subtotal` decimal(10,2) NOT NULL, + `shipping_cost` decimal(10,2) NOT NULL DEFAULT 0.00, + `discount` decimal(10,2) NOT NULL DEFAULT 0.00, + `total` decimal(10,2) NOT NULL, + `payment_method` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'cash', + `payment_status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `delivery_method` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'courier', + `delivery_status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `comment` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `orders` +-- + +INSERT INTO `orders` (`id`, `order_number`, `user_id`, `customer_name`, `customer_email`, `customer_phone`, `shipping_address`, `subtotal`, `shipping_cost`, `discount`, `total`, `payment_method`, `payment_status`, `delivery_method`, `delivery_status`, `comment`, `created_at`, `updated_at`) VALUES +(1, 'ORD-20260402-69CDC5BBD6FEB', 1, 'duckinahatt', 'margaritaborodovskih@gmail.com', '+7(909)-090-86-13', NULL, '5403.00', '0.00', '0.00', '5403.00', 'cash', 'paid', 'pickup', 'delivered', NULL, '2026-04-01 22:26:19', '2026-04-06 06:04:06'), +(2, 'ORD-20260406-69D3808EA5C09', 1, 'duckinahat', 'margaritaborodovskih@gmail.com', '+7(909)-090-86-13', NULL, '5208.00', '0.00', '0.00', '5208.00', 'cash', 'pending', 'pickup', 'pending', NULL, '2026-04-06 06:44:46', '2026-04-06 06:44:46'), +(3, 'ORD-20260406-69D380D6CE7B4', 1, 'duckinahat', 'margaritaborodovskih@gmail.com', '+7(909)-090-86-13', NULL, '1435.00', '0.00', '0.00', '1435.00', 'online', 'pending', 'pickup', 'pending', NULL, '2026-04-06 06:45:58', '2026-04-06 06:45:58'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `order_items` +-- + +CREATE TABLE `order_items` ( + `id` bigint(20) UNSIGNED NOT NULL, + `order_id` bigint(20) UNSIGNED NOT NULL, + `variation_id` bigint(20) UNSIGNED NOT NULL, + `product_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `variation_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sku` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `quantity` int(11) NOT NULL, + `price` decimal(10,2) NOT NULL, + `total` decimal(10,2) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `order_items` +-- + +INSERT INTO `order_items` (`id`, `order_id`, `variation_id`, `product_name`, `variation_name`, `sku`, `quantity`, `price`, `total`, `created_at`, `updated_at`) VALUES +(1, 1, 60, 'AlphaPet Сухой корм для стерилизованных кошек', 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой, 1,5 кг', '1053741', 1, '1969.00', '1969.00', '2026-04-01 22:26:19', '2026-04-01 22:26:19'), +(2, 1, 53, 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением', 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением, с ягненком, 1 кг', '1065459', 1, '1435.00', '1435.00', '2026-04-01 22:26:19', '2026-04-01 22:26:19'), +(3, 1, 46, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет', 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет, 2 кг', '1002774', 1, '1999.00', '1999.00', '2026-04-01 22:26:19', '2026-04-01 22:26:19'), +(4, 2, 57, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет', 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 400 гр.', '1000724', 2, '635.00', '1270.00', '2026-04-06 06:44:46', '2026-04-06 06:44:46'), +(5, 2, 60, 'AlphaPet Сухой корм для стерилизованных кошек', 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой, 1,5 кг', '1053741', 2, '1969.00', '3938.00', '2026-04-06 06:44:46', '2026-04-06 06:44:46'), +(6, 3, 53, 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением', 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением, с ягненком, 1 кг', '1065459', 1, '1435.00', '1435.00', '2026-04-06 06:45:58', '2026-04-06 06:45:58'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `password_reset_tokens` +-- + +CREATE TABLE `password_reset_tokens` ( + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `permissions` +-- + +CREATE TABLE `permissions` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `group` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `permissions` +-- + +INSERT INTO `permissions` (`id`, `name`, `slug`, `group`, `description`) VALUES +(1, 'Доступ в личный кабинет', 'cabinet_access', 'cabinet', 'Возможность входить в личный кабинет и просматривать свои данные'), +(2, 'Просматривать заказы', 'view_orders', 'orders', 'Просмотр списка заказов'), +(3, 'Редактировать заказы', 'edit_orders', 'orders', 'Редактирование заказов (статус, удаление, подтверждение)'), +(4, 'Оформлять заказы', 'checkout', 'orders', 'Оформление заказов на сайте'), +(5, 'Управлять корзиной', 'manage_cart', 'cart', 'Добавление/удаление товаров из корзины'), +(6, 'Добавлять товары', 'create_products', 'products', 'Создание новых товаров'), +(7, 'Редактировать товары', 'edit_products', 'products', 'Редактирование товаров'), +(8, 'Управлять количеством товара', 'manage_stock', 'products', 'Изменение остатков товаров на складе'), +(9, 'Просматривать пользователей', 'view_users', 'users', 'Просмотр списка пользователей'), +(10, 'Создавать пользователей', 'create_users', 'users', 'Создание новых пользователей'), +(11, 'Управлять ролями', 'manage_roles', 'rbac', 'Создание/редактирование ролей'), +(12, 'Управлять правами', 'manage_permissions', 'rbac', 'Создание/редактирование прав доступа'), +(13, 'Редактировать данные магазина', 'edit_shop_settings', 'shop', 'Изменение настроек магазина'), +(14, 'Доступ в админ-панель', 'admin_access', 'admin', 'Возможность входить в административную панель'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `permission_role` +-- + +CREATE TABLE `permission_role` ( + `id` bigint(20) UNSIGNED NOT NULL, + `permission_id` bigint(20) UNSIGNED NOT NULL, + `role_id` bigint(20) UNSIGNED NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `permission_role` +-- + +INSERT INTO `permission_role` (`id`, `permission_id`, `role_id`, `created_at`, `updated_at`) VALUES +(1, 14, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(2, 1, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(3, 4, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(4, 6, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(5, 10, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(6, 3, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(7, 7, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(8, 13, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(9, 5, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(10, 12, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(11, 11, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(12, 8, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(13, 2, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(14, 9, 2, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(15, 14, 3, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(16, 1, 3, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(17, 6, 3, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(18, 7, 3, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(19, 2, 3, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(20, 14, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(21, 1, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(22, 4, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(23, 3, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(24, 2, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(25, 9, 4, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(26, 14, 5, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(27, 1, 5, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(28, 8, 5, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(29, 2, 5, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(30, 1, 6, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(31, 4, 6, '2026-03-14 18:11:29', '2026-03-14 18:11:29'), +(32, 5, 6, '2026-03-14 18:11:29', '2026-03-14 18:11:29'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `personal_access_tokens` +-- + +CREATE TABLE `personal_access_tokens` ( + `id` bigint(20) UNSIGNED NOT NULL, + `tokenable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `tokenable_id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `abilities` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `last_used_at` timestamp NULL DEFAULT NULL, + `expires_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `products` +-- + +CREATE TABLE `products` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `brand_id` bigint(20) UNSIGNED DEFAULT NULL, + `category_id` bigint(20) UNSIGNED NOT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT 1, + `meta_title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `meta_description` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `meta_keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `products` +-- + +INSERT INTO `products` (`id`, `name`, `slug`, `description`, `brand_id`, `category_id`, `is_active`, `meta_title`, `meta_description`, `meta_keywords`, `created_at`, `updated_at`) VALUES +(12, 'Rungo Ошейник нейлоновый с ручкой для собак K-9, L', 'rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l', 'Ошейник K-9 от бренда RUNGO – надежный аксессуар для дополнительного контроля собаки на прогулках, в поездках, при дрессировке.\r\nРазмер: обхват шеи 42-65 см, ширина 3,8 см', 10, 7, 1, 'Вот вариант для этого товара: Meta Title: Rungo ошейник нейлоновый с ручкой K-9 для собак, L', 'Прочный нейлоновый ошейник Rungo K-9 с удобной ручкой для контроля собаки. Размер L, надежная посадка и комфорт в ежедневном использовании.', 'rungo ошейник, ошейник для собак, нейлоновый ошейник, ошейник с ручкой, rungo k-9, ошейник l, ошейник для крупных собак, амуниция для собак', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(21, 'Grandin Hypoallergenic ягненок', 'grandin-hypoallergenic-iagnenok', 'Гипоаллергенный сухой корм для собак всех пород с ягненком. Беззерновой суперпремиум класс без курицы и говядины.', 5, 3, 1, 'Grandin Hypoallergenic сухой корм ягненок', 'Гипоаллергенный корм Grandin с ягненком для собак всех пород без злаков суперпремиум класс', 'grandin hypoallergenic,сухой корм собак,ягненок,гипоаллергенный корм собак', '2026-03-29 12:20:24', '2026-03-29 13:18:29'), +(22, 'Klicker Adult', 'klicker-adult', 'Сухой корм для собак мелких пород с лососем. Высокая усвояемость и поддержка пищеварения.', 11, 3, 1, 'Klicker Adult сухой корм лосось мелкие породы', 'Премиум корм Klicker для мелких пород с лососем поддержка пищеварения', 'klicker корм,сухой корм мелких собак,лосось собак', '2026-03-29 12:20:24', '2026-03-29 13:41:32'), +(23, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет', 'royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let', 'Сухой корм для взрослых собак мелких пород. Поддержка кожи и шерсти, высокая калорийность.', 1, 3, 1, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет', 'Корм Royal Canin для мелких взрослых собак поддержка кожи шерсти', 'royal canin mini adult,сухой корм собак мелких пород', '2026-03-29 12:20:24', '2026-03-29 14:07:02'), +(24, 'АВВА Adult Сухой корм на основе свежего мяса для взрослых собак мелких пород, с ягненком и индейкой', 'avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi', 'Сухой корм суперпремиум с ягненком для всех пород. Естественные ингредиенты без ГМО.', 2, 3, 1, 'АВВА Adult Сухой корм на основе свежего мяса для взрослых собак мелких пород, с ягненком и индейкой', 'ABBA суперпремиум корм с ягненком для собак всех пород натуральные ингредиенты', 'abba premium,ягненок сухой корм,суперпремиум собак', '2026-03-29 12:20:24', '2026-03-29 17:16:40'), +(25, 'AlphaPet Adult Monoprotein Сухой корм для собак средних и крупных пород, белая рыба', 'alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba', 'Здоровый и активный питомец – главная задача каждого хозяина. Команда AlphaPet® создает и производит полезные корма высшей категории качества Holistiс, давая возможность каждому владельцу быть уверенным в правильном выборе кормления для своего животного. AlphaPet® MONOPROTEIN на основе белой рыбы - благодаря единственному источнику животного белка, подойдет животным с пищевой непереносимостью.\r\n\r\nБелая рыба - отличный источник легкоусвояемого белка, микроэлементов: железа, селена, цинка, йода и витаминов B12 и D. Также рыба ценный источник ненасыщенных жирных кислот Омега 3, благодаря которым кожа и шерсть животных будут в прекрасном состоянии. Диетическое мясо белой рыбы хорошо сбалансированно и несет в себе максимум пользы для питомцев.\r\n\r\nПриготовленно по инновационной технологии из свежей белой рыбы и с содержанием большого процента животного белка!', 12, 3, 1, 'AlphaPet Adult Monoprotein Сухой корм для собак средних и крупных пород, белая рыба', 'Здоровый и активный питомец – главная задача каждого хозяина. Команда AlphaPet® создает и производит полезные корма высшей категории качества Holistiс, давая возможность каждому владельцу быть уверенным в правильном выборе кормления для своего животного. AlphaPet® MONOPROTEIN на основе белой рыбы - благодаря единственному источнику животного белка, подойдет животным с пищевой непереносимостью.\r\n\r\nБелая рыба - отличный источник легкоусвояемого белка, микроэлементов: железа, селена, цинка, йода и витаминов B12 и D. Также рыба ценный источник ненасыщенных жирных кислот Омега 3, благодаря которым кожа и шерсть животных будут в прекрасном состоянии. Диетическое мясо белой рыбы хорошо сбалансированно и несет в себе максимум пользы для питомцев.\r\n\r\nПриготовленно по инновационной технологии из свежей белой рыбы и с содержанием большого процента животного белка!', 'alphapet monoprotein, сухой корм собак, белая рыба корм, корм средних пород, корм крупных собак, монобелковый корм, корм при аллергии, холистик корм собак, alphapet adult', '2026-03-29 12:20:24', '2026-03-29 18:45:42'), +(26, 'Ownat Grain Free Just Сухой корм беззерновой для собак', 'ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak', 'В основе корма лежит максимальное количество натуральных ингредиентов: свежее мясо, свежие овощи и фрукты, а также водоросли, что позволяет донести до питомца пользу продуктов в том виде, в каком задумала природа.', 4, 3, 1, 'Ownat Grain Free Just Сухой корм беззерновой для собак, с лососем и морепродуктами', 'Ownat Grain Free Just беззерновой сухой корм для собак. Доступны вкусы: лосось и морепродукты, курица, утка, ягненок. 70% мяса, 20% свежего, холистик класс беззлаковый.', 'ownat grain free just, беззерновой корм собак, корм лосось морепродукты, ownat курица, ownat утка, ownat ягненок, сухой корм беззлаковый, холистик корм собак, ownat grain free вкусы', '2026-03-29 12:20:24', '2026-03-29 19:03:16'), +(27, 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением', 'klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem', 'Сухой корм для кошек с чувствительным пищеварением. Легкоусвояемые ингредиенты.', 11, 21, 1, 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением, с ягненком, 1 кг', 'Корм для кошек с чувствительным пищеварением Klicker легкоусвояемые ингредиенты', 'klicker sensitive,сухой корм кошек,пищеварение кошки', '2026-03-29 12:20:24', '2026-03-29 19:06:53'), +(28, 'Grandin Holistic Влажный корм (консервы) для взрослых кошек', 'grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek', 'GRANDIN Holistic Health Privilege в желе - высококачественный консервированный корм для взрослых кошек с повышенным содержанием рыбы.', 5, 22, 1, 'Grandin Holistic влажный корм для взрослых кошек, консервы без злаков', 'Grandin Holistic влажный корм (консервы) для взрослых кошек. Высокое содержание мяса, без злаков и ГМО, нежное желе/соус, подходит для привередливых и чувствительных кошек.', 'grandin holistic, влажный корм для кошек, консервы для кошек, корм для взрослых кошек, беззлаковый влажный корм, grandin консервы, тунец в желе, курица в желе, индейка в соусе', '2026-03-29 12:20:24', '2026-03-29 19:12:47'), +(29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет', 'royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let', 'Поддержание оптимального веса. Помогает поддерживать оптимальный вес благодаря ограниченному содержанию жиров, оптимальному уровню белков и входящему в состав корма L-карнитину.\r\nПоддержание мышечного тонуса. Помогает поддерживать мышечный тонус благодаря повышенному содержанию белка и L-карнитину.\r\nПоддержание здоровья мочевыделительной системы. Способствует профилактике заболеваний мочевыделительной системы за счет сбалансированного содержания минеральных веществ и поддержания рН мочи.', 1, 21, 1, 'Royal Canin Sterilised сухой корм кошки', 'Корм Royal Canin для стерилизованных кошек поддержка мочевыводящей системы', 'royal canin sterilised,корм стерилизованных кошек', '2026-03-29 12:20:24', '2026-03-29 19:22:45'), +(30, 'AlphaPet Сухой корм для стерилизованных кошек', 'alphapet-suxoi-korm-dlia-sterilizovannyx-kosek', '80% мясного белка;\r\n30% свежего мяса;\r\nНизкое содержание жира и оптимальный уровень клетчатки помогают ограничивать набор избыточного веса;\r\nБаланс магния, кальция и фосфора для здоровья мочевыделительной системы;\r\nУникальный комплекс натуральных добавок AlphaPetBIO®;\r\nНатуральные ингредиенты;\r\nНе содержит ГМО, искусственных красителей и ароматизаторов;\r\nИнгредиенты, пригодные в пищу человеку, уровня Human Grade;\r\nБережная технология, сохраняющая вкусовые и питательные свойства свежего мяса.', 12, 21, 1, 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой', 'AlphaPet Superpremium Sterilised сухой корм для стерилизованных кошек с ягненком и индейкой. 80% мясного белка, 30% свежего мяса, контроль веса, профилактика МКБ.', 'alphapet sterilised, корм стерилизованных кошек, ягненок индейка корм, alphapet суперпремиум, сухой корм кошки стерилизованные, корм мкб кошки, alphapet ягненок', '2026-03-29 12:20:24', '2026-03-29 19:44:22'), +(31, 'Tetra Min Holiday корм желе', 'tetra-min-holiday-korm-zele', 'Сухой корм для кошек с курицей. Полнорационное питание.', 13, 50, 1, 'Tetra Min Holiday корм желе аквариумные рыбы 14 дней 30г', 'Tetra Min Holiday гелевый корм-желе для аквариумных рыб на 14 дней. 100% съедобный блок с дафнией, витаминами, минералами. Не мутит воду, немецкое качество.', 'tetra min holiday, корм желе рыбы, корм на отпуск 14 дней, tetra holiday желе, аквариумный корм желе, корм дафния рыбы, tetra 30г желе', '2026-03-29 12:20:24', '2026-03-29 19:58:14'), +(32, 'Little One Корм для морских свинок', 'little-one-korm-dlia-morskix-svinok', 'Полнорационный корм с добавлением витаминов и минеральных веществ. Разработан с учетом специфических потребностей морских свинок и содержит повышенное количество витамина С, жизненно необходимого для их здоровья.\r\n\r\nРазнообразный состав корма включает в себя травяные гранулы, воздушные ингредиенты и хлопья, семена, овощи и редкие плоды.', 14, 34, 1, 'Little One корм для морских свинок полнорационный витамин С', 'Little One корм для морских свинок с повышенным содержанием витамина С. Полнорационный состав: травяные гранулы, семена, овощи, воздушные хлопья. 35-50г/сутки на зверька.', 'little one морские свинки, корм морских свинок, корм с витамином с, little one грызуны, полнорационный корм свинки, корм травяные гранулы свинок', '2026-03-29 12:20:24', '2026-03-29 20:00:36'), +(34, 'Little One Корм для морских свинок Зелёная долина', 'little-one-korm-dlia-morskix-svinok-zelenaia-dolina', 'Little One «Зеленая долина» — это полнорационный беззерновой корм для морских свинок, в состав которого входит 60 разновидностей трав.\r\nДополнительно его состав обогащен шиповником и лепестками розы, которые богаты витамином С, а также добавлены другие полезные и любимые морскими свинками ингредиенты – тыква, пастернак, яблоко и др.\r\nБлагодаря использованию специальной технологии холодного прессования, травяные гранулы сохранили все витамины и минералы, входящие в состав растений.\r\nКорм богат длинными волокнами клетчатки, а также обогащен фруктоолигосахаридами для поддержания роста полезной микрофлоры в кишечнике и жирными кислотами ω-3 и ω-6 для здоровья кожи и блестящей шерсти.\r\nКорм отлично подходит для диетического питания.', 14, 34, 1, 'Little One Зелёная долина корм морских свинок разнотравье 750г', 'Little One \"Зелёная долина\" корм для морских свинок из разнотравья 750г. 60 трав холодного прессования, 24% клетчатки, без зерна, витамин С, диетический для пищеварения.', 'little one зеленая долина, корм морских свинок разнотравье, корм без зерна свинки, little one 750г, корм 60 трав свинок, диетический корм свинок', '2026-03-29 12:20:24', '2026-03-29 20:05:17'), +(35, 'Rungo Комбинезон теплый для собак породы мопс', 'rungo-kombinezon-teplyi-dlia-sobak-porody-mops', 'Теплый комбинезон для собак от бренд RUNGO – простой и эффективный способ сделать прогулку с собакой комфортной в любую непогоду. Комбинезон защитит Вашего питомца от сырости, загрязнений и переохлаждения.', 10, 65, 1, 'Ferplast парашютный ошейник собака', 'Легкий парашютный ошейник Ferplast для собак', 'ferplast парашютный,ошейник легкий собака', '2026-03-29 12:20:24', '2026-03-29 20:12:19'), +(36, 'Rogz ошейник Utility', 'rogz-oseinik-utility', 'Усиленный нейлон с мягкой подкладкой. 5 точек фиксации.', 16, 7, 1, 'Rogz Utility ошейник собака', 'Прочный ошейник Rogz Utility усиленный нейлон', 'rogz utility,ошейник собака усиленный', '2026-03-29 12:20:24', '2026-03-30 09:47:30'), +(37, 'Hunter кожаный плетеный', 'hunter-kozhanii-pletenyi', 'Ручная плетка из натуральной кожи. Эксклюзивный дизайн.', NULL, 7, 1, 'Hunter плетеный кожаный ошейник', 'Эксклюзивный плетеный кожаный ошейник Hunter', 'hunter плетеный,кожаный ошейник эксклюзив', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(38, 'Petzl ошейник альпинистский', 'petzl-alpinistskii-osheynik', 'Сверхпрочный для рабочих собак. Используется кинологами.', NULL, 7, 1, 'Petzl альпинистский ошейник собака', 'Сверхпрочный ошейник Petzl для рабочих собак', 'petzl альпинистский,ошейник рабочие собаки', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(39, 'Ever Clean Extra Strength', 'ever-clean-extra-strength', 'Древесный наполнитель для кошек. Сильная комкуемость отличная нейтрализация запаха.', NULL, 25, 1, 'Ever Clean Extra Strength древесный наполнитель', 'Премиум древесный наполнитель Ever Clean сильная комкуемость', 'ever clean,древесный наполнитель кошки,премиум наполнитель', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(40, 'Cat\'s Best Original', 'cats-best-original', 'Натуральный гранулированный наполнитель из волокон целлюлозы. 100% биоразлагаемый.', NULL, 25, 1, 'Cat\'s Best Original древесный наполнитель', 'Натуральный древесный наполнитель Cat\'s Best из целлюлозы', 'cats best,древесный натуральный,наполнитель кошки', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(41, 'Barsik Premium древесный', 'barsik-premium-drevesnyi', 'Древесный наполнитель из опилок хвойных пород. Высокая впитываемость.', NULL, 25, 1, 'Barsik Premium древесный наполнитель кошки', 'Древесный наполнитель Barsik Premium из хвойных пород', 'barsik древесный,наполнитель кошки хвойный', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(42, 'Perfect Fit древесный', 'perfect-fit-drevesnyi', 'Комкующийся древесный наполнитель. Натуральный состав без химии.', NULL, 25, 1, 'Perfect Fit древесный наполнитель', 'Комкующийся древесный наполнитель Perfect Fit натуральный', 'perfect fit древесный,комкующийся наполнитель', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(43, 'Сибирский лес премиум', 'sibirskii-les-premium', 'Премиум древесный наполнитель. Сильный контроль запаха.', NULL, 25, 1, 'Сибирский лес премиум древесный наполнитель', 'Премиум древесный наполнитель Сибирский лес контроль запаха', 'сибирский лес,древесный премиум наполнитель', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(44, 'Травка-Сено древесный', 'travka-seno-drevesnyi', 'Натуральный древесный наполнитель с экстрактами трав.', NULL, 25, 1, 'Травка-Сено древесный наполнитель кошки', 'Древесный наполнитель Травка-Сено с экстрактами трав', 'травка сено,древесный с травами наполнитель', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(45, 'Kong Classic красный', 'kong-classic-krasnyi', 'Классическая резиновая игрушка для жевания и апортировки. Неотъемлемый элемент дрессировки.', NULL, 11, 1, 'Kong Classic красный мячик собака', 'Резиновая игрушка Kong Classic для собак жевание апортировка', 'kong classic,мячик собака резиновый,игрушка для жевания', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(46, 'Trixie теннисный мячик', 'trixie-tennisnyi-myachik', 'Теннисный мячик для собак. Прочная резина с войлоком.', NULL, 11, 1, 'Trixie теннисный мячик собака', 'Теннисный мячик Trixie для апортировки собак', 'trixie теннисный,мячик собака апортировка', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(47, 'Ferplast фрисби Flyer', 'ferplast-frisbi-flyer', 'Пластиковый фрисби для активных игр на улице. Легкий и прочный.', NULL, 11, 1, 'Ferplast Flyer фрисби собака', 'Фрисби Ferplast Flyer для собак активные игры', 'ferplast фрисби,фрисби собака уличные игры', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(48, 'K9 Granit мячик', 'k9-granit-myachik', 'Прочный резиновый мячик для сильных челюстей. Выдерживает давление.', NULL, 11, 1, 'K9 Granit мячик собака', 'Резиновый мячик K9 Granit для мощных собак', 'k9 granit,мячик собака прочный челюсти', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(49, 'Chuckit! Ultra мячик', 'chuckit-ultra-myachik', 'Яркий мячик для метателя Chuckit. Увеличенная дальность броска.', NULL, 11, 1, 'Chuckit Ultra мячик собака метатель', 'Мячик Chuckit Ultra для метателя собак', 'chuckit ultra,мячик метатель собака', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(50, 'Rogz Grinz мячик зубастый', 'rogz-grinz-myachik-zubastyi', 'Резиновый мячик с зубастой мордочкой. Массаж десен.', NULL, 11, 1, 'Rogz Grinz зубастый мячик собака', 'Мячик Rogz Grinz массаж десен собак', 'rogz grinz,мячик зубастый собака десны', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(51, 'Trixie Ортопедическая лежанка', 'trixie-ortopedicheskaya-lezhanka', 'Лежанка с ортопедической пеной memory foam. Для собак с проблемами суставов.', NULL, 14, 1, 'Trixie ортопедическая лежанка собака', 'Ортопедическая лежанка Trixie memory foam для собак суставы', 'trixie ортопедическая,лежанка memory foam,собаки суставы', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(52, 'Good Boy плед лежанка', 'good-boy-pled-lezhanka', 'Мягкая лежанка-плед из флиса. Съемный чехол машинная стирка.', NULL, 14, 1, 'Good Boy плед лежанка собака', 'Лежанка-плед Good Boy флис съемный чехол', 'good boy плед,лежанка флис собака', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(53, 'Ferplast лежанка Carlotta', 'ferplast-lezhanka-carlotta', 'Круглая лежанка с бортиками. Машинная стирка 30°C.', NULL, 14, 1, 'Ferplast Carlotta лежанка собака', 'Круглая лежанка Ferplast Carlotta с бортиками', 'ferplast carlotta,лежанка круглая бортики', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(54, 'Hunter лежанка Bavaria', 'hunter-lezhanka-bavaria', 'Немецкое качество. Прочная ткань водоотталкивающая подкладка.', NULL, 14, 1, 'Hunter Bavaria лежанка собака', 'Лежанка Hunter Bavaria немецкое качество водоотталкивающая', 'hunter bavaria,лежанка немецкая качество', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(55, 'PetFusion ортопедическая', 'petfusion-ortopedicheskaya', 'Лежанка с ортопедической пеной. Экологичные материалы гипоаллергенная.', NULL, 14, 1, 'PetFusion ортопедическая лежанка собака', 'Ортопедическая лежанка PetFusion экологичные гипоаллергенная', 'petfusion ортопедическая,лежанка экологичная', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(56, 'Laifugy лежанка домик', 'laifugy-lezhanka-domik', 'Лежанка-домик с крышей. Для маленьких собак и щенков.', NULL, 14, 1, 'Laifugy лежанка домик собака', 'Лежанка-домик Laifugy для маленьких собак щенков', 'laifugy домик,лежанка маленькие собаки', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек', 'grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek', 'GRANDORF Holistic Adult Sterilised — суперпремиальный беззерновой сухой корм для взрослых стерилизованных кошек.', 15, 21, 1, 'GRANDORF Holistic Adult Sterilised сухой корм стерилизованные кошки', 'GRANDORF Holistic Adult Sterilised сухой корм для взрослых стерилизованных кошек. 70% мяса (индейка+ягненок), беззерновой, таурин, L-карнитин, контроль веса, здоровье мочевыводящей системы.', 'grandorf sterilised, корм стерилизованных кошек, grandorf holistic adult, беззерновой корм кошки, корм с таурином кошки, grandorf индейка ягненок, holistic корм стерилизованные', '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(58, 'Ownat Adult Sterilized Grain Free Prime Сухой корм для стерилизованных кошек', 'ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek', 'OWNAT GRAIN FREE PRIME STERILIZES – это полнорационный сбалансированный корм для стерилизованных кошек и кастрированных котов.\r\nПовышенное содержание белков: мясные и рыбные ингредиенты в составе обеспечивают чувство сытости и наполняют организм незаменимыми аминокислотами.\r\nКорм содержит полный комплекс необходимых микро- и макроэлементов.\r\nНе содержит злаки, поэтому снижает риск возникновения пищевой аллергии.', 4, 21, 1, 'Ownat Adult Sterilized Grain Free Prime корм стерилизованные кошки', 'Ownat Grain Free Prime Adult Sterilized сухой корм для стерилизованных кошек. Беззерновой, 70% мяса, таурин, L-карнитин, контроль веса, профилактика МКБ, суперпремиум.', 'ownat grain free, корм стерилизованных кошек, ownat sterilized prime, беззерновой корм кошки, ownat кролик тунец, корм с таурином кошки, super premium sterilized', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(59, 'AlphaPet WOW Сухой корм для стерилизованных кошек', 'alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek', '80% мясного белка;\r\nСвежее мясо в составе;\r\nНизкое содержание жира и оптимальный уровень клетчатки помогают ограничивать набор избыточного веса;\r\nБаланс магния, кальций и фосфора для здоровья мочевыделительной системы;\r\nУникальный комплекс натуральных добавок AlphaPetBIO®;\r\nНатуральные ингредиенты;\r\nНе содержит ГМО, искусственных красителей и ароматизаторов;\r\nИнгредиенты, пригодные в пищу человеку, уровня Human Grade;\r\nБережная технология, сохраняющая вкусовые и питательные свойства свежего мяса.', 12, 21, 1, 'AlphaPet WOW Сухой корм стерилизованных кошек с индейкой', 'AlphaPet WOW Grain Free сухой корм для стерилизованных кошек с индейкой. 65% мяса, беззерновой, L-карнитин, таурин 0.2%, контроль веса, здоровье мочевыводящей системы, суперпремиум класс.', 'alphapet wow, корм стерилизованных кошек индейка, alphapet grain free, сухой корм кошки стерилизованные, alphapet l-карнитин, корм с таурином кошки, суперпремиум стерилизованные', '2026-03-30 07:01:27', '2026-03-30 07:05:45'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `product_attributes` +-- + +CREATE TABLE `product_attributes` ( + `id` bigint(20) UNSIGNED NOT NULL, + `product_id` bigint(20) UNSIGNED NOT NULL, + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `product_attributes` +-- + +INSERT INTO `product_attributes` (`id`, `product_id`, `key`, `value`, `created_at`, `updated_at`) VALUES +(19, 12, 'Размер питомца', 'Все размеры', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(20, 12, 'Материал изготовления', 'Нейлон', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(71, 37, 'Материал', 'Натуральная кожа (плетеный)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(72, 38, 'Материал', 'Альпинистский нейлон', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(73, 39, 'Тип наполнителя', 'Древесный, комкующийся', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(74, 40, 'Тип наполнителя', 'Древесный, целлюлозный', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(75, 41, 'Тип наполнителя', 'Древесный (хвойные породы)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(76, 42, 'Тип наполнителя', 'Древесный, комкующийся', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(77, 43, 'Тип наполнителя', 'Древесный премиум', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(78, 44, 'Тип наполнителя', 'Древесный с травами', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(79, 45, 'Материал', 'Натуральная резина', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(80, 45, 'Тип игрушки', 'Для жевания, апортировки', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(81, 46, 'Материал', 'Резина с войлоком', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(82, 47, 'Материал', 'Пластик', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(83, 47, 'Тип игрушки', 'Фрисби', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(84, 48, 'Материал', 'Прочная резина', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(85, 49, 'Материал', 'Резина', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(86, 49, 'Особенности', 'Для метателя Chuckit', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(87, 50, 'Материал', 'Резина', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(88, 50, 'Особенности', 'Массаж десен', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(89, 51, 'Материал', 'Memory foam', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(90, 51, 'Особенности', 'Ортопедическая', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(91, 52, 'Материал', 'Флис', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(92, 52, 'Особенности', 'Съемный чехол', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(93, 53, 'Форма', 'Круглая с бортиками', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(94, 54, 'Особенности', 'Водоотталкивающая', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(95, 55, 'Материал', 'Ортопедическая пена', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(96, 55, 'Особенности', 'Гипоаллергенная', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(97, 56, 'Тип', 'Лежанка-домик', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(101, 21, 'Класс корма', 'Суперпремиум', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(102, 21, 'Особенности', 'Беззерновой, гипоаллергенный', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(103, 21, 'Размер питомца', 'Все размеры', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(104, 21, 'Тип корма', 'Сухой', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(105, 22, 'Класс корма', 'Премиум', '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(106, 22, 'Размер питомца', 'Мелкие породы', '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(107, 22, 'Тип корма', 'Сухой', '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(132, 25, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(133, 25, 'Размер питомца', 'Средний и крупный', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(134, 25, 'Тип корма', 'Сухой', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(135, 26, 'Класс корма', 'Холистик', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(136, 26, 'Размер питомца', 'Все размеры', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(137, 26, 'Тип корма', 'Сухой', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(138, 27, 'Специальные показания', 'Для чувствительного пищеварения', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(139, 27, 'Тип корма', 'Сухой', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(140, 27, 'Возраст питомца', 'Все возрасты', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(141, 27, 'Размер питомца', 'Все размеры', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(142, 27, 'Особенности ингредиентов', 'Беззерновой корм', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(143, 28, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(144, 28, 'Особенности ингредиентов', 'Холистик', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(145, 28, 'Тип корма', 'Влажный', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(150, 23, 'Возраст', 'Взрослые (1-8 лет)', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(151, 23, 'Размер питомца', 'Мелкие породы', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(152, 23, 'Тип корма', 'Сухой', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(153, 24, 'Класс корма', 'Суперпремиум', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(154, 24, 'Размер питомца', 'Все размеры', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(155, 24, 'Тип корма', 'Сухой', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(156, 29, 'Возраст питомца', 'Для взрослых 1-7 лет', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(157, 29, 'Размер питомца', 'Все размеры', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(158, 29, 'Специальные показания', 'Кастраты и стерилизованные', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(159, 29, 'Тип корма', 'Сухой', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(180, 30, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(181, 30, 'Особенности ингредиентов', 'Свежее мясо', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(182, 30, 'Размер питомца', 'Все размеры', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(183, 30, 'Тип корма', 'Сухой', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(186, 31, 'Тип упаковки', 'Пакет, саше или коробка', '2026-03-29 19:58:14', '2026-03-29 19:58:14'), +(187, 32, 'Возраст питомца', 'Все возрасты', '2026-03-29 20:00:36', '2026-03-29 20:00:36'), +(188, 34, 'Возраст питомца', 'Все возрасты', '2026-03-29 20:05:17', '2026-03-29 20:05:17'), +(191, 35, 'Материал изготовления', 'Мембрана', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(192, 35, 'Пол животного', 'Девочка', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(196, 58, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(197, 58, 'Особенности ингредиентов', 'Беззерновой корм', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(198, 58, 'Специальные показания', 'Кастраты и стерилизованные', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(201, 59, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(202, 59, 'Размер питомца', 'Все размеры', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(203, 36, 'Материал', 'Усиленный нейлон', '2026-03-30 09:47:30', '2026-03-30 09:47:30'), +(204, 57, 'Возраст питомца', 'Для взрослых 1-6 лет', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(205, 57, 'Размер питомца', 'Все размеры', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(206, 57, 'Специальные показания', 'Кастраты и стерилизованные', '2026-03-31 16:14:19', '2026-03-31 16:14:19'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `product_variations` +-- + +CREATE TABLE `product_variations` ( + `id` bigint(20) UNSIGNED NOT NULL, + `product_id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sku` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` decimal(10,2) NOT NULL, + `old_price` decimal(10,2) DEFAULT NULL, + `stock` int(11) NOT NULL DEFAULT 0, + `is_default` tinyint(1) NOT NULL DEFAULT 0, + `is_active` tinyint(1) NOT NULL DEFAULT 1, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `product_variations` +-- + +INSERT INTO `product_variations` (`id`, `product_id`, `name`, `sku`, `price`, `old_price`, `stock`, `is_default`, `is_active`, `created_at`, `updated_at`) VALUES +(22, 12, 'Rungo Ошейник нейлоновый с ручкой для собак K-9, L, обхват шеи 42-65 см, ширина 3,8 см, черный', '1064128', '1749.00', NULL, 25, 1, 1, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(23, 12, 'Rungo Ошейник нейлоновый с ручкой для собак K-9, M, обхват шеи 38-48 см, ширина 3,2 см, красный', '1064127', '1499.00', '1599.00', 10, 0, 1, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(41, 21, 'Grandin Hypoallergenic ягненок, 2.7 кг', '1049894', '4499.00', '4200.00', 50, 1, 1, '2026-03-29 12:20:24', '2026-03-29 13:18:29'), +(42, 21, 'Grandin Hypoallergenic ягненок, 11.2 кг', '1049893', '10999.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 13:18:29'), +(43, 22, 'Klicker Adult лосось, 0.5 кг', '1060933', '779.00', NULL, 100, 1, 1, '2026-03-29 12:20:24', '2026-03-29 13:41:32'), +(45, 23, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет, 800 гр.', '1005371', '755.00', '855.00', 75, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:24:15'), +(46, 23, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет, 2 кг', '1002774', '1999.00', '2200.00', 39, 1, 1, '2026-03-29 12:20:24', '2026-04-01 22:26:19'), +(47, 24, 'АВВА Adult Сухой корм на основе свежего мяса для взрослых собак мелких пород, с ягненком и индейкой, 400 гр.', '1065978', '489.00', NULL, 60, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:24:26'), +(48, 24, 'АВВА Adult Сухой корм на основе свежего мяса для взрослых собак мелких пород, с ягненком и индейкой, 1,5 кг', 'ABBA-YAG-12KG', '1559.00', NULL, 30, 1, 1, '2026-03-29 12:20:24', '2026-03-29 19:24:26'), +(49, 25, 'AlphaPet Adult Monoprotein Сухой корм для собак средних и крупных пород, белая рыба, 2 кг', '1060824', '2019.00', '2219.00', 80, 1, 1, '2026-03-29 12:20:24', '2026-03-29 18:45:42'), +(50, 25, 'AlphaPet Adult Monoprotein Сухой корм для собак средних и крупных пород, белая рыба, 12 кг', '1060825', '10529.00', NULL, 30, 0, 1, '2026-03-29 12:20:24', '2026-03-29 18:45:42'), +(51, 26, 'Ownat Grain Free Just Сухой корм беззерновой для собак, с лососем и морепродуктами, 3 кг', '1042255', '3179.00', NULL, 45, 1, 1, '2026-03-29 12:20:24', '2026-03-29 19:03:16'), +(52, 26, 'Ownat Grain Free Just Сухой корм беззерновой для собак, с лососем и морепродуктами, 14 кг', '1061428', '9999.00', '12000.00', 15, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:03:16'), +(53, 27, 'Klicker Adult Sensitive Digestion Сухой корм для кошек с чувствительным пищеварением, с ягненком, 1 кг', '1065459', '1435.00', '1793.00', 78, 1, 1, '2026-03-29 12:20:24', '2026-04-06 06:45:58'), +(55, 28, 'Grandin Holistic Влажный корм (консервы) для взрослых кошек, тунец в желе, 80 гр.', '1064817', '199.00', NULL, 50, 1, 1, '2026-03-29 12:20:24', '2026-03-29 19:12:47'), +(56, 28, 'Grandin Holistic Влажный корм (консервы) для взрослых кошек, тунец с топпингом из лосося, 80 гр.', '1064818', '199.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:12:47'), +(57, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 400 гр.', '1000724', '635.00', NULL, 48, 0, 1, '2026-03-29 12:20:24', '2026-04-06 06:44:46'), +(58, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 200 гр.', '1051781', '339.00', NULL, 30, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:22:45'), +(59, 30, 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой, 400 гр.', '1053776', '639.00', NULL, 55, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:44:22'), +(60, 30, 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой, 1,5 кг', '1053741', '1969.00', NULL, 17, 1, 1, '2026-03-29 12:20:24', '2026-04-06 06:44:46'), +(61, 31, 'Tetra Min Holiday корм желе на 14 дней, 30 г', '1006487', '499.00', NULL, 65, 1, 1, '2026-03-29 12:20:24', '2026-03-29 19:49:44'), +(63, 32, 'Little One Корм для морских свинок, 400 гр.', '1007511', '255.00', NULL, 75, 1, 1, '2026-03-29 12:20:24', '2026-03-29 19:55:44'), +(64, 32, 'Little One Корм для морских свинок, 900 гр.', '1015934', '537.00', NULL, 15, 0, 1, '2026-03-29 12:20:24', '2026-03-29 19:55:44'), +(67, 34, 'Little One Корм для морских свинок Зелёная долина, 750 гр.', '1015722', '615.00', NULL, 40, 1, 1, '2026-03-29 12:20:24', '2026-03-29 20:05:17'), +(69, 35, 'Rungo Комбинезон теплый для собак породы мопс, обхват шеи 34 см, обхват груди 57 см, длина спины 34 см, шоколад (девочка)', '1063488', '2599.00', NULL, 5, 1, 1, '2026-03-29 12:20:24', '2026-03-29 20:12:19'), +(70, 35, 'Rungo Комбинезон с флисовой подкладкой для мопса, 57х34х34 см, пудра-бордо (девочка)', '1059683', '2599.00', NULL, 10, 0, 1, '2026-03-29 12:20:24', '2026-03-29 20:12:19'), +(71, 36, 'Rogz Utility ошейник, M', 'ROGZ-UTILITY-M', '2999.00', NULL, 30, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(72, 36, 'Rogz Utility ошейник, L', 'ROGZ-UTILITY-L', '3499.00', NULL, 15, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(73, 37, 'Hunter кожаный плетеный, M', 'HUNTER-PLET-M', '4999.00', NULL, 10, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(74, 37, 'Hunter кожаный плетеный, L', 'HUNTER-PLET-L', '5999.00', NULL, 5, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(75, 38, 'Petzl ошейник альпинистский, L/XL', 'PETZL-ALP-LXL', '7999.00', NULL, 8, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(76, 39, 'Ever Clean Extra Strength, 10 л', 'EVERCLEAN-10L', '1499.00', NULL, 40, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(77, 39, 'Ever Clean Extra Strength, 20 л', 'EVERCLEAN-20L', '2599.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(78, 40, 'Cat\'s Best Original, 6 кг', 'CATS-BEST-6KG', '1299.00', NULL, 60, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(79, 40, 'Cat\'s Best Original, 17 кг', 'CATS-BEST-17KG', '2999.00', NULL, 30, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(80, 41, 'Barsik Premium древесный, 5 л', 'BARSIK-5L', '899.00', NULL, 80, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(81, 41, 'Barsik Premium древесный, 10 л', 'BARSIK-10L', '1499.00', NULL, 50, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(82, 42, 'Perfect Fit древесный, 8 л', 'PERFECTFIT-8L', '1099.00', NULL, 70, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(83, 42, 'Perfect Fit древесный, 15 л', 'PERFECTFIT-15L', '1999.00', NULL, 40, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(84, 43, 'Сибирский лес премиум, 10 л', 'SIBLES-10L', '1399.00', NULL, 45, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(85, 43, 'Сибирский лес премиум, 20 л', 'SIBLES-20L', '2499.00', NULL, 20, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(86, 44, 'Травка-Сено древесный, 7 л', 'TRAVKA-7L', '1199.00', NULL, 55, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(87, 44, 'Травка-Сено древесный, 14 л', 'TRAVKA-14L', '2099.00', NULL, 30, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(88, 45, 'Kong Classic красный, S', 'KONG-CLASSIC-S', '1999.00', NULL, 35, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(89, 45, 'Kong Classic красный, M', 'KONG-CLASSIC-M', '2499.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(90, 46, 'Trixie теннисный мячик, стандарт', 'TRIXIE-TENNIS-STD', '399.00', NULL, 100, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(91, 46, 'Trixie теннисный мячик, большой', 'TRIXIE-TENNIS-L', '599.00', NULL, 70, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(92, 47, 'Ferplast фрисби Flyer, средний', 'FERPLAST-FLYER-M', '799.00', NULL, 60, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(93, 47, 'Ferplast фрисби Flyer, большой', 'FERPLAST-FLYER-L', '999.00', NULL, 40, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(94, 48, 'K9 Granit мячик, M', 'K9-GRANIT-M', '1499.00', NULL, 30, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(95, 48, 'K9 Granit мячик, L', 'K9-GRANIT-L', '1999.00', NULL, 20, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(96, 49, 'Chuckit! Ultra мячик, средний', 'CHUCKIT-ULTRA-M', '1299.00', NULL, 50, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(97, 49, 'Chuckit! Ultra мячик, большой', 'CHUCKIT-ULTRA-L', '1699.00', NULL, 35, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(98, 50, 'Rogz Grinz мячик зубастый, M', 'ROGZ-GRINZ-M', '1199.00', NULL, 45, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(99, 50, 'Rogz Grinz мячик зубастый, L', 'ROGZ-GRINZ-L', '1499.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(100, 51, 'Trixie Ортопедическая лежанка, S (50x40 см)', 'TRIXIE-ORTHO-S', '7999.00', NULL, 15, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(101, 51, 'Trixie Ортопедическая лежанка, M (70x50 см)', 'TRIXIE-ORTHO-M', '10999.00', NULL, 10, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(102, 52, 'Good Boy плед лежанка, S (60x45 см)', 'GOODBOY-PLED-S', '2999.00', NULL, 40, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(103, 52, 'Good Boy плед лежанка, L (90x65 см)', 'GOODBOY-PLED-L', '5999.00', NULL, 25, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(104, 53, 'Ferplast лежанка Carlotta, S (50 см диаметр)', 'FERPLAST-CARL-S', '3499.00', NULL, 35, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(105, 53, 'Ferplast лежанка Carlotta, M (70 см диаметр)', 'FERPLAST-CARL-M', '5999.00', NULL, 20, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(106, 54, 'Hunter лежанка Bavaria, M (75x55 см)', 'HUNTER-BAV-M', '6999.00', NULL, 20, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(107, 54, 'Hunter лежанка Bavaria, L (95x70 см)', 'HUNTER-BAV-L', '9999.00', NULL, 12, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(108, 55, 'PetFusion ортопедическая, M (71x53 см)', 'PETFUSION-M', '8999.00', NULL, 18, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(109, 55, 'PetFusion ортопедическая, L (91x66 см)', 'PETFUSION-L', '12999.00', NULL, 8, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(110, 56, 'Laifugy лежанка домик, S (60x45x30 см)', 'LAIFUGY-S', '4499.00', NULL, 30, 1, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(111, 56, 'Laifugy лежанка домик, M (80x60x35 см)', 'LAIFUGY-M', '6999.00', NULL, 20, 0, 1, '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(112, 23, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет, 4 кг', '1027343', '3739.00', NULL, 25, 0, 1, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(115, 23, 'Royal Canin Mini Adult Сухой корм для взрослых собак мелких размеров в возрасте от 10 месяцев до 8 лет, 8 кг', '1002775', '6719.00', NULL, 15, 0, 1, '2026-03-29 14:30:52', '2026-03-29 14:30:52'), +(116, 26, 'Ownat Adult Grain Free Сухой корм беззерновой для взрослых собак, с ягненком, 3 кг', '1042254', '3179.00', NULL, 5, 0, 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(117, 26, 'Ownat Adult Grain Free Сухой корм беззерновой для взрослых собак, с ягненком, 14 кг', '1044809', '9999.00', NULL, 10, 0, 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(118, 26, 'Ownat Adult Grain Free Сухой корм для взрослых собак, с уткой, 14 кг', '1044810', '8999.00', '9999.00', 0, 0, 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(119, 26, 'Ownat Adult Grain Free Сухой корм для взрослых собак, с уткой, 3 кг', '1044811', '3179.00', NULL, 15, 0, 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(120, 26, 'Ownat Adult Grain Free Сухой корм для взрослых собак, с курицей, 3 кг', '1040783', '2507.00', '2949.00', 20, 0, 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(121, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 1,2 кг', '1051779', '1839.00', NULL, 0, 1, 1, '2026-03-29 19:22:45', '2026-03-29 19:24:35'), +(122, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 2 кг', '1000715', '2945.00', NULL, 10, 0, 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(123, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 4 кг', '1003418', '5669.00', NULL, 0, 0, 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(124, 29, 'Royal Canin Sterilised 37 Regular Сухой корм для стерилизованных кошек с 1 до 7 лет, 10 кг', '1002563', '12815.00', NULL, 25, 0, 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(127, 30, 'AlphaPet Сухой корм для стерилизованных кошек, с ягненком и индейкой, 7 кг', '1066740', '7499.00', NULL, 0, 0, 1, '2026-03-29 19:45:46', '2026-03-29 19:45:46'), +(128, 35, 'Rungo Комбинезон теплый для собак породы мопс, длина спины 30 см, обхват шеи 43 см, обхват груди 60 см, красный (девочка)', '1054814', '2399.00', '2599.00', 3, 0, 1, '2026-03-29 20:12:19', '2026-03-29 20:12:19'), +(129, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, с кроликом и индейкой, 2 кг', '1040169', '3735.00', NULL, 5, 1, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(130, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, с кроликом и индейкой, 400 гр.', '1040168', '1125.00', NULL, 15, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(131, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, с кроликом и индейкой, 8 кг', '1063077', '11255.00', NULL, 5, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(132, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для стерилизованных кошек, с индейкой, 2 кг', '1063079', '3435.00', '3735.00', 5, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(133, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для стерилизованных кошек, с индейкой, 400 гр.', '1063078', '900.00', '1125.00', 0, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(134, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, четыре вида мяса, 400 гр.', '1040174', '1185.00', NULL, 8, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(135, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, четыре вида мяса, 2 кг', '1040175', '3915.00', NULL, 8, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(136, 57, 'GRANDORF Holistic Adult Sterilised Сухой корм для взрослых стерилизованных кошек, четыре вида мяса, 8 кг', '1065210', '11669.00', NULL, 15, 0, 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(137, 58, 'Ownat Adult Sterilized Grain Free Prime Сухой корм для стерилизованных кошек, с курицей и индейкой, 1 кг', '1040784', '1929.00', NULL, 10, 1, 1, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(138, 58, 'Ownat Adult Sterilized Grain Free Prime Сухой корм для стерилизованных кошек, с рыбой, 1 кг', '1061427', '2169.00', NULL, 5, 0, 1, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(139, 59, 'AlphaPet WOW Сухой корм для стерилизованных кошек с индейкой, 350 г', '1053735', '339.00', NULL, 10, 1, 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(140, 59, 'AlphaPet WOW Сухой корм для стерилизованных кошек с индейкой, 1,5 кг', '1053736', '1129.00', NULL, 10, 0, 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(141, 59, 'AlphaPet WOW Сухой корм для стерилизованных кошек с цыпленком, 350 г', '1053779', '339.00', NULL, 15, 0, 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `reviews` +-- + +CREATE TABLE `reviews` ( + `id` bigint(20) UNSIGNED NOT NULL, + `user_id` bigint(20) UNSIGNED NOT NULL, + `product_id` bigint(20) UNSIGNED NOT NULL, + `rating` tinyint(4) NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8mb4_unicode_ci NOT NULL, + `advantages` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disadvantages` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `helpful_count` int(11) NOT NULL DEFAULT 0, + `unhelpful_count` int(11) NOT NULL DEFAULT 0, + `is_approved` tinyint(1) NOT NULL DEFAULT 0, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `roles` +-- + +CREATE TABLE `roles` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `roles` +-- + +INSERT INTO `roles` (`id`, `name`, `slug`, `description`) VALUES +(1, 'Супер администратор', 'super_admin', 'Полный доступ ко всем функциям системы (обходит все проверки прав)'), +(2, 'Администратор магазина', 'shop_admin', 'Полное управление магазином, товарами и заказами'), +(3, 'Менеджер по товарам', 'product_manager', 'Управление каталогом товаров'), +(4, 'Менеджер по заказам', 'order_manager', 'Обработка заказов'), +(5, 'Кладовщик', 'warehouse_manager', 'Управление остатками товаров'), +(6, 'Зарегистрированный пользователь', 'registered_user', 'Обычный пользователь сайта'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `users` +-- + +CREATE TABLE `users` ( + `id` bigint(20) UNSIGNED NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `phone` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `email_verified_at` timestamp NULL DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `role_id` bigint(20) UNSIGNED DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `users` +-- + +INSERT INTO `users` (`id`, `name`, `email`, `phone`, `email_verified_at`, `password`, `remember_token`, `created_at`, `updated_at`, `role_id`) VALUES +(1, 'duckinahat', 'margaritaborodovskih@gmail.com', '+7(909)-090-86-13', NULL, '$2y$12$DA50T5Pr3l1EYQyf4/LYd.PmtAVm9bIXcF5lpqV5qiLV3hrCrOP2e', 'QncGrCIXhpPDpCigKEchTXoSyE2dFs9G0eCKTfnKBqKMFgfk1ltjx5mHBAmM', '2026-03-18 15:31:55', '2026-04-06 04:51:11', 1), +(2, 'user11', 'user1@mail.com', '+7(888)-888-88-88', NULL, '$2y$12$9Z5wZFaeK7UZ00o9MNvjDurBEc6.D.iWqYd3k3LauTmtgh3MNYw.S', NULL, '2026-04-01 14:45:38', '2026-04-04 12:16:40', 6); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `variation_attributes` +-- + +CREATE TABLE `variation_attributes` ( + `id` bigint(20) UNSIGNED NOT NULL, + `variation_id` bigint(20) UNSIGNED NOT NULL, + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `variation_attributes` +-- + +INSERT INTO `variation_attributes` (`id`, `variation_id`, `key`, `value`, `created_at`, `updated_at`) VALUES +(1, 22, 'color', 'Черный', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(2, 22, 'size', 'L', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(3, 23, 'color', 'Красный', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(4, 23, 'size', 'M', '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(49, 76, 'объем', '10 л', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(50, 77, 'объем', '20 л', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(51, 78, 'вес', '6 кг', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(52, 79, 'вес', '17 кг', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(53, 80, 'объем', '5 л', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(54, 81, 'объем', '10 л', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(55, 88, 'размер', 'S', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(56, 89, 'размер', 'M', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(57, 90, 'размер', 'стандарт', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(58, 91, 'размер', 'большой', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(59, 100, 'размер', 'S (50x40 см)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(60, 101, 'размер', 'M (70x50 см)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(61, 102, 'размер', 'S (60x45 см)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(62, 103, 'размер', 'L (90x65 см)', '2026-03-29 12:20:24', '2026-03-29 12:20:24'), +(63, 41, 'flavor', 'Ягненок', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(64, 41, 'weight', '2.7', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(65, 42, 'flavor', 'Ягненок', '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(66, 43, 'flavor', 'Лосось', '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(67, 43, 'weight', '0.5', '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(118, 49, 'flavor', 'Белая рыба', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(119, 49, 'weight', '2', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(120, 50, 'flavor', 'Белая рыба', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(121, 50, 'weight', '12', '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(122, 51, 'flavor', 'Лосось', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(123, 51, 'weight', '3', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(124, 52, 'flavor', 'Лосось', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(125, 52, 'weight', '14', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(126, 116, 'flavor', 'Ягненок', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(127, 116, 'weight', '3', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(128, 117, 'flavor', 'Ягненок', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(129, 117, 'weight', '14', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(130, 118, 'flavor', 'Утка', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(131, 118, 'weight', '14', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(132, 119, 'flavor', 'Утка', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(133, 119, 'weight', '3', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(134, 120, 'flavor', 'Курица', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(135, 120, 'weight', '3', '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(136, 53, 'flavor', 'Ягненок', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(137, 53, 'weight', '1', '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(138, 55, 'flavor', 'Тунец', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(139, 55, 'weight', '0.08', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(140, 56, 'flavor', 'Тунец с топпингом из лосося', '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(153, 45, 'flavor', 'Кукуруза', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(154, 45, 'weight', '0.8', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(155, 46, 'flavor', 'Кукуруза', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(156, 46, 'weight', '2', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(157, 112, 'flavor', 'Кукуруза', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(158, 112, 'weight', '4', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(159, 115, 'flavor', 'Кукуруза', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(160, 115, 'weight', '8', '2026-03-29 19:24:15', '2026-03-29 19:24:15'), +(161, 47, 'flavor', 'Ягненок, индейка', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(162, 47, 'weight', '0.4', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(163, 48, 'flavor', 'Ягненок, индейка', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(164, 48, 'weight', '1.5', '2026-03-29 19:24:26', '2026-03-29 19:24:26'), +(165, 57, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(166, 57, 'weight', '0.4', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(167, 58, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(168, 58, 'weight', '0.2', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(169, 121, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(170, 121, 'weight', '1.2', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(171, 122, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(172, 122, 'weight', '2', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(173, 123, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(174, 123, 'weight', '4', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(175, 124, 'flavor', 'Птица', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(176, 124, 'weight', '10', '2026-03-29 19:24:35', '2026-03-29 19:24:35'), +(200, 59, 'flavor', 'Ягненок, индейка', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(201, 59, 'weight', '0.4', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(202, 60, 'flavor', 'Ягненок, индейка', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(203, 60, 'weight', '1.5', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(204, 127, 'flavor', 'Ягненок, индейка', '2026-03-29 19:46:02', '2026-03-29 19:46:02'), +(208, 61, 'weight', '0.03', '2026-03-29 19:58:14', '2026-03-29 19:58:14'), +(209, 63, 'weight', '0.4', '2026-03-29 20:00:36', '2026-03-29 20:00:36'), +(210, 64, 'weight', '0.9', '2026-03-29 20:00:36', '2026-03-29 20:00:36'), +(211, 67, 'weight', '0.75', '2026-03-29 20:05:17', '2026-03-29 20:05:17'), +(217, 69, 'color', 'Шоколад', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(218, 69, 'size', 'XL', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(219, 70, 'color', 'Пудровый', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(220, 70, 'size', 'XL', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(221, 128, 'color', 'Красный', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(222, 128, 'size', 'L', '2026-03-29 20:12:37', '2026-03-29 20:12:37'), +(239, 137, 'flavor', 'Курица, индейка', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(240, 137, 'weight', '1', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(241, 138, 'flavor', 'Рыба', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(242, 138, 'weight', '1', '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(249, 139, 'flavor', 'Индейка', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(250, 139, 'weight', '0.35', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(251, 140, 'flavor', 'Индейка', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(252, 140, 'weight', '1.5', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(253, 141, 'flavor', 'Цыпленок', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(254, 141, 'weight', '0.35', '2026-03-30 07:05:45', '2026-03-30 07:05:45'), +(255, 129, 'flavor', 'Кролик, индейка', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(256, 129, 'weight', '2', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(257, 130, 'flavor', 'Кролик, индейка', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(258, 130, 'weight', '0.4', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(259, 131, 'flavor', 'Кролик, индейка', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(260, 131, 'weight', '8', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(261, 132, 'flavor', 'Индейка', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(262, 132, 'weight', '2', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(263, 133, 'flavor', 'Индейка', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(264, 133, 'weight', '0.4', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(265, 134, 'flavor', 'Мясо', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(266, 134, 'weight', '0.4', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(267, 135, 'flavor', 'Мясо', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(268, 135, 'weight', '2', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(269, 136, 'flavor', 'Мясо', '2026-03-31 16:14:19', '2026-03-31 16:14:19'), +(270, 136, 'weight', '8', '2026-03-31 16:14:19', '2026-03-31 16:14:19'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `variation_images` +-- + +CREATE TABLE `variation_images` ( + `id` bigint(20) UNSIGNED NOT NULL, + `variation_id` bigint(20) UNSIGNED NOT NULL, + `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sort_order` int(11) NOT NULL DEFAULT 0, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Volcado de datos para la tabla `variation_images` +-- + +INSERT INTO `variation_images` (`id`, `variation_id`, `path`, `sort_order`, `created_at`, `updated_at`) VALUES +(25, 22, 'assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_22/0.webp', 0, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(26, 22, 'assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_22/1.webp', 1, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(27, 23, 'assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_23/0.webp', 0, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(28, 23, 'assets/images/products/rungo-oseinik-neilonovyi-s-ruckoi-dlia-sobak-k-9-l/variation_23/1.webp', 1, '2026-03-28 18:14:26', '2026-03-28 18:14:26'), +(29, 41, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/0.webp', 0, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(30, 41, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/1.webp', 1, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(31, 41, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_41/2.webp', 2, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(32, 42, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/0.jpeg', 0, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(33, 42, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/1.webp', 1, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(34, 42, 'assets/images/products/grandin-hypoallergenic-iagnenok/variation_42/2.webp', 2, '2026-03-29 13:18:29', '2026-03-29 13:18:29'), +(35, 43, 'assets/images/products/klicker-adult/variation_43/0.webp', 0, '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(36, 43, 'assets/images/products/klicker-adult/variation_43/1.webp', 1, '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(37, 43, 'assets/images/products/klicker-adult/variation_43/2.webp', 2, '2026-03-29 13:41:32', '2026-03-29 13:41:32'), +(38, 45, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/0.webp', 0, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(39, 45, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/1.webp', 1, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(40, 45, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_45/2.webp', 2, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(41, 46, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/0.webp', 0, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(42, 46, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/1.webp', 1, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(43, 46, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_46/2.webp', 2, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(44, 112, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/0.webp', 0, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(45, 112, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/1.webp', 1, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(46, 112, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_112/2.webp', 2, '2026-03-29 14:07:03', '2026-03-29 14:07:03'), +(56, 115, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/0.webp', 0, '2026-03-29 14:30:52', '2026-03-29 14:30:52'), +(57, 115, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/1.webp', 1, '2026-03-29 14:30:52', '2026-03-29 14:30:52'), +(58, 115, 'assets/images/products/royal-canin-mini-adult-suxoi-korm-dlia-vzroslyx-sobak-melkix-razmerov-v-vozraste-ot-10-mesiacev-do-8-let/variation_115/2.webp', 2, '2026-03-29 14:30:52', '2026-03-29 14:30:52'), +(59, 47, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/0.webp', 0, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(60, 47, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/1.webp', 1, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(61, 47, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_47/2.webp', 2, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(62, 48, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/0.webp', 0, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(63, 48, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/1.webp', 1, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(64, 48, 'assets/images/products/avva-adult-suxoi-korm-na-osnove-svezego-miasa-dlia-vzroslyx-sobak-melkix-porod-s-iagnenkom-i-indeikoi/variation_48/2.webp', 2, '2026-03-29 17:16:40', '2026-03-29 17:16:40'), +(65, 49, 'assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_49/0.webp', 0, '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(66, 49, 'assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_49/1.webp', 1, '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(67, 50, 'assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_50/0.webp', 0, '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(68, 50, 'assets/images/products/alphapet-adult-monoprotein-suxoi-korm-dlia-sobak-srednix-i-krupnyx-porod-belaia-ryba/variation_50/1.webp', 1, '2026-03-29 18:45:42', '2026-03-29 18:45:42'), +(69, 51, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(70, 51, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(71, 51, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_51/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(72, 52, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(73, 52, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(74, 52, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_52/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(75, 116, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(76, 116, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(77, 116, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_116/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(78, 117, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(79, 117, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(80, 117, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_117/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(81, 118, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(82, 118, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(83, 118, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_118/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(84, 119, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(85, 119, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(86, 119, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_119/2.webp', 2, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(87, 120, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_120/0.webp', 0, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(88, 120, 'assets/images/products/ownat-grain-free-just-suxoi-korm-bezzernovoi-dlia-sobak/variation_120/1.webp', 1, '2026-03-29 19:03:16', '2026-03-29 19:03:16'), +(89, 53, 'assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/0.webp', 0, '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(90, 53, 'assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/1.webp', 1, '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(91, 53, 'assets/images/products/klicker-adult-sensitive-digestion-suxoi-korm-dlia-kosek-s-cuvstvitelnym-pishhevareniem/variation_53/2.webp', 2, '2026-03-29 19:06:53', '2026-03-29 19:06:53'), +(92, 55, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/0.webp', 0, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(93, 55, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/1.webp', 1, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(94, 55, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_55/2.webp', 2, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(95, 56, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/0.webp', 0, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(96, 56, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/1.webp', 1, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(97, 56, 'assets/images/products/grandin-holistic-vlaznyi-korm-konservy-dlia-vzroslyx-kosek/variation_56/2.webp', 2, '2026-03-29 19:12:47', '2026-03-29 19:12:47'), +(98, 57, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/0.webp', 0, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(99, 57, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/1.webp', 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(100, 57, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/2.webp', 2, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(101, 57, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_57/3.webp', 3, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(102, 58, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/0.webp', 0, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(103, 58, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/1.webp', 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(104, 58, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/2.webp', 2, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(105, 58, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_58/3.webp', 3, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(106, 121, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/0.webp', 0, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(107, 121, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/1.webp', 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(108, 121, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/2.webp', 2, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(109, 121, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_121/3.webp', 3, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(110, 122, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/0.webp', 0, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(111, 122, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/1.webp', 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(112, 122, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/2.webp', 2, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(113, 122, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_122/3.webp', 3, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(114, 123, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/0.webp', 0, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(115, 123, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/1.webp', 1, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(116, 123, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/2.webp', 2, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(117, 123, 'assets/images/products/royal-canin-sterilised-37-regular-suxoi-korm-dlia-sterilizovannyx-kosek-s-1-do-7-let/variation_123/3.webp', 3, '2026-03-29 19:22:45', '2026-03-29 19:22:45'), +(118, 59, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/0.webp', 0, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(119, 59, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/1.webp', 1, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(120, 59, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_59/2.webp', 2, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(121, 60, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/0.webp', 0, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(122, 60, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/1.webp', 1, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(123, 60, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_60/2.webp', 2, '2026-03-29 19:44:22', '2026-03-29 19:44:22'), +(133, 127, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/0.webp', 0, '2026-03-29 19:45:46', '2026-03-29 19:45:46'), +(134, 127, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/1.webp', 1, '2026-03-29 19:45:46', '2026-03-29 19:45:46'), +(135, 127, 'assets/images/products/alphapet-suxoi-korm-dlia-sterilizovannyx-kosek/variation_127/2.webp', 2, '2026-03-29 19:45:46', '2026-03-29 19:45:46'), +(136, 61, 'assets/images/products/tetra-min-holiday-korm-zele/variation_61/0.webp', 0, '2026-03-29 19:49:44', '2026-03-29 19:49:44'), +(137, 63, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/0.webp', 0, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(138, 63, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/1.webp', 1, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(139, 63, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_63/2.webp', 2, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(140, 64, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/0.webp', 0, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(141, 64, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/1.webp', 1, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(142, 64, 'assets/images/products/little-one-korm-dlia-morskix-svinok/variation_64/2.webp', 2, '2026-03-29 19:55:44', '2026-03-29 19:55:44'), +(143, 67, 'assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/0.webp', 0, '2026-03-29 20:05:17', '2026-03-29 20:05:17'), +(144, 67, 'assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/1.webp', 1, '2026-03-29 20:05:17', '2026-03-29 20:05:17'), +(145, 67, 'assets/images/products/little-one-korm-dlia-morskix-svinok-zelenaia-dolina/variation_67/2.webp', 2, '2026-03-29 20:05:17', '2026-03-29 20:05:17'), +(146, 69, 'assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_69/0.webp', 0, '2026-03-29 20:12:19', '2026-03-29 20:12:19'), +(147, 70, 'assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_70/0.webp', 0, '2026-03-29 20:12:19', '2026-03-29 20:12:19'), +(148, 128, 'assets/images/products/rungo-kombinezon-teplyi-dlia-sobak-porody-mops/variation_128/0.webp', 0, '2026-03-29 20:12:19', '2026-03-29 20:12:19'), +(149, 129, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(150, 129, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(151, 129, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_129/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(152, 130, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(153, 130, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(154, 130, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_130/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(155, 131, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(156, 131, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(157, 131, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_131/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(158, 132, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(159, 132, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(160, 132, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_132/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(161, 133, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(162, 133, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(163, 133, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_133/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(164, 134, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(165, 134, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(166, 134, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_134/2.webp', 2, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(167, 135, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/0.webp', 0, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(168, 135, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/1.webp', 1, '2026-03-30 06:08:32', '2026-03-30 06:08:32'), +(169, 137, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/0.webp', 0, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(170, 137, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/1.webp', 1, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(171, 137, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_137/2.webp', 2, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(172, 138, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/0.webp', 0, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(173, 138, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/1.webp', 1, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(174, 138, 'assets/images/products/ownat-adult-sterilized-grain-free-prime-suxoi-korm-dlia-sterilizovannyx-kosek/variation_138/2.webp', 2, '2026-03-30 06:56:38', '2026-03-30 06:56:38'), +(175, 139, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_139/0.webp', 0, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(176, 139, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_139/1.webp', 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(177, 140, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_140/0.webp', 0, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(178, 140, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_140/1.webp', 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(179, 141, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_141/0.webp', 0, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(180, 141, 'assets/images/products/alphapet-wow-suxoi-korm-dlia-sterilizovannyx-kosek/variation_141/1.webp', 1, '2026-03-30 07:01:27', '2026-03-30 07:01:27'), +(181, 135, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_135/2.webp', 2, NULL, NULL), +(182, 136, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/0.webp', 0, NULL, NULL), +(183, 136, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/1.webp', 1, NULL, NULL), +(184, 136, 'assets/images/products/grandorf-holistic-adult-sterilised-suxoi-korm-dlia-vzroslyx-sterilizovannyx-kosek/variation_136/2.webp', 2, NULL, NULL); + +-- +-- Índices para tablas volcadas +-- + +-- +-- Indices de la tabla `brands` +-- +ALTER TABLE `brands` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `brands_slug_unique` (`slug`); + +-- +-- Indices de la tabla `cart_items` +-- +ALTER TABLE `cart_items` + ADD PRIMARY KEY (`id`), + ADD KEY `cart_items_variation_id_foreign` (`variation_id`), + ADD KEY `cart_items_user_id_session_id_index` (`user_id`,`session_id`), + ADD KEY `cart_items_session_id_index` (`session_id`); + +-- +-- Indices de la tabla `categories` +-- +ALTER TABLE `categories` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `categories_slug_unique` (`slug`), + ADD UNIQUE KEY `categories_name_parent_id_unique` (`name`,`parent_id`), + ADD KEY `categories_parent_id_index` (`parent_id`), + ADD KEY `categories_sort_order_index` (`sort_order`); + +-- +-- Indices de la tabla `contacts` +-- +ALTER TABLE `contacts` + ADD PRIMARY KEY (`id`); + +-- +-- Indices de la tabla `failed_jobs` +-- +ALTER TABLE `failed_jobs` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`); + +-- +-- Indices de la tabla `migrations` +-- +ALTER TABLE `migrations` + ADD PRIMARY KEY (`id`); + +-- +-- Indices de la tabla `orders` +-- +ALTER TABLE `orders` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `orders_order_number_unique` (`order_number`), + ADD KEY `orders_user_id_foreign` (`user_id`); + +-- +-- Indices de la tabla `order_items` +-- +ALTER TABLE `order_items` + ADD PRIMARY KEY (`id`), + ADD KEY `order_items_order_id_foreign` (`order_id`), + ADD KEY `order_items_variation_id_foreign` (`variation_id`); + +-- +-- Indices de la tabla `password_reset_tokens` +-- +ALTER TABLE `password_reset_tokens` + ADD PRIMARY KEY (`email`); + +-- +-- Indices de la tabla `permissions` +-- +ALTER TABLE `permissions` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `permissions_name_unique` (`name`), + ADD UNIQUE KEY `permissions_slug_unique` (`slug`); + +-- +-- Indices de la tabla `permission_role` +-- +ALTER TABLE `permission_role` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `permission_role_permission_id_role_id_unique` (`permission_id`,`role_id`), + ADD KEY `permission_role_role_id_foreign` (`role_id`); + +-- +-- Indices de la tabla `personal_access_tokens` +-- +ALTER TABLE `personal_access_tokens` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `personal_access_tokens_token_unique` (`token`), + ADD KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`); + +-- +-- Indices de la tabla `products` +-- +ALTER TABLE `products` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `products_slug_unique` (`slug`), + ADD KEY `products_brand_id_index` (`brand_id`), + ADD KEY `products_category_id_index` (`category_id`), + ADD KEY `products_is_active_index` (`is_active`); + +-- +-- Indices de la tabla `product_attributes` +-- +ALTER TABLE `product_attributes` + ADD PRIMARY KEY (`id`), + ADD KEY `product_attributes_product_id_key_index` (`product_id`,`key`); + +-- +-- Indices de la tabla `product_variations` +-- +ALTER TABLE `product_variations` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `product_variations_sku_unique` (`sku`), + ADD KEY `product_variations_sku_index` (`sku`), + ADD KEY `product_variations_product_id_index` (`product_id`); + +-- +-- Indices de la tabla `reviews` +-- +ALTER TABLE `reviews` + ADD PRIMARY KEY (`id`), + ADD KEY `reviews_user_id_foreign` (`user_id`), + ADD KEY `reviews_product_id_foreign` (`product_id`), + ADD KEY `reviews_rating_index` (`rating`), + ADD KEY `reviews_is_approved_index` (`is_approved`), + ADD KEY `reviews_created_at_index` (`created_at`); + +-- +-- Indices de la tabla `roles` +-- +ALTER TABLE `roles` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `roles_name_unique` (`name`), + ADD UNIQUE KEY `roles_slug_unique` (`slug`); + +-- +-- Indices de la tabla `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `users_email_unique` (`email`), + ADD KEY `users_phone_index` (`phone`), + ADD KEY `users_email_index` (`email`), + ADD KEY `users_role_id_foreign` (`role_id`); + +-- +-- Indices de la tabla `variation_attributes` +-- +ALTER TABLE `variation_attributes` + ADD PRIMARY KEY (`id`), + ADD KEY `variation_attributes_variation_id_key_index` (`variation_id`,`key`); + +-- +-- Indices de la tabla `variation_images` +-- +ALTER TABLE `variation_images` + ADD PRIMARY KEY (`id`), + ADD KEY `variation_images_variation_id_sort_order_index` (`variation_id`,`sort_order`); + +-- +-- AUTO_INCREMENT de las tablas volcadas +-- + +-- +-- AUTO_INCREMENT de la tabla `brands` +-- +ALTER TABLE `brands` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17; + +-- +-- AUTO_INCREMENT de la tabla `cart_items` +-- +ALTER TABLE `cart_items` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; + +-- +-- AUTO_INCREMENT de la tabla `categories` +-- +ALTER TABLE `categories` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=66; + +-- +-- AUTO_INCREMENT de la tabla `contacts` +-- +ALTER TABLE `contacts` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; + +-- +-- AUTO_INCREMENT de la tabla `failed_jobs` +-- +ALTER TABLE `failed_jobs` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT de la tabla `migrations` +-- +ALTER TABLE `migrations` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=37; + +-- +-- AUTO_INCREMENT de la tabla `orders` +-- +ALTER TABLE `orders` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT de la tabla `order_items` +-- +ALTER TABLE `order_items` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; + +-- +-- AUTO_INCREMENT de la tabla `permissions` +-- +ALTER TABLE `permissions` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16; + +-- +-- AUTO_INCREMENT de la tabla `permission_role` +-- +ALTER TABLE `permission_role` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=38; + +-- +-- AUTO_INCREMENT de la tabla `personal_access_tokens` +-- +ALTER TABLE `personal_access_tokens` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT de la tabla `products` +-- +ALTER TABLE `products` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=60; + +-- +-- AUTO_INCREMENT de la tabla `product_attributes` +-- +ALTER TABLE `product_attributes` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=207; + +-- +-- AUTO_INCREMENT de la tabla `product_variations` +-- +ALTER TABLE `product_variations` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=142; + +-- +-- AUTO_INCREMENT de la tabla `reviews` +-- +ALTER TABLE `reviews` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT de la tabla `roles` +-- +ALTER TABLE `roles` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; + +-- +-- AUTO_INCREMENT de la tabla `users` +-- +ALTER TABLE `users` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; + +-- +-- AUTO_INCREMENT de la tabla `variation_attributes` +-- +ALTER TABLE `variation_attributes` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=271; + +-- +-- AUTO_INCREMENT de la tabla `variation_images` +-- +ALTER TABLE `variation_images` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=185; + +-- +-- Restricciones para tablas volcadas +-- + +-- +-- Filtros para la tabla `cart_items` +-- +ALTER TABLE `cart_items` + ADD CONSTRAINT `cart_items_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `cart_items_variation_id_foreign` FOREIGN KEY (`variation_id`) REFERENCES `product_variations` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `categories` +-- +ALTER TABLE `categories` + ADD CONSTRAINT `categories_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `orders` +-- +ALTER TABLE `orders` + ADD CONSTRAINT `orders_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL; + +-- +-- Filtros para la tabla `order_items` +-- +ALTER TABLE `order_items` + ADD CONSTRAINT `order_items_order_id_foreign` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `order_items_variation_id_foreign` FOREIGN KEY (`variation_id`) REFERENCES `product_variations` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `permission_role` +-- +ALTER TABLE `permission_role` + ADD CONSTRAINT `permission_role_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `permission_role_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `products` +-- +ALTER TABLE `products` + ADD CONSTRAINT `products_brand_id_foreign` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`) ON DELETE SET NULL, + ADD CONSTRAINT `products_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `product_attributes` +-- +ALTER TABLE `product_attributes` + ADD CONSTRAINT `product_attributes_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `product_variations` +-- +ALTER TABLE `product_variations` + ADD CONSTRAINT `product_variations_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `reviews` +-- +ALTER TABLE `reviews` + ADD CONSTRAINT `reviews_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `reviews_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `users` +-- +ALTER TABLE `users` + ADD CONSTRAINT `users_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE SET NULL; + +-- +-- Filtros para la tabla `variation_attributes` +-- +ALTER TABLE `variation_attributes` + ADD CONSTRAINT `variation_attributes_variation_id_foreign` FOREIGN KEY (`variation_id`) REFERENCES `product_variations` (`id`) ON DELETE CASCADE; + +-- +-- Filtros para la tabla `variation_images` +-- +ALTER TABLE `variation_images` + ADD CONSTRAINT `variation_images_variation_id_foreign` FOREIGN KEY (`variation_id`) REFERENCES `product_variations` (`id`) ON DELETE CASCADE; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..e6b9960 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $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..56af264 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Http/Controllers/Admin/BrandsController.php b/app/Http/Controllers/Admin/BrandsController.php new file mode 100644 index 0000000..48e4301 --- /dev/null +++ b/app/Http/Controllers/Admin/BrandsController.php @@ -0,0 +1,122 @@ +paginate(5); + return view('admin.brands.brands', compact('brands')); + } + + public function store(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:brands', + 'description' => 'nullable|string', + 'logo' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'website' => 'nullable|url|max:255', + 'country' => 'nullable|string|max:100', + 'is_active' => 'nullable|boolean', + ], [ + 'name.required' => 'Название бренда обязательно', + 'name.unique' => 'Бренд с таким названием уже существует', + 'name.max' => 'Название не может быть длиннее 255 символов', + 'logo.image' => 'Загрузите изображение (jpg, png, svg)', + 'logo.max' => 'Изображение не должно превышать 2 МБ', + 'website.url' => 'Введите корректный URL сайта', + 'website.max' => 'URL сайта не может быть длиннее 255 символов', + 'country.max' => 'Название страны не может быть длиннее 100 символов', + ]); + + if ($request->hasFile('logo')) { + $logo = $request->file('logo'); + $logoName = Str::slug($request->name) . '.' . $logo->getClientOriginalExtension(); + $logo->move(public_path('assets/images/brands'), $logoName); + $validated['logo'] = $logoName; + } + + $validated['slug'] = Str::slug($request->name); + + $validated['is_active'] = $request->has('is_active'); + + Brand::create($validated); + + return redirect()->route('admin.brands') + ->with('success', 'Бренд "' . $request->name . '" успешно создан'); + } + + public function edit($id) + { + $brand = Brand::findOrFail($id); + return view('admin.brands.edit', compact('brand')); + } + + public function update(Request $request, $id) + { + $brand = Brand::findOrFail($id); + + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'logo' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'website' => 'nullable|url|max:255', + 'country' => 'nullable|string|max:100', + 'is_active' => 'nullable|boolean', + ], [ + 'name.required' => 'Название бренда обязательно', + 'name.max' => 'Название не может быть длиннее 255 символов', + 'logo.image' => 'Загрузите изображение (jpg, png, svg)', + 'logo.mimes' => 'Изображение должно быть в форматах: jpg, jpeg, png, svg', + 'logo.max' => 'Изображение не должно превышать 2 МБ', + 'website.url' => 'Введите корректный URL сайта', + 'website.max' => 'URL сайта не может быть длиннее 255 символов', + 'country.max' => 'Название страны не может быть длиннее 100 символов', + ]); + + $brand->name = $validated['name']; + $brand->description = $validated['description']; + $brand->website = $validated['website']; + $brand->country = $validated['country']; + $brand->is_active = $request->has('is_active'); + + if ($request->hasFile('logo')) { + if ($brand->logo && file_exists(public_path('assets/images/brands/' . $brand->logo))) { + unlink(public_path('assets/images/brands/' . $brand->logo)); + } + + $logo = $request->file('logo'); + $logoName = Str::slug($request->name) . '.' . $logo->getClientOriginalExtension(); + $logo->move(public_path('assets/images/brands'), $logoName); + $brand->logo = $logoName; + } + + $brand->save(); + + return redirect()->route('admin.brands') + ->with('success', 'Бренд "' . $brand->name . '" успешно обновлен'); + } + + public function destroy($id) + { + $brand = Brand::findOrFail($id); + + $brandName = $brand->name; + + if ($brand->logo && file_exists(public_path('assets/images/brands/' . $brand->logo))) { + unlink(public_path('assets/images/brands/' . $brand->logo)); + } + + $brand->delete(); + + return redirect()->route('admin.brands')->with('success', 'Бренд "' . $brandName . '" успешно удален'); + } +} diff --git a/app/Http/Controllers/Admin/CategoriesController.php b/app/Http/Controllers/Admin/CategoriesController.php new file mode 100644 index 0000000..b60c249 --- /dev/null +++ b/app/Http/Controllers/Admin/CategoriesController.php @@ -0,0 +1,217 @@ +parent_id) + ->where('sort_order', '<', $category->sort_order) + ->orderBy('sort_order', 'desc') + ->first(); + + if ($previous) { + $temp = $category->sort_order; + $category->sort_order = $previous->sort_order; + $previous->sort_order = $temp; + + $category->save(); + $previous->save(); + } + + return redirect()->route('admin.categories')->with('success', 'Порядок категорий обновлен'); + } + + public function moveDown($id) + { + $category = Category::findOrFail($id); + + $next = Category::where('parent_id', $category->parent_id) + ->where('sort_order', '>', $category->sort_order) + ->orderBy('sort_order', 'asc') + ->first(); + + if ($next) { + $temp = $category->sort_order; + $category->sort_order = $next->sort_order; + $next->sort_order = $temp; + + $category->save(); + $next->save(); + } + + return redirect()->route('admin.categories')->with('success', 'Порядок категорий обновлен'); + } + + public function store(Request $request) + { + $validated = $request->validate([ + 'parent_id' => 'nullable|exists:categories,id', + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'icon' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'image' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'is_active' => 'nullable|boolean', + ], [ + 'name.required' => 'Название категории обязательно', + 'name.max' => 'Название не может быть длиннее 255 символов', + 'icon.image' => 'Загрузите изображение (jpg, png, svg)', + 'icon.max' => 'Изображение не должно превышать 2 МБ', + 'image.image' => 'Загрузите изображение (jpg, png, svg)', + 'image.max' => 'Изображение не должно превышать 2 МБ', + 'parent_id.exists' => 'Выбранная родительская категория не существует', + ]); + + if ($request->hasFile('icon')) { + $icon = $request->file('icon'); + $iconName = Str::slug($request->name) . '_icon.' . $icon->getClientOriginalExtension(); + $icon->move(public_path('assets/images/categories/icons'), $iconName); + $validated['icon'] = $iconName; + } + + if ($request->hasFile('image')) { + $image = $request->file('image'); + $imageName = Str::slug($request->name) . '_image.' . $image->getClientOriginalExtension(); + $image->move(public_path('assets/images/categories/images'), $imageName); + $validated['image'] = $imageName; + } + + $validated['slug'] = Str::slug($request->name); + + if (Category::where('slug', $validated['slug'])->exists()) { + $validated['slug'] = $validated['slug'] . '-' . uniqid(); + } + + $validated['is_active'] = $request->has('is_active'); + $validated['sort_order'] = Category::where('parent_id', $request->parent_id)->max('sort_order') + 10; + + Category::create($validated); + + return redirect()->route('admin.categories') + ->with('success', 'Категория "' . $request->name . '" успешно создана'); + } + + public function edit($id) + { + $category = Category::findOrFail($id); + + $allCategories = Category::with('parent') + ->get() + ->map(function ($cat) use ($category) { + $cat->level = $cat->calculateLevel(); + $cat->disabled = $cat->id == $category->id || $cat->isDescendantOf($category->id); + return $cat; + }) + ->filter(function ($cat) { + return $cat->level < 2; + }); + + return view('admin.categories.edit', compact('category', 'allCategories')); + } + + public function update(Request $request, $id) + { + $category = Category::findOrFail($id); + + $validated = $request->validate([ + 'parent_id' => 'nullable|exists:categories,id', + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'icon' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'image' => 'nullable|image|mimes:jpg,jpeg,png,svg|max:2048', + 'is_active' => 'nullable|boolean', + 'remove_icon' => 'nullable|boolean', + 'remove_image' => 'nullable|boolean', + ], [ + 'name.required' => 'Название категории обязательно', + 'name.max' => 'Название не может быть длиннее 255 символов', + 'icon.image' => 'Загрузите изображение (jpg, png, svg)', + 'icon.max' => 'Изображение не должно превышать 2 МБ', + 'image.image' => 'Загрузите изображение (jpg, png, svg)', + 'image.max' => 'Изображение не должно превышать 2 МБ', + 'parent_id.exists' => 'Выбранная родительская категория не существует', + ]); + + $category->name = $validated['name']; + $category->description = $validated['description']; + $category->parent_id = $validated['parent_id']; + $category->is_active = $request->has('is_active'); + + if ($request->hasFile('icon')) { + if ($category->icon && file_exists(public_path('assets/images/categories/icons/' . $category->icon))) { + unlink(public_path('assets/images/categories/icons/' . $category->icon)); + } + + $icon = $request->file('icon'); + $iconName = Str::slug($request->name) . '_icon.' . $icon->getClientOriginalExtension(); + $icon->move(public_path('assets/images/categories/icons'), $iconName); + $category->icon = $iconName; + } + + if ($request->has('remove_icon') && $request->remove_icon == 1) { + if ($category->icon && file_exists(public_path('assets/images/categories/icons/' . $category->icon))) { + unlink(public_path('assets/images/categories/icons/' . $category->icon)); + } + $category->icon = null; + } + + if ($request->hasFile('image')) { + if ($category->image && file_exists(public_path('assets/images/categories/images/' . $category->image))) { + unlink(public_path('assets/images/categories/images/' . $category->image)); + } + + $image = $request->file('image'); + $imageName = Str::slug($request->name) . '_image.' . $image->getClientOriginalExtension(); + $image->move(public_path('assets/images/categories/images'), $imageName); + $category->image = $imageName; + } + + if ($request->has('remove_image') && $request->remove_image == 1) { + if ($category->image && file_exists(public_path('assets/images/categories/images/' . $category->image))) { + unlink(public_path('assets/images/categories/images/' . $category->image)); + } + $category->image = null; + } + + $category->save(); + + return redirect()->route('admin.categories') + ->with('success', 'Категория "' . $category->name . '" успешно обновлена'); + } + + public function destroy($id) + { + $category = Category::findOrFail($id); + $categoryName = $category->name; + + if ($category->icon && file_exists(public_path('assets/images/categories/icons/' . $category->icon))) { + unlink(public_path('assets/images/categories/icons/' . $category->icon)); + } + + if ($category->image && file_exists(public_path('assets/images/categories/images/' . $category->image))) { + unlink(public_path('assets/images/categories/images/' . $category->image)); + } + + $category->delete(); + + return redirect()->route('admin.categories') + ->with('success', 'Категория "' . $categoryName . '" успешно удалена'); + } +} diff --git a/app/Http/Controllers/Admin/ContactController.php b/app/Http/Controllers/Admin/ContactController.php new file mode 100644 index 0000000..dfae30e --- /dev/null +++ b/app/Http/Controllers/Admin/ContactController.php @@ -0,0 +1,90 @@ + 'Хвостики и лапки' + ]); + } + + return view('admin.contacts.edit', compact('contact')); + } + + public function update(Request $request) + { + $contact = Contact::first(); + + if (!$contact) { + $contact = Contact::create(); + } + + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string|max:255', + 'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg,webp|max:2048', + 'favicon' => 'nullable|image|mimes:ico,png,svg|max:1024', + 'phone' => 'nullable|string|max:255', + 'email' => 'nullable|email|max:255', + 'address' => 'nullable|string|max:255', + 'work_hours' => 'nullable|string|max:255', + 'telegram' => 'nullable|string|max:255', + 'whatsapp' => 'nullable|string|max:255', + 'vkontakte' => 'nullable|string|max:255', + 'meta_title' => 'nullable|string|max:255', + 'meta_description' => 'nullable|string', + 'meta_keywords' => 'nullable|string' + ]); + + if ($request->hasFile('logo')) { + if ($contact->logo && file_exists(public_path('assets/images/logo/' . $contact->logo))) { + unlink(public_path('assets/images/logo/' . $contact->logo)); + } + + $logoFile = $request->file('logo'); + $logoName = time() . '_logo.' . $logoFile->getClientOriginalExtension(); + $logoFile->move(public_path('assets/images/logo'), $logoName); + $contact->logo = $logoName; + } + + if ($request->hasFile('favicon')) { + if ($contact->favicon && file_exists(public_path('assets/images/logo/' . $contact->favicon))) { + unlink(public_path('assets/images/logo/' . $contact->favicon)); + } + + $faviconFile = $request->file('favicon'); + $faviconName = time() . '_favicon.' . $faviconFile->getClientOriginalExtension(); + $faviconFile->move(public_path('assets/images/logo'), $faviconName); + $contact->favicon = $faviconName; + } + + $contact->update([ + 'name' => $request->name, + 'description' => $request->description, + 'phone' => $request->phone, + 'email' => $request->email, + 'address' => $request->address, + 'work_hours' => $request->work_hours, + 'telegram' => $request->telegram, + 'whatsapp' => $request->whatsapp, + 'vkontakte' => $request->vkontakte, + 'meta_title' => $request->meta_title, + 'meta_description' => $request->meta_description, + 'meta_keywords' => $request->meta_keywords + ]); + + return redirect()->route('admin.contacts.edit') + ->with('success', 'Данные сайта успешно обновлены'); + } +} diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php new file mode 100644 index 0000000..7f6ee26 --- /dev/null +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -0,0 +1,31 @@ + User::count(), + 'totalProducts' => ProductVariation::count(), + 'totalOrders' => Order::count(), + 'recentOrders' => Order::with('user') + ->orderBy('created_at', 'desc') + ->limit(5) + ->get(), + 'popularProducts' => OrderItem::popular(10)->get(), + 'monthlyRevenue' => Order::getMonthlyRevenue(), + + ]; + return view('admin.dashboard', $data); + } +} diff --git a/app/Http/Controllers/Admin/OrdersController.php b/app/Http/Controllers/Admin/OrdersController.php new file mode 100644 index 0000000..7b249d8 --- /dev/null +++ b/app/Http/Controllers/Admin/OrdersController.php @@ -0,0 +1,61 @@ +filled('search')) { + $query->where('order_number', 'like', "%{$request->search}%"); + } + + // Фильтр по статусу + if ($request->filled('status')) { + $query->where('delivery_status', $request->status); + } + + $orders = $query->orderBy('created_at', 'desc')->paginate(20); + + return view('admin.orders.orders', compact('orders')); + } + + /** + * Детали заказа + */ + public function show($id) + { + $order = Order::with(['user', 'items.variation.product'])->findOrFail($id); + return view('admin.orders.show', compact('order')); + } + + /** + * Обновление статуса заказа + */ + public function updateStatus(Request $request, $id) + { + $request->validate([ + 'delivery_status' => 'required|in:pending,processing,shipped,delivered,cancelled', + 'payment_status' => 'required|in:pending,paid,failed' + ]); + + $order = Order::findOrFail($id); + $order->update([ + 'delivery_status' => $request->delivery_status, + 'payment_status' => $request->payment_status + ]); + + return redirect()->route('admin.orders.show', $order->id) + ->with('success', 'Статус заказа обновлен'); + } +} diff --git a/app/Http/Controllers/Admin/PermissionsController.php b/app/Http/Controllers/Admin/PermissionsController.php new file mode 100644 index 0000000..aef51aa --- /dev/null +++ b/app/Http/Controllers/Admin/PermissionsController.php @@ -0,0 +1,107 @@ +orderBy('name')->paginate(10); + return view('admin.permissions.permissions', compact('permissions')); + } + + /** + * Сохранить новое право + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255|unique:permissions', + 'slug' => 'required|string|max:255|unique:permissions', + 'group' => 'nullable|string|max:255', + 'description' => 'nullable|string' + ], [ + 'name.required' => 'Обязательно для заполнения', + 'name.unique' => 'Право с таким названием уже существует', + 'slug.required' => 'Обязательно для заполнения', + 'slug.unique' => 'Право с таким slug уже существует' + ]); + + Permission::create([ + 'name' => $request->name, + 'slug' => $request->slug, + 'group' => $request->group, + 'description' => $request->description + ]); + + return redirect()->route('admin.permissions') + ->with('success', 'Право "' . $request->name . '" успешно создано'); + } + + /** + * Форма редактирования + */ + public function edit($id) + { + $permission = Permission::findOrFail($id); + return view('admin.permissions.edit', compact('permission')); + } + + /** + * Обновить право + */ + public function update(Request $request, $id) + { + $permission = Permission::findOrFail($id); + + $request->validate([ + 'name' => 'required|string|max:255|unique:permissions,name,' . $id, + 'slug' => 'required|string|max:255|unique:permissions,slug,' . $id, + 'group' => 'nullable|string|max:255', + 'description' => 'nullable|string' + ], [ + 'name.required' => 'Обязательно для заполнения', + 'name.unique' => 'Право с таким названием уже существует', + 'slug.required' => 'Обязательно для заполнения', + 'slug.unique' => 'Право с таким slug уже существует' + ]); + + $permission->update([ + 'name' => $request->name, + 'slug' => $request->slug, + 'group' => $request->group, + 'description' => $request->description + ]); + + return redirect()->route('admin.permissions') + ->with('success', 'Право "' . $permission->name . '" успешно обновлено'); + } + + /** + * Удалить право + */ + public function destroy($id) + { + $permission = Permission::findOrFail($id); + + $rolesCount = $permission->roles()->count(); + + $permissionName = $permission->name; + $permission->delete(); + + $message = 'Право "' . $permissionName . '" успешно удалено'; + if ($rolesCount > 0) { + $message .= ' Право было удалено у ' . $rolesCount . ' ролей.'; + } + + return redirect()->route('admin.permissions') + ->with('success', $message); + } +} diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php new file mode 100644 index 0000000..6b2e6ee --- /dev/null +++ b/app/Http/Controllers/Admin/ProductController.php @@ -0,0 +1,722 @@ +orderBy('created_at', 'desc') + ->paginate(15); + + return view('admin.products.products', compact('products')); + } + + public function create() + { + $categories = Category::getFlatTree(); + $brands = Brand::active()->orderBy('name')->get(); + + return view('admin.products.create', compact('categories', 'brands')); + } + + public function store(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'category_id' => 'required|exists:categories,id', + 'brand_id' => 'nullable|exists:brands,id', + 'description' => 'nullable|string', + 'is_active' => 'nullable|boolean', + + 'meta_title' => 'nullable|string|max:255', + 'meta_description' => 'nullable|string', + 'meta_keywords' => 'nullable|string', + + 'attributes' => 'nullable|array', + 'attributes.*.key' => 'nullable|string', + 'attributes.*.value' => 'nullable|string', + + 'variations' => 'required|array|min:1', + 'variations.*.name' => 'required|string|max:255', + 'variations.*.sku' => 'required|string|max:100|unique:product_variations,sku', + 'variations.*.price' => 'required|numeric|min:0', + 'variations.*.old_price' => 'nullable|numeric|min:0', + 'variations.*.stock' => 'required|integer|min:0', + 'variations.*.is_default' => 'nullable|boolean', + 'variations.*.attributes' => 'nullable|array', + 'variations.*.attributes.flavor' => 'nullable|string|max:100', + 'variations.*.attributes.color' => 'nullable|string|max:100', + 'variations.*.attributes.size' => 'nullable|string|max:50', + 'variations.*.attributes.weight' => 'nullable|numeric|min:0', + + 'variations.*.images' => 'nullable|array', + 'variations.*.images.*' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048', + ], [ + 'name.required' => 'Название товара обязательно', + 'category_id.required' => 'Выберите категорию', + 'variations.required' => 'Добавьте хотя бы одну вариацию', + 'variations.*.name.required' => 'Название вариации обязательно', + 'variations.*.sku.required' => 'Артикул обязателен', + 'variations.*.sku.unique' => 'Артикул "{value}" уже существует', + 'variations.*.price.required' => 'Цена обязательна', + 'variations.*.stock.required' => 'Количество обязательно', + 'variations.*.images.*.image' => 'Файл должен быть изображением', + 'variations.*.images.*.mimes' => 'Допустимые форматы: jpg, jpeg, png, webp', + 'variations.*.images.*.max' => 'Размер изображения не должен превышать 2 МБ', + ]); + + DB::beginTransaction(); + + try { + $slug = Str::slug($request->name); + $baseSlug = $slug; + $counter = 1; + while (Product::where('slug', $slug)->exists()) { + $slug = $baseSlug . '-' . $counter; + $counter++; + } + + $product = Product::create([ + 'name' => $validated['name'], + 'slug' => $slug, + 'category_id' => $validated['category_id'], + 'brand_id' => $validated['brand_id'] ?? null, + 'description' => $validated['description'] ?? null, + 'is_active' => $request->boolean('is_active'), + 'meta_title' => $validated['meta_title'] ?? null, + 'meta_description' => $validated['meta_description'] ?? null, + 'meta_keywords' => $validated['meta_keywords'] ?? null, + ]); + + // Сохраняем атрибуты товара + if (!empty($validated['attributes'])) { + foreach ($validated['attributes'] as $attr) { + if (!empty($attr['key']) && !empty($attr['value'])) { + ProductAttribute::create([ + 'product_id' => $product->id, + 'key' => $attr['key'], + 'value' => $attr['value'], + ]); + } + } + } + + // Создаем вариации + foreach ($validated['variations'] as $index => $variationData) { + $variation = ProductVariation::create([ + 'product_id' => $product->id, + 'name' => $variationData['name'], + 'sku' => $variationData['sku'], + 'price' => $variationData['price'], + 'old_price' => $variationData['old_price'] ?? null, + 'stock' => $variationData['stock'], + 'is_default' => $variationData['is_default'] ?? ($index == 0), + 'is_active' => true, + ]); + + // Сохраняем атрибуты вариации + if (!empty($variationData['attributes'])) { + foreach ($variationData['attributes'] as $key => $value) { + if (!empty($value) || $value === 0 || $value === '0') { + VariationAttribute::create([ + 'variation_id' => $variation->id, + 'key' => $key, + 'value' => $value, + ]); + } + } + } + + // Сохраняем изображения + if ($request->hasFile("variations.{$index}.images")) { + $files = $request->file("variations.{$index}.images"); + $validFiles = array_filter($files, function ($file) { + return $file !== null && $file->isValid(); + }); + + if (!empty($validFiles)) { + $this->saveVariationImages($validFiles, $product->slug, $variation->id); + } + } + } + + DB::commit(); + + return redirect()->route('admin.products.create') + ->with('success', 'Товар "' . $product->name . '" успешно создан'); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('Product create error: ' . $e->getMessage()); + return redirect()->back() + ->withInput() + ->with('error', 'Ошибка при создании товара: ' . $e->getMessage()); + } + } + + public function edit($id) + { + $product = Product::with(['variations.attributes', 'variations.images', 'attributes', 'brand', 'category'])->findOrFail($id); + + $categories = Category::getFlatTree(); + + $brands = Brand::active()->orderBy('name')->get(); + + return view('admin.products.edit', compact('product', 'categories', 'brands')); + } + + public function update(Request $request, $id) + { + $product = Product::findOrFail($id); + + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'category_id' => 'required|exists:categories,id', + 'brand_id' => 'nullable|exists:brands,id', + 'description' => 'nullable|string', + 'is_active' => 'nullable|boolean', + + 'meta_title' => 'nullable|string|max:255', + 'meta_description' => 'nullable|string', + 'meta_keywords' => 'nullable|string', + + 'attributes' => 'nullable|array', + 'attributes.*.key' => 'nullable|string', + 'attributes.*.value' => 'nullable|string', + + 'variations' => 'required|array|min:1', + 'variations.*.id' => 'nullable|exists:product_variations,id', + 'variations.*.name' => 'required|string|max:255', + 'variations.*.sku' => 'required|string|max:100', + 'variations.*.price' => 'required|numeric|min:0', + 'variations.*.old_price' => 'nullable|numeric|min:0', + 'variations.*.stock' => 'required|integer|min:0', + 'variations.*.is_default' => 'nullable|boolean', + 'variations.*.attributes' => 'nullable|array', + 'variations.*.attributes.flavor' => 'nullable|string|max:100', + 'variations.*.attributes.color' => 'nullable|string|max:100', + 'variations.*.attributes.size' => 'nullable|string|max:50', + 'variations.*.attributes.weight' => 'nullable|numeric|min:0', + + 'variations.*.images' => 'nullable|array', + 'variations.*.images.*' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048', + 'variations.*.removed_images' => 'nullable|array', + 'variations.*.removed_images.*' => 'nullable|string', + 'variations.*.existing_images' => 'nullable|array', + 'variations.*.existing_images.*' => 'nullable|string', + ], [ + // Основные поля + 'name.required' => 'Название товара обязательно', + 'name.string' => 'Название товара должно быть строкой', + 'name.max' => 'Название товара не может превышать 255 символов', + + 'category_id.required' => 'Выберите категорию', + 'category_id.exists' => 'Выбранная категория не существует', + + 'brand_id.exists' => 'Выбранный бренд не существует', + + 'meta_title.max' => 'Meta Title не может превышать 255 символов', + + // Вариации + 'variations.required' => 'Добавьте хотя бы одну вариацию', + 'variations.array' => 'Некорректный формат вариаций', + 'variations.min' => 'Добавьте хотя бы одну вариацию', + + 'variations.*.id.exists' => 'Вариация с ID :input не найдена', + + 'variations.*.name.required' => 'Название вариации обязательно', + 'variations.*.name.string' => 'Название вариации должно быть строкой', + 'variations.*.name.max' => 'Название вариации не может превышать 255 символов', + + 'variations.*.sku.required' => 'Артикул (SKU) обязателен', + 'variations.*.sku.string' => 'Артикул должен быть строкой', + 'variations.*.sku.max' => 'Артикул не может превышать 100 символов', + + 'variations.*.price.required' => 'Цена обязательна', + 'variations.*.price.numeric' => 'Цена должна быть числом', + 'variations.*.price.min' => 'Цена не может быть отрицательной', + + 'variations.*.old_price.numeric' => 'Старая цена должна быть числом', + 'variations.*.old_price.min' => 'Старая цена не может быть отрицательной', + + 'variations.*.stock.required' => 'Количество обязательно', + 'variations.*.stock.integer' => 'Количество должно быть целым числом', + 'variations.*.stock.min' => 'Количество не может быть отрицательным', + + 'variations.*.is_default.boolean' => 'Поле "Основная вариация" должно быть true или false', + + 'variations.*.attributes.array' => 'Некорректный формат атрибутов вариации', + + 'variations.*.attributes.flavor.string' => 'Вкус должен быть строкой', + 'variations.*.attributes.flavor.max' => 'Вкус не может превышать 100 символов', + + 'variations.*.attributes.color.string' => 'Цвет должен быть строкой', + 'variations.*.attributes.color.max' => 'Цвет не может превышать 100 символов', + + 'variations.*.attributes.size.string' => 'Размер должен быть строкой', + 'variations.*.attributes.size.max' => 'Размер не может превышать 50 символов', + + 'variations.*.attributes.weight.numeric' => 'Вес должен быть числом', + 'variations.*.attributes.weight.min' => 'Вес не может быть отрицательным', + + // Изображения + 'variations.*.images.array' => 'Некорректный формат изображений', + + 'variations.*.images.*.image' => 'Файл должен быть изображением', + 'variations.*.images.*.mimes' => 'Допустимые форматы изображений: jpg, jpeg, png, webp', + 'variations.*.images.*.max' => 'Размер изображения не должен превышать 2 МБ', + + 'variations.*.removed_images.array' => 'Некорректный формат списка удаляемых изображений', + 'variations.*.removed_images.*.string' => 'Путь к удаляемому изображению должен быть строкой', + + 'variations.*.existing_images.array' => 'Некорректный формат списка существующих изображений', + 'variations.*.existing_images.*.string' => 'Путь к существующему изображению должен быть строкой', + + // Атрибуты товара + 'attributes.array' => 'Некорректный формат характеристик', + 'attributes.*.key.string' => 'Название характеристики должно быть строкой', + 'attributes.*.value.string' => 'Значение характеристики должно быть строкой', + ]); + + DB::beginTransaction(); + + try { + // Обновляем slug если изменилось название + $newSlug = Str::slug($validated['name']); + $oldSlug = $product->slug; + + if ($oldSlug != $newSlug) { + $slug = $newSlug; + $counter = 1; + while (Product::where('slug', $slug)->where('id', '!=', $id)->exists()) { + $slug = $newSlug . '-' . $counter; + $counter++; + } + $product->slug = $slug; + $this->renameProductFolder($oldSlug, $slug, $product); + } + + // Обновляем товар + $product->update([ + 'name' => $validated['name'], + 'description' => $validated['description'], + 'brand_id' => $validated['brand_id'], + 'category_id' => $validated['category_id'], + 'is_active' => $request->boolean('is_active'), + 'meta_title' => $validated['meta_title'], + 'meta_description' => $validated['meta_description'], + 'meta_keywords' => $validated['meta_keywords'], + ]); + + // Обновляем атрибуты товара + ProductAttribute::where('product_id', $product->id)->delete(); + if (!empty($validated['attributes'])) { + foreach ($validated['attributes'] as $attr) { + if (!empty($attr['key']) && !empty($attr['value'])) { + ProductAttribute::create([ + 'product_id' => $product->id, + 'key' => $attr['key'], + 'value' => $attr['value'], + ]); + } + } + } + + $existingVariationIds = []; + + foreach ($validated['variations'] as $index => $variationData) { + if (isset($variationData['id']) && $variationData['id']) { + $variation = ProductVariation::find($variationData['id']); + + if ($variation && $variation->product_id == $product->id) { + $variation->update([ + 'name' => $variationData['name'], + 'sku' => $variationData['sku'], + 'price' => $variationData['price'], + 'old_price' => $variationData['old_price'] ?? null, + 'stock' => $variationData['stock'], + 'is_default' => $variationData['is_default'] ?? false, + ]); + + // Обновляем атрибуты вариации + VariationAttribute::where('variation_id', $variation->id)->delete(); + if (!empty($variationData['attributes'])) { + foreach ($variationData['attributes'] as $key => $value) { + if (!empty($value) || $value === 0 || $value === '0') { + VariationAttribute::create([ + 'variation_id' => $variation->id, + 'key' => $key, + 'value' => $value, + ]); + } + } + } + + // ========== ОБРАБОТКА ИЗОБРАЖЕНИЙ ========== + // 1. Удаляем отмеченные изображения + if (!empty($variationData['removed_images']) && is_array($variationData['removed_images'])) { + foreach ($variationData['removed_images'] as $imagePath) { + $image = VariationImage::where('variation_id', $variation->id) + ->where('path', $imagePath) + ->first(); + if ($image) { + $fullPath = public_path($imagePath); + if (file_exists($fullPath) && is_file($fullPath)) { + @unlink($fullPath); + } + $image->delete(); + } + } + } + + // 2. Обновляем порядок существующих изображений + if (!empty($variationData['existing_images']) && is_array($variationData['existing_images'])) { + foreach ($variationData['existing_images'] as $sortOrder => $imagePath) { + $image = VariationImage::where('variation_id', $variation->id) + ->where('path', $imagePath) + ->first(); + if ($image) { + $image->sort_order = $sortOrder; + $image->save(); + } + } + } + + // 3. Сохраняем новые изображения + if ($request->hasFile("variations.{$index}.images")) { + $files = $request->file("variations.{$index}.images"); + $validFiles = array_filter($files, function ($file) { + return $file !== null && $file->isValid(); + }); + + if (!empty($validFiles)) { + $this->saveVariationImages($validFiles, $product->slug, $variation->id); + } + } + + $existingVariationIds[] = $variation->id; + } + } else { + // Создаем новую вариацию + $variation = ProductVariation::create([ + 'product_id' => $product->id, + 'name' => $variationData['name'], + 'sku' => $variationData['sku'], + 'price' => $variationData['price'], + 'old_price' => $variationData['old_price'] ?? null, + 'stock' => $variationData['stock'], + 'is_default' => $variationData['is_default'] ?? false, + 'is_active' => true, + ]); + + // Сохраняем атрибуты + if (!empty($variationData['attributes'])) { + foreach ($variationData['attributes'] as $key => $value) { + if (!empty($value) || $value === 0 || $value === '0') { + VariationAttribute::create([ + 'variation_id' => $variation->id, + 'key' => $key, + 'value' => $value, + ]); + } + } + } + + // Сохраняем изображения + if ($request->hasFile("variations.{$index}.images")) { + $files = $request->file("variations.{$index}.images"); + $validFiles = array_filter($files, function ($file) { + return $file !== null && $file->isValid(); + }); + + if (!empty($validFiles)) { + $this->saveVariationImages($validFiles, $product->slug, $variation->id); + } + } + + $existingVariationIds[] = $variation->id; + } + } + + // Удаляем вариации, которых нет в форме + $variationsToDelete = ProductVariation::where('product_id', $product->id) + ->whereNotIn('id', $existingVariationIds) + ->get(); + + foreach ($variationsToDelete as $variation) { + // Удаляем изображения из БД и файловой системы + $images = VariationImage::where('variation_id', $variation->id)->get(); + foreach ($images as $image) { + $fullPath = public_path($image->path); + if (file_exists($fullPath) && is_file($fullPath)) { + @unlink($fullPath); + } + $image->delete(); + } + + // Удаляем атрибуты + VariationAttribute::where('variation_id', $variation->id)->delete(); + + // Удаляем папку + $folderPath = public_path('assets/images/products/' . $product->slug . '/variation_' . $variation->id); + if (file_exists($folderPath) && is_dir($folderPath)) { + $this->deleteDirectory($folderPath); + } + + $variation->delete(); + } + + DB::commit(); + + return redirect()->route('admin.products') + ->with('success', 'Товар "' . $product->name . '" успешно обновлен'); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('Product update error: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]); + return redirect()->back() + ->withInput() + ->with('error', 'Ошибка при обновлении товара: ' . $e->getMessage()); + } + } + + private function saveVariationImages($images, $productSlug, $variationId) + { + $folder = public_path('assets/images/products/' . $productSlug . '/variation_' . $variationId); + + if (!file_exists($folder)) { + mkdir($folder, 0755, true); + } + + // Получаем текущий максимальный sort_order + $maxSortOrder = VariationImage::where('variation_id', $variationId)->max('sort_order'); + $nextIndex = ($maxSortOrder !== null) ? $maxSortOrder + 1 : 0; + + foreach ($images as $index => $image) { + if ($image && $image->isValid()) { + $extension = $image->getClientOriginalExtension(); + $filename = ($nextIndex + $index) . '.' . $extension; + $destinationPath = $folder . '/' . $filename; + + $image->move($folder, $filename); + + if (file_exists($destinationPath)) { + VariationImage::create([ + 'variation_id' => $variationId, + 'path' => 'assets/images/products/' . $productSlug . '/variation_' . $variationId . '/' . $filename, + 'sort_order' => $nextIndex + $index, + ]); + } + } + } + } + + private function renameProductFolder($oldSlug, $newSlug, $product) + { + $oldFolder = public_path('assets/images/products/' . $oldSlug); + $newFolder = public_path('assets/images/products/' . $newSlug); + + if (file_exists($oldFolder) && is_dir($oldFolder)) { + if (file_exists($newFolder)) { + $this->mergeDirectories($oldFolder, $newFolder); + $this->deleteDirectory($oldFolder); + } else { + rename($oldFolder, $newFolder); + } + + // Обновляем пути в БД + $variations = ProductVariation::where('product_id', $product->id)->get(); + foreach ($variations as $variation) { + $images = VariationImage::where('variation_id', $variation->id)->get(); + foreach ($images as $image) { + $image->path = str_replace('assets/images/products/' . $oldSlug, 'assets/images/products/' . $newSlug, $image->path); + $image->save(); + } + } + } + } + + private function mergeDirectories($source, $destination) + { + if (!is_dir($destination)) { + mkdir($destination, 0777, true); + } + + $files = scandir($source); + foreach ($files as $file) { + if ($file == '.' || $file == '..') continue; + + $sourcePath = $source . '/' . $file; + $destPath = $destination . '/' . $file; + + if (is_dir($sourcePath)) { + $this->mergeDirectories($sourcePath, $destPath); + rmdir($sourcePath); + } else { + copy($sourcePath, $destPath); + unlink($sourcePath); + } + } + } + + private function deleteDirectory($dir) + { + if (!file_exists($dir)) { + return true; + } + + if (!is_dir($dir)) { + return unlink($dir); + } + + foreach (scandir($dir) as $item) { + if ($item == '.' || $item == '..') { + continue; + } + + if (!$this->deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) { + return false; + } + } + + return rmdir($dir); + } + + public function checkSku(Request $request) + { + $request->validate([ + 'sku' => 'required|string', + 'variation_id' => 'nullable|exists:product_variations,id', + 'product_id' => 'nullable|exists:products,id' + ]); + + $sku = $request->sku; + $variationId = $request->variation_id; + $productId = $request->product_id; + + $isUnique = ProductVariation::isSkuUnique($sku, $variationId, $productId); + + return response()->json([ + 'unique' => $isUnique, + 'message' => $isUnique ? null : 'Артикул "' . $sku . '" уже используется' + ]); + } + + public function destroy($id) + { + $product = Product::findOrFail($id); + $productName = $product->name; + + foreach ($product->variations as $variation) { + $images = VariationImage::where('variation_id', $variation->id)->get(); + foreach ($images as $image) { + $fullPath = public_path($image->path); + if (file_exists($fullPath) && is_file($fullPath)) { + @unlink($fullPath); + } + } + $folderPath = public_path('assets/images/products/' . $product->slug . '/variation_' . $variation->id); + if (file_exists($folderPath) && is_dir($folderPath)) { + $this->deleteDirectory($folderPath); + } + } + + $productFolder = public_path('assets/images/products/' . $product->slug); + if (file_exists($productFolder) && is_dir($productFolder)) { + $this->deleteDirectory($productFolder); + } + + $product->delete(); + + return redirect()->route('admin.products') + ->with('success', 'Товар "' . $productName . '" успешно удален'); + } + + public function duplicate($id) + { + DB::beginTransaction(); + + try { + $original = Product::with(['variations.attributes', 'variations.images'])->findOrFail($id); + + $newProduct = $original->replicate(); + $newProduct->name = $original->name . ' (копия)'; + $newProduct->slug = Str::slug($newProduct->name) . '-' . uniqid(); + $newProduct->created_at = now(); + $newProduct->updated_at = now(); + $newProduct->save(); + + // Копируем атрибуты товара + foreach ($original->attributes as $attr) { + ProductAttribute::create([ + 'product_id' => $newProduct->id, + 'key' => $attr->key, + 'value' => $attr->value, + ]); + } + + // Копируем вариации + foreach ($original->variations as $variation) { + $newVariation = $variation->replicate(); + $newVariation->product_id = $newProduct->id; + $newVariation->sku = $variation->sku . '-copy-' . uniqid(); + $newVariation->created_at = now(); + $newVariation->updated_at = now(); + $newVariation->save(); + + // Копируем атрибуты вариации + foreach ($variation->attributes as $attr) { + VariationAttribute::create([ + 'variation_id' => $newVariation->id, + 'key' => $attr->key, + 'value' => $attr->value, + ]); + } + + // Копируем изображения + $newFolder = public_path('assets/images/products/' . $newProduct->slug . '/variation_' . $newVariation->id); + if (!file_exists($newFolder)) { + mkdir($newFolder, 0755, true); + } + + foreach ($variation->images as $image) { + $oldPath = public_path($image->path); + $filename = basename($image->path); + $newPath = $newFolder . '/' . $filename; + + if (file_exists($oldPath)) { + copy($oldPath, $newPath); + VariationImage::create([ + 'variation_id' => $newVariation->id, + 'path' => 'assets/images/products/' . $newProduct->slug . '/variation_' . $newVariation->id . '/' . $filename, + 'sort_order' => $image->sort_order, + ]); + } + } + } + + DB::commit(); + + return redirect()->route('admin.products') + ->with('success', 'Товар "' . $original->name . '" успешно скопирован. Новая версия: "' . $newProduct->name . '"'); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('Product duplicate error: ' . $e->getMessage()); + return redirect()->back() + ->with('error', 'Ошибка при копировании товара: ' . $e->getMessage()); + } + } +} diff --git a/app/Http/Controllers/Admin/RolesController.php b/app/Http/Controllers/Admin/RolesController.php new file mode 100644 index 0000000..fe7cc4f --- /dev/null +++ b/app/Http/Controllers/Admin/RolesController.php @@ -0,0 +1,109 @@ +paginate(15); + + return view('admin.roles.roles', compact('roles')); + } + + public function create() + { + $permissions = Permission::all(); + + return view('admin.roles.create', compact('permissions')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'slug' => 'required|string|max:255|unique:roles', + 'description' => 'nullable|string', + 'permissions' => 'nullable|array', + 'permissions.*' => 'exists:permissions,id' + ], [ + 'name.required' => 'Обязательно для заполнения', + 'name.max' => 'Не более 255 символов', + 'slug.required' => 'Обязательно для заполнения', + 'slug.max' => 'Не более 255 символов', + 'slug.unique' => 'Такой slug уже существует', + 'permissions.*.exists' => 'Право не найдено' + ]); + + $role = Role::create([ + 'name' => $request->name, + 'slug' => $request->slug, + 'description' => $request->description + ]); + + if ($request->has('permissions')) { + $role->permissions()->attach($request->permissions); + } + + return redirect()->route('admin.roles') + ->with('success', 'Роль "' . $role->name . '" успешно создана'); + } + + public function edit($id) + { + $role = Role::with('permissions')->findOrFail($id); + $permissions = Permission::all(); + + return view('admin.roles.edit', compact('role', 'permissions')); + } + + public function update(Request $request, $id) + { + $role = Role::findOrFail($id); + + $request->validate([ + 'name' => 'required|string|max:255', + 'slug' => 'required|string|max:255|unique:roles,slug,' . $id, + 'description' => 'nullable|string', + 'permissions' => 'nullable|array', + 'permissions.*' => 'exists:permissions,id' + ]); + + $role->update([ + 'name' => $request->name, + 'slug' => $request->slug, + 'description' => $request->description + ]); + + $role->permissions()->sync($request->permissions ?? []); + + return redirect()->route('admin.roles') + ->with('success', 'Роль "' . $role->name . '" успешно обновлена'); + } + + public function destroy($id) + { + $role = Role::findOrFail($id); + + $usersCount = User::where('role_id', $role->id)->count(); + + if ($usersCount > 0) { + return redirect()->route('admin.roles') + ->with('error', 'Нельзя удалить роль, у которой есть пользователи'); + } + + $roleName = $role->name; + $role->permissions()->detach(); + $role->delete(); + + return redirect()->route('admin.roles') + ->with('success', 'Роль "' . $roleName . '" успешно удалена'); + } +} diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php new file mode 100644 index 0000000..1dee19d --- /dev/null +++ b/app/Http/Controllers/Admin/UsersController.php @@ -0,0 +1,133 @@ +filled('search')) { + $search = $request->search; + $query->where(function ($q) use ($search) { + $q->where('name', 'like', "%{$search}%") + ->orWhere('email', 'like', "%{$search}%"); + }); + } + + $users = $query->orderBy('created_at', 'desc')->paginate(15); + $users->appends($request->all()); + + return view('admin.users.users', compact('users')); + } + + public function create() + { + $roles = Role::all(); + return view('admin.users.create', compact('roles')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|email|max:255|unique:users', + 'phone' => 'nullable|string|max:20', + 'password' => 'required|string|min:8|confirmed', + 'role_id' => 'required|exists:roles,id' + ], [ + 'name.required' => 'Обязательно для заполнения', + 'name.max' => 'Не более 255 символов', + 'email.required' => 'Обязательно для заполнения', + 'email.email' => 'Введите корректный email', + 'email.max' => 'Не более 255 символов', + 'email.unique' => 'Этот email уже занят', + 'phone.max' => 'Не более 20 символов', + 'password.required' => 'Обязательно для заполнения', + 'password.min' => 'Минимум 8 символов', + 'password.confirmed' => 'Пароли не совпадают', + 'role_id.required' => 'Обязательно для заполнения' + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'phone' => $request->phone, + 'password' => Hash::make($request->password), + 'role_id' => $request->role_id + ]); + + return redirect()->route('admin.users') + ->with('success', 'Пользователь "' . $user->name . '" успешно создан'); + } + + public function edit($id) + { + $user = User::findOrFail($id); + $roles = Role::all(); + return view('admin.users.edit', compact('user', 'roles')); + } + + public function update(Request $request, $id) + { + $user = User::findOrFail($id); + + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|email|max:255|unique:users,email,' . $id, + 'phone' => 'nullable|string|max:20', + 'password' => 'nullable|string|min:8|confirmed', + 'role_id' => 'required|exists:roles,id' + ], [ + 'name.required' => 'Обязательно для заполнения', + 'name.max' => 'Не более 255 символов', + 'email.required' => 'Обязательно для заполнения', + 'email.email' => 'Введите корректный email', + 'email.max' => 'Не более 255 символов', + 'email.unique' => 'Этот email уже занят', + 'phone.max' => 'Не более 20 символов', + 'password.min' => 'Минимум 8 символов', + 'password.confirmed' => 'Пароли не совпадают', + 'role_id.required' => 'Обязательно для заполнения' + ]); + + $data = [ + 'name' => $request->name, + 'email' => $request->email, + 'phone' => $request->phone, + 'role_id' => $request->role_id + ]; + + if ($request->filled('password')) { + $data['password'] = Hash::make($request->password); + } + + $user->update($data); + + return redirect()->route('admin.users') + ->with('success', 'Пользователь "' . $user->name . '" успешно обновлен'); + } + + public function destroy($id) + { + $user = User::findOrFail($id); + + if ($user->id === auth()->id()) { + return redirect()->route('admin.users') + ->with('error', 'Нельзя удалить самого себя'); + } + + $userName = $user->name; + $user->delete(); + + return redirect()->route('admin.users') + ->with('success', 'Пользователь "' . $userName . '" успешно удален'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..62ffd2a --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,50 @@ +validate([ + 'email' => 'required|email', + 'password' => 'required|string', + ], [ + 'email.required' => 'Введите email', + 'email.email' => 'Введите корректный email', + 'password.required' => 'Введите пароль', + ]); + + $remember = $request->has('save_checkbox'); + + if (Auth::attempt($credentials, $remember)) { + $request->session()->regenerate(); + + return redirect()->intended('/'); + } + + return back()->withErrors([ + 'email' => 'Неверный email или пароль', + ])->onlyInput('email'); + } + + public function logout(Request $request) + { + Auth::logout(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..24ebf55 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,63 @@ +all(), [ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'phone' => 'required|string|max:20', + 'password' => 'required|string|min:8|confirmed', + 'save_checkbox' => 'accepted' + ], [ + 'name.required' => 'Обязательно введите Ваше имя', + 'email.required' => 'Обязательно введите адрес электронной почты', + 'phone.required' => 'Обязательно введите Ваш номер телефона', + 'email.email' => 'Введите корректный адрес электронной почты', + 'email.unique' => 'Пользователь с таким адресом электронной почты уже существует', + 'password.required' => 'Поле пароль обязательно для заполнения', + 'password.min' => 'Пароль должен содержать минимум 8 символов', + 'password.confirmed' => 'Пароли не совпадают', + 'save_checkbox.accepted' => 'Необходимо согласие на обработку персональных данных' + ]); + + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'phone' => $request->phone, + 'password' => Hash::make($request->password), + ]); + + $defaultRole = Role::where('slug', 'registered_user')->first(); + if ($defaultRole) { + $user->role()->attach($defaultRole->id); + } + + auth()->login($user); + + return redirect()->intended('/') + ->with('success', 'Регистрация прошла успешно!'); + } +} diff --git a/app/Http/Controllers/BrandController.php b/app/Http/Controllers/BrandController.php new file mode 100644 index 0000000..113683a --- /dev/null +++ b/app/Http/Controllers/BrandController.php @@ -0,0 +1,113 @@ +withCount('products') + ->orderBy('name') + ->paginate(20); + + return view('brands.brands', compact('brands')); + } + + /** + * Display products by brand with filters. + */ + public function show(Request $request, $slug) + { + $brand = Brand::where('slug', $slug) + ->active() + ->firstOrFail(); + + // Получаем ID категорий, в которых есть товары этого бренда + $categoryIds = $brand->products() + ->active() + ->pluck('category_id') + ->unique() + ->filter() + ->values() + ->toArray(); + + // Загружаем категории с родителями для построения полного пути + $categories = Category::with(['parent', 'parent.parent']) + ->whereIn('id', $categoryIds) + ->active() + ->get(); + + // Формируем полный путь для каждой категории + $categoriesWithPath = $categories->map(function ($category) { + $path = []; + $current = $category; + + while ($current) { + $path[] = $current->name; + $current = $current->parent; + } + + $category->full_path = implode(' / ', array_reverse($path)); + return $category; + })->sortBy('full_path'); + + // Диапазон цен + $priceRange = DB::table('products') + ->join('product_variations', 'products.id', '=', 'product_variations.product_id') + ->where('products.brand_id', $brand->id) + ->where('products.is_active', true) + ->selectRaw('MIN(product_variations.price) as min_price, MAX(product_variations.price) as max_price') + ->first(); + + $minPrice = $priceRange->min_price ?? 0; + $maxPrice = $priceRange->max_price ?? 10000; + + // Запрос на продукты с фильтрацией + $productsQuery = Product::with(['variations', 'category']) + ->where('brand_id', $brand->id) + ->active(); + + // Фильтрация по категориям + if ($request->has('categories') && !empty($request->categories)) { + $productsQuery->whereIn('category_id', $request->categories); + } + + // Фильтрация по цене + if ($request->has('price-min') && $request->has('price-max')) { + $min = (float) $request->get('price-min'); + $max = (float) $request->get('price-max'); + + $productsQuery->whereHas('variations', function ($q) use ($min, $max) { + $q->whereBetween('price', [$min, $max]); + }); + } + + // Сортировка + $sort = $request->get('sort', 'created_at'); + $order = $request->get('order', 'desc'); + + if ($sort === 'price') { + $productsQuery->withMin('variations', 'price') + ->orderBy('variations_min_price', $order); + } elseif ($sort === 'name') { + $productsQuery->orderBy('name', $order); + } else { + $productsQuery->orderBy($sort, $order); + } + + $products = $productsQuery->paginate(20); + $products->appends($request->all()); + + return view('brands.show', compact('brand', 'products', 'categoriesWithPath', 'minPrice', 'maxPrice')); + } +} diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php new file mode 100644 index 0000000..cba7487 --- /dev/null +++ b/app/Http/Controllers/CartController.php @@ -0,0 +1,179 @@ +get(); + $total = $cartItems->sum('total'); + + return view('cart.show', compact('cartItems', 'total')); + } + + public function add(Request $request) + { + $request->validate([ + 'variation_id' => 'required|exists:product_variations,id', + 'quantity' => 'required|integer|min:1' + ]); + + $variation = ProductVariation::with('product')->find($request->variation_id); + + if (!$variation) { + if ($request->ajax()) { + return response()->json(['success' => false, 'message' => 'Товар не найден'], 404); + } + return back()->with('error', 'Товар не найден'); + } + + if ($variation->stock < $request->quantity) { + if ($request->ajax()) { + return response()->json(['success' => false, 'message' => 'Недостаточно товара на складе'], 422); + } + return back()->with('error', 'Недостаточно товара на складе'); + } + + $cartItem = CartItem::findByVariation($request->variation_id); + + if ($cartItem) { + $newQuantity = $cartItem->quantity + $request->quantity; + if ($variation->stock < $newQuantity) { + if ($request->ajax()) { + return response()->json(['success' => false, 'message' => 'Недостаточно товара на складе'], 422); + } + return back()->with('error', 'Недостаточно товара на складе'); + } + $cartItem->update(['quantity' => $newQuantity]); + } else { + CartItem::create([ + 'user_id' => Auth::id(), + 'session_id' => session()->getId(), + 'variation_id' => $request->variation_id, + 'quantity' => $request->quantity, + 'price' => $variation->price + ]); + } + + $cartCount = CartItem::getCount(); + + if ($request->ajax()) { + return response()->json([ + 'success' => true, + 'message' => 'Товар добавлен в корзину', + 'cart_count' => $cartCount + ]); + } + + return back()->with('success', 'Товар добавлен в корзину'); + } + + + public function update(Request $request, $id) + { + $request->validate(['quantity' => 'required|integer|min:1']); + + $cartItem = CartItem::find($id); + + if (!$cartItem) { + return response()->json(['error' => 'Товар не найден'], 404); + } + + $variation = $cartItem->variation; + + if ($variation->stock < $request->quantity) { + return response()->json(['error' => 'Недостаточно товара на складе'], 422); + } + + $cartItem->update(['quantity' => $request->quantity]); + + $cartItems = CartItem::getCartQuery()->get(); + $cartTotal = $cartItems->sum('total'); + $totalItems = $cartItems->sum('quantity'); + + return response()->json([ + 'success' => true, + 'total' => $cartItem->total, + 'cart_total' => $cartTotal, + 'total_items' => $totalItems, + 'max_stock' => $variation->stock + ]); + } + + public function remove($id) + { + $cartItem = CartItem::findCartItem($id); + + if ($cartItem) { + $cartItem->delete(); + return redirect()->route('cart.index')->with('success', 'Товар удален из корзины'); + } + + return redirect()->route('cart.index')->with('error', 'Товар не найден'); + } + + public function clear() + { + CartItem::clear(); + return redirect()->route('cart.index')->with('success', 'Корзина очищена'); + } + + public function checkout() + { + $cartItems = CartItem::getCartQuery()->get(); + + if ($cartItems->isEmpty()) { + return redirect()->route('cart.index')->with('error', 'Корзина пуста'); + } + + $total = $cartItems->sum('total'); + + return view('cart.checkout', compact('cartItems', 'total')); + } + + public function processOrder(Request $request) + { + $request->validate([ + 'customer_name' => 'required|string|max:255', + 'customer_email' => 'required|email|max:255', + 'customer_phone' => 'required|string|max:20', + 'shipping_address' => 'required_if:delivery_method,courier,express|max:1000', + 'delivery_method' => 'required|in:courier,pickup,express', + 'payment_method' => 'required|in:cash,card,online' + ], [ + 'customer_name.required' => 'Поле обязательно для заполнения', + 'customer_email.required' => 'Поле обязательно для заполнения', + 'customer_email.email' => 'Введите корректный адрес электронной почты', + 'customer_phone.required' => 'Поле обязательно для заполнения', + 'shipping_address.required_if' => 'Адрес доставки обязателен для выбранного способа доставки', + 'delivery_method.required' => 'Выберите способ доставки', + 'payment_method.required' => 'Выберите способ оплаты' + ]); + + + $cartItems = CartItem::getCartQuery()->get(); + + if ($cartItems->isEmpty()) { + return back()->with('error', 'Корзина пуста'); + } + + $order = Order::createFromCart($request->all(), $cartItems); + + if ($order['success']) { + return redirect()->route('orders.show', $order['order']) + ->with('success', 'Заказ оформлен! Номер заказа: ' . $order['order']->order_number); + } + + return back()->with('error', $order['message']); + } +} diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php new file mode 100644 index 0000000..fe93c77 --- /dev/null +++ b/app/Http/Controllers/CategoryController.php @@ -0,0 +1,67 @@ +getAllCategoryIds(); + + $brands = Brand::whereHas('products', function ($query) use ($categoryIds) { + $query->whereIn('category_id', $categoryIds) + ->active(); + }) + ->active() + ->orderBy('name') + ->get(); + + $priceRange = DB::table('products') + ->join('product_variations', 'products.id', '=', 'product_variations.product_id') + ->whereIn('products.category_id', $categoryIds) + ->where('products.is_active', true) + ->where('product_variations.is_active', true) + ->selectRaw('MIN(product_variations.price) as min_price, MAX(product_variations.price) as max_price') + ->first(); + + $minPrice = $priceRange->min_price ?? 0; + $maxPrice = $priceRange->max_price ?? 10000; + + $productsQuery = $category->productsWithChildren() + ->with(['variations', 'brand']) + ->active(); + + if ($request->has('brands') && !empty($request->brands)) { + $productsQuery->whereIn('brand_id', $request->brands); + } + + if ($request->has('price-min') && $request->has('price-max')) { + $min = (float) $request->get('price-min'); + $max = (float) $request->get('price-max'); + + $productsQuery->whereHas('variations', function ($q) use ($min, $max) { + $q->whereBetween('price', [$min, $max]); + }); + } + + $products = $productsQuery->orderBy('created_at', 'desc')->paginate(20); + + $products->appends($request->all()); + + $children = $category->children()->active()->get(); + + return view('categories.show', compact('category', 'products', 'children', 'brands', 'minPrice', 'maxPrice')); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..77ec359 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ +discounted() + ->inStock() + ->active() + ->orderByRaw('(old_price - price) / old_price * 100 DESC') + ->limit(8) + ->get(); + + $categories = Category::active()->root()->orderBy('sort_order')->get(); + + $dryCatFood = Product::getForCarousel(21, 12); + + $dryDogFood = Product::getForCarousel(3, 12); + + return view('index', compact('discountedProducts', 'categories', 'dryCatFood', 'dryDogFood')); + } + + public function about() + { + + $topBrands = Brand::active()->popular()->limit(5)->get(); + + return view('about', compact('topBrands')); + } + + public function contacts() + { + return view('contacts'); + } + + public function privacyPolicy() + { + return view('privacy-policy'); + } +} diff --git a/app/Http/Controllers/MenuController.php b/app/Http/Controllers/MenuController.php new file mode 100644 index 0000000..14b1f90 --- /dev/null +++ b/app/Http/Controllers/MenuController.php @@ -0,0 +1,90 @@ +active() + ->orderBy('sort_order') + ->get(); + + $contacts = Contact::getData(); + + $popularBrands = Brand::active()->popular()->limit(8)->get(); + + return [ + 'categories' => $categories, + 'contacts' => $contacts, + 'popularBrands' => $popularBrands, + 'footerCategories' => $footerCategories, + ]; + } + + public function search(Request $request) + { + $query = trim($request->get('q', '')); + + // Проверка на минимальную длину + if (mb_strlen($query) < 3) { + return redirect()->back()->with('error', 'Для поиска введите минимум 3 символа'); + } + + // Поиск товаров + $products = Product::with(['variations', 'brand', 'category']) + ->where('name', 'like', "%{$query}%") + ->orWhere('description', 'like', "%{$query}%") + ->orWhere('meta_keywords', 'like', "%{$query}%") + ->active() + ->paginate(20); + + // Поиск брендов + $brands = Brand::where('name', 'like', "%{$query}%") + ->orWhere('description', 'like', "%{$query}%") + ->active() + ->limit(10) + ->get(); + + return view('search.results', compact('products', 'brands', 'query')); + } + + /** + * AJAX поиск для подсказок + */ + public function searchAjax(Request $request) + { + $query = trim($request->get('q', '')); + + if (mb_strlen($query) < 2) { + return response()->json([]); + } + + // Поиск товаров + $products = Product::with('variations') + ->where('name', 'like', "%{$query}%") + ->active() + ->limit(5) + ->get(['id', 'name', 'slug']); + + // Поиск брендов + $brands = Brand::where('name', 'like', "%{$query}%") + ->active() + ->limit(3) + ->get(['id', 'name', 'slug']); + + return response()->json([ + 'products' => $products, + 'brands' => $brands + ]); + } +} diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php new file mode 100644 index 0000000..17c01bb --- /dev/null +++ b/app/Http/Controllers/OrderController.php @@ -0,0 +1,35 @@ +orderBy('created_at', 'desc') + ->paginate(20); + + return view('orders.orders', compact('orders')); + } + + /** + * Display order details. + */ + public function show(Order $order) + { + $user = Auth::user(); + if ($order->user_id !== Auth::id()) { + abort(403); + } + + return view('profile.order-show', compact('order', 'user')); + } +} diff --git a/app/Http/Controllers/ProductsController.php b/app/Http/Controllers/ProductsController.php new file mode 100644 index 0000000..9f97740 --- /dev/null +++ b/app/Http/Controllers/ProductsController.php @@ -0,0 +1,39 @@ +where('slug', $slug) + ->where('is_active', true) + ->firstOrFail(); + + $defaultVariation = $product->default_variation; + + return view('products.show', compact('product', 'defaultVariation')); + } + + public function getVariationImages($variationId) + { + $images = ProductVariation::getImagesDataById($variationId); + + return response()->json([ + 'success' => true, + 'images' => $images + ]); + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100644 index 0000000..f4ccb7a --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,97 @@ +id) + ->whereNotIn('delivery_status', ['delivered', 'cancelled']) + ->orderBy('created_at', 'desc') + ->get(); + + $archiveOrders = Order::where('user_id', $user->id) + ->whereIn('delivery_status', ['delivered', 'cancelled']) + ->orderBy('created_at', 'desc') + ->get(); + + return view('profile.profile', compact('user', 'activeOrders', 'archiveOrders')); + } + + /** + * Редактирование профиля + */ + public function edit() + { + $user = Auth::user(); + return view('profile.edit', compact('user')); + } + + /** + * Обновление профиля + */ + public function update(Request $request) + { + $user = Auth::user(); + + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => [ + 'required', + 'email', + 'max:255', + Rule::unique('users')->ignore($user->id), + ], + 'phone' => 'nullable|string|max:20', + 'current_password' => 'nullable|required_with:password|current_password', + 'password' => 'nullable|string|min:8|confirmed', + ], [ + 'name.required' => 'Обязательно для заполнения', + 'email.required' => 'Обязательно для заполнения', + 'email.email' => 'Введите корректный email', + 'email.unique' => 'Этот email уже занят', + 'current_password.required_with' => 'Введите текущий пароль', + 'current_password.current_password' => 'Неверный текущий пароль', + 'password.min' => 'Пароль должен содержать минимум 8 символов', + 'password.confirmed' => 'Пароли не совпадают', + ]); + + $user->name = $request->name; + $user->email = $request->email; + $user->phone = $request->phone; + + if ($request->filled('password')) { + $user->password = Hash::make($request->password); + } + + $user->save(); + + return redirect()->route('profile.index') + ->with('success', 'Профиль успешно обновлен'); + } + + /** + * Детали заказа + */ + public function orderShow($id) + { + $order = Order::where('user_id', Auth::id()) + ->with('items.variation.product') + ->findOrFail($id); + $user = Auth::user(); + + return view('profile.order-show', compact('order', 'user')); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..74b91eb --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,69 @@ + + */ + 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, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + '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, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'permission' => \App\Http\Middleware\CheckPermission::class, + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..d4ef644 --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/app/Http/Middleware/CheckPermission.php b/app/Http/Middleware/CheckPermission.php new file mode 100644 index 0000000..08f29b7 --- /dev/null +++ b/app/Http/Middleware/CheckPermission.php @@ -0,0 +1,32 @@ +hasPermission($permission)) { + abort(403, 'У вас нет прав для доступа к этой странице'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/CheckRole.php b/app/Http/Middleware/CheckRole.php new file mode 100644 index 0000000..ab71f03 --- /dev/null +++ b/app/Http/Middleware/CheckRole.php @@ -0,0 +1,20 @@ + + */ + 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..afc78c4 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +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..c9c58bd --- /dev/null +++ b/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + 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..093bf64 --- /dev/null +++ b/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // '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..50cf957 --- /dev/null +++ b/app/Models/Brand.php @@ -0,0 +1,62 @@ + 'boolean', + ]; + + public function products(): HasMany + { + return $this->hasMany(Product::class); + } + + public function activeProducts(): HasMany + { + return $this->hasMany(Product::class)->where('is_active', true); + } + + public function getProductsCountAttribute(): int + { + return $this->activeProducts()->count(); + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } + + public function scopePopular($query) + { + return $query->withCount('products')->orderBy('products_count', 'desc'); + } + + public function getLogoUrlAttribute(): string + { + if ($this->logo) { + $logoPath = 'assets/images/brands/' . $this->logo; + if (file_exists(public_path($logoPath))) { + return asset($logoPath); + } + } + + return asset('assets/images/brands/default.svg'); + } +} diff --git a/app/Models/CartItem.php b/app/Models/CartItem.php new file mode 100644 index 0000000..58a6e29 --- /dev/null +++ b/app/Models/CartItem.php @@ -0,0 +1,97 @@ + 'integer', + 'price' => 'decimal:2' + ]; + + public function variation(): BelongsTo + { + return $this->belongsTo(ProductVariation::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function getTotalAttribute(): float + { + return $this->quantity * $this->price; + } + + /** + * Получить корзину для текущего пользователя/сессии + */ + public static function getCartQuery() + { + return self::with('variation.product') + ->where(function ($query) { + if (Auth::check()) { + $query->where('user_id', Auth::id()); + } else { + $query->where('session_id', session()->getId()); + } + }); + } + + /** + * Получить количество товаров в корзине + */ + public static function getCount() + { + return self::getCartQuery()->sum('quantity'); + } + + /** + * Получить общую сумму корзины + */ + public static function getTotal() + { + return self::getCartQuery()->get()->sum('total'); + } + + /** + * Получить товар в корзине по вариации + */ + public static function findByVariation($variationId) + { + return self::getCartQuery() + ->where('variation_id', $variationId) + ->first(); + } + + /** + * Получить товар в корзине по ID + */ + public static function findCartItem($id) + { + return self::getCartQuery() + ->where('id', $id) + ->first(); + } + + /** + * Очистить корзину + */ + public static function clear() + { + return self::getCartQuery()->delete(); + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php new file mode 100644 index 0000000..61c16ad --- /dev/null +++ b/app/Models/Category.php @@ -0,0 +1,243 @@ + 'boolean', + ]; + + public function parent(): BelongsTo + { + return $this->belongsTo(Category::class, 'parent_id'); + } + + public function children(): HasMany + { + return $this->hasMany(Category::class, 'parent_id')->orderBy('sort_order'); + } + + public function descendants() + { + return $this->children()->with('descendants'); + } + + public function products(): HasMany + { + return $this->hasMany(Product::class, 'category_id'); + } + + public function getFullSlugAttribute(): string + { + $slugs = []; + $current = $this; + + while ($current) { + $slugs[] = $current->slug; + $current = $current->parent; + } + + return implode('/', array_reverse($slugs)); + } + + public function getUrlAttribute(): string + { + return route('category.show', $this->full_slug); + } + + public function getBreadcrumbsAttribute() + { + $breadcrumbs = []; + $current = $this; + + while ($current) { + array_unshift($breadcrumbs, [ + 'name' => $current->name, + 'slug' => $current->slug, + 'url' => $current->url + ]); + $current = $current->parent; + } + + return $breadcrumbs; + } + + public function getPathAttribute() + { + $path = []; + $current = $this; + + while ($current) { + array_unshift($path, $current->slug); + $current = $current->parent; + } + + return implode('/', $path); + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } + + public function scopeRoot($query) + { + return $query->whereNull('parent_id'); + } + + public static function getTreeMenu() + { + return self::with('descendants')->root()->active()->orderBy('sort_order')->get(); + } + + public static function findByPath($path) + { + $slugs = explode('/', trim($path, '/')); + $category = null; + + foreach ($slugs as $slug) { + if (!$category) { + $category = self::where('slug', $slug) + ->whereNull('parent_id') + ->active() + ->first(); + } else { + $category = $category->children() + ->where('slug', $slug) + ->active() + ->first(); + } + + if (!$category) { + return null; + } + } + + return $category; + } + + public static function getSelectTree($maxLevel = 1) + { + $categories = self::with('parent')->get(); + + return $categories->map(function ($cat) { + $cat->level = $cat->calculateLevel(); + return $cat; + })->filter(function ($cat) use ($maxLevel) { + return $cat->level < $maxLevel; + }); + } + + public static function getFlatTree() + { + $categories = self::with('parent') + ->orderBy('parent_id') + ->orderBy('sort_order') + ->get(); + + return self::buildFlatTree($categories); + } + + private static function buildFlatTree($categories, $parentId = null, $level = 0) + { + $result = collect(); + + foreach ($categories as $category) { + if ($category->parent_id == $parentId) { + $category->level = $level; + $result->push($category); + + $children = self::buildFlatTree($categories, $category->id, $level + 1); + $result = $result->concat($children); + } + } + + return $result; + } + + public function getLevelAttribute() + { + return $this->calculateLevel(); + } + + public function calculateLevel($level = 0) + { + if ($this->parent) { + return $this->parent->calculateLevel($level + 1); + } + return $level; + } + + public function isDescendantOf($ancestorId): bool + { + $current = $this; + while ($current) { + if ($current->id == $ancestorId) { + return true; + } + $current = $current->parent; + } + return false; + } + + public function getIconUrlAttribute(): string + { + if ($this->icon !== NULL) { + $iconPath = 'assets/images/categories/icons/' . $this->icon; + if (file_exists(public_path($iconPath))) { + return asset($iconPath); + } + } + + return asset('assets/images/categories/icons/default.svg'); + } + + public function getImageUrlAttribute(): string + { + if ($this->image !== NULL) { + $imagePath = 'assets/images/categories/images/' . $this->image; + if (file_exists(public_path($imagePath))) { + return asset($imagePath); + } + } + + return asset('assets/images/categories/images/default.svg'); + } + + public function getAllCategoryIds(): array + { + $ids = [$this->id]; + + foreach ($this->children as $child) { + $ids = array_merge($ids, $child->getAllCategoryIds()); + } + + return $ids; + } + + // В модели Category + public function productsWithChildren() + { + $categoryIds = $this->getAllCategoryIds(); + + return Product::whereIn('category_id', $categoryIds); + } +} diff --git a/app/Models/Contact.php b/app/Models/Contact.php new file mode 100644 index 0000000..d717a3f --- /dev/null +++ b/app/Models/Contact.php @@ -0,0 +1,31 @@ + 'decimal:2', + 'shipping_cost' => 'decimal:2', + 'discount' => 'decimal:2', + 'total' => 'decimal:2' + ]; + + const DELIVERY_STATUSES = [ + 'pending' => 'Ожидает обработки', + 'processing' => 'В обработке', + 'shipped' => 'Отправлен', + 'delivered' => 'Доставлен', + 'cancelled' => 'Отменён' + ]; + + const PAYMENT_STATUSES = [ + 'pending' => 'Ожидает оплаты', + 'paid' => 'Оплачен', + 'failed' => 'Ошибка оплаты' + ]; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function items(): HasMany + { + return $this->hasMany(OrderItem::class); + } + + public static function generateOrderNumber(): string + { + return 'ORD-' . date('Ymd') . '-' . strtoupper(uniqid()); + } + + /** + * Создать заказ из корзины + */ + public static function createFromCart($data, $cartItems) + { + DB::beginTransaction(); + + try { + $subtotal = $cartItems->sum('total'); + $shippingCost = self::calculateShipping($data['delivery_method']); + $total = $subtotal + $shippingCost; + + $shippingAddress = null; + if (in_array($data['delivery_method'], ['courier', 'express'])) { + $shippingAddress = $data['shipping_address']; + } + + $order = self::create([ + 'order_number' => self::generateOrderNumber(), + 'user_id' => auth()->id(), + 'customer_name' => $data['customer_name'], + 'customer_email' => $data['customer_email'], + 'customer_phone' => $data['customer_phone'], + 'shipping_address' => $shippingAddress, + 'subtotal' => $subtotal, + 'shipping_cost' => $shippingCost, + 'total' => $total, + 'payment_method' => $data['payment_method'], + 'delivery_method' => $data['delivery_method'], + 'comment' => $data['comment'] ?? null + ]); + + foreach ($cartItems as $item) { + OrderItem::create([ + 'order_id' => $order->id, + 'variation_id' => $item->variation_id, + 'product_name' => $item->variation->product->name, + 'variation_name' => $item->variation->name, + 'sku' => $item->variation->sku, + 'quantity' => $item->quantity, + 'price' => $item->price, + 'total' => $item->total + ]); + + $item->variation->decrement('stock', $item->quantity); + } + + CartItem::clear(); + + DB::commit(); + + return ['success' => true, 'order' => $order]; + } catch (\Exception $e) { + DB::rollBack(); + return ['success' => false, 'message' => $e->getMessage()]; + } + } + + /** + * Рассчитать стоимость доставки + */ + private static function calculateShipping($method) + { + return match ($method) { + 'express' => 300, + 'courier' => 0, + 'pickup' => 0, + default => 0, + }; + } + + public function getDeliveryStatusNameAttribute(): string + { + return self::DELIVERY_STATUSES[$this->delivery_status] ?? $this->delivery_status; + } + + public function getPaymentStatusNameAttribute(): string + { + return self::PAYMENT_STATUSES[$this->payment_status] ?? $this->payment_status; + } + + public function getDeliveryStatusColorAttribute(): string + { + return match ($this->delivery_status) { + 'pending' => 'warning', + 'processing' => 'info', + 'shipped' => 'primary', + 'delivered' => 'success', + 'cancelled' => 'danger', + default => 'secondary' + }; + } + + public function getDeliveryStatusIconAttribute(): string + { + return match ($this->delivery_status) { + 'pending' => 'bi-clock', + 'processing' => 'bi-arrow-repeat', + 'shipped' => 'bi-truck', + 'delivered' => 'bi-check-circle', + 'cancelled' => 'bi-x-circle', + default => 'bi-question-circle' + }; + } + + /** + * Получить все возможные статусы доставки для выпадающего списка + */ + public static function getDeliveryStatuses(): array + { + return self::DELIVERY_STATUSES; + } + + /** + * Получить все возможные статусы оплаты для выпадающего списка + */ + public static function getPaymentStatuses(): array + { + return self::PAYMENT_STATUSES; + } + + public static function getRevenue($startDate, $endDate, $paidOnly = true) + { + $query = self::query(); + + if ($paidOnly) { + $query->where('payment_status', 'paid'); + } + + return $query->whereBetween('created_at', [$startDate, $endDate]) + ->sum('total'); + } + + public static function getMonthlyRevenue() + { + return self::getRevenue(now()->startOfMonth(), now()->endOfMonth()); + } +} diff --git a/app/Models/OrderItem.php b/app/Models/OrderItem.php new file mode 100644 index 0000000..aa9af30 --- /dev/null +++ b/app/Models/OrderItem.php @@ -0,0 +1,65 @@ + 'integer', + 'price' => 'decimal:2', + 'total' => 'decimal:2' + ]; + + public function order(): BelongsTo + { + return $this->belongsTo(Order::class); + } + + public function variation(): BelongsTo + { + return $this->belongsTo(ProductVariation::class); + } + + public static function createFromCartItem($orderId, $cartItem) + { + return self::create([ + 'order_id' => $orderId, + 'variation_id' => $cartItem->variation_id, + 'product_name' => $cartItem->variation->product->name, + 'variation_name' => $cartItem->variation->name, + 'sku' => $cartItem->variation->sku, + 'quantity' => $cartItem->quantity, + 'price' => $cartItem->price, + 'total' => $cartItem->total + ]); + } + + public function scopePopular($query, $limit = 5) + { + return $query->select( + 'product_name', + 'variation_name', + 'variation_id', + DB::raw('SUM(quantity) as total_quantity'), + DB::raw('SUM(total) as total_revenue') + ) + ->groupBy('product_name', 'variation_name', 'variation_id') + ->orderBy('total_quantity', 'desc') + ->limit($limit); + } +} diff --git a/app/Models/Permission.php b/app/Models/Permission.php new file mode 100644 index 0000000..e6ba5a5 --- /dev/null +++ b/app/Models/Permission.php @@ -0,0 +1,28 @@ +belongsToMany(Role::class)->withTimestamps(); + } + + public function scopeInGroup($query, string $group) + { + $query->where('group', $group); + } +} diff --git a/app/Models/Product.php b/app/Models/Product.php new file mode 100644 index 0000000..d9e2c85 --- /dev/null +++ b/app/Models/Product.php @@ -0,0 +1,183 @@ + 'boolean', + ]; + + public function brand(): BelongsTo + { + return $this->belongsTo(Brand::class); + } + + public function category(): BelongsTo + { + return $this->belongsTo(Category::class); + } + + public function variations(): HasMany + { + return $this->hasMany(ProductVariation::class); + } + + public function attributes(): HasMany + { + return $this->hasMany(ProductAttribute::class); + } + + public function getDefaultVariationAttribute() + { + $defaultInStock = $this->variations->firstWhere(function ($variation) { + return $variation->is_default && $variation->stock > 0; + }); + + if ($defaultInStock) { + return $defaultInStock; + } + + $anyInStock = $this->variations->firstWhere('stock', '>', 0); + + if ($anyInStock) { + return $anyInStock; + } + + return $this->variations->firstWhere('is_default', true) ?? $this->variations->first(); + } + + /** + * Получить URL главного изображения товара (из дефолтной вариации) + */ + public function getMainImageAttribute(): string + { + $defaultVariation = $this->default_variation; + + if ($defaultVariation) { + return $defaultVariation->main_image_url; + } + + return asset('assets/images/products/default.svg'); + } + + /** + * Получить изображения дефолтной вариации + */ + public function getDefaultVariationImages() + { + $defaultVariation = $this->default_variation; + + if ($defaultVariation) { + return $defaultVariation->images; + } + + return collect(); + } + + public static function getForCarousel($categoryId = null, $limit = 9, $itemsPerSlide = 3) + { + $query = self::with(['category', 'brand', 'variations']) + ->active(); + + if ($categoryId) { + $query->byCategory($categoryId); + } + + $products = $query->limit($limit)->get(); + + $products = $products->filter(function ($product) { + return $product->variations->isNotEmpty(); + }); + + $products = $products->sortByDesc(function ($product) { + $defaultVariation = $product->default_variation; + if ($defaultVariation && $defaultVariation->stock > 0) { + return 3; + } elseif ($defaultVariation) { + return 2; + } elseif ($product->variations->firstWhere('stock', '>', 0)) { + return 1; + } + return 0; + }); + + return $products->chunk($itemsPerSlide); + } + + public function getRatingAttribute(): array + { + return [ + 'score' => 4.9, + 'count' => 1000 + ]; + } + + public function getMinPriceAttribute(): float + { + return $this->variations->min('price') ?? 0; + } + + public function getMaxPriceAttribute(): float + { + return $this->variations->max('price') ?? 0; + } + + public function getPriceRangeAttribute(): string + { + $min = $this->min_price; + $max = $this->max_price; + + if ($min == $max) { + return number_format($min, 0, '.', ' ') . ' ₽'; + } + + return 'от ' . number_format($min, 0, '.', ' ') . ' ₽ до ' . number_format($max, 0, '.', ' ') . ' ₽'; + } + + public function getTotalStockAttribute(): int + { + return $this->variations->sum('stock'); + } + + public function getHasStockAttribute(): bool + { + return $this->total_stock > 0; + } + + public function getFullNameAttribute(): string + { + return $this->brand ? "[{$this->brand->name}] {$this->name}" : $this->name; + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } + + public function scopeByBrand($query, $brandId) + { + return $query->where('brand_id', $brandId); + } + + public function scopeByCategory($query, $categoryId) + { + return $query->where('category_id', $categoryId); + } +} \ No newline at end of file diff --git a/app/Models/ProductAttribute.php b/app/Models/ProductAttribute.php new file mode 100644 index 0000000..57af154 --- /dev/null +++ b/app/Models/ProductAttribute.php @@ -0,0 +1,16 @@ +belongsTo(Product::class); + } +} diff --git a/app/Models/ProductVariation.php b/app/Models/ProductVariation.php new file mode 100644 index 0000000..77ff3ac --- /dev/null +++ b/app/Models/ProductVariation.php @@ -0,0 +1,160 @@ + 'boolean', + 'is_active' => 'boolean', + 'price' => 'float', + 'old_price' => 'float', + ]; + + public function product(): BelongsTo + { + return $this->belongsTo(Product::class); + } + + public function attributes(): HasMany + { + return $this->hasMany(VariationAttribute::class, 'variation_id'); + } + + public function images(): HasMany + { + return $this->hasMany(VariationImage::class, 'variation_id') + ->ordered(); + } + + /** + * Получить URL главного изображения вариации + */ + public function getMainImageUrlAttribute(): string + { + $image = $this->images()->first(); + + if ($image) { + return $image->url; + } + + return asset('assets/images/products/default.svg'); + } + + /** + * Получить все изображения вариации + */ + public function getAllImages() + { + return $this->images; + } + + public function getHasDiscountAttribute(): bool + { + return $this->old_price && $this->old_price > $this->price; + } + + public function getDiscountPercentAttribute(): int + { + if (!$this->has_discount) return 0; + return round(($this->old_price - $this->price) / $this->old_price * 100); + } + + public function getInStockAttribute(): bool + { + return $this->stock > 0; + } + + public function getFormattedPriceAttribute(): string + { + return number_format($this->price, 0, '.', ' ') . ' ₽'; + } + + public function getFormattedOldPriceAttribute(): string + { + if (!$this->old_price) return ''; + return number_format($this->old_price, 0, '.', ' ') . ' ₽'; + } + + public static function isSkuUnique($sku, $excludeId = null, $productId = null) + { + $query = self::where('sku', $sku); + + if ($excludeId) { + $query->where('id', '!=', $excludeId); + } + + if ($productId) { + $query->where('product_id', $productId); + } + + return !$query->exists(); + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } + + public function scopeInStock($query) + { + return $query->where('stock', '>', 0); + } + + public function scopeDiscounted($query) + { + return $query->whereNotNull('old_price') + ->whereColumn('old_price', '>', 'price'); + } + + public function scopeDefault($query) + { + return $query->where('is_default', true); + } + + // ========== МЕТОДЫ ДЛЯ AJAX ========== + + public static function getImagesByVariationId($variationId) + { + $variation = self::with(['images' => function ($query) { + $query->active()->ordered(); + }])->find($variationId); + + if (!$variation) { + return collect(); + } + + return $variation->images; + } + + public static function getImagesDataById($variationId) + { + $images = self::getImagesByVariationId($variationId); + + return $images->map(function ($image) { + return [ + 'id' => $image->id, + 'url' => $image->url, + 'sort_order' => $image->sort_order, + 'variation_id' => $image->variation_id + ]; + }); + } +} diff --git a/app/Models/Review.php b/app/Models/Review.php new file mode 100644 index 0000000..59107ed --- /dev/null +++ b/app/Models/Review.php @@ -0,0 +1,74 @@ + 'boolean', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function product(): BelongsTo + { + return $this->belongsTo(Product::class); + } + + public function getDateAttribute(): string + { + return $this->created_at->format('d.m.Y'); + } + + public function getIsFreshAttribute(): bool + { + return $this->created_at->gt(now()->subWeek()); + } + + public function scopeApproved($query) + { + return $query->where('is_approved', true); + } + + public function scopeByRating($query, $rating) + { + return $query->where('rating', $rating); + } + + public function scopeHelpful($query) + { + return $query->orderBy('helpful_count', 'desc'); + } + + public function scopeLatest($query) + { + return $query->orderBy('created_at', 'desc'); + } + + public function scopeUserProduct($query, $userId, $productId) + { + return $query->where('user_id', $userId) + ->where('product_id', $productId); + } +} diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..d2ff7ef --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,32 @@ +belongsToMany(User::class)->withTimestamps(); + } + + public function permissions(): BelongsToMany + { + return $this->belongsToMany(Permission::class)->withTimestamps(); + } + + public function hasPermission(string $permissionSlug): bool + { + return $this->permissions()->where('slug', $permissionSlug)->exists(); + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..8270725 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,110 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + 'phone', + 'role_id', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + + public function role(): BelongsTo + { + return $this->belongsTo(Role::class); + } + + public function permissions(): BelongsToMany + { + return $this->belongsToMany(Permission::class, 'role_user', 'user_id', 'role_id') + ->join('permission_role', 'role_user.role_id', '=', 'permission_role.role_id') + ->join('permissions', 'permission_role.permission_id', '=', 'permissions.id') + ->select('permissions.*') + ->distinct() + ->withTimestamps(); + } + + public function hasRole(string $roleSlug): bool + { + return $this->role()->where('slug', $roleSlug)->exists(); + } + + public function hasPermission(string $permissionSlug): bool + { + if ($this->hasRole('super_admin')) { + return true; + } + + $role = $this->role; + + return $role && $role->hasPermission($permissionSlug); + } + + public function hasAnyPermission(array $permissionSlugs): bool + { + if ($this->is_super_admin) { + return true; + } + + foreach ($permissionSlugs as $permissionSlug) { + if ($this->hasPermission($permissionSlug)) { + return true; + } + } + + return false; + } + + public function hasAllPermissions(array $permissionSlugs): bool + { + if ($this->is_super_admin) { + return true; + } + + foreach ($permissionSlugs as $permissionSlug) { + if (!$this->hasPermission($permissionSlug)) { + return false; + } + } + + return true; + } +} diff --git a/app/Models/VariationAttribute.php b/app/Models/VariationAttribute.php new file mode 100644 index 0000000..c31b15e --- /dev/null +++ b/app/Models/VariationAttribute.php @@ -0,0 +1,16 @@ +belongsTo(ProductVariation::class, 'variation_id'); + } +} diff --git a/app/Models/VariationImage.php b/app/Models/VariationImage.php new file mode 100644 index 0000000..1cef1c6 --- /dev/null +++ b/app/Models/VariationImage.php @@ -0,0 +1,47 @@ + 'integer', + 'is_active' => 'boolean' + ]; + + public function variation(): BelongsTo + { + return $this->belongsTo(ProductVariation::class, 'variation_id'); + } + + public function getUrlAttribute(): string + { + if ($this->path && file_exists(public_path($this->path))) { + return asset($this->path); + } + + return asset('assets/images/products/default.svg'); + } + + public function scopeOrdered($query) + { + return $query->orderBy('sort_order', 'asc'); + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..7acca87 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,25 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + Gate::before(function ($user, $ability) { + return $user->hasPermission($ability); + }); + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/app/Providers/MenuServiceProvider.php b/app/Providers/MenuServiceProvider.php new file mode 100644 index 0000000..3c9821c --- /dev/null +++ b/app/Providers/MenuServiceProvider.php @@ -0,0 +1,34 @@ +getMenuData(); + + $view->with('menuCategories', $menuData['categories']); + $view->with('menuContacts', $menuData['contacts']); + $view->with('menuBrands', $menuData['popularBrands']); + $view->with('footerCategories', $menuData['footerCategories']); + }); + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1cf5f15 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} 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..8a3d72d --- /dev/null +++ b/composer.json @@ -0,0 +1,66 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The skeleton application for the Laravel framework.", + "keywords": ["laravel", "framework"], + "license": "MIT", + "require": { + "php": "^8.1", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.10", + "laravel/sanctum": "^3.3", + "laravel/tinker": "^2.8" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ignition": "^2.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, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..27d0f68 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8146 @@ +{ + "_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": "9c491b8531eec05ba41a11d9276a5749", + "packages": [ + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.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", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "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": "^4.0.0" + }, + "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.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "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 || ^5.4" + }, + "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.10" + }, + "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": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "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/3.0.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%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-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.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "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.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "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.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "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 + } + }, + "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.8.1" + }, + "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": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "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/2.0.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": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.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.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "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.6.2" + }, + "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": "2023-12-03T20:05:35+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "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" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.48.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/91e2b9e218afa4e5c377510faa11957042831ba3", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "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.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", + "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/process": "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.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "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.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.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.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "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 and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "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.5).", + "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.5.1).", + "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|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "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.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/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": "2024-04-30T12:52:59+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.21" + }, + "time": "2024-04-30T12:46:16+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "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": "2023-12-19T18:44:48+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "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": "2023-11-08T14:08:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "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.9.0" + }, + "time": "2024-01-04T16:10:04+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "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.3", + "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 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-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": "2024-02-02T11:59:32+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "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": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.27.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "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 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "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.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "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.27.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-04-07T19:17:50+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.25.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-03-15T19:58:44+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "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.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "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": "3.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/3.6.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T21:02:21+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.3", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "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": "2024-01-25T10:35:09+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-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.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "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()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-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/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-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/v5.0.2" + }, + "time": "2024-03-05T20:51:40+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "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.15.1" + }, + "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": "2023-02-08T01:06:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "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.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36: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.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.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": "https://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" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.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": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: 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" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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/2.0" + }, + "time": "2023-04-04T09:54: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": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.3", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^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." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "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.12.3" + }, + "time": "2024-04-02T15:57:53+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": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.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-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.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.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|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "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|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.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.4.7" + }, + "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": "2024-04-23T10:36:43+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.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.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "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|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "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.4.7" + }, + "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": "2024-04-29T11:24:44+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "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", + "symfony/serializer": "<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "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": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "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.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ffeb9591c61f65a68d47f77d12b83fa530227a69", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69", + "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.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "7495687c58bfd88b7883823747b0656d90679123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "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.4.7" + }, + "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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "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 || ^7.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/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-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.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+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": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^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": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "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", + "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.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "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.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12: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.15.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/3600b5d17aff52f6100ea4921849deacbbeb8656", + "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.54.0", + "illuminate/view": "^10.48.8", + "larastan/larastan": "^2.9.5", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.11", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.34.7" + }, + "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": "2024-04-30T15:02:26+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.29.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/8be4a31150eab3b46af11a2e7b2c4632eefaad7e", + "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0", + "illuminate/support": "^9.52.16|^10.0|^11.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "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": "2024-03-20T20:09:31+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.11", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "81a161d0b135df89951abd52296adf97deb0723d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", + "reference": "81a161d0b135df89951abd52296adf97deb0723d", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "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": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-03-21T18:34:15+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "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.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.10.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.3", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.4" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", + "nunomaduro/larastan": "^2.6.4", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.3.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "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": "2023-10-11T15:45:01+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+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": "10.1.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.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": "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", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:33:41+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "shasum": "" + }, + "require": { + "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": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.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", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + }, + "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": "2024-04-24T06:32:35+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.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", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-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", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-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", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 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", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.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": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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 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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "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": { + "source": "https://github.com/spatie/backtrace/tree/1.6.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-04-24T13:22:11+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "e27977d534eefe04c154c6fd8460217024054c05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/e27977d534eefe04c154c6fd8460217024054c05", + "reference": "e27977d534eefe04c154c6fd8460217024054c05", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.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.5.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-03T15:43:14+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.14.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/c23cc018c5f423d2f413b99f84655fceb6549811", + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.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": "2024-05-03T15:56:16+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f52124d50122611e8a40f628cef5c19ff6cc5b57", + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.5", + "spatie/ignition": "^1.14", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1", + "orchestra/testbench": "8.22.3|^9.0", + "pestphp/pest": "^2.34", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.16", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "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": "2024-05-02T13:42:49+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.7" + }, + "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": "2024-04-28T10:28:08+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..74b5766 --- /dev/null +++ b/config/app.php @@ -0,0 +1,189 @@ + 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' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | 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' => 'en', + + /* + |-------------------------------------------------------------------------- + | 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' => ServiceProvider::defaultProviders()->merge([ + /* + * 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, + App\Providers\MenuServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | 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([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..9548c15 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => 'web', + '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' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | 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' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // '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 expiry 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. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + '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..2410485 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,71 @@ + 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' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: '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..d4171e2 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,111 @@ + 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'), + 'lock_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..137ad18 --- /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' => true, + 'engine' => null, + '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/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..0e8a0bb --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,54 @@ + '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', 12), + 'verify' => true, + ], + + /* + |-------------------------------------------------------------------------- + | 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, + 'verify' => true, + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..c44d276 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,131 @@ + 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'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + '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'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + '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..e894b2e --- /dev/null +++ b/config/mail.php @@ -0,0 +1,134 @@ + 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", "ses-v2", + | "postmark", "log", "array", "failover", "roundrobin" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + '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', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => null, + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + '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', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | 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..01c6b05 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,109 @@ + 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, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | 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..35d75b3 --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,83 @@ + 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. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | 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' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..0ace530 --- /dev/null +++ b/config/services.php @@ -0,0 +1,34 @@ + [ + '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'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..e738cb3 --- /dev/null +++ b/config/session.php @@ -0,0 +1,214 @@ + 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', + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => false, + +]; 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..584104c --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..444fafb --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php b/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php new file mode 100644 index 0000000..81a7229 --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php @@ -0,0 +1,28 @@ +string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('password_reset_tokens'); + } +}; 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..249da81 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,32 @@ +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. + */ + public function down(): void + { + 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..e828ad8 --- /dev/null +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +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. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2026_03_12_171109_create_roles_table.php b/database/migrations/2026_03_12_171109_create_roles_table.php new file mode 100644 index 0000000..35c6474 --- /dev/null +++ b/database/migrations/2026_03_12_171109_create_roles_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name')->unique(); + $table->string('slug')->unique(); + $table->string('description')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/2026_03_12_171110_create_permissions_table.php b/database/migrations/2026_03_12_171110_create_permissions_table.php new file mode 100644 index 0000000..26c4338 --- /dev/null +++ b/database/migrations/2026_03_12_171110_create_permissions_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name')->unique(); + $table->string('slug')->unique(); + $table->string('group')->nullable(); + $table->text('description')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('permissions'); + } +}; diff --git a/database/migrations/2026_03_12_171111_create_permission_role_table.php b/database/migrations/2026_03_12_171111_create_permission_role_table.php new file mode 100644 index 0000000..b501c05 --- /dev/null +++ b/database/migrations/2026_03_12_171111_create_permission_role_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('permission_id')->constrained()->onDelete('cascade'); + $table->foreignId('role_id')->constrained()->onDelete('cascade'); + $table->timestamps(); + + $table->unique(['permission_id', 'role_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('permission_role'); + } +}; diff --git a/database/migrations/2026_03_14_102454_create_categories_table.php b/database/migrations/2026_03_14_102454_create_categories_table.php new file mode 100644 index 0000000..76904fe --- /dev/null +++ b/database/migrations/2026_03_14_102454_create_categories_table.php @@ -0,0 +1,45 @@ +id(); + $table->string('name'); + $table->string('slug')->unique(); + $table->text('description')->nullable(); + $table->string('icon')->nullable(); + $table->string('image')->nullable(); + + $table->unsignedBigInteger('parent_id')->nullable(); + + $table->integer('sort_order')->default(0)->index(); + $table->boolean('is_active')->default(true); + + $table->index('parent_id'); + + $table->foreign('parent_id') + ->references('id') + ->on('categories') + ->onDelete('cascade'); + + $table->unique(['name', 'parent_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/database/migrations/2026_03_14_124100_create_brands_table.php b/database/migrations/2026_03_14_124100_create_brands_table.php new file mode 100644 index 0000000..41550bb --- /dev/null +++ b/database/migrations/2026_03_14_124100_create_brands_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name'); + $table->string('slug')->unique(); + $table->text('description')->nullable(); + $table->string('logo')->nullable(); + $table->string('website')->nullable(); + $table->string('country')->nullable(); + $table->boolean('is_active')->default(true); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('brands'); + } +}; diff --git a/database/migrations/2026_03_14_124103_create_products_table.php b/database/migrations/2026_03_14_124103_create_products_table.php new file mode 100644 index 0000000..3a45fc4 --- /dev/null +++ b/database/migrations/2026_03_14_124103_create_products_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('name'); + $table->string('slug')->unique(); + $table->text('description'); + + $table->foreignId('brand_id')->nullable()->constrained()->onDelete('set null'); + $table->foreignId('category_id')->constrained()->onDelete('cascade'); + + $table->json('attributes')->nullable(); + $table->boolean('is_active')->default(true); + $table->timestamps(); + + $table->index('brand_id'); + $table->index('category_id'); + $table->index('is_active'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('products'); + } +}; diff --git a/database/migrations/2026_03_14_135714_create_product_variations_table.php b/database/migrations/2026_03_14_135714_create_product_variations_table.php new file mode 100644 index 0000000..242c627 --- /dev/null +++ b/database/migrations/2026_03_14_135714_create_product_variations_table.php @@ -0,0 +1,44 @@ +id(); + $table->foreignId('product_id')->constrained()->onDelete('cascade'); + + $table->string('name'); + $table->string('sku')->unique(); + $table->decimal('price', 10, 2); + $table->decimal('old_price', 10, 2)->nullable(); + $table->json('attributes')->nullable(); + + $table->json('images')->nullable(); + $table->integer('stock')->default(0); + + $table->boolean('is_default')->default(false); + $table->boolean('is_active')->default(true); + + $table->timestamps(); + + $table->index('sku'); + $table->index('product_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_variations'); + } +}; diff --git a/database/migrations/2026_03_14_201029_create_reviews_table.php b/database/migrations/2026_03_14_201029_create_reviews_table.php new file mode 100644 index 0000000..70a74e7 --- /dev/null +++ b/database/migrations/2026_03_14_201029_create_reviews_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->foreignId('product_id')->constrained()->onDelete('cascade'); + + $table->tinyInteger('rating'); + $table->string('title')->nullable(); + $table->text('comment'); + $table->text('advantages')->nullable(); + $table->text('disadvantages')->nullable(); + + $table->integer('helpful_count')->default(0); + $table->integer('unhelpful_count')->default(0); + $table->boolean('is_approved')->default(false); + $table->timestamps(); + + $table->index('rating'); + $table->index('is_approved'); + $table->index('created_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('reviews'); + } +}; diff --git a/database/migrations/2026_03_14_213006_create_contacts_table.php b/database/migrations/2026_03_14_213006_create_contacts_table.php new file mode 100644 index 0000000..04680b2 --- /dev/null +++ b/database/migrations/2026_03_14_213006_create_contacts_table.php @@ -0,0 +1,45 @@ +id(); + $table->string('name')->default('Хвостики и лапки'); + $table->string('description')->nullable(); + $table->string('logo')->nullable(); + $table->string('favicon')->nullable(); + + $table->string('phone')->nullable(); + $table->string('email')->nullable(); + $table->string('address')->nullable(); + $table->string('work_hours')->nullable(); + + $table->string('telegram')->nullable(); + $table->string('whatsapp')->nullable(); + $table->string('vkontakte')->nullable(); + + $table->string('meta_title')->nullable(); + $table->text('meta_description')->nullable(); + $table->text('meta_keywords')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('contacts'); + } +}; diff --git a/database/migrations/2026_03_14_213427_add_meta_fields_to_products_table.php b/database/migrations/2026_03_14_213427_add_meta_fields_to_products_table.php new file mode 100644 index 0000000..aaaa903 --- /dev/null +++ b/database/migrations/2026_03_14_213427_add_meta_fields_to_products_table.php @@ -0,0 +1,30 @@ +string('meta_title')->nullable()->after('is_active'); + $table->text('meta_description')->nullable()->after('meta_title'); + $table->string('meta_keywords')->nullable()->after('meta_description'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('products', function (Blueprint $table) { + $table->dropColumn(['meta_title', 'meta_description', 'meta_keywords']); + }); + } +}; diff --git a/database/migrations/2026_03_16_191828_add_phone_to_users_table.php b/database/migrations/2026_03_16_191828_add_phone_to_users_table.php new file mode 100644 index 0000000..abfef36 --- /dev/null +++ b/database/migrations/2026_03_16_191828_add_phone_to_users_table.php @@ -0,0 +1,30 @@ +string('phone', 20)->nullable()->after('email'); + + $table->index('phone'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('phone'); + }); + } +}; diff --git a/database/migrations/2026_03_16_192010_add_email_index_to_users_table.php b/database/migrations/2026_03_16_192010_add_email_index_to_users_table.php new file mode 100644 index 0000000..89b0904 --- /dev/null +++ b/database/migrations/2026_03_16_192010_add_email_index_to_users_table.php @@ -0,0 +1,25 @@ +index('email'); + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropIndex('email'); + }); + } +}; diff --git a/database/migrations/2026_03_18_192641_add_role_id_to_users_table.php b/database/migrations/2026_03_18_192641_add_role_id_to_users_table.php new file mode 100644 index 0000000..3ff3cd7 --- /dev/null +++ b/database/migrations/2026_03_18_192641_add_role_id_to_users_table.php @@ -0,0 +1,29 @@ +foreignId('role_id')->nullable()->constrained('roles')->nullOnDelete()->after('phone'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropForeign(['role_id']); + $table->dropColumn('role_id'); + }); + } +}; diff --git a/database/migrations/2026_03_28_191947_fix_products_and_variations_structure.php b/database/migrations/2026_03_28_191947_fix_products_and_variations_structure.php new file mode 100644 index 0000000..77982f4 --- /dev/null +++ b/database/migrations/2026_03_28_191947_fix_products_and_variations_structure.php @@ -0,0 +1,73 @@ +dropColumn('attributes'); + }); + + // Удаляем JSON поля из таблицы product_variations + Schema::table('product_variations', function (Blueprint $table) { + $table->dropColumn('attributes'); + $table->dropColumn('images'); + }); + + // Создаем таблицу для изображений вариаций + Schema::create('variation_images', function (Blueprint $table) { + $table->id(); + $table->foreignId('variation_id')->constrained('product_variations')->cascadeOnDelete(); + $table->string('path'); + $table->integer('sort_order')->default(0); + $table->timestamps(); + + $table->index(['variation_id', 'sort_order']); + }); + + // Создаем таблицу для атрибутов вариаций + Schema::create('variation_attributes', function (Blueprint $table) { + $table->id(); + $table->foreignId('variation_id')->constrained('product_variations')->cascadeOnDelete(); + $table->string('key'); + $table->string('value')->nullable(); + $table->timestamps(); + + $table->index(['variation_id', 'key']); + }); + + // Создаем таблицу для атрибутов товара + Schema::create('product_attributes', function (Blueprint $table) { + $table->id(); + $table->foreignId('product_id')->constrained()->cascadeOnDelete(); + $table->string('key'); + $table->text('value')->nullable(); + $table->timestamps(); + + $table->index(['product_id', 'key']); + }); + } + + public function down() + { + // Возвращаем JSON поля + Schema::table('products', function (Blueprint $table) { + $table->json('attributes')->nullable(); + }); + + Schema::table('product_variations', function (Blueprint $table) { + $table->json('attributes')->nullable(); + $table->json('images')->nullable(); + }); + + // Удаляем новые таблицы + Schema::dropIfExists('variation_images'); + Schema::dropIfExists('variation_attributes'); + Schema::dropIfExists('product_attributes'); + } +}; diff --git a/database/migrations/2026_04_01_142406_create_cart_items_table.php b/database/migrations/2026_04_01_142406_create_cart_items_table.php new file mode 100644 index 0000000..c57e84e --- /dev/null +++ b/database/migrations/2026_04_01_142406_create_cart_items_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignId('user_id')->nullable()->constrained()->onDelete('cascade'); + $table->string('session_id')->nullable()->index(); + $table->foreignId('variation_id')->constrained('product_variations')->onDelete('cascade'); + $table->integer('quantity')->default(1); + $table->decimal('price', 10, 2); + $table->timestamps(); + + $table->index(['user_id', 'session_id']); + }); + } + + public function down() + { + Schema::dropIfExists('cart_items'); + } +} diff --git a/database/migrations/2026_04_01_142423_create_orders_table.php b/database/migrations/2026_04_01_142423_create_orders_table.php new file mode 100644 index 0000000..a59b38e --- /dev/null +++ b/database/migrations/2026_04_01_142423_create_orders_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('order_number')->unique(); + $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); + $table->string('customer_name'); + $table->string('customer_email'); + $table->string('customer_phone'); + $table->text('shipping_address')->nullable(); + $table->decimal('subtotal', 10, 2); + $table->decimal('shipping_cost', 10, 2)->default(0); + $table->decimal('discount', 10, 2)->default(0); + $table->decimal('total', 10, 2); + $table->string('payment_method')->default('cash'); + $table->string('payment_status')->default('pending'); + $table->string('delivery_method')->default('courier'); + $table->string('delivery_status')->default('pending'); + $table->text('comment')->nullable(); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('orders'); + } +} diff --git a/database/migrations/2026_04_01_142428_create_order_items_table.php b/database/migrations/2026_04_01_142428_create_order_items_table.php new file mode 100644 index 0000000..78ab621 --- /dev/null +++ b/database/migrations/2026_04_01_142428_create_order_items_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignId('order_id')->constrained()->onDelete('cascade'); + $table->foreignId('variation_id')->constrained('product_variations')->onDelete('cascade'); + $table->string('product_name'); + $table->string('variation_name')->nullable(); + $table->string('sku')->nullable(); + $table->integer('quantity'); + $table->decimal('price', 10, 2); + $table->decimal('total', 10, 2); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('order_items'); + } +} diff --git a/database/seeders/BrandSeeder.php b/database/seeders/BrandSeeder.php new file mode 100644 index 0000000..cb1fe62 --- /dev/null +++ b/database/seeders/BrandSeeder.php @@ -0,0 +1,67 @@ +cleanTables(); + + $brands = [ + [ + 'name' => 'Royal Canin', + 'slug' => 'royal-canin', + 'description' => 'Премиальные корма для кошек и собак', + 'country' => 'Франция', + 'website' => 'https://www.royalcanin.com', + ], + [ + 'name' => 'ABBA', + 'slug' => 'abba', + 'description' => 'Качественные корма для домашних животных', + 'country' => 'Россия', + 'website' => 'https://abba.ru', + ], + [ + 'name' => 'RURRI', + 'slug' => 'rurri', + 'description' => 'Одежда и амуниция для собак', + 'country' => 'Россия', + ], + [ + 'name' => 'Ownat', + 'slug' => 'ownat', + 'description' => 'Натуральные корма премиум-класса', + 'country' => 'Испания', + 'website' => 'https://www.ownat.com', + ], + [ + 'name' => 'Grandin', + 'slug' => 'grandin', + 'description' => 'Корма и лакомства для собак', + 'country' => 'Россия', + ], + ]; + + foreach ($brands as $brandData) { + Brand::create($brandData); + } + + $this->command->info('✅ Бренды созданы: ' . Brand::count()); + } + + private function cleanTables() + { + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + DB::table('products')->truncate(); + DB::table('brands')->truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + } +} diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php new file mode 100644 index 0000000..2fcc787 --- /dev/null +++ b/database/seeders/CategorySeeder.php @@ -0,0 +1,421 @@ +cleanTables(); + + $categories = [ + // ============================================ + // ДЛЯ СОБАК + // ============================================ + [ + 'name' => 'Для собак', + 'slug' => 'dlya-sobak', + 'sort_order' => 10, + 'children' => [ + // Корма для собак + [ + 'name' => 'Корма', + 'slug' => 'korma-dlya-sobak', + 'sort_order' => 10, + 'children' => [ + [ + 'name' => 'Сухие корма', + 'slug' => 'suhie-korma', + 'sort_order' => 10 + ], + [ + 'name' => 'Влажные корма', + 'slug' => 'vlazhnye-korma', + 'sort_order' => 20 + ], + [ + 'name' => 'Диетическое питание', + 'slug' => 'dieticheskoe-pitanie', + 'sort_order' => 30 + ], + ] + ], + // Амуниция для собак + [ + 'name' => 'Амуниция', + 'slug' => 'amunitsiya', + 'sort_order' => 20, + 'children' => [ + [ + 'name' => 'Ошейники и поводки', + 'slug' => 'osheyniki-i-povodki', + 'sort_order' => 10 + ], + [ + 'name' => 'Намордники', + 'slug' => 'namordniki', + 'sort_order' => 20 + ], + [ + 'name' => 'Шлейки', + 'slug' => 'shleyki', + 'sort_order' => 30 + ], + ] + ], + // Игрушки для собак + [ + 'name' => 'Игрушки', + 'slug' => 'igrushki', + 'sort_order' => 30, + 'children' => [ + [ + 'name' => 'Мячики и фрисби', + 'slug' => 'myachiki-i-frisbi', + 'sort_order' => 10 + ], + [ + 'name' => 'Канаты и кости', + 'slug' => 'kanaty-i-kosti', + 'sort_order' => 20 + ], + ] + ], + // Лежанки и домики + [ + 'name' => 'Лежанки и домики', + 'slug' => 'lezhanki-i-domiki', + 'sort_order' => 40, + 'children' => [ + [ + 'name' => 'Лежанки', + 'slug' => 'lezhanki', + 'sort_order' => 10 + ], + [ + 'name' => 'Домики', + 'slug' => 'domiki', + 'sort_order' => 20 + ], + ] + ], + // Миски и кормушки + [ + 'name' => 'Миски и кормушки', + 'slug' => 'miski-i-kormushki', + 'sort_order' => 50, + 'children' => [ + [ + 'name' => 'Миски', + 'slug' => 'miski', + 'sort_order' => 10 + ], + [ + 'name' => 'Автокормушки', + 'slug' => 'avtokormushki', + 'sort_order' => 20 + ], + ] + ], + ] + ], + + // ============================================ + // ДЛЯ КОШЕК + // ============================================ + [ + 'name' => 'Для кошек', + 'slug' => 'dlya-koshek', + 'sort_order' => 20, + 'children' => [ + // Корма для кошек + [ + 'name' => 'Корма', + 'slug' => 'korma-dlya-koshek', + 'sort_order' => 10, + 'children' => [ + [ + 'name' => 'Сухие корма', + 'slug' => 'suhie-korma-dlya-koshek', + 'sort_order' => 10 + ], + [ + 'name' => 'Паучи и консервы', + 'slug' => 'pauchi-i-konservy', + 'sort_order' => 20 + ], + [ + 'name' => 'Лакомства', + 'slug' => 'lakomstva-dlya-koshek', + 'sort_order' => 30 + ], + ] + ], + // Наполнители + [ + 'name' => 'Наполнители', + 'slug' => 'napolniteli', + 'sort_order' => 20, + 'children' => [ + [ + 'name' => 'Древесные', + 'slug' => 'drevesnye', + 'sort_order' => 10 + ], + [ + 'name' => 'Силикагелевые', + 'slug' => 'silikagelevye', + 'sort_order' => 20 + ], + [ + 'name' => 'Комкующиеся', + 'slug' => 'komkuyuschiesya', + 'sort_order' => 30 + ], + ] + ], + // Когтеточки и домики + [ + 'name' => 'Когтеточки и домики', + 'slug' => 'kogtetochki-i-domiki', + 'sort_order' => 30, + 'children' => [ + [ + 'name' => 'Когтеточки', + 'slug' => 'kogtetochki', + 'sort_order' => 10 + ], + [ + 'name' => 'Лежанки для кошек', + 'slug' => 'lezhanki-dlya-koshek', + 'sort_order' => 20 + ], + [ + 'name' => 'Игровые комплексы', + 'slug' => 'igrovye-kompleksy', + 'sort_order' => 30 + ], + ] + ], + ] + ], + + // ============================================ + // ДЛЯ ГРЫЗУНОВ + // ============================================ + [ + 'name' => 'Для грызунов', + 'slug' => 'dlya-gryzunov', + 'sort_order' => 30, + 'children' => [ + [ + 'name' => 'Корма', + 'slug' => 'korma-dlya-gryzunov', + 'sort_order' => 10, + 'children' => [ + [ + 'name' => 'Зерновые смеси', + 'slug' => 'zernovye-smesi', + 'sort_order' => 10 + ], + [ + 'name' => 'Сено и травы', + 'slug' => 'seno-i-travy', + 'sort_order' => 20 + ], + [ + 'name' => 'Лакомства', + 'slug' => 'lakomstva-dlya-gryzunov', + 'sort_order' => 30 + ], + ] + ], + [ + 'name' => 'Клетки и аксессуары', + 'slug' => 'kletki-i-aksessuary', + 'sort_order' => 20, + 'children' => [ + [ + 'name' => 'Клетки', + 'slug' => 'kletki', + 'sort_order' => 10 + ], + [ + 'name' => 'Поилки и миски', + 'slug' => 'poilki-i-miski', + 'sort_order' => 20 + ], + [ + 'name' => 'Наполнители', + 'slug' => 'napolniteli-dlya-gryzunov', + 'sort_order' => 30 + ], + ] + ], + ] + ], + + // ============================================ + // ДЛЯ ПТИЦ + // ============================================ + [ + 'name' => 'Для птиц', + 'slug' => 'dlya-ptic', + 'sort_order' => 40, + 'children' => [ + [ + 'name' => 'Корма', + 'slug' => 'korma-dlya-ptic', + 'sort_order' => 10, + 'children' => [ + [ + 'name' => 'Корма для попугаев', + 'slug' => 'korma-dlya-popugaev', + 'sort_order' => 10 + ], + [ + 'name' => 'Корма для канареек', + 'slug' => 'korma-dlya-kanareek', + 'sort_order' => 20 + ], + [ + 'name' => 'Минеральные камни', + 'slug' => 'mineralnye-kamni', + 'sort_order' => 30 + ], + ] + ], + [ + 'name' => 'Аксессуары', + 'slug' => 'aksessuary-dlya-ptic', + 'sort_order' => 20, + 'children' => [ + [ + 'name' => 'Клетки и жердочки', + 'slug' => 'kletki-i-zherdochki', + 'sort_order' => 10 + ], + [ + 'name' => 'Игрушки для птиц', + 'slug' => 'igrushki-dlya-ptic', + 'sort_order' => 20 + ], + ] + ], + ] + ], + + // ============================================ + // ДЛЯ РЫБ + // ============================================ + [ + 'name' => 'Для рыб', + 'slug' => 'dlya-ryb', + 'sort_order' => 50, + 'children' => [ + [ + 'name' => 'Корма для рыб', + 'slug' => 'korma-dlya-ryb', + 'sort_order' => 10 + ], + [ + 'name' => 'Аквариумы', + 'slug' => 'akvariumy', + 'sort_order' => 20 + ], + [ + 'name' => 'Фильтрация и помпы', + 'slug' => 'filtratsiya-i-pompy', + 'sort_order' => 30 + ], + [ + 'name' => 'Освещение', + 'slug' => 'osveschenie', + 'sort_order' => 40 + ], + [ + 'name' => 'Грунт и декор', + 'slug' => 'grunt-i-dekor', + 'sort_order' => 50 + ], + ] + ], + + // ============================================ + // ЗДОРОВЬЕ И УХОД + // ============================================ + [ + 'name' => 'Здоровье и уход', + 'slug' => 'zdorovie-i-uhod', + 'sort_order' => 60, + 'children' => [ + [ + 'name' => 'Шампуни и косметика', + 'slug' => 'shampuni-i-kosmetika', + 'sort_order' => 10 + ], + [ + 'name' => 'Витамины и добавки', + 'slug' => 'vitaminy-i-dobavki', + 'sort_order' => 20 + ], + [ + 'name' => 'Средства от паразитов', + 'slug' => 'sredstva-ot-parazitov', + 'sort_order' => 30 + ], + [ + 'name' => 'Аптечка', + 'slug' => 'aptechka', + 'sort_order' => 40 + ], + [ + 'name' => 'Груминг', + 'slug' => 'gruming', + 'sort_order' => 50 + ], + ] + ], + ]; + + foreach ($categories as $categoryData) { + $this->createCategoryWithChildren($categoryData); + } + + $this->command->info('✅ Категории успешно созданы!'); + $this->command->info('📊 Всего категорий: ' . Category::count()); + } + + private function cleanTables() + { + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + DB::table('products')->truncate(); + DB::table('categories')->truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + } + + private function createCategoryWithChildren($data, $parentId = null) + { + $children = $data['children'] ?? []; + unset($data['children']); + + $data['parent_id'] = $parentId; + $data['is_active'] = true; + + $data['icon'] = $data['slug'] . '.svg'; + + $data['image'] = $data['slug'] . '.jpg'; + + $category = Category::create($data); + + foreach ($children as $childData) { + $this->createCategoryWithChildren($childData, $category->id); + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..4500a48 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,21 @@ +call([ + RolesAndPermissionsSeeder::class, + CategorySeeder::class, + BrandSeeder::class, + ]); + } +} diff --git a/database/seeders/ProductCatalogSeeder.php b/database/seeders/ProductCatalogSeeder.php new file mode 100644 index 0000000..9ad6798 --- /dev/null +++ b/database/seeders/ProductCatalogSeeder.php @@ -0,0 +1,1651 @@ + КОРМА -> СУХИЕ КОРМА (category_id=3) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 21, + 'name' => 'Grandin Hypoallergenic ягненок', + 'slug' => 'grandin-hypoallergenic-yagnenok', + 'description' => 'Гипоаллергенный сухой корм для собак всех пород с ягненком. Беззерновой суперпремиум класс без курицы и говядины.', + 'brand_id' => 5, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'Grandin Hypoallergenic сухой корм ягненок', + 'meta_description' => 'Гипоаллергенный корм Grandin с ягненком для собак всех пород без злаков суперпремиум класс', + 'meta_keywords' => 'grandin hypoallergenic,сухой корм собак,ягненок,гипоаллергенный корм собак', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 22, + 'name' => 'Klicker Adult лосось', + 'slug' => 'klicker-adult-los-os', + 'description' => 'Сухой корм для собак мелких пород с лососем. Высокая усвояемость и поддержка пищеварения.', + 'brand_id' => null, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'Klicker Adult сухой корм лосось мелкие породы', + 'meta_description' => 'Премиум корм Klicker для мелких пород с лососем поддержка пищеварения', + 'meta_keywords' => 'klicker корм,сухой корм мелких собак,лосось собак', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 23, + 'name' => 'Royal Canin Mini Adult', + 'slug' => 'royal-canin-mini-adult', + 'description' => 'Сухой корм для взрослых собак мелких пород. Поддержка кожи и шерсти, высокая калорийность.', + 'brand_id' => 1, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'Royal Canin Mini Adult сухой корм мелкие породы', + 'meta_description' => 'Корм Royal Canin для мелких взрослых собак поддержка кожи шерсти', + 'meta_keywords' => 'royal canin mini adult,сухой корм собак мелких пород', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 24, + 'name' => 'ABBA Premium ягненок', + 'slug' => 'abba-premium-yagnenok', + 'description' => 'Сухой корм суперпремиум с ягненком для всех пород. Естественные ингредиенты без ГМО.', + 'brand_id' => 2, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'ABBA Premium сухой корм ягненок', + 'meta_description' => 'ABBA суперпремиум корм с ягненком для собак всех пород натуральные ингредиенты', + 'meta_keywords' => 'abba premium,ягненок сухой корм,суперпремиум собак', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 25, + 'name' => 'RURRI Classic говядина', + 'slug' => 'rurri-classic-govyadina', + 'description' => 'Сухой корм с говядиной для собак всех пород. Балансированное питание эконом класс.', + 'brand_id' => 3, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'RURRI Classic говядина сухой корм', + 'meta_description' => 'Качественный корм RURRI Classic с говядиной для собак всех пород', + 'meta_keywords' => 'rurri classic,говядина корм собак,сухой корм эконом', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 26, + 'name' => 'Ownat Grain Free курица', + 'slug' => 'ownat-grain-free-kurica', + 'description' => 'Беззерновой сухой корм с курицей и рисом для собак всех пород. Холистик класс.', + 'brand_id' => 4, + 'category_id' => 3, + 'is_active' => 1, + 'meta_title' => 'Ownat Grain Free сухой корм курица', + 'meta_description' => 'Беззерновой корм Ownat Grain Free с курицей холистик класс для собак', + 'meta_keywords' => 'ownat grain free,курица беззерновой,холистик корм', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 41, + 'product_id' => 21, + 'name' => 'Grandin Hypoallergenic ягненок, 2.7 кг', + 'sku' => 'GRANDIN-1049894', + 'price' => 2499.00, + 'old_price' => null, + 'stock' => 50, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 42, + 'product_id' => 21, + 'name' => 'Grandin Hypoallergenic ягненок, 11.2 кг', + 'sku' => 'GRANDIN-1049893', + 'price' => 7899.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 43, + 'product_id' => 22, + 'name' => 'Klicker Adult лосось, 0.5 кг', + 'sku' => 'KLICKER-1060933', + 'price' => 1299.00, + 'old_price' => null, + 'stock' => 100, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 44, + 'product_id' => 22, + 'name' => 'Klicker Adult лосось, 2 кг', + 'sku' => 'KLICKER-LOSOS-2KG', + 'price' => 3999.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 45, + 'product_id' => 23, + 'name' => 'Royal Canin Mini Adult, 2 кг', + 'sku' => 'RC-MINI-ADULT-2KG', + 'price' => 3599.00, + 'old_price' => null, + 'stock' => 75, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 46, + 'product_id' => 23, + 'name' => 'Royal Canin Mini Adult, 4 кг', + 'sku' => 'RC-MINI-ADULT-4KG', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 47, + 'product_id' => 24, + 'name' => 'ABBA Premium ягненок, 3 кг', + 'sku' => 'ABBA-YAG-3KG', + 'price' => 2199.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 48, + 'product_id' => 24, + 'name' => 'ABBA Premium ягненок, 12 кг', + 'sku' => 'ABBA-YAG-12KG', + 'price' => 6999.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 49, + 'product_id' => 25, + 'name' => 'RURRI Classic говядина, 3 кг', + 'sku' => 'RURRI-GOV-3KG', + 'price' => 1599.00, + 'old_price' => 1799.00, + 'stock' => 80, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 50, + 'product_id' => 25, + 'name' => 'RURRI Classic говядина, 15 кг', + 'sku' => 'RURRI-GOV-15KG', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 51, + 'product_id' => 26, + 'name' => 'Ownat Grain Free курица, 2 кг', + 'sku' => 'OWNAT-KUR-2KG', + 'price' => 2299.00, + 'old_price' => null, + 'stock' => 45, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 52, + 'product_id' => 26, + 'name' => 'Ownat Grain Free курица, 12 кг', + 'sku' => 'OWNAT-KUR-12KG', + 'price' => 7999.00, + 'old_price' => null, + 'stock' => 15, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // 2. КОШКИ -> КОРМА -> СУХИЕ КОРМА (category_id=21) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 27, + 'name' => 'Klicker Sensitive Digestion', + 'slug' => 'klicker-sensitive-digestion', + 'description' => 'Сухой корм для кошек с чувствительным пищеварением. Легкоусвояемые ингредиенты.', + 'brand_id' => null, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'Klicker Sensitive сухой корм кошки пищеварение', + 'meta_description' => 'Корм для кошек с чувствительным пищеварением Klicker легкоусвояемые ингредиенты', + 'meta_keywords' => 'klicker sensitive,сухой корм кошек,пищеварение кошки', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 28, + 'name' => 'Bozita Funktion Indoor', + 'slug' => 'bozita-funktion-indoor', + 'description' => 'Сухой корм для кошек живущих в доме. Контроль веса и шерсти.', + 'brand_id' => null, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'Bozita Funktion Indoor сухой корм кошки', + 'meta_description' => 'Корм для домашних кошек Bozita Funktion контроль веса шерсти', + 'meta_keywords' => 'bozita indoor,корм кошек дом,функциональный корм', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 29, + 'name' => 'Royal Canin Sterilised', + 'slug' => 'royal-canin-sterilised', + 'description' => 'Сухой корм для стерилизованных кошек. Поддержка мочевыводящей системы.', + 'brand_id' => 1, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'Royal Canin Sterilised сухой корм кошки', + 'meta_description' => 'Корм Royal Canin для стерилизованных кошек поддержка мочевыводящей системы', + 'meta_keywords' => 'royal canin sterilised,корм стерилизованных кошек', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 30, + 'name' => 'Grandin Hypo Cat', + 'slug' => 'grandin-hypo-cat', + 'description' => 'Гипоаллергенный сухой корм для кошек всех пород.', + 'brand_id' => 5, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'Grandin Hypoallergenic сухой корм кошки', + 'meta_description' => 'Гипоаллергенный корм Grandin для кошек всех пород', + 'meta_keywords' => 'grandin hypo кошка,гипоаллергенный корм кошек', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 31, + 'name' => 'Ownat Classic курица', + 'slug' => 'ownat-classic-kurica-koshka', + 'description' => 'Сухой корм для кошек с курицей. Полнорационное питание.', + 'brand_id' => 4, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'Ownat Classic сухой корм кошки курица', + 'meta_description' => 'Полнорационный корм Ownat Classic с курицей для кошек', + 'meta_keywords' => 'ownat classic кошка,курица корм кошек', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 32, + 'name' => 'RURRI Indoor', + 'slug' => 'rurri-indoor-koshka', + 'description' => 'Сухой корм для взрослых кошек живущих в помещении.', + 'brand_id' => 3, + 'category_id' => 21, + 'is_active' => 1, + 'meta_title' => 'RURRI Indoor сухой корм кошки', + 'meta_description' => 'Корм RURRI для взрослых кошек живущих в помещении', + 'meta_keywords' => 'rurri indoor,корм кошек помещение', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 53, + 'product_id' => 27, + 'name' => 'Klicker Sensitive Digestion, 1 кг', + 'sku' => 'KLICKER-SENS-1KG', + 'price' => 1399.00, + 'old_price' => null, + 'stock' => 80, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 54, + 'product_id' => 27, + 'name' => 'Klicker Sensitive Digestion, 4 кг', + 'sku' => 'KLICKER-SENS-4KG', + 'price' => 4499.00, + 'old_price' => null, + 'stock' => 35, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 55, + 'product_id' => 28, + 'name' => 'Bozita Funktion Indoor, 1.5 кг', + 'sku' => 'BOZITA-INDOOR-1.5', + 'price' => 1899.00, + 'old_price' => null, + 'stock' => 70, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 56, + 'product_id' => 28, + 'name' => 'Bozita Funktion Indoor, 4 кг', + 'sku' => 'BOZITA-INDOOR-4KG', + 'price' => 4899.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 57, + 'product_id' => 29, + 'name' => 'Royal Canin Sterilised, 2 кг', + 'sku' => 'RC-STER-2KG', + 'price' => 3499.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 58, + 'product_id' => 29, + 'name' => 'Royal Canin Sterilised, 4 кг', + 'sku' => 'RC-STER-4KG', + 'price' => 5899.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 59, + 'product_id' => 30, + 'name' => 'Grandin Hypo Cat, 2 кг', + 'sku' => 'GRANDIN-HYPOCAT-2', + 'price' => 2399.00, + 'old_price' => null, + 'stock' => 55, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 60, + 'product_id' => 30, + 'name' => 'Grandin Hypo Cat, 10 кг', + 'sku' => 'GRANDIN-HYPOCAT-10', + 'price' => 7499.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 61, + 'product_id' => 31, + 'name' => 'Ownat Classic курица, 1.5 кг', + 'sku' => 'OWNAT-KUR-KOSH-1.5', + 'price' => 1699.00, + 'old_price' => null, + 'stock' => 65, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 62, + 'product_id' => 31, + 'name' => 'Ownat Classic курица, 7 кг', + 'sku' => 'OWNAT-KUR-KOSH-7', + 'price' => 4999.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 63, + 'product_id' => 32, + 'name' => 'RURRI Indoor, 2 кг', + 'sku' => 'RURRI-INDOOR-2', + 'price' => 1799.00, + 'old_price' => null, + 'stock' => 75, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 64, + 'product_id' => 32, + 'name' => 'RURRI Indoor, 10 кг', + 'sku' => 'RURRI-INDOOR-10', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 15, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // 3. СОБАКИ -> АМУНИЦИЯ -> ОШЕЙНИКИ И ПОВОДКИ (category_id=7) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 33, + 'name' => 'Rungo K-9 ошейник', + 'slug' => 'rungo-k9-osheynik', + 'description' => 'Нейлоновый ошейник с ручкой для контроля собаки. Прочный и удобный.', + 'brand_id' => 10, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Rungo K-9 ошейник нейлоновый с ручкой', + 'meta_description' => 'Прочный ошейник Rungo K-9 с ручкой для собак всех размеров', + 'meta_keywords' => 'rungo k9,ошейник собак с ручкой,нейлоновый ошейник', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 34, + 'name' => 'Trixie кожаный ошейник', + 'slug' => 'trixie-kozhanii-osheynik', + 'description' => 'Натуральная кожа с металлическими заклепками. Классический дизайн.', + 'brand_id' => null, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Trixie кожаный ошейник собака', + 'meta_description' => 'Кожаный ошейник Trixie натуральная кожа для собак', + 'meta_keywords' => 'trixie кожаный,ошейник собака кожа', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 35, + 'name' => 'Ferplast парашютный ошейник', + 'slug' => 'ferplast-parashyutnyi-osheynik', + 'description' => 'Парашютная ткань легкая и прочная. Регулируемый размер.', + 'brand_id' => null, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Ferplast парашютный ошейник собака', + 'meta_description' => 'Легкий парашютный ошейник Ferplast для собак', + 'meta_keywords' => 'ferplast парашютный,ошейник легкий собака', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 36, + 'name' => 'Rogz ошейник Utility', + 'slug' => 'rogz-utility-osheynik', + 'description' => 'Усиленный нейлон с мягкой подкладкой. 5 точек фиксации.', + 'brand_id' => null, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Rogz Utility ошейник собака', + 'meta_description' => 'Прочный ошейник Rogz Utility усиленный нейлон', + 'meta_keywords' => 'rogz utility,ошейник собака усиленный', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 37, + 'name' => 'Hunter кожаный плетеный', + 'slug' => 'hunter-kozhanii-pletenyi', + 'description' => 'Ручная плетка из натуральной кожи. Эксклюзивный дизайн.', + 'brand_id' => null, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Hunter плетеный кожаный ошейник', + 'meta_description' => 'Эксклюзивный плетеный кожаный ошейник Hunter', + 'meta_keywords' => 'hunter плетеный,кожаный ошейник эксклюзив', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 38, + 'name' => 'Petzl ошейник альпинистский', + 'slug' => 'petzl-alpinistskii-osheynik', + 'description' => 'Сверхпрочный для рабочих собак. Используется кинологами.', + 'brand_id' => null, + 'category_id' => 7, + 'is_active' => 1, + 'meta_title' => 'Petzl альпинистский ошейник собака', + 'meta_description' => 'Сверхпрочный ошейник Petzl для рабочих собак', + 'meta_keywords' => 'petzl альпинистский,ошейник рабочие собаки', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 65, + 'product_id' => 33, + 'name' => 'Rungo K-9 ошейник, L (42-65 см)', + 'sku' => 'RUNGO-K9-L-1064128', + 'price' => 1749.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 66, + 'product_id' => 33, + 'name' => 'Rungo K-9 ошейник, M (38-48 см)', + 'sku' => 'RUNGO-K9-M-1064127', + 'price' => 1499.00, + 'old_price' => 1599.00, + 'stock' => 10, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 67, + 'product_id' => 34, + 'name' => 'Trixie кожаный ошейник, M (30-45 см)', + 'sku' => 'TRIXIE-LEATHER-M', + 'price' => 2199.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 68, + 'product_id' => 34, + 'name' => 'Trixie кожаный ошейник, L (40-60 см)', + 'sku' => 'TRIXIE-LEATHER-L', + 'price' => 2799.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 69, + 'product_id' => 35, + 'name' => 'Ferplast парашютный ошейник, S (25-40 см)', + 'sku' => 'FERPLAST-S', + 'price' => 1299.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 70, + 'product_id' => 35, + 'name' => 'Ferplast парашютный ошейник, M (35-55 см)', + 'sku' => 'FERPLAST-M', + 'price' => 1599.00, + 'old_price' => null, + 'stock' => 35, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 71, + 'product_id' => 36, + 'name' => 'Rogz Utility ошейник, M', + 'sku' => 'ROGZ-UTILITY-M', + 'price' => 2999.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 72, + 'product_id' => 36, + 'name' => 'Rogz Utility ошейник, L', + 'sku' => 'ROGZ-UTILITY-L', + 'price' => 3499.00, + 'old_price' => null, + 'stock' => 15, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 73, + 'product_id' => 37, + 'name' => 'Hunter кожаный плетеный, M', + 'sku' => 'HUNTER-PLET-M', + 'price' => 4999.00, + 'old_price' => null, + 'stock' => 10, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 74, + 'product_id' => 37, + 'name' => 'Hunter кожаный плетеный, L', + 'sku' => 'HUNTER-PLET-L', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 5, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 75, + 'product_id' => 38, + 'name' => 'Petzl ошейник альпинистский, L/XL', + 'sku' => 'PETZL-ALP-LXL', + 'price' => 7999.00, + 'old_price' => null, + 'stock' => 8, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // 4. КОШКИ -> НАПОЛНИТЕЛИ -> ДРЕВЕСНЫЕ (category_id=25) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 39, + 'name' => 'Ever Clean Extra Strength', + 'slug' => 'ever-clean-extra-strength', + 'description' => 'Древесный наполнитель для кошек. Сильная комкуемость отличная нейтрализация запаха.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => 'Ever Clean Extra Strength древесный наполнитель', + 'meta_description' => 'Премиум древесный наполнитель Ever Clean сильная комкуемость', + 'meta_keywords' => 'ever clean,древесный наполнитель кошки,премиум наполнитель', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 40, + 'name' => "Cat's Best Original", + 'slug' => 'cats-best-original', + 'description' => 'Натуральный гранулированный наполнитель из волокон целлюлозы. 100% биоразлагаемый.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => "Cat's Best Original древесный наполнитель", + 'meta_description' => 'Натуральный древесный наполнитель Cat\'s Best из целлюлозы', + 'meta_keywords' => 'cats best,древесный натуральный,наполнитель кошки', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 41, + 'name' => 'Barsik Premium древесный', + 'slug' => 'barsik-premium-drevesnyi', + 'description' => 'Древесный наполнитель из опилок хвойных пород. Высокая впитываемость.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => 'Barsik Premium древесный наполнитель кошки', + 'meta_description' => 'Древесный наполнитель Barsik Premium из хвойных пород', + 'meta_keywords' => 'barsik древесный,наполнитель кошки хвойный', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 42, + 'name' => 'Perfect Fit древесный', + 'slug' => 'perfect-fit-drevesnyi', + 'description' => 'Комкующийся древесный наполнитель. Натуральный состав без химии.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => 'Perfect Fit древесный наполнитель', + 'meta_description' => 'Комкующийся древесный наполнитель Perfect Fit натуральный', + 'meta_keywords' => 'perfect fit древесный,комкующийся наполнитель', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 43, + 'name' => 'Сибирский лес премиум', + 'slug' => 'sibirskii-les-premium', + 'description' => 'Премиум древесный наполнитель. Сильный контроль запаха.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => 'Сибирский лес премиум древесный наполнитель', + 'meta_description' => 'Премиум древесный наполнитель Сибирский лес контроль запаха', + 'meta_keywords' => 'сибирский лес,древесный премиум наполнитель', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 44, + 'name' => 'Травка-Сено древесный', + 'slug' => 'travka-seno-drevesnyi', + 'description' => 'Натуральный древесный наполнитель с экстрактами трав.', + 'brand_id' => null, + 'category_id' => 25, + 'is_active' => 1, + 'meta_title' => 'Травка-Сено древесный наполнитель кошки', + 'meta_description' => 'Древесный наполнитель Травка-Сено с экстрактами трав', + 'meta_keywords' => 'травка сено,древесный с травами наполнитель', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 76, + 'product_id' => 39, + 'name' => 'Ever Clean Extra Strength, 10 л', + 'sku' => 'EVERCLEAN-10L', + 'price' => 1499.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 77, + 'product_id' => 39, + 'name' => 'Ever Clean Extra Strength, 20 л', + 'sku' => 'EVERCLEAN-20L', + 'price' => 2599.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 78, + 'product_id' => 40, + 'name' => "Cat's Best Original, 6 кг", + 'sku' => 'CATS-BEST-6KG', + 'price' => 1299.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 79, + 'product_id' => 40, + 'name' => "Cat's Best Original, 17 кг", + 'sku' => 'CATS-BEST-17KG', + 'price' => 2999.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 80, + 'product_id' => 41, + 'name' => 'Barsik Premium древесный, 5 л', + 'sku' => 'BARSIK-5L', + 'price' => 899.00, + 'old_price' => null, + 'stock' => 80, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 81, + 'product_id' => 41, + 'name' => 'Barsik Premium древесный, 10 л', + 'sku' => 'BARSIK-10L', + 'price' => 1499.00, + 'old_price' => null, + 'stock' => 50, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 82, + 'product_id' => 42, + 'name' => 'Perfect Fit древесный, 8 л', + 'sku' => 'PERFECTFIT-8L', + 'price' => 1099.00, + 'old_price' => null, + 'stock' => 70, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 83, + 'product_id' => 42, + 'name' => 'Perfect Fit древесный, 15 л', + 'sku' => 'PERFECTFIT-15L', + 'price' => 1999.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 84, + 'product_id' => 43, + 'name' => 'Сибирский лес премиум, 10 л', + 'sku' => 'SIBLES-10L', + 'price' => 1399.00, + 'old_price' => null, + 'stock' => 45, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 85, + 'product_id' => 43, + 'name' => 'Сибирский лес премиум, 20 л', + 'sku' => 'SIBLES-20L', + 'price' => 2499.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 86, + 'product_id' => 44, + 'name' => 'Травка-Сено древесный, 7 л', + 'sku' => 'TRAVKA-7L', + 'price' => 1199.00, + 'old_price' => null, + 'stock' => 55, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 87, + 'product_id' => 44, + 'name' => 'Травка-Сено древесный, 14 л', + 'sku' => 'TRAVKA-14L', + 'price' => 2099.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // 5. СОБАКИ -> ИГРУШКИ -> МЯЧИКИ И ФРИСБИ (category_id=11) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 45, + 'name' => 'Kong Classic красный', + 'slug' => 'kong-classic-krasnyi', + 'description' => 'Классическая резиновая игрушка для жевания и апортировки. Неотъемлемый элемент дрессировки.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'Kong Classic красный мячик собака', + 'meta_description' => 'Резиновая игрушка Kong Classic для собак жевание апортировка', + 'meta_keywords' => 'kong classic,мячик собака резиновый,игрушка для жевания', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 46, + 'name' => 'Trixie теннисный мячик', + 'slug' => 'trixie-tennisnyi-myachik', + 'description' => 'Теннисный мячик для собак. Прочная резина с войлоком.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'Trixie теннисный мячик собака', + 'meta_description' => 'Теннисный мячик Trixie для апортировки собак', + 'meta_keywords' => 'trixie теннисный,мячик собака апортировка', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 47, + 'name' => 'Ferplast фрисби Flyer', + 'slug' => 'ferplast-frisbi-flyer', + 'description' => 'Пластиковый фрисби для активных игр на улице. Легкий и прочный.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'Ferplast Flyer фрисби собака', + 'meta_description' => 'Фрисби Ferplast Flyer для собак активные игры', + 'meta_keywords' => 'ferplast фрисби,фрисби собака уличные игры', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 48, + 'name' => 'K9 Granit мячик', + 'slug' => 'k9-granit-myachik', + 'description' => 'Прочный резиновый мячик для сильных челюстей. Выдерживает давление.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'K9 Granit мячик собака', + 'meta_description' => 'Резиновый мячик K9 Granit для мощных собак', + 'meta_keywords' => 'k9 granit,мячик собака прочный челюсти', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 49, + 'name' => 'Chuckit! Ultra мячик', + 'slug' => 'chuckit-ultra-myachik', + 'description' => 'Яркий мячик для метателя Chuckit. Увеличенная дальность броска.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'Chuckit Ultra мячик собака метатель', + 'meta_description' => 'Мячик Chuckit Ultra для метателя собак', + 'meta_keywords' => 'chuckit ultra,мячик метатель собака', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 50, + 'name' => 'Rogz Grinz мячик зубастый', + 'slug' => 'rogz-grinz-myachik-zubastyi', + 'description' => 'Резиновый мячик с зубастой мордочкой. Массаж десен.', + 'brand_id' => null, + 'category_id' => 11, + 'is_active' => 1, + 'meta_title' => 'Rogz Grinz зубастый мячик собака', + 'meta_description' => 'Мячик Rogz Grinz массаж десен собак', + 'meta_keywords' => 'rogz grinz,мячик зубастый собака десны', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 88, + 'product_id' => 45, + 'name' => 'Kong Classic красный, S', + 'sku' => 'KONG-CLASSIC-S', + 'price' => 1999.00, + 'old_price' => null, + 'stock' => 35, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 89, + 'product_id' => 45, + 'name' => 'Kong Classic красный, M', + 'sku' => 'KONG-CLASSIC-M', + 'price' => 2499.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 90, + 'product_id' => 46, + 'name' => 'Trixie теннисный мячик, стандарт', + 'sku' => 'TRIXIE-TENNIS-STD', + 'price' => 399.00, + 'old_price' => null, + 'stock' => 100, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 91, + 'product_id' => 46, + 'name' => 'Trixie теннисный мячик, большой', + 'sku' => 'TRIXIE-TENNIS-L', + 'price' => 599.00, + 'old_price' => null, + 'stock' => 70, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 92, + 'product_id' => 47, + 'name' => 'Ferplast фрисби Flyer, средний', + 'sku' => 'FERPLAST-FLYER-M', + 'price' => 799.00, + 'old_price' => null, + 'stock' => 60, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 93, + 'product_id' => 47, + 'name' => 'Ferplast фрисби Flyer, большой', + 'sku' => 'FERPLAST-FLYER-L', + 'price' => 999.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 94, + 'product_id' => 48, + 'name' => 'K9 Granit мячик, M', + 'sku' => 'K9-GRANIT-M', + 'price' => 1499.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 95, + 'product_id' => 48, + 'name' => 'K9 Granit мячик, L', + 'sku' => 'K9-GRANIT-L', + 'price' => 1999.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 96, + 'product_id' => 49, + 'name' => 'Chuckit! Ultra мячик, средний', + 'sku' => 'CHUCKIT-ULTRA-M', + 'price' => 1299.00, + 'old_price' => null, + 'stock' => 50, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 97, + 'product_id' => 49, + 'name' => 'Chuckit! Ultra мячик, большой', + 'sku' => 'CHUCKIT-ULTRA-L', + 'price' => 1699.00, + 'old_price' => null, + 'stock' => 35, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 98, + 'product_id' => 50, + 'name' => 'Rogz Grinz мячик зубастый, M', + 'sku' => 'ROGZ-GRINZ-M', + 'price' => 1199.00, + 'old_price' => null, + 'stock' => 45, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 99, + 'product_id' => 50, + 'name' => 'Rogz Grinz мячик зубастый, L', + 'sku' => 'ROGZ-GRINZ-L', + 'price' => 1499.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // 6. СОБАКИ -> ЛЕЖАНКИ И ДОМИКИ -> ЛЕЖАНКИ (category_id=14) + // ====================================================== + DB::table('products')->insert([ + [ + 'id' => 51, + 'name' => 'Trixie Ортопедическая лежанка', + 'slug' => 'trixie-ortopedicheskaya-lezhanka', + 'description' => 'Лежанка с ортопедической пеной memory foam. Для собак с проблемами суставов.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'Trixie ортопедическая лежанка собака', + 'meta_description' => 'Ортопедическая лежанка Trixie memory foam для собак суставы', + 'meta_keywords' => 'trixie ортопедическая,лежанка memory foam,собаки суставы', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 52, + 'name' => 'Good Boy плед лежанка', + 'slug' => 'good-boy-pled-lezhanka', + 'description' => 'Мягкая лежанка-плед из флиса. Съемный чехол машинная стирка.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'Good Boy плед лежанка собака', + 'meta_description' => 'Лежанка-плед Good Boy флис съемный чехол', + 'meta_keywords' => 'good boy плед,лежанка флис собака', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 53, + 'name' => 'Ferplast лежанка Carlotta', + 'slug' => 'ferplast-lezhanka-carlotta', + 'description' => 'Круглая лежанка с бортиками. Машинная стирка 30°C.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'Ferplast Carlotta лежанка собака', + 'meta_description' => 'Круглая лежанка Ferplast Carlotta с бортиками', + 'meta_keywords' => 'ferplast carlotta,лежанка круглая бортики', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 54, + 'name' => 'Hunter лежанка Bavaria', + 'slug' => 'hunter-lezhanka-bavaria', + 'description' => 'Немецкое качество. Прочная ткань водоотталкивающая подкладка.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'Hunter Bavaria лежанка собака', + 'meta_description' => 'Лежанка Hunter Bavaria немецкое качество водоотталкивающая', + 'meta_keywords' => 'hunter bavaria,лежанка немецкая качество', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 55, + 'name' => 'PetFusion ортопедическая', + 'slug' => 'petfusion-ortopedicheskaya', + 'description' => 'Лежанка с ортопедической пеной. Экологичные материалы гипоаллергенная.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'PetFusion ортопедическая лежанка собака', + 'meta_description' => 'Ортопедическая лежанка PetFusion экологичные гипоаллергенная', + 'meta_keywords' => 'petfusion ортопедическая,лежанка экологичная', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 56, + 'name' => 'Laifugy лежанка домик', + 'slug' => 'laifugy-lezhanka-domik', + 'description' => 'Лежанка-домик с крышей. Для маленьких собак и щенков.', + 'brand_id' => null, + 'category_id' => 14, + 'is_active' => 1, + 'meta_title' => 'Laifugy лежанка домик собака', + 'meta_description' => 'Лежанка-домик Laifugy для маленьких собак щенков', + 'meta_keywords' => 'laifugy домик,лежанка маленькие собаки', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + DB::table('product_variations')->insert([ + [ + 'id' => 100, + 'product_id' => 51, + 'name' => 'Trixie Ортопедическая лежанка, S (50x40 см)', + 'sku' => 'TRIXIE-ORTHO-S', + 'price' => 7999.00, + 'old_price' => null, + 'stock' => 15, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 101, + 'product_id' => 51, + 'name' => 'Trixie Ортопедическая лежанка, M (70x50 см)', + 'sku' => 'TRIXIE-ORTHO-M', + 'price' => 10999.00, + 'old_price' => null, + 'stock' => 10, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 102, + 'product_id' => 52, + 'name' => 'Good Boy плед лежанка, S (60x45 см)', + 'sku' => 'GOODBOY-PLED-S', + 'price' => 2999.00, + 'old_price' => null, + 'stock' => 40, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 103, + 'product_id' => 52, + 'name' => 'Good Boy плед лежанка, L (90x65 см)', + 'sku' => 'GOODBOY-PLED-L', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 25, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 104, + 'product_id' => 53, + 'name' => 'Ferplast лежанка Carlotta, S (50 см диаметр)', + 'sku' => 'FERPLAST-CARL-S', + 'price' => 3499.00, + 'old_price' => null, + 'stock' => 35, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 105, + 'product_id' => 53, + 'name' => 'Ferplast лежанка Carlotta, M (70 см диаметр)', + 'sku' => 'FERPLAST-CARL-M', + 'price' => 5999.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 106, + 'product_id' => 54, + 'name' => 'Hunter лежанка Bavaria, M (75x55 см)', + 'sku' => 'HUNTER-BAV-M', + 'price' => 6999.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 107, + 'product_id' => 54, + 'name' => 'Hunter лежанка Bavaria, L (95x70 см)', + 'sku' => 'HUNTER-BAV-L', + 'price' => 9999.00, + 'old_price' => null, + 'stock' => 12, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 108, + 'product_id' => 55, + 'name' => 'PetFusion ортопедическая, M (71x53 см)', + 'sku' => 'PETFUSION-M', + 'price' => 8999.00, + 'old_price' => null, + 'stock' => 18, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 109, + 'product_id' => 55, + 'name' => 'PetFusion ортопедическая, L (91x66 см)', + 'sku' => 'PETFUSION-L', + 'price' => 12999.00, + 'old_price' => null, + 'stock' => 8, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 110, + 'product_id' => 56, + 'name' => 'Laifugy лежанка домик, S (60x45x30 см)', + 'sku' => 'LAIFUGY-S', + 'price' => 4499.00, + 'old_price' => null, + 'stock' => 30, + 'is_default' => 1, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'id' => 111, + 'product_id' => 56, + 'name' => 'Laifugy лежанка домик, M (80x60x35 см)', + 'sku' => 'LAIFUGY-M', + 'price' => 6999.00, + 'old_price' => null, + 'stock' => 20, + 'is_default' => 0, + 'is_active' => 1, + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + + // ====================================================== + // АТРИБУТЫ ДЛЯ ПРОДУКТОВ (product_attributes) + // ====================================================== + DB::table('product_attributes')->insert([ + // Для Grandin Hypoallergenic (id=21) + ['id' => 35, 'product_id' => 21, 'key' => 'Размер питомца', 'value' => 'Все размеры', 'created_at' => $now, 'updated_at' => $now], + ['id' => 36, 'product_id' => 21, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 37, 'product_id' => 21, 'key' => 'Класс корма', 'value' => 'Суперпремиум', 'created_at' => $now, 'updated_at' => $now], + ['id' => 38, 'product_id' => 21, 'key' => 'Особенности', 'value' => 'Беззерновой, гипоаллергенный', 'created_at' => $now, 'updated_at' => $now], + + // Для Klicker Adult (id=22) + ['id' => 39, 'product_id' => 22, 'key' => 'Размер питомца', 'value' => 'Мелкие породы', 'created_at' => $now, 'updated_at' => $now], + ['id' => 40, 'product_id' => 22, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 41, 'product_id' => 22, 'key' => 'Класс корма', 'value' => 'Премиум', 'created_at' => $now, 'updated_at' => $now], + + // Для Royal Canin Mini Adult (id=23) + ['id' => 42, 'product_id' => 23, 'key' => 'Размер питомца', 'value' => 'Мелкие породы', 'created_at' => $now, 'updated_at' => $now], + ['id' => 43, 'product_id' => 23, 'key' => 'Возраст', 'value' => 'Взрослые (1-7 лет)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 44, 'product_id' => 23, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + + // Для ABBA Premium (id=24) + ['id' => 45, 'product_id' => 24, 'key' => 'Размер питомца', 'value' => 'Все размеры', 'created_at' => $now, 'updated_at' => $now], + ['id' => 46, 'product_id' => 24, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 47, 'product_id' => 24, 'key' => 'Класс корма', 'value' => 'Суперпремиум', 'created_at' => $now, 'updated_at' => $now], + + // Для RURRI Classic (id=25) + ['id' => 48, 'product_id' => 25, 'key' => 'Размер питомца', 'value' => 'Все размеры', 'created_at' => $now, 'updated_at' => $now], + ['id' => 49, 'product_id' => 25, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 50, 'product_id' => 25, 'key' => 'Класс корма', 'value' => 'Эконом', 'created_at' => $now, 'updated_at' => $now], + + // Для Ownat Grain Free (id=26) + ['id' => 51, 'product_id' => 26, 'key' => 'Размер питомца', 'value' => 'Все размеры', 'created_at' => $now, 'updated_at' => $now], + ['id' => 52, 'product_id' => 26, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 53, 'product_id' => 26, 'key' => 'Класс корма', 'value' => 'Холистик', 'created_at' => $now, 'updated_at' => $now], + + // Для кошачьих кормов (id=27-32) + ['id' => 54, 'product_id' => 27, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 55, 'product_id' => 27, 'key' => 'Особенности', 'value' => 'Для чувствительного пищеварения', 'created_at' => $now, 'updated_at' => $now], + ['id' => 56, 'product_id' => 28, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 57, 'product_id' => 28, 'key' => 'Особенности', 'value' => 'Для домашних кошек, контроль веса', 'created_at' => $now, 'updated_at' => $now], + ['id' => 58, 'product_id' => 29, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 59, 'product_id' => 29, 'key' => 'Особенности', 'value' => 'Для стерилизованных кошек', 'created_at' => $now, 'updated_at' => $now], + ['id' => 60, 'product_id' => 30, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 61, 'product_id' => 30, 'key' => 'Особенности', 'value' => 'Гипоаллергенный', 'created_at' => $now, 'updated_at' => $now], + ['id' => 62, 'product_id' => 31, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 63, 'product_id' => 31, 'key' => 'Вкус', 'value' => 'Курица', 'created_at' => $now, 'updated_at' => $now], + ['id' => 64, 'product_id' => 32, 'key' => 'Тип корма', 'value' => 'Сухой', 'created_at' => $now, 'updated_at' => $now], + ['id' => 65, 'product_id' => 32, 'key' => 'Особенности', 'value' => 'Для домашних кошек', 'created_at' => $now, 'updated_at' => $now], + + // Для ошейников (id=33-38) + ['id' => 66, 'product_id' => 33, 'key' => 'Материал', 'value' => 'Нейлон', 'created_at' => $now, 'updated_at' => $now], + ['id' => 67, 'product_id' => 33, 'key' => 'Особенности', 'value' => 'С ручкой для контроля', 'created_at' => $now, 'updated_at' => $now], + ['id' => 68, 'product_id' => 34, 'key' => 'Материал', 'value' => 'Натуральная кожа', 'created_at' => $now, 'updated_at' => $now], + ['id' => 69, 'product_id' => 35, 'key' => 'Материал', 'value' => 'Парашютная ткань', 'created_at' => $now, 'updated_at' => $now], + ['id' => 70, 'product_id' => 36, 'key' => 'Материал', 'value' => 'Усиленный нейлон', 'created_at' => $now, 'updated_at' => $now], + ['id' => 71, 'product_id' => 37, 'key' => 'Материал', 'value' => 'Натуральная кожа (плетеный)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 72, 'product_id' => 38, 'key' => 'Материал', 'value' => 'Альпинистский нейлон', 'created_at' => $now, 'updated_at' => $now], + + // Для наполнителей (id=39-44) + ['id' => 73, 'product_id' => 39, 'key' => 'Тип наполнителя', 'value' => 'Древесный, комкующийся', 'created_at' => $now, 'updated_at' => $now], + ['id' => 74, 'product_id' => 40, 'key' => 'Тип наполнителя', 'value' => 'Древесный, целлюлозный', 'created_at' => $now, 'updated_at' => $now], + ['id' => 75, 'product_id' => 41, 'key' => 'Тип наполнителя', 'value' => 'Древесный (хвойные породы)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 76, 'product_id' => 42, 'key' => 'Тип наполнителя', 'value' => 'Древесный, комкующийся', 'created_at' => $now, 'updated_at' => $now], + ['id' => 77, 'product_id' => 43, 'key' => 'Тип наполнителя', 'value' => 'Древесный премиум', 'created_at' => $now, 'updated_at' => $now], + ['id' => 78, 'product_id' => 44, 'key' => 'Тип наполнителя', 'value' => 'Древесный с травами', 'created_at' => $now, 'updated_at' => $now], + + // Для игрушек (id=45-50) + ['id' => 79, 'product_id' => 45, 'key' => 'Материал', 'value' => 'Натуральная резина', 'created_at' => $now, 'updated_at' => $now], + ['id' => 80, 'product_id' => 45, 'key' => 'Тип игрушки', 'value' => 'Для жевания, апортировки', 'created_at' => $now, 'updated_at' => $now], + ['id' => 81, 'product_id' => 46, 'key' => 'Материал', 'value' => 'Резина с войлоком', 'created_at' => $now, 'updated_at' => $now], + ['id' => 82, 'product_id' => 47, 'key' => 'Материал', 'value' => 'Пластик', 'created_at' => $now, 'updated_at' => $now], + ['id' => 83, 'product_id' => 47, 'key' => 'Тип игрушки', 'value' => 'Фрисби', 'created_at' => $now, 'updated_at' => $now], + ['id' => 84, 'product_id' => 48, 'key' => 'Материал', 'value' => 'Прочная резина', 'created_at' => $now, 'updated_at' => $now], + ['id' => 85, 'product_id' => 49, 'key' => 'Материал', 'value' => 'Резина', 'created_at' => $now, 'updated_at' => $now], + ['id' => 86, 'product_id' => 49, 'key' => 'Особенности', 'value' => 'Для метателя Chuckit', 'created_at' => $now, 'updated_at' => $now], + ['id' => 87, 'product_id' => 50, 'key' => 'Материал', 'value' => 'Резина', 'created_at' => $now, 'updated_at' => $now], + ['id' => 88, 'product_id' => 50, 'key' => 'Особенности', 'value' => 'Массаж десен', 'created_at' => $now, 'updated_at' => $now], + + // Для лежанок (id=51-56) + ['id' => 89, 'product_id' => 51, 'key' => 'Материал', 'value' => 'Memory foam', 'created_at' => $now, 'updated_at' => $now], + ['id' => 90, 'product_id' => 51, 'key' => 'Особенности', 'value' => 'Ортопедическая', 'created_at' => $now, 'updated_at' => $now], + ['id' => 91, 'product_id' => 52, 'key' => 'Материал', 'value' => 'Флис', 'created_at' => $now, 'updated_at' => $now], + ['id' => 92, 'product_id' => 52, 'key' => 'Особенности', 'value' => 'Съемный чехол', 'created_at' => $now, 'updated_at' => $now], + ['id' => 93, 'product_id' => 53, 'key' => 'Форма', 'value' => 'Круглая с бортиками', 'created_at' => $now, 'updated_at' => $now], + ['id' => 94, 'product_id' => 54, 'key' => 'Особенности', 'value' => 'Водоотталкивающая', 'created_at' => $now, 'updated_at' => $now], + ['id' => 95, 'product_id' => 55, 'key' => 'Материал', 'value' => 'Ортопедическая пена', 'created_at' => $now, 'updated_at' => $now], + ['id' => 96, 'product_id' => 55, 'key' => 'Особенности', 'value' => 'Гипоаллергенная', 'created_at' => $now, 'updated_at' => $now], + ['id' => 97, 'product_id' => 56, 'key' => 'Тип', 'value' => 'Лежанка-домик', 'created_at' => $now, 'updated_at' => $now], + ]); + + // ====================================================== + // АТРИБУТЫ ДЛЯ ВАРИАЦИЙ (variation_attributes) + // ====================================================== + DB::table('variation_attributes')->insert([ + // Вариации кормов собак + ['id' => 15, 'variation_id' => 41, 'key' => 'вес', 'value' => '2.7 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 16, 'variation_id' => 41, 'key' => 'вкус', 'value' => 'ягненок', 'created_at' => $now, 'updated_at' => $now], + ['id' => 17, 'variation_id' => 42, 'key' => 'вес', 'value' => '11.2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 18, 'variation_id' => 42, 'key' => 'вкус', 'value' => 'ягненок', 'created_at' => $now, 'updated_at' => $now], + ['id' => 19, 'variation_id' => 43, 'key' => 'вес', 'value' => '0.5 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 20, 'variation_id' => 44, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 21, 'variation_id' => 45, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 22, 'variation_id' => 46, 'key' => 'вес', 'value' => '4 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 23, 'variation_id' => 47, 'key' => 'вес', 'value' => '3 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 24, 'variation_id' => 48, 'key' => 'вес', 'value' => '12 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 25, 'variation_id' => 49, 'key' => 'вес', 'value' => '3 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 26, 'variation_id' => 50, 'key' => 'вес', 'value' => '15 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 27, 'variation_id' => 51, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 28, 'variation_id' => 52, 'key' => 'вес', 'value' => '12 кг', 'created_at' => $now, 'updated_at' => $now], + + // Вариации кормов кошек + ['id' => 29, 'variation_id' => 53, 'key' => 'вес', 'value' => '1 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 30, 'variation_id' => 54, 'key' => 'вес', 'value' => '4 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 31, 'variation_id' => 55, 'key' => 'вес', 'value' => '1.5 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 32, 'variation_id' => 56, 'key' => 'вес', 'value' => '4 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 33, 'variation_id' => 57, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 34, 'variation_id' => 58, 'key' => 'вес', 'value' => '4 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 35, 'variation_id' => 59, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 36, 'variation_id' => 60, 'key' => 'вес', 'value' => '10 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 37, 'variation_id' => 61, 'key' => 'вес', 'value' => '1.5 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 38, 'variation_id' => 62, 'key' => 'вес', 'value' => '7 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 39, 'variation_id' => 63, 'key' => 'вес', 'value' => '2 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 40, 'variation_id' => 64, 'key' => 'вес', 'value' => '10 кг', 'created_at' => $now, 'updated_at' => $now], + + // Вариации ошейников + ['id' => 41, 'variation_id' => 65, 'key' => 'размер', 'value' => 'L (42-65 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 42, 'variation_id' => 65, 'key' => 'цвет', 'value' => 'черный', 'created_at' => $now, 'updated_at' => $now], + ['id' => 43, 'variation_id' => 66, 'key' => 'размер', 'value' => 'M (38-48 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 44, 'variation_id' => 66, 'key' => 'цвет', 'value' => 'черный', 'created_at' => $now, 'updated_at' => $now], + ['id' => 45, 'variation_id' => 67, 'key' => 'размер', 'value' => 'M (30-45 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 46, 'variation_id' => 68, 'key' => 'размер', 'value' => 'L (40-60 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 47, 'variation_id' => 69, 'key' => 'размер', 'value' => 'S (25-40 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 48, 'variation_id' => 70, 'key' => 'размер', 'value' => 'M (35-55 см)', 'created_at' => $now, 'updated_at' => $now], + + // Вариации наполнителей + ['id' => 49, 'variation_id' => 76, 'key' => 'объем', 'value' => '10 л', 'created_at' => $now, 'updated_at' => $now], + ['id' => 50, 'variation_id' => 77, 'key' => 'объем', 'value' => '20 л', 'created_at' => $now, 'updated_at' => $now], + ['id' => 51, 'variation_id' => 78, 'key' => 'вес', 'value' => '6 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 52, 'variation_id' => 79, 'key' => 'вес', 'value' => '17 кг', 'created_at' => $now, 'updated_at' => $now], + ['id' => 53, 'variation_id' => 80, 'key' => 'объем', 'value' => '5 л', 'created_at' => $now, 'updated_at' => $now], + ['id' => 54, 'variation_id' => 81, 'key' => 'объем', 'value' => '10 л', 'created_at' => $now, 'updated_at' => $now], + + // Вариации игрушек + ['id' => 55, 'variation_id' => 88, 'key' => 'размер', 'value' => 'S', 'created_at' => $now, 'updated_at' => $now], + ['id' => 56, 'variation_id' => 89, 'key' => 'размер', 'value' => 'M', 'created_at' => $now, 'updated_at' => $now], + ['id' => 57, 'variation_id' => 90, 'key' => 'размер', 'value' => 'стандарт', 'created_at' => $now, 'updated_at' => $now], + ['id' => 58, 'variation_id' => 91, 'key' => 'размер', 'value' => 'большой', 'created_at' => $now, 'updated_at' => $now], + + // Вариации лежанок + ['id' => 59, 'variation_id' => 100, 'key' => 'размер', 'value' => 'S (50x40 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 60, 'variation_id' => 101, 'key' => 'размер', 'value' => 'M (70x50 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 61, 'variation_id' => 102, 'key' => 'размер', 'value' => 'S (60x45 см)', 'created_at' => $now, 'updated_at' => $now], + ['id' => 62, 'variation_id' => 103, 'key' => 'размер', 'value' => 'L (90x65 см)', 'created_at' => $now, 'updated_at' => $now], + ]); + } +} diff --git a/database/seeders/RolesAndPermissionsSeeder.php b/database/seeders/RolesAndPermissionsSeeder.php new file mode 100644 index 0000000..a9046c0 --- /dev/null +++ b/database/seeders/RolesAndPermissionsSeeder.php @@ -0,0 +1,279 @@ +cleanTables(); + $this->createPermissions(); + $this->createRoles(); + $this->assignPermissionsToRoles(); + } + + private function cleanTables() + { + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + DB::table('permission_role')->truncate(); + DB::table('role_user')->truncate(); + DB::table('permissions')->truncate(); + DB::table('roles')->truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + } + + private function createPermissions() + { + $permissions = [ + + // ========== ЛИЧНЫЙ КАБИНЕТ ========== + [ + 'name' => 'Доступ в личный кабинет', + 'slug' => 'cabinet_access', + 'group' => 'cabinet', + 'description' => 'Возможность входить в личный кабинет и просматривать свои данные' + ], + + // ========== ЗАКАЗЫ ========== + [ + 'name' => 'Просматривать заказы', + 'slug' => 'view_orders', + 'group' => 'orders', + 'description' => 'Просмотр списка заказов' + ], + [ + 'name' => 'Редактировать заказы', + 'slug' => 'edit_orders', + 'group' => 'orders', + 'description' => 'Редактирование заказов (статус, удаление, подтверждение)' + ], + [ + 'name' => 'Оформлять заказы', + 'slug' => 'checkout', + 'group' => 'orders', + 'description' => 'Оформление заказов на сайте' + ], + + // ========== КОРЗИНА ========== + [ + 'name' => 'Управлять корзиной', + 'slug' => 'manage_cart', + 'group' => 'cart', + 'description' => 'Добавление/удаление товаров из корзины' + ], + + // ========== ТОВАРЫ ========== + [ + 'name' => 'Добавлять товары', + 'slug' => 'create_products', + 'group' => 'products', + 'description' => 'Создание новых товаров' + ], + [ + 'name' => 'Редактировать товары', + 'slug' => 'edit_products', + 'group' => 'products', + 'description' => 'Редактирование товаров' + ], + [ + 'name' => 'Управлять количеством товара', + 'slug' => 'manage_stock', + 'group' => 'products', + 'description' => 'Изменение остатков товаров на складе' + ], + + // ========== ПОЛЬЗОВАТЕЛИ ========== + [ + 'name' => 'Просматривать пользователей', + 'slug' => 'view_users', + 'group' => 'users', + 'description' => 'Просмотр списка пользователей' + ], + [ + 'name' => 'Создавать пользователей', + 'slug' => 'create_users', + 'group' => 'users', + 'description' => 'Создание новых пользователей' + ], + + // ========== РОЛИ И ПРАВА ========== + [ + 'name' => 'Управлять ролями', + 'slug' => 'manage_roles', + 'group' => 'rbac', + 'description' => 'Создание/редактирование ролей' + ], + [ + 'name' => 'Управлять правами', + 'slug' => 'manage_permissions', + 'group' => 'rbac', + 'description' => 'Создание/редактирование прав доступа' + ], + + // ========== МАГАЗИН ========== + [ + 'name' => 'Редактировать данные магазина', + 'slug' => 'edit_shop_settings', + 'group' => 'shop', + 'description' => 'Изменение настроек магазина' + ], + + // ========== ДОСТУП В АДМИНКУ ========== + [ + 'name' => 'Доступ в админ-панель', + 'slug' => 'admin_access', + 'group' => 'admin', + 'description' => 'Возможность входить в административную панель' + ], + ]; + + foreach ($permissions as $permission) { + Permission::firstOrCreate( + ['slug' => $permission['slug']], + $permission + ); + $this->command->info("✓ Создано право: {$permission['name']}"); + } + } + + private function createRoles() + { + $roles = [ + [ + 'name' => 'Супер администратор', + 'slug' => 'super_admin', + 'description' => 'Полный доступ ко всем функциям системы (обходит все проверки прав)' + ], + [ + 'name' => 'Администратор магазина', + 'slug' => 'shop_admin', + 'description' => 'Полное управление магазином, товарами и заказами' + ], + [ + 'name' => 'Менеджер по товарам', + 'slug' => 'product_manager', + 'description' => 'Управление каталогом товаров' + ], + [ + 'name' => 'Менеджер по заказам', + 'slug' => 'order_manager', + 'description' => 'Обработка заказов' + ], + [ + 'name' => 'Кладовщик', + 'slug' => 'warehouse_manager', + 'description' => 'Управление остатками товаров' + ], + [ + 'name' => 'Зарегистрированный пользователь', + 'slug' => 'registered_user', + 'description' => 'Обычный пользователь сайта' + ], + ]; + + foreach ($roles as $roleData) { + Role::firstOrCreate( + ['slug' => $roleData['slug']], + $roleData + ); + $this->command->info("✓ Создана роль: {$roleData['name']}"); + } + } + + private function assignPermissionsToRoles() + { + // ============================================ + // АДМИНИСТРАТОР МАГАЗИНА + // ============================================ + + $shopAdmin = Role::where('slug', 'shop_admin')->first(); + $shopAdmin->permissions()->sync( + Permission::whereIn('slug', [ + 'admin_access', + 'cabinet_access', + 'view_orders', + 'edit_orders', + 'checkout', + 'manage_cart', + 'create_products', + 'edit_products', + 'manage_stock', + 'view_users', + 'create_users', + 'manage_roles', + 'manage_permissions', + 'edit_shop_settings', + ])->pluck('id') + ); + $this->command->info('✓ Назначены права для Администратора магазина'); + + // ============================================ + // МЕНЕДЖЕР ПО ТОВАРАМ + // ============================================ + + $productManager = Role::where('slug', 'product_manager')->first(); + $productManager->permissions()->sync( + Permission::whereIn('slug', [ + 'admin_access', + 'cabinet_access', + 'create_products', + 'edit_products', + 'view_orders', + ])->pluck('id') + ); + $this->command->info('✓ Назначены права для Менеджера по товарам'); + + // ============================================ + // МЕНЕДЖЕР ПО ЗАКАЗАМ + // ============================================ + $orderManager = Role::where('slug', 'order_manager')->first(); + $orderManager->permissions()->sync( + Permission::whereIn('slug', [ + 'admin_access', + 'cabinet_access', + 'view_orders', + 'edit_orders', + 'checkout', + 'view_users', + ])->pluck('id') + ); + $this->command->info('✓ Назначены права для Менеджера по заказам'); + + // ============================================ + // КЛАДОВЩИК + // ============================================ + $warehouseManager = Role::where('slug', 'warehouse_manager')->first(); + $warehouseManager->permissions()->sync( + Permission::whereIn('slug', [ + 'admin_access', + 'cabinet_access', + 'manage_stock', + 'view_orders', + ])->pluck('id') + ); + $this->command->info('✓ Назначены права для Кладовщика'); + + // ============================================ + // ЗАРЕГИСТРИРОВАННЫЙ ПОЛЬЗОВАТЕЛЬ + // ============================================ + $registeredUser = Role::where('slug', 'registered_user')->first(); + $registeredUser->permissions()->sync( + Permission::whereIn('slug', [ + 'cabinet_access', + 'manage_cart', + 'checkout', + ])->pluck('id') + ); + $this->command->info('✓ Назначены права для Зарегистрированного пользователя'); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..fcd310b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + container_name: tailandpaws_app + restart: unless-stopped + environment: + APP_ENV: production + APP_DEBUG: "false" + APP_URL: http://localhost + DB_CONNECTION: mysql + DB_HOST: db + DB_PORT: 3306 + DB_DATABASE: ${DB_DATABASE:-tailandpaws} + DB_USERNAME: ${DB_USERNAME:-laravel} + DB_PASSWORD: ${DB_PASSWORD:-secret} + CACHE_DRIVER: file + SESSION_DRIVER: file + QUEUE_CONNECTION: sync + volumes: + - storage_data:/var/www/html/storage/app + - logs_data:/var/www/html/storage/logs + ports: + - "8080:80" + depends_on: + db: + condition: service_healthy + networks: + - tailandpaws + + db: + image: mysql:8.0 + container_name: tailandpaws_db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootsecret} + MYSQL_DATABASE: ${DB_DATABASE:-tailandpaws} + MYSQL_USER: ${DB_USERNAME:-laravel} + MYSQL_PASSWORD: ${DB_PASSWORD:-secret} + volumes: + - db_data:/var/lib/mysql + ports: + - "3306:3306" + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-rootsecret}"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - tailandpaws + +volumes: + db_data: + storage_data: + logs_data: + +networks: + tailandpaws: + driver: bridge diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf new file mode 100644 index 0000000..455f143 --- /dev/null +++ b/docker/nginx/default.conf @@ -0,0 +1,29 @@ +server { + listen 80; + server_name _; + root /var/www/html/public; + index index.php; + + charset utf-8; + client_max_body_size 64M; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_hide_header X-Powered-By; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} diff --git a/docker/php/php.ini b/docker/php/php.ini new file mode 100644 index 0000000..2ca8e70 --- /dev/null +++ b/docker/php/php.ini @@ -0,0 +1,12 @@ +upload_max_filesize = 64M +post_max_size = 64M +memory_limit = 256M +max_execution_time = 60 +expose_php = Off + +opcache.enable = 1 +opcache.memory_consumption = 128 +opcache.interned_strings_buffer = 8 +opcache.max_accelerated_files = 10000 +opcache.revalidate_freq = 60 +opcache.validate_timestamps = 0 diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 0000000..5547ec0 --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,23 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php-fpm] +command=php-fpm +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=nginx -g "daemon off;" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/isUniqueConstraintError($e)) b/isUniqueConstraintError($e)) new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2bc0240 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2552 @@ +{ + "name": "TailAndPaws", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@popperjs/core": "^2.11.8", + "bootstrap": "^5.3.8", + "bootstrap-icons": "^1.13.1", + "sortablejs": "^1.15.7" + }, + "devDependencies": { + "autoprefixer": "^10.4.20", + "axios": "^1.7.9", + "laravel-vite-plugin": "^1.2.0", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "vite": "^6.3.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.13.1.tgz", + "integrity": "sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001779", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", + "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", + "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sortablejs": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6b3b1a8 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "autoprefixer": "^10.4.20", + "axios": "^1.7.9", + "laravel-vite-plugin": "^1.2.0", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "vite": "^6.3.2" + }, + "dependencies": { + "@popperjs/core": "^2.11.8", + "bootstrap": "^5.3.8", + "bootstrap-icons": "^1.13.1", + "sortablejs": "^1.15.7" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..bc86714 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,32 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/prepareBindings($bindings) b/prepareBindings($bindings) new file mode 100644 index 0000000..e69de29 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/assets/css/brand.css b/public/assets/css/brand.css new file mode 100644 index 0000000..be10714 --- /dev/null +++ b/public/assets/css/brand.css @@ -0,0 +1,8 @@ +.hover-shadow { + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.hover-shadow:hover { + transform: translateY(-5px); + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1) !important; +} \ No newline at end of file diff --git a/public/assets/css/cart.css b/public/assets/css/cart.css new file mode 100644 index 0000000..8cd38c6 --- /dev/null +++ b/public/assets/css/cart.css @@ -0,0 +1,92 @@ +.cart-item { + transition: background-color 0.2s ease; +} + +.cart-item:hover { + background-color: #f8f9fa; +} + +.quantity-control { + background: #fff; + overflow: hidden; +} + +.quantity-control button { + background: none; + border: none; + font-size: 18px; + font-weight: 500; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.quantity-control input { + text-align: center; + padding: 0; +} + +.quantity-control input:focus { + outline: none; + box-shadow: none; +} + +.quantity-control input::-webkit-inner-spin-button, +.quantity-control input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.remove-item { + opacity: 0.5; + transition: opacity 0.2s ease; +} + +.remove-item:hover { + opacity: 1; +} + +.btn-dark-green:disabled { + background-color: #6c757d; + cursor: not-allowed; +} + +.card { + border-radius: 12px; +} + +.item-total { + font-size: 16px; +} + +.btn-link { + font-size: 16pt; + text-decoration: none; + color: var(--dark-green); +} + +.btn-link:hover { + color: var(--dark-green); +} + +@media (max-width: 768px) { + .quantity-control { + width: 100px !important; + } + + .quantity-control button { + width: 28px !important; + } + + .quantity-control input { + width: 40px !important; + } + + .item-total { + font-size: 14px; + } + + .text-end { + width: 120px; + margin: 0 !important; + } +} \ No newline at end of file diff --git a/public/assets/css/category.css b/public/assets/css/category.css new file mode 100644 index 0000000..35db7b7 --- /dev/null +++ b/public/assets/css/category.css @@ -0,0 +1,103 @@ +.ui-slider { + height: 6px; + margin: 16px 16px 0; + border-radius: 3px; + background: #e9ecef; +} + +.ui-slider .noUi-background { + background: linear-gradient(90deg, #e9ecef 0%, #dee2e6 100%); + border-radius: 3px; +} + +.ui-slider .noUi-handle { + width: 22px; + height: 22px; + top: -8px; + right: -11px; + background: #fff; + border: 3px solid var(--dark-green); + border-radius: 50%; + box-shadow: + 0 4px 12px #3233293b, + 0 2px 4px rgba(0, 0, 0, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +.ui-slider .noUi-handle.noUi-active { + transform: scale(1.1) !important; + border-width: 4px; + border-color: var(--dark-green); + box-shadow: 0 0 0 4px #3233293b; +} + +.ui-slider .noUi-handle:before, +.ui-slider .noUi-handle:after { + display: none; +} + +.ui-slider.disabled { + opacity: 0.5; + pointer-events: none; +} + +.ui-slider.disabled .noUi-handle { + cursor: not-allowed; +} + +input:disabled { + background-color: #e9ecef; + cursor: not-allowed; +} + +.noUi-connect { + background: #fff; +} + +.filters .form-control:focus { + box-shadow: none; + border-color: var(---dark-green); +} + +.close-btn { + position: absolute; + top: 10px; + right: 20px; + background: none; + border: none; + color: white; + font-size: 2rem; + cursor: pointer; +} + +.form-check-input:checked { + background-color: var(--dark-green); + border-color: var(--dark-green); +} + +.form-check-input:focus, +.login-form .form-control:focus { + border-color: var(--dark-green); + outline: 0; + box-shadow: none; +} + + +@media (max-width: 767.98px) { + .filters.mobile-open { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.678); + z-index: 1050; + overflow-y: auto; + padding: 1rem; + } + + body.filters-open { + overflow: hidden; + } +} \ No newline at end of file diff --git a/public/assets/css/checkout.css b/public/assets/css/checkout.css new file mode 100644 index 0000000..71d0334 --- /dev/null +++ b/public/assets/css/checkout.css @@ -0,0 +1,28 @@ +.btn-dark-green:disabled { + background-color: #6c757d; + cursor: not-allowed; +} + +.btn-outline-mint { + background-color: transparent; + border: 1px solid #2c5e2e; + color: #2c5e2e; + border-radius: 8px; + transition: all 0.2s ease; +} + +.btn-outline-mint:hover { + background-color: #2c5e2e; + color: white; +} + +.form-control:focus, .form-check-input:focus { + border-color: var(--dark-green); + outline: 0; + box-shadow: 0 0 0 .25rem #2a2a2254; +} + +.form-check-input:checked { + background-color: var(--dark-green); + border-color: var(--dark-green); +} \ No newline at end of file diff --git a/public/assets/css/index.css b/public/assets/css/index.css new file mode 100644 index 0000000..92a8823 --- /dev/null +++ b/public/assets/css/index.css @@ -0,0 +1,153 @@ +/* Карусель с акциями */ +#carouselDiscount .carousel-inner { + height: 500px; + background-color: var(--orange); +} + +.carousel-discount-img { + background-color: var(--light-gray); + border-radius: 15px; + padding: 15px; + height: 100%; +} + +#carouselDiscount .carousel-item { + color: var(--light-gray); + height: 100% !important; + flex-shrink: 0; + width: 100%; + overflow: hidden; +} + +#carouselDiscount .carousel-item img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.discount-badge { + width: 60px; + height: 60px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--dark-green); + border-radius: 100%; +} + +.carousel-price { + background-color: var(--light-gray); + color: var(--orange); + border-radius: 15px; + padding: 10px; +} + +.original-price { + text-decoration: line-through; + text-decoration-color: var(--dark-green); + text-decoration-thickness: 2px; + opacity: 0.8; + align-self: flex-end; +} + +.discounted-price { + align-self: center; +} + +/* Блок с товарами */ +.product-card { + height: 500px; +} + +/* Слайдер с продуктами */ +.carousel-indicators { + position: relative; +} + +/* Блок с брендами */ +.brand-circle { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + padding: 10px; + background-color: var(--light-gray); + border-radius: 15px; +} + +.brand-circle img { + width: 80%; + height: 100%; + object-fit: contain; +} + + +@media (max-width: 991px) { + + /* Карусель на мобильных устройствах */ + #carouselDiscount .carousel-inner { + height: 500px; + } + + .carousel-discount-img { + height: 50%; + } + + #carouselDiscount .carousel-item h1 { + font-size: medium !important; + } + + #carouselDiscount .btn-dark-green { + padding: 5px !important; + font-size: 0.8rem !important; + } + + .discount-badge { + width: 40px; + height: 40px; + font-size: 0.7rem; + } + + .carousel-price { + padding: 0; + } + + .carousel-price div { + width: 70% !important; + padding: 5px; + } + + .original-price { + font-size: 0.8rem !important; + } + + .discounted-price { + font-size: 1rem !important; + } + + /* Карточки */ + .product-card { + height: 300px; + } + + .product-card .btn-dark-green { + padding: 5px !important; + font-size: 0.8rem !important; + } + + .card-text { + font-size: 0.7rem !important; + } + + .card-title h5 { + font-size: 0.8rem !important; + } +} + +@media (max-width: 576px) { + + /* Карточки */ + .product-card { + height: 250px; + } +} \ No newline at end of file diff --git a/public/assets/css/login.css b/public/assets/css/login.css new file mode 100644 index 0000000..533d690 --- /dev/null +++ b/public/assets/css/login.css @@ -0,0 +1,59 @@ +main { + flex: 1 0 auto; + display: flex; + flex-direction: column; + gap: 50px; + justify-content: center; + align-items: center; +} + +.form-check-input { + width: 15px !important; + height: 15px !important; + cursor: pointer; + margin: 0; +} + +.login-form .form-control, +input[type="submit"] { + border-radius: 5px; + height: 50px; + padding: 10px; +} + +.login-form { + min-height: 45vh; +} + +.form-check-input:checked { + background-color: var(--dark-green); + border-color: var(--dark-green); +} + +.form-check-input:focus, +.login-form .form-control:focus { + border-color: var(--dark-green); + outline: 0; + box-shadow: 0 0 0 .25rem #2a2a2254; +} + +@media (max-width: 991px) { + .login-form { + width: 100% !important; + min-height: 30vh; + } + + .login-form h3 { + font-size: 1.2rem !important; + } + + .login-form .form-control { + height: 40px; + padding: 5px; + } + + .form-check-input { + width: 18px !important; + height: 18px !important; + } +} \ No newline at end of file diff --git a/public/assets/css/menu.css b/public/assets/css/menu.css new file mode 100644 index 0000000..8b8b6cb --- /dev/null +++ b/public/assets/css/menu.css @@ -0,0 +1,719 @@ +* { + box-sizing: border-box; + font-family: 'Comic Relief', Arial, Helvetica, sans-serif; +} + +:root { + --dark-green: #323329; + --dark-green-hover: #2a2a22; + --light-gray: #E6E2DF; + --orange: #C47C4C; + --dark-orange: #b36b3c; + --action-btn-size: 44px; +} + +@font-face { + font-family: 'Comic Relief'; + src: url('../fonts/ComicRelief-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Comic Relief'; + src: url('../fonts/ComicRelief-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: bold; + font-display: swap; +} + +/* Основа */ + +body, +html { + height: 100%; + margin: 0; + display: flex; + flex-direction: column; +} + +body { + min-height: 130vh; +} + +main { + flex: 1 0 auto; + display: flex; + flex-direction: column; + gap: 50px; +} + +.alert-dark-green { + background-color: var(--dark-green); + color: var(--light-gray); +} + +/* Хэдер */ + +.navbar-brand, +.nav-link { + transition: transform 0.6s ease; + color: var(--light-gray); +} + +.nav-link { + font-size: 1.2rem; + position: relative; + text-align: center; +} + +.navbar-brand:hover, +.nav-link:hover { + transform: scale(1.05); +} + +.nav-link:hover, +.nav-link:focus { + color: rgb(199, 198, 197); +} + +.cart-count { + transform: translate(-50%, -50%); + min-width: 18px; + height: 18px; + line-height: 18px; + padding: 0 5px; + font-size: 10px; + font-weight: 600; + top: 20% !important; + left: 80% !important; +} + +@keyframes cartBump { + 0% { + transform: translate(-50%, -50%) scale(1); + } + + 50% { + transform: translate(-50%, -50%) scale(1.2); + } + + 100% { + transform: translate(-50%, -50%) scale(1); + } +} + +.cart-bump { + animation: cartBump 0.3s ease; +} + +.action-btn { + width: var(--action-btn-size); + height: var(--action-btn-size); + min-width: var(--action-btn-size); + min-height: var(--action-btn-size); + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.3s ease; +} + +.auth-dropdown-menu .action-btn { + border: 1px solid var(--light-gray); +} + +.action-btn:hover { + transform: scale(1.05); + background-color: var(--dark-orange); +} + +.header-icon { + width: 24px !important; + height: 24px !important; + object-fit: contain; + display: inline-block; + flex-shrink: 0; +} + +#input_search:focus { + border-color: var(--orange); + box-shadow: 0 0 5px var(--orange); +} + +/* Мега-меню */ +.dropdown-megamenu { + position: static !important; +} + +.dropdown-icon { + display: inline-flex; + align-items: center; + margin-left: 3px; +} + +.dropdown-icon img { + width: 20px; + height: 20px; + transition: transform 0.5s ease; +} + +.dropdown-megamenu:hover .dropdown-icon img { + transform: rotate(180deg); +} + +.dropdown-megamenu>.nav-link::after { + content: ''; + position: absolute; + bottom: -20px; + left: 0; + width: 100%; + height: 20px; + background: transparent; +} + +.dropdown-megamenu .megamenu { + position: absolute; + top: 95%; + left: 0; + right: 0; + background: #ffffff; + border-radius: 0 0 12px 12px; + box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2); + padding: 24px; + display: none; + z-index: 1050; + width: 100%; + border-top: 3px solid var(--orange); +} + +/* Добавляем невидимый мостик сверху меню */ +.dropdown-megamenu .megamenu::before { + content: ''; + position: absolute; + top: -20px; + left: 0; + width: 100%; + height: 20px; + background: transparent; +} + +/* Показываем меню при наведении */ +.dropdown-megamenu:hover .megamenu, +.dropdown-megamenu .megamenu:hover { + display: block; +} + +/* Анимация появления */ +.dropdown-megamenu .megamenu { + display: none; + animation: fadeIn 0.3s ease; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(-10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Стили для контента мега-меню */ +.megamenu-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 24px; +} + +.category-column h5 { + color: var(--dark-green); + font-weight: 600; + margin-bottom: 12px; + font-size: 16px; +} + +.category-column ul { + list-style: none; + padding: 0; + margin: 0; +} + +.category-column li { + margin-bottom: 6px; +} + +.category-column a { + color: var(--dark-green); + text-decoration: none; + font-size: 14px; + padding: 4px 0; + display: block; + transition: all 0.2s; +} + +.category-column a:hover { + color: var(--orange); + padding-left: 8px; +} + +.category-image { + grid-column: 1 / -1; + text-align: center; + margin-bottom: 16px; +} + +.category-image img { + max-width: 100%; + height: 200px; + object-fit: cover; + border-radius: 8px; +} + +.text-dark-green { + color: var(--dark-green); +} + +/* Мегаменю пользователя */ +.header-main-menu { + flex: 1 1 auto; + min-width: 0; +} + +.header-right { + flex: 0 0 auto; + min-width: 280px; +} + +.header-search { + width: 100%; + max-width: 20vw; + min-width: 180px; + display: flex; + gap: 8px; +} + +.header-search input { + flex: 1 1 auto; + min-width: 0; + height: var(--action-btn-size); +} + +.header-search .action-btn { + flex-shrink: 0; +} + +.auth-dropdown { + position: relative; +} + +.auth-dropdown-menu { + position: absolute; + top: 100%; + right: 0; + display: none; + flex-direction: column; + gap: 8px; + padding-top: 10px; + z-index: 1050; +} + +.auth-dropdown:hover .auth-dropdown-menu { + display: flex; +} + +.auth-dropdown::before { + content: ""; + position: absolute; + top: 100%; + right: 0; + width: 100%; + height: 12px; + background: transparent; +} + +.user-mobile-menu { + display: flex; + gap: 8px; + align-items: center; +} + +/* Футер */ + +.footer-links { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 200px)); + justify-content: center; + align-items: center; +} + +.footer-link { + color: var(--light-gray); + text-decoration: none; + font-size: 14px; + transition: all 0.3s ease; + padding: 4px 0; + display: block; + width: 100%; + max-width: 300px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.footer-link:hover { + color: var(--orange); + transform: translateX(5px); +} + +.footer-section h3 { + color: var(--light-gray); + border-bottom: 2px solid var(--orange) !important; + font-size: 1.2rem; + padding-bottom: 0.5rem; + margin-bottom: 1rem; +} + +.card { + border-radius: 0px; + border: 1px solid var(--orange); + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 5px; + padding: 10px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.product-link { + display: block; + color: inherit; + text-decoration: none; + height: calc(100% - 60px); +} + +.product-link .card-body { + display: flex; + flex-direction: column; + justify-content: flex-start; + padding: 10px; +} + +.card-img { + width: 100%; + height: 50%; + object-fit: cover; +} + +.card-title { + height: 20%; + margin: 10px 0; +} + +.card-text { + flex-grow: 1; + margin: 0; +} + +.active>.page-link, +.page-link.active { + color: var(--light-gray); + background-color: var(--dark-green); + border-color: var(--dark-green); +} + +.page-link { + color: var(--dark-green); +} + +.page-link:hover { + color: var(--orange); +} + +.page-link:focus { + border-color: var(--dark-green); + outline: 0; + box-shadow: 0 0 0 .25rem #2a2a2254; + color: var(--dark-green); + background-color: #f8f9fa; +} + +.btn-close:focus { + border: none; + outline: 0; + box-shadow: none; +} + +/* Блок с категориями */ +.category-card { + background-size: cover; + background-position: center; + background-repeat: no-repeat; + height: 200px; + padding: 0; + border: none; +} + +.category-card .card-body { + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(0, 0, 0, 0.5); + color: var(--light-gray); + transition: background-color 0.3s ease; +} + +.category-card:hover .card-body { + background-color: rgba(0, 0, 0, 0.7); +} + + +@media (max-width: 1399.98px) { + .header-search { + max-width: 25vw; + } + + .footer-section p, + .footer-section h3 { + text-align: center; + } + + .social-media { + justify-content: center !important; + } +} + +@media (max-width: 1199.98px) { + .header-search { + max-width: 30vw; + } +} + +@media (max-width: 991.98px) { + main { + gap: 30px; + } + + .dropdown-megamenu { + position: relative !important; + } + + .dropdown-megamenu .megamenu { + position: static; + box-shadow: none; + padding: 15px; + background: rgba(255, 255, 255, 0.1); + margin-top: 10px; + } + + .megamenu-grid { + grid-template-columns: 1fr; + } + + .category-column a { + color: var(--light-gray); + } + + .category-column a:hover { + color: var(--orange); + } + + .category-column h5 { + color: var(--light-gray); + } + + .navbar-brand img { + width: 60px; + height: 60px; + } + + .nav-link, + .footer-link { + font-size: 1rem !important; + } + + .header-right { + flex: 1; + min-width: 0; + width: 100%; + } + + .header-search { + max-width: none; + flex: 1; + min-width: 0; + } + + .header-search input { + width: 100% !important; + min-width: 0; + } +} + +@media (max-width: 767.98px) { + .header-right { + flex-wrap: wrap; + gap: 8px; + } + + .header-search { + flex: 1; + min-width: 0; + order: 1; + } + + .user-mobile-menu { + order: 2; + } + + .header-right:has(a:only-child) .header-search { + flex: 1; + } +} + +@media (max-width: 575.98px) { + .navbar-brand h3 { + font-size: 1rem !important; + } + + .navbar-brand img { + width: 50px; + height: 50px; + } + + .action-btn { + --action-btn-size: 40px; + } + + .header-search .action-btn { + flex-shrink: 0; + } + + .user-mobile-menu { + gap: 6px; + } + + .header-right { + gap: 6px; + } +} + +@media (max-width: 480px) { + + .navbar-brand h3 { + font-size: 0.9rem !important; + } + + .nav-link, + .footer-link { + font-size: 0.9rem !important; + } + + .footer-link { + text-align: center; + } + + .action-btn { + --action-btn-size: 38px; + } + + .header-icon { + width: 20px !important; + height: 20px !important; + } + + .dropdown-icon img { + width: 16px; + height: 16px; + } + + .header-search { + gap: 6px; + } +} + +@media (max-width: 375px) { + .action-btn { + --action-btn-size: 36px; + } + + .navbar-brand { + gap: 6px !important; + } + + .navbar-brand h3 { + font-size: 0.8rem !important; + } + + .user-mobile-menu { + gap: 4px; + } + + .header-right { + gap: 4px; + } +} + +@media (hover: none) and (pointer: coarse) { + .action-btn:hover { + transform: none; + } + + .dropdown-megamenu .megamenu { + display: none; + } + + .dropdown-megamenu.active .megamenu { + display: block; + } +} + +.action-btn { + position: relative; + overflow: hidden; +} + +.action-btn::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: rgba(255, 255, 255, 0.3); + transform: translate(-50%, -50%); + transition: width 0.3s ease, height 0.3s ease; +} + +.action-btn:active::after { + width: 100%; + height: 100%; +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--light-gray); +} + +::-webkit-scrollbar-thumb { + background: var(--orange); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--dark-orange); +} \ No newline at end of file diff --git a/public/assets/css/nouislider.min.css b/public/assets/css/nouislider.min.css new file mode 100644 index 0000000..60f217c --- /dev/null +++ b/public/assets/css/nouislider.min.css @@ -0,0 +1 @@ +.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{top:-100%;width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px} \ No newline at end of file diff --git a/public/assets/css/product.css b/public/assets/css/product.css new file mode 100644 index 0000000..52d3944 --- /dev/null +++ b/public/assets/css/product.css @@ -0,0 +1,61 @@ +.product-gallery .main-image { + background-color: #f8f9fa; + border-radius: 8px; + overflow: hidden; +} + +.thumbnail-item { + border: 2px solid transparent; + border-radius: 8px; + transition: all 0.2s ease; +} + +.thumbnail-item.active { + border-color: var(--orange); +} + +.thumbnail-item:hover { + border-color: var(--orange); +} + +.btn-dark-green:disabled { + background-color: #6c757d; + cursor: not-allowed; +} + +.delivery-method { + background-color: #f8f9fa; + transition: all 0.2s ease; + cursor: pointer; +} + +.delivery-method:hover { + background-color: #e9ecef; +} + +.variation-btn { + width: 100%; + padding: 15px; +} + +.variation-btn.active { + background-color: var(--orange); + border-color: var(--orange); + color: white; +} + +.btn-link { + font-size: 16pt; + text-decoration: none; + color: var(--dark-green); +} + +.btn-link:hover { + color: var(--dark-green); +} + +.quantity-selector input::-webkit-inner-spin-button, +.quantity-selector input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} \ No newline at end of file diff --git a/public/assets/css/profile.css b/public/assets/css/profile.css new file mode 100644 index 0000000..6c3fa97 --- /dev/null +++ b/public/assets/css/profile.css @@ -0,0 +1,76 @@ +/* Сайдбар */ + +aside { + min-height: 100%; +} + +.nav-link { + text-align: left; +} + +/* Таблицы */ + +td { + vertical-align: middle; +} + +.form-check-input:checked { + background-color: var(--dark-green); + border-color: var(--dark-green); +} + +.form-check-input:focus, +.table .form-control:focus, +.edit-brand .form-control:focus, +.card-body .form-control:focus, +.card-body .form-select:focus { + border-color: var(--dark-green) !important; + outline: 0 !important; + box-shadow: 0 0 0 .25rem #2a2a2254 !important; +} + +#search:focus { + border-color: var(--dark-green) !important; + outline: 0 !important; + box-shadow: 0 0 0 .25rem #2a2a2254 !important; +} + +/* Кнопки */ + +.btn-dark-green:hover { + color: var(--light-gray); +} + +.nav-item[role="presentation"] .nav-link.active { + background-color: var(--dark-green); + color: var(--light-gray); +} + +.nav-item[role="presentation"] .nav-link { + transform: scale(1); +} + +/* В ваш основной CSS файл */ +.category-name { + font-size: 14px; + line-height: 1.4; +} + +.table tbody tr:hover { + background-color: rgba(0, 0, 0, 0.02); +} + +.category-name .text-muted { + font-family: monospace; + font-size: 12px; + color: #adb5bd !important; +} + +@media (max-width: 991px) { + + /* Сайдбар */ + + aside { + min-height: auto; + } +} \ No newline at end of file diff --git a/public/assets/fonts/ComicRelief-Bold.ttf b/public/assets/fonts/ComicRelief-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b862465bcfe7b30ac1cfea6d91c93505c49e3eb GIT binary patch literal 93304 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

T-ME9^oZ)#% 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%0Ao_rW+{BhRCbWi;9CSy)D^MDD16 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/brands/abba.png b/public/assets/images/brands/abba.png new file mode 100644 index 0000000000000000000000000000000000000000..d8aeb58930d240e9bdb94fa0dd1733d7bba29e4c GIT binary patch literal 12914 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