feat: enhance stock filtering in paginateForIndex method to improve inventory management

This commit is contained in:
Yoga Pangestu 2026-07-16 11:06:24 +07:00
parent bb17bf6ad4
commit c16cfac861

View File

@ -37,6 +37,24 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $st
->with('media') ->with('media')
->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void { ->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void {
$query->where('variant', 'like', "%{$tableQuery['search']}%"); $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 { ->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)); $query->whereHas('prices', fn (Builder $priceQuery) => $priceQuery->where('stock', '<=', 0));
}) })
->when($stockStatus === 'low_stock', function (Builder $query): void { ->when($stockStatus === 'low_stock', function (Builder $query): void {
$minStock = [ $query->where(function (Builder $query): void {
RawMaterialUnit::YARD->value => 20, $query->where('unit', RawMaterialUnit::YARD->value)
RawMaterialUnit::METER->value => 10, ->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 20));
RawMaterialUnit::KILOGRAM->value => 5, })->orWhere(function (Builder $query): void {
]; $query->where('unit', RawMaterialUnit::METER->value)
->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 10));
$query->whereHas('prices', function (Builder $priceQuery) use ($minStock): void { })->orWhere(function (Builder $query): void {
$priceQuery->where('stock', '>', 0)->where(function (Builder $priceQuery) use ($minStock): void { $query->where('unit', RawMaterialUnit::KILOGRAM->value)
foreach (RawMaterialUnit::cases() as $unit) { ->whereHas('prices', fn (Builder $q) => $q->where('stock', '>', 0)->where('stock', '<', 5));
$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]);
});
}
});
}); });
}); });