HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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;
    }
}