diff --git a/backend/app/Http/Controllers/ProveedoresController.php b/backend/app/Http/Controllers/ProveedoresController.php new file mode 100644 index 0000000..515aaf4 --- /dev/null +++ b/backend/app/Http/Controllers/ProveedoresController.php @@ -0,0 +1,142 @@ +validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $proveedores = $restaurante->proveedores(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $proveedores->count(), + route: 'restaurant.all', + data: ['restaurante_id' => $restaurante_id] + ); + + $data = $proveedores->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene un proveedor 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); + $proveedor = Proveedor::findOrFail($id); + + if($proveedor->restaurante != $restaurante) { + throw new ModelNotFoundException("proveedor", $id); + } + + return response()->json($proveedor); + } + + /** + * Crea un nuevo proveedor + */ + public function create(Request $request, $restaurante_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $this->validate($request, [ + 'rut' => 'required', + 'nombre' => 'required', + 'descripcion' => 'required', + 'direccion' => 'sometimes|required', + 'telefono' => 'sometimes|required' + ]); + + $proveedor = Proveedor::create([ + 'id' => Uuid::uuid4(), + 'rut' => $request->input('rut'), + 'nombre' => $request->input('nombre'), + 'descripcion' => $request->input('descripcion'), + 'direccion' => $request->input('direccion', ''), + 'telefono' => $request->input('telefono', ''), + 'restaurante_id' => $restaurante->id + ]); + + return response()->json($proveedor, 201); + } + + /** + * Actualiza un proveedor + */ + public function update(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $this->validate($request, [ + 'rut' => 'required', + 'nombre' => 'required', + 'descripcion' => 'required', + 'direccion' => 'sometimes|required', + 'telefono' => 'sometimes|required' + ]); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $proveedor = Proveedor::findOrFail($id); + + if($proveedor->restaurante != $restaurante) { + throw new ModelNotFoundException("proveedor", $id); + } + + $proveedor->rut = $request->input('rut'); + $proveedor->nombre = $request->input('nombre'); + $proveedor->descripcion = $request->input('descripcion'); + $proveedor->direccion = $request->input('direccion'); + $proveedor->telefono = $request->input('telefono'); + + $proveedor->save(); + + return response()->json($proveedor); + } + + /** + * Elimina un proveedor + */ + public function delete(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $proveedor = Proveedor::findOrFail($id); + + if($proveedor->restaurante != $restaurante) { + throw new ModelNotFoundException("proveedor", $id); + } + + $proveedor->delete(); + + return response()->json([], 204); + } +} diff --git a/backend/app/Models/Proveedor.php b/backend/app/Models/Proveedor.php index 341e84d..e1c412c 100644 --- a/backend/app/Models/Proveedor.php +++ b/backend/app/Models/Proveedor.php @@ -10,6 +10,16 @@ class Proveedor extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'proveedores'; + protected $fillable = [ + 'id', 'rut', 'nombre', 'descripcion', + 'direccion', 'telefono', 'restaurante_id' + ]; + + public static function findOrFail($id) { + $proveedor = Proveedor::find($id); + if(!$proveedor) throw new ModelNotFoundException("proveedor", $id); + return $proveedor; + } public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index adc1c62..5626855 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -6,6 +6,7 @@ use App\Models\CanalVenta; use App\Models\Sector; use App\Models\ZonaProduccion; use App\Models\Categoria; +use App\Models\Proveedor; use App\Traits\UuidPrimaryKey; use App\Exceptions\ModelNotFoundException; use Illuminate\Database\Eloquent\Model; @@ -45,4 +46,8 @@ class Restaurante extends Model { public function categorias() { return $this->hasMany(Categoria::class, 'restaurante_id'); } + + public function proveedores() { + return $this->hasMany(Proveedor::class, 'restaurante_id'); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index a7ed8da..6e66e4e 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -47,5 +47,11 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->post( '/{restaurante_id}/categorias', ['as' => 'categorias.create', 'uses' => 'CategoriasController@create']); $router->put( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.update', 'uses' => 'CategoriasController@update']); $router->delete('/{restaurante_id}/categorias/{id}', ['as' => 'categorias.delete', 'uses' => 'CategoriasController@delete']); + + $router->get( '/{restaurante_id}/proveedores', ['as' => 'proveedores.all', 'uses' => 'ProveedoresController@all']); + $router->get( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.get', 'uses' => 'ProveedoresController@get']); + $router->post( '/{restaurante_id}/proveedores', ['as' => 'proveedores.create', 'uses' => 'ProveedoresController@create']); + $router->put( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.update', 'uses' => 'ProveedoresController@update']); + $router->delete('/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.delete', 'uses' => 'ProveedoresController@delete']); }); });