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/farmfun/reserveren.farmfun.be/app/Komma/Shop/seeds/SampleOrders.php
<?php

namespace App\Komma\Shop\seeds;

use App\Komma\Addresses\Models\Address;
use App\Komma\Shop\Cart\ShoppingCartService;
use App\Komma\Shop\Checkout\CheckoutService;
use App\Komma\Shop\Orders\OrderStatus;
use App\Komma\Shop\Payment\Transaction;
use App\Komma\Shop\Payment\TransactionStatus;
use App\Komma\Shop\Products\Product\Product;
use App\Komma\Shop\Products\Product\ProductTranslation;
use App\Komma\Shop\Products\ProductComposite\ProductComposite;
use App\Komma\Shop\Products\ProductComposite\ProductCompositeTranslation;
use App\Komma\Shop\Products\ProductGroup\ProductGroup;
use App\Komma\Shop\Products\ProductGroup\ProductGroupTranslation;
use App\Komma\Sites\SiteServiceInterface;
use App\Komma\Users\Models\SiteUser;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;

class SampleOrders extends Seeder
{
    /**
     * @throws \Throwable
     */
    public function run()
    {
        Auth::login(SiteUser::first());

        $checkoutService = new CheckoutService();
        $shoppingCartService = new ShoppingCartService();
        /** @var SiteServiceInterface $siteService */
        $siteService = app(SiteServiceInterface::class);
        $siteService->setCurrentSiteToDefault();

        for ($index = 0; $index < 5; $index++) {
            $this->createProductGroup();
            $this->createProductComposite();
        }

        $sampleOrderAmount = 30;
//        $sampleOrderAmount = 50000; //A real life situation

        for ($index = 0; $index < $sampleOrderAmount; $index++) {
            /** @var SiteUser $user */
            $user = factory(SiteUser::class)->make();
            $user->save();

            $shoppingCartService->clear();
            $productablesToAdd = mt_rand(1, 3);
            for ($productableCounter = 0; $productableCounter < $productablesToAdd; $productableCounter++) {
                //Create a random productable with all sub models
                switch (mt_rand(1, 3)) {
                    case 1:
                        $productable = Product::inRandomOrder()->first();
                        break;
                    case 2:
                        $productable = ProductGroup::inRandomOrder()->first();
                        break;
                    case 3:
                        $productable = ProductComposite::inRandomOrder()->first();
                        break;
                }

                $shoppingCartService->addProductable($productable);
            }

            $status = Arr::random(TransactionStatus::getAsArray());

            $addressForShipping = factory(Address::class)->create();
            $addressForInvoice = factory(Address::class)->create();
            Model::reguard();
            $order = $checkoutService->createOrder($shoppingCartService, $user, $addressForShipping, $addressForInvoice);
            Model::unguard();
            $fakeTransaction = new Transaction([
                'order_id' => $order->id,
                'amount' => $order->total_price,
                'psp_payment_reference' => Str::random(),
                'psp' => 'example PSP',
                'psp_id' => mt_rand(10000, 99999),
                'ip' => request()->ip(),
                'currency_iso_4217_code' => 'EUR',
                'error_code' => '',
                'account_reference' => '',
                'account_holder_name' => $user->first_name.' '.$user->last_name,
                'acccount_brand' => 'fake',
                'issuer_id' => 'somebank',
                'payment_method' => 'KommaPal',
                'status' => $status,
                'payment_link' => route('fakepsp', ['order' => $order]),
                'expire_date' => Carbon::now()->addMinutes(15)->toDateTimeString(),
                'payment_date' => ($status == OrderStatus::COMPLETED) ? Carbon::now()->addMinutes(1)->toDateTimeString() : null,
            ]);
            $fakeTransaction->save();

            /** @var Transaction $transaction */
            $transaction = $order->transactions()->save($fakeTransaction);
        }
    }

    /**
     * @return ProductComposite
     */
    public function createProductComposite()
    {
        //Notice that when you create translations using factories, you also create translatables
        /** @var ProductComposite $productComposite */
        /** @var ProductCompositeTranslation $translation */
        $translation = factory(ProductCompositeTranslation::class)->create();
        $productComposite = $translation->translatable;

        $productGroups = [];
        $count = mt_rand(1, 3);
        for ($index = 0; $index < $count; $index++) {
            $productGroups[] = $this->createProductGroup();
        }

        $productComposite->groups()->saveMany($productGroups);

        return $productComposite;
    }

    /**
     * @return ProductGroup
     */
    public function createProductGroup()
    {
        //Notice that when you create translations using factories, you also create translatables
        /** @var ProductGroup $productGroup */
        /** @var ProductGroupTranslation $translation */
        $translation = factory(ProductGroupTranslation::class)->create();
        $productGroup = $translation->translatable;

        $products = [];
        $count = mt_rand(1, 3);
        for ($index = 0; $index < $count; $index++) {
            /** @var Product $product */
            /** @var ProductTranslation $translation */
            $translation = factory(ProductTranslation::class)->create();
            $products[] = $translation->translatable;
        }
        $productGroup->products()->saveMany($products);

        return $productGroup;
    }
}