From d64dacee8d8e033f7391dae7cc36fd3379df68e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Mon, 12 Jul 2021 11:05:50 -0400 Subject: [PATCH] Validaciones y Zonas de produccion --- .../CantDeleteHasChildException.php | 23 ++++ backend/app/Exceptions/GenericException.php | 4 +- .../Controllers/RestaurantesController.php | 8 ++ .../Http/Controllers/SectoresController.php | 5 + .../Controllers/ZonasProduccionController.php | 125 ++++++++++++++++++ backend/app/Models/Restaurante.php | 5 + backend/app/Models/Sector.php | 4 + backend/app/Models/ZonaProduccion.php | 8 ++ backend/routes/web.php | 6 + 9 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 backend/app/Exceptions/CantDeleteHasChildException.php create mode 100644 backend/app/Http/Controllers/ZonasProduccionController.php diff --git a/backend/app/Exceptions/CantDeleteHasChildException.php b/backend/app/Exceptions/CantDeleteHasChildException.php new file mode 100644 index 0000000..7b44d07 --- /dev/null +++ b/backend/app/Exceptions/CantDeleteHasChildException.php @@ -0,0 +1,23 @@ +parent = $parent; + $this->child = $child; + } + + public function render($request) { + return response()->json([ + 'error' => 'cant_delete', + 'message' => $this->parent . ' tiene ' . $this->child . ' asociados' + ], 400); + } +} diff --git a/backend/app/Exceptions/GenericException.php b/backend/app/Exceptions/GenericException.php index 22c3832..ad65e68 100644 --- a/backend/app/Exceptions/GenericException.php +++ b/backend/app/Exceptions/GenericException.php @@ -18,8 +18,8 @@ class GenericException extends Exception { public function render($request) { return response()->json([ - 'error' => $this->error + 'error' => $this->error, 'message' => $this->message - ], $status); + ], $this->status); } } diff --git a/backend/app/Http/Controllers/RestaurantesController.php b/backend/app/Http/Controllers/RestaurantesController.php index c78ee92..a7e279d 100644 --- a/backend/app/Http/Controllers/RestaurantesController.php +++ b/backend/app/Http/Controllers/RestaurantesController.php @@ -6,6 +6,7 @@ use App\Models\Restaurante; use App\Services\PaginatorService; use App\Services\UuidService; use App\Exceptions\GenericException; +use App\Exceptions\CantDeleteHasChildException; use App\Exceptions\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -92,6 +93,13 @@ class RestaurantesController extends Controller { app(UuidService::class)->validOrFail($id); $restaurant = Restaurante::findOrFail($id); + + if($restaurant->usuarios()->count() > 0) throw new CantDeleteHasChildException("restaurant", "usuario"); + if($restaurant->canalesVenta()->count() > 0) throw new CantDeleteHasChildException("restaurant", "canal_venta"); + if($restaurant->sectores()->count() > 0) throw new CantDeleteHasChildException("restaurant", "sector"); + if($restaurant->zonasProduccion()->count() > 0) throw new CantDeleteHasChildException("restaurant", "zona_produccion"); + + $restaurant->delete(); return response()->json([], 204); } diff --git a/backend/app/Http/Controllers/SectoresController.php b/backend/app/Http/Controllers/SectoresController.php index a1ea34f..e067e9e 100644 --- a/backend/app/Http/Controllers/SectoresController.php +++ b/backend/app/Http/Controllers/SectoresController.php @@ -7,6 +7,7 @@ use App\Models\Sector; use App\Services\PaginatorService; use App\Services\UuidService; use App\Exceptions\GenericException; +use App\Exceptions\CantdeletehasChild; use App\Exceptions\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -118,6 +119,10 @@ class SectoresController extends Controller { throw new ModelNotFoundException("sector", $id); } + if($sector->canalesVenta()->count() > 0) { + throw new CantDeleteHasChildException("sector", "canal_venta"); + } + $sector->delete(); return response()->json([], 204); diff --git a/backend/app/Http/Controllers/ZonasProduccionController.php b/backend/app/Http/Controllers/ZonasProduccionController.php new file mode 100644 index 0000000..8311d23 --- /dev/null +++ b/backend/app/Http/Controllers/ZonasProduccionController.php @@ -0,0 +1,125 @@ +validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $zonasProduccion = $restaurante->zonasProduccion(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $zonasProduccion->count(), + route: 'restaurant.all', + data: ['restaurante_id' => $restaurante_id] + ); + + $data = $zonasProduccion->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene una zonas de produccion por su id + */ + public function get(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $zonaProduccion = ZonaProduccion::findOrFail($id); + + if($zonaProduccion->restaurante != $restaurante) { + throw new ModelNotFoundException("zona_produccion", $id); + } + + return response()->json($zonaProduccion); + } + + /** + * Crea una nueva zona de produccion + */ + public function create(Request $request, $restaurante_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $this->validate($request, [ + 'nombre' => 'required' + ]); + + $zonaProduccion = ZonaProduccion::create([ + 'id' => Uuid::uuid4(), + 'nombre' => $request->input('nombre'), + 'restaurante_id' => $restaurante->id + ]); + + return response()->json($zonaProduccion, 201); + } + + /** + * Actualiza un zona de produccion + */ + public function update(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $this->validate($request, [ + 'nombre' => 'required' + ]); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $zonaProduccion = ZonaProduccion::findOrFail($id); + + if($zonaProduccion->restaurante != $restaurante) { + throw new ModelNotFoundException("sector", $id); + } + + $zonaProduccion->nombre = $request->input('nombre'); + $zonaProduccion->save(); + + return response()->json($zonaProduccion); + } + + /** + * Elimina un sector + */ + public function delete(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $zonaProduccion = ZonaProduccion::findOrFail($id); + + if($zonaProduccion->restaurante != $restaurante) { + throw new ModelNotFoundException("zona_produccion", $id); + } + + $zonaProduccion->delete(); + + return response()->json([], 204); + } +} diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index d81070d..43fa492 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Models\CanalVenta; use App\Models\Sector; +use App\Models\ZonaProduccion; use App\Traits\UuidPrimaryKey; use App\Exceptions\ModelNotFoundException; use Illuminate\Database\Eloquent\Model; @@ -35,4 +36,8 @@ class Restaurante extends Model { public function sectores() { return $this->hasMany(Sector::class, 'restaurante_id'); } + + public function zonasProduccion() { + return $this->hasMany(ZonaProduccion::class, 'restaurante_id'); + } } diff --git a/backend/app/Models/Sector.php b/backend/app/Models/Sector.php index d0c4b4e..b36d2ba 100644 --- a/backend/app/Models/Sector.php +++ b/backend/app/Models/Sector.php @@ -22,4 +22,8 @@ class Sector extends Model { public function restaurante() { return $this->belongsTo(Restaurante::class); } + + public function canalesVenta() { + return $this->hasMany(CanalVenta::class, 'sector_id'); + } } diff --git a/backend/app/Models/ZonaProduccion.php b/backend/app/Models/ZonaProduccion.php index 1ea6cfd..95bc971 100644 --- a/backend/app/Models/ZonaProduccion.php +++ b/backend/app/Models/ZonaProduccion.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Traits\UuidPrimaryKey; +use App\Exceptions\ModelNotFoundException; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -10,6 +11,13 @@ class ZonaProduccion extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'zonas_produccion'; + protected $fillable = ['id', 'nombre', 'restaurante_id']; + + public static function findOrFail($id) { + $zonaProduccion = ZonaProduccion::find($id); + if(!$zonaProduccion) throw new ModelNotFoundException("zona_produccion", $id); + return $zonaProduccion; + } public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/routes/web.php b/backend/routes/web.php index f84f7a9..7fc0311 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -22,6 +22,12 @@ function registerRestaurantApi($router) { $router->post( '/{restaurante_id}/sectores', ['as' => 'sectores.create', 'uses' => 'SectoresController@create']); $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update']); $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete']); + + $router->get( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.all', 'uses' => 'ZonasProduccionController@all']); + $router->get( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.get', 'uses' => 'ZonasProduccionController@get']); + $router->post( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.create', 'uses' => 'ZonasProduccionController@create']); + $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update']); + $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete']); }); }