* @version 1.0.0 */ class InventorySerialController extends Controller { /** * Listar seriales de un producto */ public function index(CatalogItem $catalogItem, Request $request) { $query = $catalogItem->serials(); if ($request->has('status')) { $query->where('status', $request->status); } if ($request->has('q')) { $query->where('serial_number', 'like', "%{$request->q}%"); } $serials = $query->orderBy('serial_number', 'ASC')->with('saleDetail.sale') ->paginate(config('app.pagination')); return ApiResponse::OK->response([ 'serials' => $serials, 'catalogItem' => $catalogItem->load('category'), ]); } /** * Mostrar un serial específico */ public function show(CatalogItem $catalogItem, InventorySerial $serial) { // Verificar que el serial pertenece al inventario if ($serial->catalog_item_id !== $catalogItem->id) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Serial no encontrado para este inventario' ]); } return ApiResponse::OK->response([ 'serial' => $serial->load('saleDetail'), 'catalogItem' => $catalogItem->load('category'), ]); } /** * Crear un nuevo serial */ public function store(CatalogItem $catalogItem, Request $request) { $request->validate([ 'serial_number' => ['required', 'string', 'unique:inventory_serials,serial_number'], 'notes' => ['nullable', 'string'], ]); $serial = InventorySerial::create([ 'catalog_item_id' => $catalogItem->id, 'serial_number' => $request->serial_number, 'status' => 'disponible', 'notes' => $request->notes, ]); // Sincronizar stock $catalogItem->syncStock(); return ApiResponse::CREATED->response([ 'serial' => $serial, 'catalogItem' => $catalogItem->fresh(), ]); } /** * Actualizar un serial */ public function update(CatalogItem $catalogItem , InventorySerial $serial, Request $request) { // Verificar que el serial pertenece al inventario if ($serial->catalog_item_id !== $catalogItem->id) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Serial no encontrado para este inventario' ]); } $request->validate([ 'serial_number' => ['sometimes', 'string', 'unique:inventory_serials,serial_number,' . $serial->id], 'status' => ['sometimes', 'in:disponible,vendido'], 'notes' => ['nullable', 'string'], ]); $serial->update($request->only(['serial_number', 'status', 'notes'])); // Sincronizar stock del inventario $catalogItem->syncStock(); return ApiResponse::OK->response([ 'serial' => $serial->fresh(), 'catalogItem' => $catalogItem->fresh(), ]); } /** * Eliminar un serial */ public function destroy(CatalogItem $catalogItem, InventorySerial $serial) { // Verificar que el serial pertenece al inventario if ($serial->catalog_item_id !== $catalogItem->id) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Serial no encontrado para este inventario' ]); } $serial->delete(); // Sincronizar stock $catalogItem->syncStock(); return ApiResponse::OK->response([ 'message' => 'Serial eliminado exitosamente', 'catalogItem' => $catalogItem->fresh(), ]); } }