diff --git a/app/Http/Controllers/Material/MaterialController.php b/app/Http/Controllers/Material/MaterialController.php index 930b40c..2ccc30a 100644 --- a/app/Http/Controllers/Material/MaterialController.php +++ b/app/Http/Controllers/Material/MaterialController.php @@ -8,6 +8,7 @@ use App\Http\Requests\Material\TransferMaterialRequest; use App\Http\Requests\Material\ReturnMaterialRequest; use App\Http\Resources\Material\MaterialResource; use App\Services\Material\MaterialService; +use Illuminate\Http\Request; class MaterialController extends ApiController { @@ -18,6 +19,27 @@ class MaterialController extends ApiController $this->service = $service; } + public function index(Request $request) + { + $filters = $request->only([ + 'search', + 'technician_id', + 'warehouse_id', + 'type', + 'page', + 'per_page', + 'sort_by', + 'sort_order', + ]); + + $data = $this->service->list($filters); + + return $this->success( + MaterialResource::collection($data), + 'List material user berhasil diambil' + ); + } + public function assign(AssignMaterialRequest $request) { $result = $this->service->assign($request->validated()); diff --git a/app/Services/Material/MaterialService.php b/app/Services/Material/MaterialService.php index a50db17..4fc2725 100644 --- a/app/Services/Material/MaterialService.php +++ b/app/Services/Material/MaterialService.php @@ -10,6 +10,60 @@ use DB; class MaterialService { + public function list(array $filters = []) + { + $serialized = TechnicianMaterial::query() + ->select([ + 'id', + 'user_id', + 'barcode_id', + 'inventory_item_id', + 'material_name', + 'serial_number', + 'status', + 'assigned_at', + 'assigned_by', + 'created_at', + 'updated_at', + DB::raw('NULL as unit'), + DB::raw('NULL as qty_received'), + DB::raw('NULL as qty_used'), + DB::raw('NULL as qty_remaining'), + DB::raw("'serialized' as type"), + ]); + + $consumable = TechnicianConsumable::query() + ->select([ + 'id', + 'user_id', + 'barcode_id', + 'inventory_item_id', + 'material_name', + DB::raw('NULL as serial_number'), + 'status', + 'assigned_at', + 'assigned_by', + 'created_at', + 'updated_at', + 'unit', + 'qty_received', + 'qty_used', + 'qty_remaining', + DB::raw("'consumable' as type"), + ]); + + if (!empty($filters['user_id'])) { + $serialized->where('user_id', $filters['user_id']); + $consumable->where('user_id', $filters['user_id']); + } + + $query = $serialized->unionAll($consumable); + + return DB::query() + ->fromSub($query, 'materials') + ->orderByDesc('created_at') + ->paginate($filters['per_page'] ?? 15); + } /* |-------------------------------------------------------------------------- | ASSIGN MATERIAL (AUTO DETECT TYPE) diff --git a/routes/api.php b/routes/api.php index f9c3235..ce0b445 100644 --- a/routes/api.php +++ b/routes/api.php @@ -60,15 +60,14 @@ Route::middleware('auth:sanctum')->group(function () { Route::post('/escalate', 'escalate'); }); - Route::prefix('materials')->group(function () { - - Route::post('/assign', [MaterialController::class, 'assign']); - Route::post('/transfer', [MaterialController::class, 'transfer']); - Route::post('/return', [MaterialController::class, 'return']); - - Route::get('/user/{user_id}', [MaterialController::class, 'listByUser']); - Route::get('/history/{barcode_id}', [MaterialController::class, 'history']); + Route::controller(MaterialController::class)->group(function () { + Route::get('/', 'index'); + Route::post('/assign', 'assign'); + Route::post('/transfer', 'transfer'); + Route::post('/return', 'return'); + Route::get('/user/{user_id}', 'listByUser'); + Route::get('/history/{barcode_id}', 'history'); }); Route::prefix('audit-logs')