feat: Introduce FeedDeliveryObserver for automatic feed stock management and enhance ProcessFeedSchedule with stock pre-checks and transactions.
This commit is contained in:
parent
551437c8e6
commit
22ef713f92
@ -5,6 +5,7 @@
|
|||||||
use App\Models\FeedDelivery;
|
use App\Models\FeedDelivery;
|
||||||
use App\Models\FeedSchedule;
|
use App\Models\FeedSchedule;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class ProcessFeedSchedule extends Command
|
class ProcessFeedSchedule extends Command
|
||||||
{
|
{
|
||||||
@ -21,7 +22,7 @@ public function handle(): int
|
|||||||
{
|
{
|
||||||
$time = $this->argument('time') ?? now()->format('H:i');
|
$time = $this->argument('time') ?? now()->format('H:i');
|
||||||
|
|
||||||
$schedules = FeedSchedule::whereTime('scheduled_at', $time)->get();
|
$schedules = FeedSchedule::with('feeds.unit')->whereTime('scheduled_at', $time)->get();
|
||||||
|
|
||||||
if ($schedules->isEmpty()) {
|
if ($schedules->isEmpty()) {
|
||||||
$this->info("No schedules found for time: {$time}");
|
$this->info("No schedules found for time: {$time}");
|
||||||
@ -31,15 +32,27 @@ public function handle(): int
|
|||||||
|
|
||||||
foreach ($schedules as $schedule) {
|
foreach ($schedules as $schedule) {
|
||||||
foreach ($schedule->feeds as $feed) {
|
foreach ($schedule->feeds as $feed) {
|
||||||
$quantity = $feed->pivot->quantity;
|
if ($feed->stock < $feed->pivot->quantity) {
|
||||||
$decrement = min($quantity, $feed->stock);
|
$this->error("Stock pakan '{$feed->name}' tidak cukup untuk jadwal '{$schedule->scheduled_at->format('H:i')}'. Dibutuhkan: {$feed->pivot->quantity}, Tersedia: {$feed->stock}");
|
||||||
$feed->decrement('stock', $decrement);
|
|
||||||
|
|
||||||
FeedDelivery::create([
|
return 1;
|
||||||
'feed_id' => $feed->id,
|
}
|
||||||
'quantity' => $quantity,
|
}
|
||||||
'delivered_at' => now(),
|
|
||||||
]);
|
try {
|
||||||
|
DB::transaction(function () use ($schedule) {
|
||||||
|
foreach ($schedule->feeds as $feed) {
|
||||||
|
FeedDelivery::create([
|
||||||
|
'feed_id' => $feed->id,
|
||||||
|
'quantity' => $feed->pivot->quantity,
|
||||||
|
'delivered_at' => now(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->error('Gagal memproses jadwal pakan: '.$e->getMessage());
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,11 +2,14 @@
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Observers\FeedDeliveryObserver;
|
||||||
|
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
#[ObservedBy([FeedDeliveryObserver::class])]
|
||||||
class FeedDelivery extends Model
|
class FeedDelivery extends Model
|
||||||
{
|
{
|
||||||
use HasFactory, SoftDeletes;
|
use HasFactory, SoftDeletes;
|
||||||
|
|||||||
57
app/Observers/FeedDeliveryObserver.php
Normal file
57
app/Observers/FeedDeliveryObserver.php
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Observers;
|
||||||
|
|
||||||
|
use App\Models\FeedDelivery;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class FeedDeliveryObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle the FeedDelivery "created" event.
|
||||||
|
*/
|
||||||
|
public function created(FeedDelivery $feedDelivery): void
|
||||||
|
{
|
||||||
|
$feedDelivery->feed()->decrement('stock', $feedDelivery->quantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the FeedDelivery "updating" event.
|
||||||
|
*/
|
||||||
|
public function updating(FeedDelivery $feedDelivery): void
|
||||||
|
{
|
||||||
|
if ($feedDelivery->isDirty('quantity')) {
|
||||||
|
$oldQuantity = $feedDelivery->getOriginal('quantity');
|
||||||
|
$newQuantity = $feedDelivery->quantity;
|
||||||
|
|
||||||
|
$diff = $newQuantity - $oldQuantity;
|
||||||
|
|
||||||
|
$feedDelivery->feed()->decrement('stock', $diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($feedDelivery->isDirty('feed_id')) {
|
||||||
|
$oldFeedId = $feedDelivery->getOriginal('feed_id');
|
||||||
|
$newFeedId = $feedDelivery->feed_id;
|
||||||
|
|
||||||
|
DB::table('feeds')->where('id', $oldFeedId)->increment('stock', $feedDelivery->getOriginal('quantity'));
|
||||||
|
|
||||||
|
DB::table('feeds')->where('id', $newFeedId)->decrement('stock', $feedDelivery->quantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the FeedDelivery "deleted" event.
|
||||||
|
*/
|
||||||
|
public function deleted(FeedDelivery $feedDelivery): void
|
||||||
|
{
|
||||||
|
$feedDelivery->feed()->increment('stock', $feedDelivery->quantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the FeedDelivery "restored" event.
|
||||||
|
*/
|
||||||
|
public function restored(FeedDelivery $feedDelivery): void
|
||||||
|
{
|
||||||
|
$feedDelivery->feed()->decrement('stock', $feedDelivery->quantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user