-
Notifications
You must be signed in to change notification settings - Fork 36
/
Order.php
72 lines (59 loc) · 1.78 KB
/
Order.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
declare(strict_types=1);
namespace Laracon\Order\Domain\Models;
use Laracon\Order\Infrastructure\Database\Factories\OrderFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Laracon\Inventory\Contracts\DataTransferObjects\ProductDto;
use Laracon\Order\Domain\Exceptions\EmptyOrderException;
class Order extends Model
{
use HasFactory;
protected $orderLines = [];
/**
* The attributes that are mass assignable.
*
* @var string[]
*/
protected $fillable = [
'user_id',
];
/**
* Create a new factory instance for the model.
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
protected static function newFactory()
{
return OrderFactory::new();
}
public function orderLines(): HasMany
{
return $this->hasMany(OrderLine::class);
}
public function addOrderLine(ProductDto $product, int $quantity): void
{
$orderLine = new OrderLine([
'product_id' => $product->id,
'product_name' => $product->name,
'price' => $product->price,
'quantity' => $quantity,
]);
$this->orderLines[] = $orderLine;
}
public function checkout(): void
{
if (empty($this->orderLines)) {
throw new EmptyOrderException();
}
$this->amount = collect($this->orderLines)->sum(fn (OrderLine $orderLine) =>
$orderLine->subtotal()
);
$this->tax = $this->amount * TaxRate::current()->rate;
$this->total_amount = $this->amount + $this->tax;
$this->save();
$this->orderLines()->saveMany($this->orderLines);
$this->refresh();
}
}