* @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('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, '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'), ]); } /** * Crear un nuevo serial */ public function store(Inventory $inventario, Request $request) { $request->validate([ 'serial_number' => ['required', 'string', 'unique:inventory_serials,serial_number'], 'warehouse_id' => ['nullable', 'exists:warehouses,id'], 'notes' => ['nullable', 'string'], ]); $warehouseId = $request->warehouse_id ?? app(InventoryMovementService::class)->getMainWarehouseId(); $serial = InventorySerial::create([ 'inventory_id' => $inventario->id, 'warehouse_id' => $warehouseId, 'serial_number' => $request->serial_number, 'status' => 'disponible', 'notes' => $request->notes, ]); if(!$inventario->track_serials) { $inventario->update(['track_serials' => true]); } // Sincronizar stock $inventario->syncStock(); return ApiResponse::CREATED->response([ 'serial' => $serial, 'inventory' => $inventario->fresh(), ]); } /** * Actualizar un serial */ public function update(Inventory $inventario , InventorySerial $serial, Request $request) { // 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' ]); } $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 $inventario->syncStock(); return ApiResponse::OK->response([ 'serial' => $serial->fresh(), 'inventory' => $inventario->fresh(), ]); } /** * 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(), ]); } }