pedi2/app/Http/Controllers/Api/SubpedidoController.php

159 lines
5.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Producto;
use App\TipoPedido;
use Illuminate\Http\Request;
use App\Filtros\FiltroDeSubpedido;
use App\Subpedido;
use App\GrupoDeCompra;
use App\Http\Resources\SubpedidoResource;
use Illuminate\Validation\Rule;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SubpedidoController extends Controller
{
public function index(FiltroDeSubpedido $filtros, Request $request)
{
return Subpedido::filtrar($filtros)->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);
}
}