MIF_E31222707/Modules/Purchase/Entities/ProductBatch.php

92 lines
2.8 KiB
PHP

<?php
namespace Modules\Purchase\Entities;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\DB;
class ProductBatch extends Model
{
protected $fillable = [
'purchase_id',
'product_id',
'branch_id',
'batch_code',
'quantity',
'unit_price',
'price',
'expired_date',
'created_by',
'updated_by'
];
protected $casts = [
'quantity' => 'integer',
'unit_price' => 'decimal:2',
'price' => 'decimal:2',
'expired_date' => 'date'
];
public function product(): BelongsTo
{
return $this->belongsTo('Modules\Product\Entities\Product');
}
public function branch(): BelongsTo
{
return $this->belongsTo('App\Models\Branch');
}
public function purchase(): BelongsTo
{
return $this->belongsTo(Purchase::class);
}
public static function addStock(array $data)
{
return DB::transaction(function () use ($data) {
// Check if batch with same product, branch, and expired_date exists
$batch = self::where('product_id', $data['product_id'])
->where('branch_id', $data['branch_id'])
->where('expired_date', $data['expired_date'])
->first();
if ($batch) {
// Update existing batch
$batch->update([
'quantity' => $batch->quantity + $data['quantity'],
'unit_price' => $data['unit_price'], // Update price to latest
'price' => $data['price'], // Update price to latest
'updated_by' => auth()->user()->name
]);
return $batch;
}
// Create new batch
return self::create([
'product_id' => $data['product_id'],
'branch_id' => $data['branch_id'],
'batch_code' => $data['batch_code'] ?? null,
'quantity' => $data['quantity'],
'unit_price' => $data['unit_price'],
'price' => $data['price'],
'expired_date' => $data['expired_date'],
'purchase_id' => $data['purchase_id'],
'created_by' => auth()->user()->name,
'updated_by' => auth()->user()->name
]);
});
}
public static function getAvailableStock($productId, $branchId)
{
return self::where('product_id', $productId)
->where('branch_id', $branchId)
->where(function ($query) {
$query->whereNull('expired_date')
->orWhere('expired_date', '>', now());
})
->sum('quantity');
}
}