* @version 1.0.0 */ class InventorySerialController extends Controller { /** * Listar seriales de un producto */ public function index(Inventory $inventario, Request $request) { $query = $inventario->serials(); if ($request->has('status')) { $query->where('status', $request->status); } if ($request->has('warehouse_id')) { $query->where('warehouse_id', $request->warehouse_id); } if ($request->has('q')) { $query->where('serial_number', 'like', "%{$request->q}%"); } $serials = $query->orderBy('serial_number', 'ASC')->with(['saleDetail.sale', 'warehouse']) ->paginate(config('app.pagination')); return ApiResponse::OK->response([ 'serials' => $serials, 'inventory' => $inventario->load('category'), ]); } public function search(Request $request) { $serialNumber = $request->input('serial_number'); $serial = InventorySerial::with(['inventory.price', 'inventory.category']) ->where('serial_number', $serialNumber) ->where('status', 'disponible') ->first(); return response()->json([ 'status' => 'success', 'data' => ['serial' => $serial] ]); } /** * Mostrar un serial específico */ public function show(Inventory $inventario, InventorySerial $serial) { // Verificar que el serial pertenece al inventario if ($serial->inventory_id !== $inventario->id) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Serial no encontrado para este inventario' ]); } return ApiResponse::OK->response([ 'serial' => $serial->load('saleDetail'), 'inventory' => $inventario->load('category'), ]); } /** * Eliminar un serial */ public function destroy(Inventory $inventario, InventorySerial $serial) { // Verificar que el serial pertenece al inventario if ($serial->inventory_id !== $inventario->id) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Serial no encontrado para este inventario' ]); } $serial->delete(); // Sincronizar stock $inventario->syncStock(); return ApiResponse::OK->response([ 'message' => 'Serial eliminado exitosamente', 'inventory' => $inventario->fresh(), ]); } }