File: D:/HostingSpaces/SBogers10/shop.komma.nl/database/seeds/Discounts.php
<?php declare(strict_types=1);
namespace App\Seeds;
use App\Categories\Models\Category;
use App\Discounts\Actions\DiscountActionTypes;
use App\Discounts\Conditions\DiscountConditionTypes;
use App\Discounts\Discount;
use App\Discounts\DiscountAction;
use App\Discounts\DiscountCondition;
use App\Discounts\DiscountTranslation;
use Illuminate\Database\Seeder;
use Illuminate\Support\Collection;
use Komma\KMS\Globalization\Languages\Models\Language;
/**
* Class CommonShopPages
*
* Needed for both testing and showcasing purposes
*
* @package App\Seeds
*/
class Discounts extends Seeder
{
private ?Collection $languages;
private array $dataset = [];
private function makeDataset() {
$categories = Category::all();
$categoryCSV = $categories->whereIn('code_name', ['studio_lightning', 'laptops'])
->map(function(Category $category) {
return $category->id;
})->join(',');
$bbqCategory = $categories->where('code_name', '=', 'barbecues')->first();
return [
[
'attributes' => ['active' => true],
'conditions' => [
['attributes' => ['type' => DiscountConditionTypes::PRODUCT_CATEGORY, 'operator' => 'in', 'params' => $categoryCSV]]
],
'actions' => [
['attributes' => ['type' => DiscountActionTypes::MODIFY_CART_PRICE_ABSOLUTE, 'params' => '10000']]
],
'translations' => [
[
'language' => 'nl', //ISO-639-1 formatted
'attributes' => ['title' => '€100 cashback op laptops en studio verlichting', 'description' => 'Geeft €100 korting op alle laptops en studio verlichtings producten'],
],
[
'language' => 'en', //ISO-639-1 formatted
'attributes' => ['title' => '€100 cashback laptops and studio lightning', 'description' => 'Yields a €100 discount on all laptops and studio lightning products'],
],
],
],
[
'attributes' => ['active' => true],
'conditions' => [
['attributes' => ['type' => DiscountConditionTypes::PRODUCT_CATEGORY, 'operator' => 'in', 'params' => $bbqCategory->id]],
['attributes' => ['type' => DiscountConditionTypes::PRODUCT_COUNT, 'operator' => '>=', 'params' => '2']],
],
'actions' => [
['attributes' => ['type' => DiscountActionTypes::MODIFY_CART_ITEM_PRICE_ABSOLUTE, 'params' => '20000']]
],
'translations' => [
[
'language' => 'nl', //ISO-639-1 formatted
'attributes' => ['title' => '€ 200 korting op BBQ\'s', 'description' => 'Geeft voor elke gekochte bbq € 200 korting wanneer je er minimaal 2 koopt als het 30 graden of meer is'],
],
[
'language' => 'en', //ISO-639-1 formatted
'attributes' => ['title' => '€ 200 discount on BBQ\'s', 'description' => 'Yields € 200 discount for each bbq when you buy at least 2 when it is 30 degrees celsius or more'],
],
],
],
[
'attributes' => ['active' => true],
'conditions' => [
['attributes' => ['type' => DiscountConditionTypes::WEATHER, 'operator' => '>=', 'params' => '0,30']] //Weatherstation id,Temperature in degrees celsius
],
'actions' => [
['attributes' => ['type' => DiscountActionTypes::MODIFY_CART_PRICE_PERCENTAGE, 'params' => '5']]
],
'translations' => [
[
'language' => 'nl', //ISO-639-1 formatted
'attributes' => ['title' => '5% Zomer korting', 'description' => '5% korting op alles wanneer het 30 graden of warmer is in Nederland'],
],
[
'language' => 'en', //ISO-639-1 formatted
'attributes' => ['title' => '5% Summer discount', 'description' => '5% discount on everything when temperatures hit 30 degrees celsius or more in the Nederlands'],
],
],
],
];
}
/**
* Run the seed
*/
public function run()
{
$this->dataset = $this->makeDataset();
$this->languages = Language::whereIn('iso_2', config('seeds.languages'))->get(['id', 'iso_2']);
foreach ($this->dataset as $discountData) {
//Only seed the page if it's code is defined in seeds.pages
$this->createDiscount($discountData);
}
}
/**
* @param array $discountData
*
* @return Discount
*/
private function createDiscount(array $discountData): Discount
{
$discount = new Discount($discountData['attributes']);
$discount->save();
foreach($discountData['conditions'] as $conditionData) {
$discountCondition = new DiscountCondition($conditionData['attributes']);
$discountCondition->discount()->associate($discount);
$discountCondition->save();
}
foreach($discountData['actions'] as $actionData) {
$discountCondition = new DiscountAction($actionData['attributes']);
$discountCondition->discount()->associate($discount);
$discountCondition->save();
}
foreach ($discountData['translations'] as $translationData) {
$language = $this->languages->firstWhere('iso_2', $translationData['language']);
if ($language) {
$pageTranslation = new DiscountTranslation($translationData['attributes']);
$pageTranslation->language()->associate($language);
$pageTranslation->translatable()->associate($discount);
$pageTranslation->save();
}
}
return $discount;
}
}