TKK_E32230801/laundry-app/app/Models/Order.php

85 lines
2.2 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Auth;
class Order extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'order_number',
'customer_name',
'phone',
'total_price',
'status',
'total_weight',
'estimation_time',
'payment_method',
'cash_received',
'cash_change',
'address',
'latitude',
'longitude',
'delivery_type',
'delivery_fee',
'delivery_distance',
];
/**
* Casting format kolom agar dibaca sebagai objek tanggal oleh Laravel
*/
protected $casts = [
'estimation_time' => 'datetime',
'total_price' => 'integer',
'total_weight' => 'float',
];
public function items()
{
return $this->hasMany(OrderItem::class);
}
/**
* Accessor untuk mendapatkan service_name dari items
* Menghindari error di view karena kolom service_name dihapus dari tabel orders
*/
public function getServiceNameAttribute()
{
if ($this->items->isEmpty()) {
return 'Layanan Umum';
}
return $this->items->map(function ($item) {
$qty = $item->unit === 'PCS' ? round($item->qty_or_weight) . ' PCS' : number_format($item->qty_or_weight, 3, '.', '') . ' KG';
return $item->service_name . ' (' . $qty . ')||' . $item->subtotal;
})->implode("\n");
}
/**
* Logic Booted untuk Multi-Tenancy
*/
protected static function booted()
{
static::addGlobalScope('owner', function (Builder $builder) {
if (Auth::check()) {
$user = Auth::user();
$ownerId = $user->getOwnerId();
$builder->where('user_id', $ownerId);
}
});
static::creating(function ($order) {
if (Auth::check()) {
$user = Auth::user();
$order->user_id = $user->getOwnerId();
}
});
}
}