select('id','nombre')->get(); } public function indexResources(FiltroDeSubpedido $filtros, Request $request) { return SubpedidoResource::collection(Subpedido::filtrar($filtros)->get()); } public function store(Request $request) { $validado = $this->validateSubpedido(); if (Subpedido::where([ "nombre" => $validado["nombre"], "tipo_pedido_id" => $validado["tipo_id"], "grupo_de_compra_id" => $validado["grupo_de_compra_id"]]) ->get() ->count()) throw new HttpException(400, "Ya existe un pedido con este nombre"); $pedido = new Subpedido(); $pedido->nombre = $validado["nombre"]; $pedido->grupo_de_compra_id = $validado["grupo_de_compra_id"]; $pedido->tipo_pedido_id = $validado["tipo_id"]; $pedido->save(); return $this->show($pedido); } protected function validateSubpedido(): array { return request()->validate([ 'nombre' => 'required|max:255', 'grupo_de_compra_id' => [ 'required', Rule::in(GrupoDeCompra::all()->pluck('id')), ], 'tipo_id' => [ 'required', Rule::in(TipoPedido::all()->pluck('id')), ], ]); } public function show(Subpedido $subpedido) { return new SubpedidoResource($subpedido); } // recibe request, saca producto y cantidad, valida, y pasa a syncProducto en Subpedido public function syncProductos(Subpedido $subpedido) { $faltantesYSobrantes = TipoPedido::firstOrCreate(['nombre' => 'faltantes_y_sobrantes']); if ($subpedido->tipo_pedido_id == $faltantesYSobrantes->id) { return $this->syncFaltantesYSobrantes($subpedido); } return $this->syncPedidoNormal($subpedido); } public function toggleAprobacion(Subpedido $subpedido) { $valid = request()->validate([ 'aprobacion' => 'required | boolean' ]); $subpedido->toggleAprobacion($valid['aprobacion']); return response()->noContent(); } public function syncDevoluciones(Subpedido $subpedido) { if ($subpedido->aprobado) abort(400, "No se puede modificar un pedido aprobado."); $valid = request()->validate([ 'total' => 'required|min:0', 'notas' => 'min:0' ]); $subpedido->syncDevoluciones($valid['total'], $valid['notas'] ?? ""); return new SubpedidoResource($subpedido); } /** * @param Subpedido $subpedido * @return SubpedidoResource */ public function syncPedidoNormal(Subpedido $subpedido): SubpedidoResource { if ($subpedido->aprobado) abort(400, "No se puede modificar un pedido aprobado."); $valid = request()->validate([ 'cantidad' => ['integer', 'required', 'min:0'], 'notas' => 'nullable', 'producto_id' => [ 'required', Rule::in(Producto::all()->pluck('id')), ] ]); $producto = Producto::find($valid['producto_id']); $notas = $valid['notas']; $cantidad = $valid['cantidad']; $subpedido->syncProducto($producto, $cantidad, $notas ?? ""); return new SubpedidoResource($subpedido); } /** * @param Subpedido $subpedido * @return SubpedidoResource */ public function syncFaltantesYSobrantes(Subpedido $subpedido): SubpedidoResource { $valid = request()->validate([ 'cantidad' => ['integer', 'required'], 'producto_id' => [ 'required', Rule::in(Producto::all()->pluck('id')), ] ]); $producto = Producto::find($valid['producto_id']); if ($producto->bono) abort(400, "No te puede haber faltado un bono"); $cantidad = $valid['cantidad']; if ($cantidad < 0) { // caso faltantes $barrio = GrupoDeCompra::find($subpedido->grupo_de_compra_id); $productosPedidos = $barrio->productosPedidos(true); $productoPedido = $productosPedidos->where('producto_id', $producto->id)->first(); if (!$productoPedido) abort(400, "No te puede faltar algo que no pediste."); $cantidadPedida = intval($productoPedido->cantidad_pedida); if ($cantidadPedida + $cantidad < 0) abort(400, 'No te puede faltar más de lo que pediste'); } $subpedido->syncProducto($producto, $cantidad); return new SubpedidoResource($subpedido); } }