Car-Repairs-Shop/app/Models/PurchaseOrder.php
sackey e839d40a99
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
Initial commit
2025-07-30 17:15:50 +00:00

95 lines
2.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class PurchaseOrder extends Model
{
use HasFactory;
protected $fillable = [
'supplier_id',
'po_number',
'order_date',
'expected_date',
'received_date',
'status',
'subtotal',
'tax',
'shipping',
'total',
'notes',
'approved_by',
'received_by',
];
protected $casts = [
'order_date' => 'date',
'expected_date' => 'date',
'received_date' => 'date',
'subtotal' => 'decimal:2',
'tax' => 'decimal:2',
'shipping' => 'decimal:2',
'total' => 'decimal:2',
];
const STATUS_DRAFT = 'draft';
const STATUS_PENDING = 'pending';
const STATUS_ORDERED = 'ordered';
const STATUS_PARTIAL = 'partial';
const STATUS_RECEIVED = 'received';
const STATUS_CANCELLED = 'cancelled';
public function supplier(): BelongsTo
{
return $this->belongsTo(Supplier::class);
}
public function items(): HasMany
{
return $this->hasMany(PurchaseOrderItem::class);
}
public function stockMovements(): HasMany
{
return $this->hasMany(StockMovement::class);
}
public function getStatusBadgeClassAttribute(): string
{
return match($this->status) {
self::STATUS_DRAFT => 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300',
self::STATUS_PENDING => 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300',
self::STATUS_ORDERED => 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300',
self::STATUS_PARTIAL => 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300',
self::STATUS_RECEIVED => 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300',
self::STATUS_CANCELLED => 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300',
default => 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300',
};
}
public function isEditable(): bool
{
return in_array($this->status, [self::STATUS_DRAFT, self::STATUS_PENDING]);
}
public function canBeReceived(): bool
{
return in_array($this->status, [self::STATUS_ORDERED, self::STATUS_PARTIAL]);
}
public function getItemsCountAttribute(): int
{
return $this->items()->count();
}
public function getTotalAmountAttribute(): float
{
return $this->items()->sum(\DB::raw('quantity_ordered * unit_cost'));
}
}