100 lines
2.6 KiB
PHP
100 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories\Ecommerce\Order;
|
|
|
|
use App\Events\Ecommerce\Product\Order\OrderCreated;
|
|
use App\Models\Ecommerce\Product\Order\Order;
|
|
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class OrderRepository
|
|
{
|
|
/**
|
|
* Order repo
|
|
*/
|
|
public function __construct(
|
|
protected array $data = [],
|
|
) {}
|
|
|
|
/**
|
|
* Create new order
|
|
*/
|
|
public function create()
|
|
{
|
|
$order = Order::create($this->data);
|
|
|
|
auth()->user()->carts()->with(['product' => [
|
|
'media',
|
|
'channels',
|
|
]])->get()->each(function ($cart) use ($order) {
|
|
DB::table('order_items')->insert([
|
|
'product_name' => $cart->product->name,
|
|
'product_id' => $cart->product_id,
|
|
'order_id' => $order->id,
|
|
'channel_id' => $cart->product->channels->first()?->id ?? tmpostChannel()->id,
|
|
'quantity' => $cart->product_quantity,
|
|
'unit_price_amount' => $cart->product->price_amount,
|
|
'unit_cost_amount' => $cart->product->cost_amount,
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
$cart->product->update([
|
|
'stock' => $cart->product->stock - $cart->product_quantity,
|
|
]);
|
|
});
|
|
|
|
auth()->user()->carts()->delete();
|
|
|
|
OrderCreated::dispatch($order);
|
|
|
|
return $order;
|
|
}
|
|
|
|
/**
|
|
* Available times
|
|
*/
|
|
public static function availableTimes(): array
|
|
{
|
|
$today = now()->format('d.m.Y');
|
|
$tomorrow = now()->addHour(24)->format('d.m.Y');
|
|
$times = [
|
|
'today' => [],
|
|
'tomorrow' => [],
|
|
];
|
|
|
|
if (strtotime('now') <= strtotime('09:00')) {
|
|
$times['today'][] = [
|
|
'date' => $today,
|
|
'hour' => OrderShipping::MORNING,
|
|
];
|
|
}
|
|
|
|
if (strtotime('now') <= strtotime('13:00')) {
|
|
$times['today'][] = [
|
|
'date' => $today,
|
|
'hour' => OrderShipping::EVENING,
|
|
];
|
|
}
|
|
|
|
$times['tomorrow'] = [
|
|
[
|
|
'date' => $tomorrow,
|
|
'hour' => OrderShipping::MORNING,
|
|
],
|
|
[
|
|
'date' => $tomorrow,
|
|
'hour' => OrderShipping::EVENING,
|
|
],
|
|
];
|
|
|
|
return [
|
|
'dates' => [
|
|
'today' => $today,
|
|
'tomorrow' => $tomorrow,
|
|
],
|
|
'hours' => $times,
|
|
];
|
|
}
|
|
}
|