diff --git a/backend/app/Http/Controllers/BodegaController.php b/backend/app/Http/Controllers/BodegaController.php new file mode 100644 index 0000000..fe7a86f --- /dev/null +++ b/backend/app/Http/Controllers/BodegaController.php @@ -0,0 +1,126 @@ +validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $ingresos = $restaurante->bodegaIngresos()->with('ingrediente'); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $ingresos->count(), + route: 'bodega.ingresos', + data: ['restaurante_id' => $restaurante_id], + ); + + $data = $ingresos->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene de forma paginada los egresos de productos + */ + public function egresos(Request $request, $restaurante_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $egresos = $restaurante->bodegaEgresos(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $egresos->count(), + route: 'bodega.egresos', + data: ['restaurante_id' => $restaurante_id], + ); + + $data = $egresos->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene de forma paginada los movimientos de productos + */ + public function movimientos(Request $request, $restaurante_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $movimientos = $restaurante->bodegaMovimientos(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $movimientos->count(), + route: 'bodega.movimientos', + data: ['restaurante_id' => $restaurante_id], + ); + + $data = $movimientos->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene de forma paginada el estado actual de la bodega + */ + public function actual(Request $request, $restaurante_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $actual = $restaurante->bodegaActual(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $actual->count(), + route: 'bodega.actual', + data: ['restaurante_id' => $restaurante_id], + ); + + $data = $actual->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } +} diff --git a/backend/app/Models/BodegaActual.php b/backend/app/Models/BodegaActual.php new file mode 100644 index 0000000..9e4ec30 --- /dev/null +++ b/backend/app/Models/BodegaActual.php @@ -0,0 +1,20 @@ +belongsTo(Restaurante::class); + } + + public function ingrediente() { + return $this->belongsTo(Ingrediente::class); + } +} diff --git a/backend/app/Models/BodegaEgreso.php b/backend/app/Models/BodegaEgreso.php new file mode 100644 index 0000000..5d4d7d5 --- /dev/null +++ b/backend/app/Models/BodegaEgreso.php @@ -0,0 +1,20 @@ +belongsTo(Restaurante::class); + } + + public function ingrediente() { + return $this->belongsTo(Ingrediente::class); + } +} diff --git a/backend/app/Models/BodegaIngreso.php b/backend/app/Models/BodegaIngreso.php new file mode 100644 index 0000000..50f6f82 --- /dev/null +++ b/backend/app/Models/BodegaIngreso.php @@ -0,0 +1,20 @@ +belongsTo(Restaurante::class); + } + + public function ingrediente() { + return $this->belongsTo(Ingrediente::class); + } +} diff --git a/backend/app/Models/BodegaMovimiento.php b/backend/app/Models/BodegaMovimiento.php new file mode 100644 index 0000000..79d6d09 --- /dev/null +++ b/backend/app/Models/BodegaMovimiento.php @@ -0,0 +1,20 @@ +belongsTo(Restaurante::class); + } + + public function ingrediente() { + return $this->belongsTo(Ingrediente::class); + } +} diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index 9977660..5389b44 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -73,4 +73,20 @@ class Restaurante extends Model { public function cajas() { return $this->hasMany(Caja::class, 'restaurante_id'); } + + public function bodegaIngresos() { + return $this->hasMany(BodegaIngreso::class, 'restaurante_id'); + } + + public function bodegaEgresos() { + return $this->hasMany(BodegaEgreso::class, 'restaurante_id'); + } + + public function bodegaMovimientos() { + return $this->hasMany(BodegaMovimiento::class, 'restaurante_id'); + } + + public function bodegaActual() { + return $this->hasMany(BodegaActual::class, 'restaurante_id'); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index d1ab1f3..340b2c4 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -88,5 +88,10 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->post( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.create', 'uses' => 'FacturasController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->put( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.update', 'uses' => 'FacturasController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->delete('/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.delete', 'uses' => 'FacturasController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + + $router->get( '/{restaurante_id}/bodega/ingresos', ['as' => 'bodega.ingresos', 'uses' => 'BodegaController@ingresos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/egresos', ['as' => 'bodega.egresos', 'uses' => 'BodegaController@egresos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/movimientos', ['as' => 'bodega.movimientos', 'uses' => 'BodegaController@movimientos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/actual', ['as' => 'bodega.actual', 'uses' => 'BodegaController@actual', 'middleware' => ['in_restaurante']]); }); }); diff --git a/database/init/00-schema.sql b/database/init/00-schema.sql index a42c740..90b5563 100644 --- a/database/init/00-schema.sql +++ b/database/init/00-schema.sql @@ -334,8 +334,8 @@ create table bodega_egresos ( unidades numeric not null, fecha timestamptz not null, - ingrediente_id uuid references ingredientes, - restaurante_id uuid references restaurantes, + ingrediente_id uuid not null, + restaurante_id uuid not null, created_at timestamptz not null default current_timestamp, updated_at timestamptz not null default current_timestamp, deleted_at timestamptz @@ -345,8 +345,8 @@ create table bodega_ingresos ( unidades numeric not null, fecha timestamptz not null, - ingrediente_id uuid references ingredientes, - restaurante_id uuid references restaurantes, + ingrediente_id uuid not null, + restaurante_id uuid not null, created_at timestamptz not null default current_timestamp, updated_at timestamptz not null default current_timestamp, deleted_at timestamptz diff --git a/database/modifications/04-remove-references-from-bodega.sql b/database/modifications/04-remove-references-from-bodega.sql new file mode 100644 index 0000000..52c0f1f --- /dev/null +++ b/database/modifications/04-remove-references-from-bodega.sql @@ -0,0 +1,11 @@ +alter table bodega_egresos drop constraint bodega_egresos_ingrediente_id_fkey; +alter table bodega_egresos drop constraint bodega_egresos_restaurante_id_fkey; + +alter table bodega_ingresos drop constraint bodega_ingresos_ingrediente_id_fkey; +alter table bodega_ingresos drop constraint bodega_ingresos_restaurante_id_fkey; + +alter table bodega_ingresos alter column restaurante_id set not null; +alter table bodega_ingresos alter column ingrediente_id set not null; + +alter table bodega_egresos alter column restaurante_id set not null; +alter table bodega_egresos alter column ingrediente_id set not null; \ No newline at end of file