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;
}
}