diff --git a/config/modules.php b/config/modules.php new file mode 100644 index 000000000..37bf9a64e --- /dev/null +++ b/config/modules.php @@ -0,0 +1,188 @@ + 'Modules', + + /* + |-------------------------------------------------------------------------- + | Module Stubs + |-------------------------------------------------------------------------- + | + | Default module stubs. + | + */ + + 'stubs' => [ + 'enabled' => false, + 'path' => base_path() . '/vendor/nwidart/laravel-modules/src/Commands/stubs', + 'files' => [ + 'start' => 'start.php', + 'routes' => 'Http/routes.php', + 'views/index' => 'Resources/views/index.blade.php', + 'views/master' => 'Resources/views/layouts/master.blade.php', + 'scaffold/config' => 'Config/config.php', + 'composer' => 'composer.json', + 'assets/js/app' => 'Resources/assets/js/app.js', + 'assets/sass/app' => 'Resources/assets/sass/app.scss', + 'webpack' => 'webpack.mix.js', + 'package' => 'package.json', + ], + 'replacements' => [ + 'start' => ['LOWER_NAME', 'ROUTES_LOCATION'], + 'routes' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], + 'webpack' => ['LOWER_NAME'], + 'json' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], + 'views/index' => ['LOWER_NAME'], + 'views/master' => ['LOWER_NAME', 'STUDLY_NAME'], + 'scaffold/config' => ['STUDLY_NAME'], + 'composer' => [ + 'LOWER_NAME', + 'STUDLY_NAME', + 'VENDOR', + 'AUTHOR_NAME', + 'AUTHOR_EMAIL', + 'MODULE_NAMESPACE', + ], + ], + 'gitkeep' => true, + ], + 'paths' => [ + /* + |-------------------------------------------------------------------------- + | Modules path + |-------------------------------------------------------------------------- + | + | This path used for save the generated module. This path also will be added + | automatically to list of scanned folders. + | + */ + + 'modules' => base_path('Modules'), + /* + |-------------------------------------------------------------------------- + | Modules assets path + |-------------------------------------------------------------------------- + | + | Here you may update the modules assets path. + | + */ + + 'assets' => public_path('modules'), + /* + |-------------------------------------------------------------------------- + | The migrations path + |-------------------------------------------------------------------------- + | + | Where you run 'module:publish-migration' command, where do you publish the + | the migration files? + | + */ + + 'migration' => base_path('database/migrations'), + /* + |-------------------------------------------------------------------------- + | Generator path + |-------------------------------------------------------------------------- + | Customise the paths where the folders will be generated. + | Set the generate key to false to not generate that folder + */ + 'generator' => [ + 'config' => ['path' => 'Config', 'generate' => true], + 'command' => ['path' => 'Console', 'generate' => true], + 'migration' => ['path' => 'Database/Migrations', 'generate' => true], + 'seeder' => ['path' => 'Database/Seeders', 'generate' => true], + 'factory' => ['path' => 'Database/factories', 'generate' => true], + 'model' => ['path' => 'Entities', 'generate' => true], + 'controller' => ['path' => 'Http/Controllers', 'generate' => true], + 'filter' => ['path' => 'Http/Middleware', 'generate' => true], + 'request' => ['path' => 'Http/Requests', 'generate' => true], + 'provider' => ['path' => 'Providers', 'generate' => true], + 'assets' => ['path' => 'Resources/assets', 'generate' => true], + 'lang' => ['path' => 'Resources/lang', 'generate' => true], + 'views' => ['path' => 'Resources/views', 'generate' => true], + 'test' => ['path' => 'Tests', 'generate' => true], + 'repository' => ['path' => 'Repositories', 'generate' => false], + 'event' => ['path' => 'Events', 'generate' => false], + 'listener' => ['path' => 'Listeners', 'generate' => false], + 'policies' => ['path' => 'Policies', 'generate' => false], + 'rules' => ['path' => 'Rules', 'generate' => false], + 'jobs' => ['path' => 'Jobs', 'generate' => false], + 'emails' => ['path' => 'Emails', 'generate' => false], + 'notifications' => ['path' => 'Notifications', 'generate' => false], + 'resource' => ['path' => 'Transformers', 'generate' => false], + ], + ], + /* + |-------------------------------------------------------------------------- + | Scan Path + |-------------------------------------------------------------------------- + | + | Here you define which folder will be scanned. By default will scan vendor + | directory. This is useful if you host the package in packagist website. + | + */ + + 'scan' => [ + 'enabled' => false, + 'paths' => [ + base_path('vendor/*/*'), + ], + ], + /* + |-------------------------------------------------------------------------- + | Composer File Template + |-------------------------------------------------------------------------- + | + | Here is the config for composer.json file, generated by this package + | + */ + + 'composer' => [ + 'vendor' => 'nwidart', + 'author' => [ + 'name' => 'Nicolas Widart', + 'email' => 'n.widart@gmail.com', + ], + ], + /* + |-------------------------------------------------------------------------- + | Caching + |-------------------------------------------------------------------------- + | + | Here is the config for setting up caching feature. + | + */ + 'cache' => [ + 'enabled' => false, + 'key' => 'laravel-modules', + 'lifetime' => 60, + ], + /* + |-------------------------------------------------------------------------- + | Choose what laravel-modules will register as custom namespaces. + | Setting one to false will require you to register that part + | in your own Service Provider class. + |-------------------------------------------------------------------------- + */ + 'register' => [ + 'translations' => true, + /** + * load files on boot or register method + * + * Note: boot not compatible with asgardcms + * + * @example boot|register + */ + 'files' => 'register', + ], +]; diff --git a/packages/Webkul/Product/src/Type/Bundle.php b/packages/Webkul/Product/src/Type/Bundle.php index 52a1345da..05018f331 100644 --- a/packages/Webkul/Product/src/Type/Bundle.php +++ b/packages/Webkul/Product/src/Type/Bundle.php @@ -160,22 +160,28 @@ class Bundle extends AbstractType */ public function getMinimalPrice() { - $optionPrices = []; + $minPrice = 0; + + $haveRequiredOptions = $this->haveRequiredOptions(); + + $minPrices = []; foreach ($this->product->bundle_options as $option) { - if(! $option->is_required) - continue; + $optionProductsPrices = $this->getOptionProductsPrices($option); - foreach ($option->bundle_option_products as $index => $bundleOptionProduct) { - $optionPrices[$option->id][] = $bundleOptionProduct->qty * $bundleOptionProduct->product->getTypeInstance()->getMinimalPrice(); + if (count($optionProductsPrices)) { + $selectionMinPrice = min($optionProductsPrices); + + if($option->is_required) { + $minPrice += $selectionMinPrice; + } elseif (! $haveRequiredOptions) { + $minPrices[] = $selectionMinPrice; + } } } - $minPrice = 0; - - foreach ($optionPrices as $key => $optionPrice) { - $minPrice += min($optionPrice); - } + if (! $haveRequiredOptions) + $minPrice = min($minPrices); return $minPrice; } @@ -187,26 +193,68 @@ class Bundle extends AbstractType */ public function getRegularMinimalPrice() { - $optionPrices = []; + $minPrice = 0; + + $haveRequiredOptions = $this->haveRequiredOptions(); + + $minPrices = []; foreach ($this->product->bundle_options as $option) { - if(! $option->is_required) - continue; + $optionProductsPrices = $this->getOptionProductsPrices($option, false); - foreach ($option->bundle_option_products as $index => $bundleOptionProduct) { - $optionPrices[$option->id][] = $bundleOptionProduct->qty * $bundleOptionProduct->product->price; + if (count($optionProductsPrices)) { + $selectionMinPrice = min($optionProductsPrices); + + if($option->is_required) { + $minPrice += $selectionMinPrice; + } elseif (! $haveRequiredOptions) { + $minPrices[] = $selectionMinPrice; + } } } - $minPrice = 0; - - foreach ($optionPrices as $key => $optionPrice) { - $minPrice += min($optionPrice); - } + if (! $haveRequiredOptions) + $minPrice = min($minPrices); return $minPrice; } + /** + * Get product regular minimal price + * + * @param ProductBundleOption $option + * @param boolean $minPrice + * @return float + */ + public function getOptionProductsPrices($option, $minPrice = true) + { + $optionPrices = []; + + foreach ($option->bundle_option_products as $index => $bundleOptionProduct) { + $optionPrices[] = $bundleOptionProduct->qty + * ($minPrice + ? $bundleOptionProduct->product->getTypeInstance()->getMinimalPrice() + : $bundleOptionProduct->product->price); + } + + return $optionPrices; + } + + /** + * Check if product has required options or not + * + * @return boolean + */ + protected function haveRequiredOptions() + { + foreach ($this->product->bundle_options as $option) { + if ($option->is_required) + return true; + } + + return false; + } + /** * Get product maximam price * @@ -320,7 +368,7 @@ class Bundle extends AbstractType public function getPriceHtml() { $prices = $this->getProductPrices(); - + $priceHtml = '