From c16cfac861d3734a9bb2a46b2523cca131a20870 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 16 Jul 2026 11:06:24 +0700 Subject: [PATCH] feat: enhance stock filtering in paginateForIndex method to improve inventory management --- app/Services/Master/RawMaterialService.php | 42 ++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/app/Services/Master/RawMaterialService.php b/app/Services/Master/RawMaterialService.php index e8bc5bc..1726df1 100644 --- a/app/Services/Master/RawMaterialService.php +++ b/app/Services/Master/RawMaterialService.php @@ -37,6 +37,24 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $st ->with('media') ->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void { $query->where('variant', 'like', "%{$tableQuery['search']}%"); + }) + ->when($stockStatus === 'out_of_stock', fn ($q) => $q->where('stock', '<=', 0)) + ->when($stockStatus === 'low_stock', function ($q): void { + $q->where('stock', '>', 0) + ->where(function ($q): void { + $q->orWhere(function ($q): void { + $q->whereHas('rawMaterial', fn ($q) => $q->where('unit', RawMaterialUnit::YARD->value)) + ->where('stock', '<', 20); + }) + ->orWhere(function ($q): void { + $q->whereHas('rawMaterial', fn ($q) => $q->where('unit', RawMaterialUnit::METER->value)) + ->where('stock', '<', 10); + }) + ->orWhere(function ($q): void { + $q->whereHas('rawMaterial', fn ($q) => $q->where('unit', RawMaterialUnit::KILOGRAM->value)) + ->where('stock', '<', 5); + }); + }); }), ]) ->when(($tableQuery['search_id'] ?? '') !== '', function (Builder $query) use ($tableQuery): void { @@ -52,21 +70,15 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $st $query->whereHas('prices', fn (Builder $priceQuery) => $priceQuery->where('stock', '<=', 0)); }) ->when($stockStatus === 'low_stock', function (Builder $query): void { - $minStock = [ - RawMaterialUnit::YARD->value => 20, - RawMaterialUnit::METER->value => 10, - RawMaterialUnit::KILOGRAM->value => 5, - ]; - - $query->whereHas('prices', function (Builder $priceQuery) use ($minStock): void { - $priceQuery->where('stock', '>', 0)->where(function (Builder $priceQuery) use ($minStock): void { - foreach (RawMaterialUnit::cases() as $unit) { - $priceQuery->orWhere(function (Builder $priceQuery) use ($unit, $minStock): void { - $priceQuery->whereHas('rawMaterial', fn (Builder $rawMaterialQuery) => $rawMaterialQuery->where('unit', $unit->value)) - ->where('stock', '<', $minStock[$unit->value]); - }); - } - }); + $query->where(function (Builder $query): void { + $query->where('unit', RawMaterialUnit::YARD->value) + ->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 20)); + })->orWhere(function (Builder $query): void { + $query->where('unit', RawMaterialUnit::METER->value) + ->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 10)); + })->orWhere(function (Builder $query): void { + $query->where('unit', RawMaterialUnit::KILOGRAM->value) + ->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 5)); }); });