diff --git a/app/Console/Commands/ProcessFeedSchedule.php b/app/Console/Commands/ProcessFeedSchedule.php index 74e9956..ec5889b 100644 --- a/app/Console/Commands/ProcessFeedSchedule.php +++ b/app/Console/Commands/ProcessFeedSchedule.php @@ -5,6 +5,7 @@ use App\Models\FeedDelivery; use App\Models\FeedSchedule; use Illuminate\Console\Command; +use Illuminate\Support\Facades\DB; class ProcessFeedSchedule extends Command { @@ -21,7 +22,7 @@ public function handle(): int { $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()) { $this->info("No schedules found for time: {$time}"); @@ -31,15 +32,27 @@ public function handle(): int foreach ($schedules as $schedule) { foreach ($schedule->feeds as $feed) { - $quantity = $feed->pivot->quantity; - $decrement = min($quantity, $feed->stock); - $feed->decrement('stock', $decrement); + if ($feed->stock < $feed->pivot->quantity) { + $this->error("Stock pakan '{$feed->name}' tidak cukup untuk jadwal '{$schedule->scheduled_at->format('H:i')}'. Dibutuhkan: {$feed->pivot->quantity}, Tersedia: {$feed->stock}"); - FeedDelivery::create([ - 'feed_id' => $feed->id, - 'quantity' => $quantity, - 'delivered_at' => now(), - ]); + return 1; + } + } + + 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; } } diff --git a/app/Models/FeedDelivery.php b/app/Models/FeedDelivery.php index 6ba36c4..6b55c7e 100644 --- a/app/Models/FeedDelivery.php +++ b/app/Models/FeedDelivery.php @@ -2,11 +2,14 @@ namespace App\Models; +use App\Observers\FeedDeliveryObserver; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; +#[ObservedBy([FeedDeliveryObserver::class])] class FeedDelivery extends Model { use HasFactory, SoftDeletes; diff --git a/app/Observers/FeedDeliveryObserver.php b/app/Observers/FeedDeliveryObserver.php new file mode 100644 index 0000000..fb112e8 --- /dev/null +++ b/app/Observers/FeedDeliveryObserver.php @@ -0,0 +1,57 @@ +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); + } +}