feat: enhance raw material stock filtering in index view, adding tests for low stock and out of stock scenarios

This commit is contained in:
Yoga Pangestu 2026-07-10 11:15:26 +07:00
parent fe5dfd382f
commit fa4f6d4737
2 changed files with 43 additions and 5 deletions

View File

@ -53,17 +53,17 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $st
}) })
->when($stockStatus === 'low_stock', function (Builder $query): void { ->when($stockStatus === 'low_stock', function (Builder $query): void {
$minStock = [ $minStock = [
RawMaterialUnit::YARD => 20, RawMaterialUnit::YARD->value => 20,
RawMaterialUnit::METER => 10, RawMaterialUnit::METER->value => 10,
RawMaterialUnit::KILOGRAM => 5, RawMaterialUnit::KILOGRAM->value => 5,
]; ];
$query->whereHas('prices', function (Builder $priceQuery) use ($minStock): void { $query->whereHas('prices', function (Builder $priceQuery) use ($minStock): void {
$priceQuery->where('stock', '>', 0)->where(function (Builder $priceQuery) use ($minStock): void { $priceQuery->where('stock', '>', 0)->where(function (Builder $priceQuery) use ($minStock): void {
foreach (RawMaterialUnit::cases() as $unit) { foreach (RawMaterialUnit::cases() as $unit) {
$priceQuery->orWhere(function (Builder $priceQuery) use ($unit, $minStock): void { $priceQuery->orWhere(function (Builder $priceQuery) use ($unit, $minStock): void {
$priceQuery->whereHas('rawMaterial', fn (Builder $rawMaterialQuery) => $rawMaterialQuery->where('unit', $unit)) $priceQuery->whereHas('rawMaterial', fn (Builder $rawMaterialQuery) => $rawMaterialQuery->where('unit', $unit->value))
->where('stock', '<', $minStock[$unit]); ->where('stock', '<', $minStock[$unit->value]);
}); });
} }
}); });

View File

@ -141,6 +141,44 @@ function createRawMaterialVerifierUser(): User
->get(route('admin.master.raw_materials.index', ['is_active' => '1'])) ->get(route('admin.master.raw_materials.index', ['is_active' => '1']))
->assertOk(); ->assertOk();
}); });
test('index can filter by stock status (out of stock)', function () {
$user = createRawMaterialUserWithPermission(PermissionEnum::RAW_MATERIALS_VIEW);
$inStock = RawMaterial::factory()->create();
RawMaterialPrice::factory()->create(['raw_material_id' => $inStock->id, 'stock' => 10]);
$outOfStock = RawMaterial::factory()->create();
RawMaterialPrice::factory()->create(['raw_material_id' => $outOfStock->id, 'stock' => 0]);
$response = $this->actingAs($user)
->get(route('admin.master.raw_materials.index', ['stock_status' => 'out_of_stock']));
$response->assertOk();
$response->assertInertia(fn ($page) => $page
->has('rawMaterials.data', 1)
->where('rawMaterials.data.0.id', $outOfStock->id)
);
});
test('index can filter by stock status (low stock)', function () {
$user = createRawMaterialUserWithPermission(PermissionEnum::RAW_MATERIALS_VIEW);
$yardNormal = RawMaterial::factory()->create(['unit' => RawMaterialUnit::YARD->value]);
RawMaterialPrice::factory()->create(['raw_material_id' => $yardNormal->id, 'stock' => 25]);
$yardLow = RawMaterial::factory()->create(['unit' => RawMaterialUnit::YARD->value]);
RawMaterialPrice::factory()->create(['raw_material_id' => $yardLow->id, 'stock' => 15]);
$response = $this->actingAs($user)
->get(route('admin.master.raw_materials.index', ['stock_status' => 'low_stock']));
$response->assertOk();
$response->assertInertia(fn ($page) => $page
->has('rawMaterials.data', 1)
->where('rawMaterials.data.0.id', $yardLow->id)
);
});
}); });
// ─── Create ─────────────────────────────────────────────── // ─── Create ───────────────────────────────────────────────