From 0816f37611e99dc0b8801b0eb5e7cf70a56a69e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Wed, 14 Jul 2021 03:58:17 -0400 Subject: [PATCH 01/13] Mantenedor de compras! --- .../Http/Controllers/ComprasController.php | 245 ++++++++++++++++++ .../Http/Controllers/FacturasController.php | 131 ++++++++++ backend/app/Models/Compra.php | 11 +- backend/app/Models/CompraIngrediente.php | 1 + backend/app/Models/Factura.php | 7 + backend/app/Models/Restaurante.php | 11 +- backend/routes/web.php | 15 ++ database/init/00-schema.sql | 36 ++- .../modifications/03-simplify-facturas.sql | 8 + 9 files changed, 436 insertions(+), 29 deletions(-) create mode 100644 backend/app/Http/Controllers/ComprasController.php create mode 100644 backend/app/Http/Controllers/FacturasController.php create mode 100644 database/modifications/03-simplify-facturas.sql diff --git a/backend/app/Http/Controllers/ComprasController.php b/backend/app/Http/Controllers/ComprasController.php new file mode 100644 index 0000000..2aabf04 --- /dev/null +++ b/backend/app/Http/Controllers/ComprasController.php @@ -0,0 +1,245 @@ +validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $compras = $restaurante->compras(); + + $paginate = app(PaginatorService::class)->paginate( + perPage: $request->input('per_page', 15), + page: $request->input('page', 1), + total: $compras->count(), + route: 'compras.all', + data: ['restaurante_id' => $restaurante_id] + ); + + $data = $compras->get() + ->skip($paginate['from'] - 1) + ->take($paginate['per_page']) + ->all(); + + return response()->json([ + 'pagination' => $paginate, + 'data' => $data + ]); + } + + /** + * Obtiene una compra 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); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + return response()->json($compra); + } + + /** + * Crea una nueva compra + */ + public function create(Request $request, $restaurante_id) { + $this->validate($request, [ + 'fecha_compra' => 'required|date', + 'en_arqueo' => 'required|boolean', + 'proveedor_id' => 'required' + ]); + + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($request->input('proveedor_id')); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $proveedor = Proveedor::findOrFail($request->input('proveedor_id')); + + if($proveedor->restaurante != $restaurante) { + throw new ModelNotFoundException("proveedor", $request->input('proveedor_id')); + } + + $compra = Compra::create([ + 'id' => Uuid::uuid4(), + 'fecha_compra' => $request->input('fecha_compra'), + 'proveedor_id' => $proveedor->id, + 'en_arqueo' => $request->input('en_arqueo'), + 'restaurante_id' => $restaurante->id + ]); + + return response()->json($compra, 201); + } + + /** + * Actualiza una compra + */ + public function update(Request $request, $restaurante_id, $id) { + $this->validate($request, [ + 'fecha_compra' => 'required|date', + 'en_arqueo' => 'required|boolean', + 'proveedor_id' => 'required' + ]); + + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + app(UuidService::class)->validOrFail($request->input('proveedor_id')); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $proveedor = Proveedor::findOrFail($request->input('proveedor_id')); + $compra = Compra::findOrFail($id); + + if($proveedor->restaurante != $restaurante) { + throw new ModelNotFoundException("proveedor", $proveedor->id); + } + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $compra->id); + } + + $compra->fecha_compra= $request->input('fecha_compra'); + $compra->en_arqueo = $request->input('en_arqueo'); + $compra->proveedor_id = $proveedor->id; + $compra->save(); + + return response()->json($compra); + } + + /** + * Elimina una compra + */ + public function delete(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + $compra->ingredientes()->delete(); + $compra->facturas()->delete(); + + $compra->delete(); + + return response()->json([], 204); + } + + /** + * Obtiene los ingredientes de una compra + */ + public function getIngredientes(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + return response()->json($compra->ingredientes); + } + + /** + * Agrega un ingrediente a una compra + */ + public function addIngrediente(Request $request, $restaurante_id, $id, $ingrediente_id) { + $this->validate($request, [ + 'unidades' => 'required|numeric', + 'monto_unitario' => 'required|numeric' + ]); + + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + app(UuidService::class)->validOrFail($ingrediente_id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + $ingrediente = Ingrediente::findOrFail($ingrediente_id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $compra->id); + } + + if($ingrediente->restaurante != $restaurante) { + throw new ModelNotFoundException("ingrediente", $ingrediente->id); + } + + foreach($compra->ingredientes as $ci){ + if($ci->ingrediente->id == $ingrediente->id) { + throw new AlreadyExistsException("ingrediente"); + } + } + + $compraIngrediente = CompraIngrediente::create([ + 'id' => Uuid::uuid4(), + 'unidades' => $request->input('unidades'), + 'monto_unitario' => $request->input('monto_unitario'), + 'compra_id' => $compra->id, + 'ingrediente_id' => $ingrediente->id + ]); + + return response()->json($compraIngrediente, 201); + } + + /** + * Elimina un ingrediente de una compra + */ + public function deleteIngrediente(Request $request, $restaurante_id, $id, $ingrediente_id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + app(UuidService::class)->validOrFail($ingrediente_id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + $ingrediente = Ingrediente::findOrFail($ingrediente_id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $compra->id); + } + + if($ingrediente->restaurante != $restaurante) { + throw new ModelNotFoundException("ingrediente", $ingrediente->id); + } + + $toDelete = CompraIngrediente::where('compra_id', $compra->id)->where('ingrediente_id', $ingrediente->id); + + if($toDelete->count() == 0) { + throw new ModelNotFoundException("compra_ingrediente", null); + } + + $toDelete->delete(); + + return response()->json([], 204); + } +} diff --git a/backend/app/Http/Controllers/FacturasController.php b/backend/app/Http/Controllers/FacturasController.php new file mode 100644 index 0000000..b78936f --- /dev/null +++ b/backend/app/Http/Controllers/FacturasController.php @@ -0,0 +1,131 @@ +validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + if($compra->facturas()->count() == 0) { + throw new ModelNotFoundException("factura", null); + } + + return response()->json($compra->facturas()->first()); + } + + /** + * Crea una factura a una compra + */ + public function create(Request $request, $restaurante_id, $id) { + $this->validate($request, [ + 'numero' => 'required', + 'monto_bruto' => 'required|numeric', + ]); + + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + if($compra->facturas()->count() > 0) { + throw new AlreadyExistsException("factura"); + } + + $factura = Factura::create([ + 'id' => Uuid::uuid4(), + 'numero' => $request->input('numero'), + 'monto_bruto' => $request->input('monto_bruto'), + 'compra_id' => $compra->id + ]); + + return response()->json($factura, 201); + } + + /** + * Modifica la factura a una compra + */ + public function update(Request $request, $restaurante_id, $id) { + $this->validate($request, [ + 'numero' => 'required', + 'monto_bruto' => 'required|numeric', + ]); + + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + if($compra->facturas()->count() == 0) { + throw new ModelNotFoundException("factura", null); + } + + $factura = $compra->facturas()->first(); + $factura->numero = $request->input('numero'); + $factura->monto_bruto = $request->input('monto_bruto'); + $factura->save(); + + return response()->json($factura, 201); + } + + + /** + * Elimina la factura de una compra + */ + public function delete(Request $request, $restaurante_id, $id) { + app(UuidService::class)->validOrFail($restaurante_id); + app(UuidService::class)->validOrFail($id); + + $restaurante = Restaurante::findOrFail($restaurante_id); + $compra = Compra::findOrFail($id); + + if($compra->restaurante != $restaurante) { + throw new ModelNotFoundException("compra", $id); + } + + if($compra->facturas()->count() == 0) { + throw new ModelNotFoundException("factura", null); + } + + $factura = $compra->facturas()->first(); + $factura->delete(); + + return response()->json([], 204); + } +} diff --git a/backend/app/Models/Compra.php b/backend/app/Models/Compra.php index 575a4bf..4097bad 100644 --- a/backend/app/Models/Compra.php +++ b/backend/app/Models/Compra.php @@ -11,8 +11,17 @@ class Compra extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compras'; + protected $fillable = [ + 'id', 'fecha_compra', 'proveedor_id', 'en_arqueo', 'restaurante_id' + ]; - public function compraIngredientes() { + public static function findOrFail($id) { + $compra = Compra::find($id); + if(!$compra) throw new ModelNotFoundException("compra", $id); + return $compra; + } + + public function ingredientes() { return $this->hasMany(CompraIngrediente::class); } diff --git a/backend/app/Models/CompraIngrediente.php b/backend/app/Models/CompraIngrediente.php index ce2907f..e2135cc 100644 --- a/backend/app/Models/CompraIngrediente.php +++ b/backend/app/Models/CompraIngrediente.php @@ -11,6 +11,7 @@ class CompraIngrediente extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compra_ingredientes'; + protected $fillable = ['id', 'unidades', 'monto_unitario', 'compra_id', 'ingrediente_id']; public function ingrediente() { return $this->belongsTo(Ingrediente::class); diff --git a/backend/app/Models/Factura.php b/backend/app/Models/Factura.php index a4f7550..531b5d7 100644 --- a/backend/app/Models/Factura.php +++ b/backend/app/Models/Factura.php @@ -11,6 +11,13 @@ class Factura extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'facturas'; + protected $fillable = ['id', 'numero', 'monto_bruto', 'compra_id']; + + public static function findOrFail($id) { + $factura = Factura::find($id); + if(!$factura) throw new ModelNotFoundException("factura", $id); + return $factura; + } public function compra() { return $this->belongsTo(Compra::class); diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index d1ca84a..2e484ca 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -2,13 +2,6 @@ namespace App\Models; -use App\Models\CanalVenta; -use App\Models\Sector; -use App\Models\ZonaProduccion; -use App\Models\Categoria; -use App\Models\Proveedor; -use App\Models\Ingrediente; -use App\Models\Producto; use App\Traits\UuidPrimaryKey; use App\Exceptions\ModelNotFoundException; use Illuminate\Database\Eloquent\Model; @@ -60,4 +53,8 @@ class Restaurante extends Model { public function productos() { return $this->hasMany(Producto::class, 'restaurante_id'); } + + public function compras() { + return $this->hasMany(Compra::class, 'restaurante_id'); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index ce37526..ecbdf75 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -72,5 +72,20 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->post( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.add_ingrediente', 'uses' => 'RecetasController@create']); $router->put( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.update_ingrediente', 'uses' => 'RecetasController@update']); $router->delete('/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.remove_ingrediente', 'uses' => 'RecetasController@delete']); + + $router->get( '/{restaurante_id}/compras', ['as' => 'compras.all', 'uses' => 'ComprasController@all']); + $router->get( '/{restaurante_id}/compras/{id}', ['as' => 'compras.get', 'uses' => 'ComprasController@get']); + $router->post( '/{restaurante_id}/compras', ['as' => 'compras.create', 'uses' => 'ComprasController@create']); + $router->put( '/{restaurante_id}/compras/{id}', ['as' => 'compras.update', 'uses' => 'ComprasController@update']); + $router->delete('/{restaurante_id}/compras/{id}', ['as' => 'compras.delete', 'uses' => 'ComprasController@delete']); + + $router->get( '/{restaurante_id}/compras/{id}/ingredientes', ['as' => 'compras.ingredientes.get', 'uses' => 'ComprasController@getIngredientes']); + $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente']); + $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente']); + + $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get']); + $router->post( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.create', 'uses' => 'FacturasController@create']); + $router->put( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.update', 'uses' => 'FacturasController@update']); + $router->delete('/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.delete', 'uses' => 'FacturasController@delete']); }); }); diff --git a/database/init/00-schema.sql b/database/init/00-schema.sql index 4f419b6..a42c740 100644 --- a/database/init/00-schema.sql +++ b/database/init/00-schema.sql @@ -183,31 +183,25 @@ create table compras create table facturas ( - id uuid primary key default gen_random_uuid(), - numero text not null, - monto_bruto bigint not null, - iva bigint not null default 0, - ila bigint not null default 0, - monto_neto bigint not null, - fecha_emision date not null, - fecha_vencimiento date not null, - compra_id uuid references compras, - created_at timestamptz not null default current_timestamp, - updated_at timestamptz not null default current_timestamp, - deleted_at timestamptz + id uuid primary key default gen_random_uuid(), + numero text not null, + monto_bruto bigint not null, + compra_id uuid references compras, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz ); create table compra_ingredientes ( - id uuid primary key default gen_random_uuid(), - unidades numeric not null, - monto_unitario_bruto bigint not null, - monto_unitario_neto bigint not null, - compra_id uuid references compras, - ingrediente_id uuid references ingredientes, - created_at timestamptz not null default current_timestamp, - updated_at timestamptz not null default current_timestamp, - deleted_at timestamptz + id uuid primary key default gen_random_uuid(), + unidades numeric not null, + monto_unitario bigint not null, + compra_id uuid references compras, + ingrediente_id uuid references ingredientes, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz ); create table sectores diff --git a/database/modifications/03-simplify-facturas.sql b/database/modifications/03-simplify-facturas.sql new file mode 100644 index 0000000..fab4bb3 --- /dev/null +++ b/database/modifications/03-simplify-facturas.sql @@ -0,0 +1,8 @@ +alter table facturas drop column iva; +alter table facturas drop column ila; +alter table facturas drop column monto_neto; +alter table facturas drop column fecha_emision; +alter table facturas drop column fecha_vencimiento; + +alter table compra_ingredientes rename column monto_unitario_bruto to monto_unitario; +alter table compra_ingredientes drop column monto_unitario_neto; \ No newline at end of file From e38578eec549f23955249faf7d4a0241cfe18d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Wed, 14 Jul 2021 03:59:04 -0400 Subject: [PATCH 02/13] Modificado documento de api --- api.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.json b/api.json index 5e29f00..1b67484 100644 --- a/api.json +++ b/api.json @@ -1 +1 @@ -{"_type":"export","__export_format":4,"__export_date":"2021-07-12T23:14:40.507Z","__export_source":"insomnia.desktop.app:v2021.3.0","resources":[{"_id":"req_aa4f04af413e42e98b6c7ff8f15b2d9f","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101183538,"created":1623864931076,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta","name":"All Canales de Venta","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_4b16c803edfb47008a4c88981b5088c0","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626100854066,"created":1623864914848,"name":"Canales de Venta","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1623864914848,"_type":"request_group"},{"_id":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","parentId":null,"modified":1625804982911,"created":1618956632139,"name":"Unified Restaurant","description":"","scope":"collection","_type":"workspace"},{"_id":"req_00bc36f0bb6a48dabae37a2eb59d45ef","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626124239633,"created":1623870507092,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta","name":"Create Canal de Venta","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"1\",\n\t\"sector_id\": \"82f8d4f4-c026-40b0-ad3b-bdcc8ad68211\",\n\t\"tipo_canal_id\": \"be7b4092-3688-4e4a-99b9-eca48704dc1e\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_c1f8f261c0df45d682ff619cc335fb79","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101185841,"created":1623870410352,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Get Canal de Venta","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bfb9991817234e69ba16207138ee708b","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101189573,"created":1626099439207,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Update Canal de Venta","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"2\",\n\t\"sector_id\": \"82f8d4f4-c026-40b0-ad3b-bdcc8ad68211\",\n\t\"tipo_canal_id\": \"be7b4092-3688-4e4a-99b9-eca48704dc1e\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370905.3438,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_7aa0252f5ca44043b4e44af1a52036fc","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101191313,"created":1626099739694,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Delete Canal de Venta","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370859.8281,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_85af88553451468684d58d89a10f6d95","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626096910172,"created":1626096879877,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores","name":"All Sectores","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_556c8426ee994ece88ae322735381e6f","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626096879869,"created":1626096879870,"name":"Sectores","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1622142484730,"_type":"request_group"},{"_id":"req_925f7fa50106493d85c80b7e4468c33a","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626124237844,"created":1626096879886,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores","name":"Create Sector","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Terraza\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ba8bd99d73d24d5fa13bfebe3173a716","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626097798491,"created":1626096879884,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/aa162454-d507-4cdb-b727-57e01b71e7ad","name":"Get Sectores","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e0e0e15fcc004a5292c2d21117d07cf8","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626101251139,"created":1626097865184,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/82f8d4f4-c026-40b0-ad3b-bdcc8ad68211","name":"Update Sector","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Salon Principal\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_05616d77833d4213a5313c65dea28190","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626101560124,"created":1626097988054,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/82f8d4f4-c026-40b0-ad3b-bdcc8ad68211","name":"Delete Sector","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_4a944a11bb1f4f62a51d26f6ffcf4c5f","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101152636,"created":1626100849209,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion","name":"All Zonas de Produccion","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_6f35aaa389a249e8a827f20b263ba299","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626100849202,"created":1626100849202,"name":"Zonas de Produccion","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1621281269671,"_type":"request_group"},{"_id":"req_c39597eb8f4144eea0ca0df155f23003","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626124236170,"created":1626100849219,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion","name":"Create Zona de Produccion","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Barra\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_2fe5879904004485bf1db2f313e122a8","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101155690,"created":1626100849217,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Get Zona de Produccion","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_03c92b4d20824466a8e4eb2c702b060b","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101171582,"created":1626100849221,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Update Zona de Produccion","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Barra\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fa4861c748814c7d8f5e35dcbc396f84","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101178643,"created":1626100849222,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Delete Zona de Produccion","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_1080aebb5a5a45f6bd0a0f442fa5edf7","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626122886546,"created":1626122837213,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias","name":"All Categorias","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626122837204,"created":1626122837204,"name":"Categorias","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620850662141.5,"_type":"request_group"},{"_id":"req_4a4ee41a7b96480b9cbe8d2a56745b4c","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626126605739,"created":1626122837220,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias","name":"Create Categoria","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Para Picar\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b1593f5c02264f1fbe298f7215e480a3","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123102194,"created":1626122837218,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Get Categorias","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d4b5649429044883a82360768a5e502d","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123119284,"created":1626122837221,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Update Categoria","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Bebidas\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d2acb3e2594145d6858644f2a0ef0eac","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123161491,"created":1626122837223,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Delete Categoria","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e9e72d4685e84cc7997f55a70f2f74c9","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626123780265,"created":1626123770873,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores","name":"All Proveedores","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626123770871,"created":1626123770871,"name":"Proveedores","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620635358376.75,"_type":"request_group"},{"_id":"req_a0a5fece03f944d9b026eab55d5c2b8b","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626124232590,"created":1626123770874,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores","name":"Create Proveedor","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"rut\": \"19763899-0\",\n\t\"nombre\": \"Daniel Cortés\",\n\t\"descripcion\": \"No vende nada :c\",\n\t\"direccion\": \"Quitratue #635\",\n\t\"telefono\": \"+56986570622\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_61f2e22c72ec46ad88f7a9ab97a93f48","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626123844100,"created":1626123770873,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Get Proveedor","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d2db9d9baae94dc0940dc3bd561c479c","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626124219092,"created":1626123770875,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/f3577a66-8258-4fa5-b85b-b6bcece4f471","name":"Update Proveedor","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"rut\": \"19763899-0\",\n\t\"nombre\": \"Daniel Cortés\",\n\t\"descripcion\": \"No vende nada :c\",\n\t\"direccion\": \"Quitratue #635\",\n\t\"telefono\": \"+56986570622\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_afe6407e1f4c41c894f5a29d72b8325f","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626124196775,"created":1626123770876,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/e24c9472-51d7-42d4-a7f4-99484a444ca7","name":"Delete Proveedor","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a8c7a0d43bb0446d87f9dc7dbe6d4efe","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626124843232,"created":1626124814155,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes","name":"All Ingredientes","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626124814142,"created":1626124814142,"name":"Ingredientes","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620527706494.375,"_type":"request_group"},{"_id":"req_7d96db0b5d7c493d92d288354e78e853","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626124922426,"created":1626124814157,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes","name":"Create Ingrediente","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas\",\n\t\"medida\": \"KG\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_edaa9062ac0d47c19b1a055919317013","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125057303,"created":1626124814150,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Get Ingrediente","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_64c4691a9f58457b813f9a47d7f008d1","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125063158,"created":1626124814158,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Update Ingrediente","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas KG\",\n\t\"medida\": \"KG\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ec6bcddd7d704662b9a2e78df8dfa947","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125069196,"created":1626124814159,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Delete Ingrediente","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_775da3ed6c3d47e095f52795258bc325","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626126513401,"created":1626126501639,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos","name":"All Productos","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_9c294c575c3a49c99209ed0e3a79f446","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626126501614,"created":1626126501614,"name":"Productos","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620473880553.1875,"_type":"request_group"},{"_id":"req_54da0f449ab844a1b5edb36476caf0aa","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626126625611,"created":1626126501641,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos","name":"Create Producto","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas Fritas\",\n\t\"precio_venta\": 3000,\n\t\"categoria_id\": \"f6e300a1-484c-4878-b575-24d90997d1c6\",\n\t\"zona_produccion_id\": \"a72866a3-4bd6-44a3-a49d-7921ffe0dc67\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_959e2a6bd01e4eb9b9a33d1b71cfddeb","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127020382,"created":1626126501629,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Get Producto","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_592c888b407645f88434f10dcbb3b216","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127072504,"created":1626126501643,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Update Producto","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas Fritas\",\n\t\"precio_venta\": 5000,\n\t\"categoria_id\": \"f6e300a1-484c-4878-b575-24d90997d1c6\",\n\t\"zona_produccion_id\": \"a72866a3-4bd6-44a3-a49d-7921ffe0dc67\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fe735132f5414c1798117bb3f70ee2ed","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127092082,"created":1626126501645,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Delete Producto","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d845d0f1057a44ebbc5b0208a6f95821","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130053216,"created":1626129963655,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes","name":"Receta de un producto","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_18767c6268c04ea08f2602b34108061d","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626129963625,"created":1626129963625,"name":"Recetas","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620446967582.5938,"_type":"request_group"},{"_id":"req_ee66cf0c37874b299aa3ffb2914512f4","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130196614,"created":1626129963642,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Detalle de un ingrediente de la receta de un producto","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_61c5fcb5950548efa25735a7a05f42d2","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130734000,"created":1626129963658,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Agregar ingrediente a la receta de un producto","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"unidades\": 0.25\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370917.8438,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_680247f64a644c5193aa5b3c11828d26","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130956531,"created":1626129963660,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Modificar ingrediente de la receta de un producto","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"unidades\": 0.2\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e130807eb74849c09af4259fb4e37bc6","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626131314411,"created":1626129963663,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Eliminar ingrediente de la receta de un producto","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_296d76bfd9a24a0dbf7055469538c756","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842101868,"created":1619205352864,"url":"{{ _.base_url }}/users","name":"All Users","description":"Help\n","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371460.5,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_bacd2b299b584c69b809f651b2cdbc01","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1620704135170,"created":1619205340049,"name":"Users","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1619205340049,"_type":"request_group"},{"_id":"req_4bfe2481b06b4b3fbcfa14ca95d5c3e5","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1626124243993,"created":1619205365462,"url":"{{ _.base_url }}/users","name":"Create User","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"John Doe\",\n\t\"email\": \"john.doe@gmail.com\",\n\t\"username\": \"johndoe\",\n\t\"password\": \"superPasswordWith123NumbersAnd----Symbols\",\n\t\"roles\": [\n\t\t\"admin\", \"recaudador\"\n\t],\n\t\"restaurant\": \"136be61f-201b-4dac-a9b1-72a57c5093b6\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_8ea173f0c52d4742826111cb99fa8084"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_14439e12fd6944fb923d7975f5dcae18","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625841124601,"created":1619205346326,"url":"{{ _.base_url }}/users/0d383e70-0439-4fd6-b7f5-1ae4f8641675","name":"Get User with ID","description":"","method":"GET","body":{},"parameters":[{"name":"","value":"","description":"","id":"pair_a302e60ffd554de79a73d89d19d16901"}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370632.25,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_f546af49097049ec85e4ecf8a10a5e24","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625806608662,"created":1623863254779,"url":"{{ _.base_url }}/users/auth0|6083af726b4de900695cb232","name":"Get User with Auth0 ID","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370218.125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_5f16a64979e94ec78eb1c38b53f959ee","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625841423375,"created":1619205368160,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a","name":"Update User","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Jhon 2\",\n\t\"roles\": [\n\t\t\"admin\"\n\t]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_6ffcb9f5a8f44f058886f0993c64d3d2"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205368160,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_877481c68c224e979fd8f800380fc8ee","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842051539,"created":1619836477096,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a/restaurantes/0f8618c5-3b18-4006-9697-d796921113cf","name":"Add to Restaurant","description":"","method":"PUT","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a8d5b644cb2043a1ac1251e84af3b30f"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205366786,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_60aa45de070547bc8ead62e75850a6f0","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842073383,"created":1619836996180,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a/restaurantes/0f8618c5-3b18-4006-9697-d796921113cf","name":"Remove from Restaurant","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a8d5b644cb2043a1ac1251e84af3b30f"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205366099,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_9e4450009771406cae96fa403a140b4f","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842075731,"created":1619205371423,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a","name":"Delete User","description":"","method":"DELETE","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205365412,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bb53e00d3f254f7fbfe78317fe1968a2","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625806811290,"created":1619994417387,"url":"{{ _.base_url }}/restaurantes","name":"All Restaurantes","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619994417387,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_041ef290a606475f947ba2a22fd25d17","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1619994390433,"created":1619994385631,"name":"Restaurantes","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1619018897351,"_type":"request_group"},{"_id":"req_30a4713329224d009e8ef839f14eb866","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1626124247053,"created":1619995171350,"url":"{{ _.base_url }}/restaurantes","name":"Create Restaurante","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Todo Rico Restaurant: Mackena\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619806503594,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_00c1743ddad34dd499f648e2ac3cc162","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625806831343,"created":1619994603339,"url":"{{ _.base_url }}/restaurantes/510055e0-3cab-429b-b71b-5a943646cec8","name":"Get Restaurante","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619618589801,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3af1dfcee02548a7abd53f643a2ca4cc","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625841257062,"created":1619995589467,"url":"{{ _.base_url }}/restaurantes/612ee91e-97f4-48a3-b9f1-c0cc8b246d30","name":"Update Restaurante","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Todo Rico Restaurant 2\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619430675983,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_73030c4def144f15b841b1e77143c4dc","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1626101921512,"created":1619995652735,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6","name":"Delete Restaurante","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","redirectUrl":"{{ _.auth0.redirect_uri }}","usePkce":true,"audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619336719099,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_f8b303f807b94067abc80abe81c64878","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1623880133181,"created":1623862723082,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Admin Token","description":"","method":"POST","body":{"mimeType":"application/x-www-form-urlencoded","params":[{"name":"grant_type","value":"password","description":"","id":"pair_c202372f578b4c06904ac1543e863807"},{"name":"password","value":"superPasswordWith123NumbersAnd----Symbols","description":"","id":"pair_3375474304ee4e6a99fe025e3f06dd7c"},{"name":"username","value":"john.doe@gmail.com","description":"","id":"pair_fed6ac63d6bd490897339291270f6fd8"},{"name":"audience","value":"https://api.unified.restaurant","description":"","id":"pair_1a9cca2a200d4ac291389b24495359c9"},{"name":"client_id","value":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","description":"","id":"pair_1a66a9e3e9e54ba79ef979a2dd91cb08"},{"name":"client_secret","value":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","description":"","id":"pair_0cb45df9505d4215b72f95d074d5310c"}]},"parameters":[],"headers":[{"name":"Content-Type","value":"application/x-www-form-urlencoded","id":"pair_ea81b84996b14a3abe99c76551568528"}],"authentication":{},"metaSortKey":-1623862723082,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_20211198ef5548e585276a9fc6c2d8c3","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1623862719158,"created":1623862715805,"name":"Auth0","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1618956749685,"_type":"request_group"},{"_id":"req_b94d4df26c2244299d3a11853f4b7fb0","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1625804883460,"created":1623877980738,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Global Admin Token","description":"","method":"POST","body":{"mimeType":"application/x-www-form-urlencoded","params":[{"name":"grant_type","value":"password","description":"","id":"pair_c202372f578b4c06904ac1543e863807"},{"name":"password","value":"ff9800s_a_d","description":"","id":"pair_3375474304ee4e6a99fe025e3f06dd7c"},{"name":"username","value":"register@danielcortes.xyz","description":"","id":"pair_336272efd280454abfaade129949e7ef"},{"name":"audience","value":"https://api.unified.restaurant","description":"","id":"pair_1a9cca2a200d4ac291389b24495359c9"},{"name":"client_id","value":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","description":"","id":"pair_1a66a9e3e9e54ba79ef979a2dd91cb08"},{"name":"client_secret","value":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","description":"","id":"pair_0cb45df9505d4215b72f95d074d5310c"}]},"parameters":[],"headers":[{"name":"Content-Type","value":"application/x-www-form-urlencoded","id":"pair_ea81b84996b14a3abe99c76551568528"}],"authentication":{},"metaSortKey":-1623688070335,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_7dca789f2c93484aba4a306bbecfafc9","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1623862720559,"created":1619206250828,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Client Token","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"client_id\": \"7jP8ZreA9Vmj1MTGc4HIbr8Wp5GDVzT7\",\n\t\"client_secret\": \"Z6xnSjItXJX1yqISn7RZTlgKvGNfv8rKMIeMznMpivKYuxxjOLQiGT2d0OPaxynU\",\n\t\"audience\": \"https://api.unified.restaurant\",\n\t\"grant_type\": \"client_credentials\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_5b755a57d3714d30af8d177cb7d6f349"}],"authentication":{},"metaSortKey":-1618956749735,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1620704001452,"created":1618956632180,"name":"Base Environment","data":{},"dataPropertyOrder":{},"color":null,"isPrivate":false,"metaSortKey":1618956632180,"_type":"environment"},{"_id":"jar_204c33a0808095e3efd1dbf6e7269cbca45232c6","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1619206274437,"created":1618956632182,"name":"Default Jar","cookies":[{"key":"__cfduid","value":"d4de3b27eb821e319a80136d1fec0bc771619206275","expires":"2021-05-23T19:31:15.000Z","domain":"us.auth0.com","path":"/","secure":true,"httpOnly":true,"extensions":["SameSite=Lax"],"hostOnly":false,"creation":"2021-04-23T19:31:14.433Z","lastAccessed":"2021-04-23T19:31:14.433Z","id":"3591506857326605"},{"key":"did","value":"s%3Av0%3A78535d30-a46a-11eb-b883-17455a04318d.z6Oig1APIfmXXyYfK99ZA1nob6WyC1fuqeVeavF5IZM","expires":"2022-04-24T01:31:15.000Z","maxAge":31557600,"domain":"dev-ygnrzo5i.us.auth0.com","path":"/","secure":true,"httpOnly":true,"extensions":["SameSite=None"],"hostOnly":true,"creation":"2021-04-23T19:31:14.434Z","lastAccessed":"2021-04-23T19:31:14.434Z","id":"6130484282560063"},{"key":"did_compat","value":"s%3Av0%3A78535d30-a46a-11eb-b883-17455a04318d.z6Oig1APIfmXXyYfK99ZA1nob6WyC1fuqeVeavF5IZM","expires":"2022-04-24T01:31:15.000Z","maxAge":31557600,"domain":"dev-ygnrzo5i.us.auth0.com","path":"/","secure":true,"httpOnly":true,"hostOnly":true,"creation":"2021-04-23T19:31:14.434Z","lastAccessed":"2021-04-23T19:31:14.434Z","id":"7310520988679066"}],"_type":"cookie_jar"},{"_id":"spc_b547dbb8370d46cb9a51a4dea953936d","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1618956632140,"created":1618956632140,"fileName":"Insomnia","contents":"","contentType":"yaml","_type":"api_spec"},{"_id":"env_f2c226abfe9446fa945965dd7b29f04c","parentId":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","modified":1625809831540,"created":1620703995253,"name":"Dev","data":{"base_url":"localhost:8080/api/v1","auth0":{"client_id":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","client_secret":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","auth_url":"https://dev-ygnrzo5i.us.auth0.com/authorize","token_url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token","audience":"https://api.unified.restaurant","redirect_uri":"http://dev.localhost.callback"},"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlhJRWFxOXJBVkpFVU5zekI5alJaMSJ9.eyJpc3MiOiJodHRwczovL2Rldi15Z25yem81aS51cy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NjA2ZGY0ZGVhMzJlOTcwMDY5NzU1YmQ4IiwiYXVkIjoiaHR0cHM6Ly9hcGkudW5pZmllZC5yZXN0YXVyYW50IiwiaWF0IjoxNjIzODc4MDAzLCJleHAiOjE2MjM5NjQ0MDMsImF6cCI6InVubHhOb293UVRrNFYwSkFEOEJ2M2oza1ZLcTNzZG9nIiwiZ3R5IjoicGFzc3dvcmQifQ.TxoIINR_7jxlC8Qg9P0eWrfqnnW8eHNVlZRFjTn83a4WkBWvD1YJSGzKMT6KRrk9G097hEOv-8LQboIJjFlg5eU7p5P7jesrz1bvErCE4sr9ljuHyNhPNQLCn33nCf56XqilCuBGnO1DZ3nKbuBdQMyfMp3ZccikVq43hc8b1ce1dOG-nV026urI_yjgT66M_bT7OZesR22xn6ai4egauX5dzgBc8rvETq04yQ2y-fH7zvQ0g5Memdb0XWr4DKE44yIsIxfOjub3O8mVLxEpMIk0jknt5KQvsr_BnqfADqI3w2XekkLAiFRr3XnHzKMlK_U-lLSPOcmCBWRN5NbaHg","token_admin":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlhJRWFxOXJBVkpFVU5zekI5alJaMSJ9.eyJpc3MiOiJodHRwczovL2Rldi15Z25yem81aS51cy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NjBjYTVlMTIxNDIwODgwMDY4MGFiZDM2IiwiYXVkIjoiaHR0cHM6Ly9hcGkudW5pZmllZC5yZXN0YXVyYW50IiwiaWF0IjoxNjIzODc1MTI2LCJleHAiOjE2MjM5NjE1MjYsImF6cCI6InVubHhOb293UVRrNFYwSkFEOEJ2M2oza1ZLcTNzZG9nIiwiZ3R5IjoicGFzc3dvcmQifQ.iZLaDLdobUkP_ohSXskYLdV3ikackY_ie3lnfjb34_1ebMZ8u_3JJOr4gdlnlJqWwMCJ_rRAHbg0N6GJ2ZH5UjqYkiqAzmCiMDmWKvFJ7kFtjkmJBtlybY0SV8rRaUdNBmHKE4aVqg2ktYYyjJE1m5Lm1gOQK0Hd0vHxoNJzZBVDH1ilNgPpbBP1OuB8fLGYm0q_IYMke69rjmimPR03_qGUCcPBO-1s9RXnm2Bfqjq38yBdCssR6ubnXo_FqZDKNiK19YQgx6i6grnvwJyrakQXJHbHXB-DZD3Z5no_SHlyuLfqAF9cg0P5dd-fnLLA7PkJRbhof48agxs5Wmp5pw"},"dataPropertyOrder":{"&":["base_url","auth0","token","token_admin"],"&~|auth0":["client_id","client_secret","auth_url","token_url","audience","redirect_uri"]},"color":null,"isPrivate":false,"metaSortKey":1620703995253,"_type":"environment"},{"_id":"env_8f006c56490e4794a8c98e9102c33805","parentId":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","modified":1626131587703,"created":1625809817748,"name":"Production","data":{"base_url":"api.unified.restaurant/api/v1","auth0":{"client_id":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","client_secret":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","auth_url":"https://dev-ygnrzo5i.us.auth0.com/authorize","token_url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token","audience":"https://api.unified.restaurant","redirect_uri":"http://dev.localhost.callback"}},"dataPropertyOrder":{"&":["base_url","auth0"],"&~|auth0":["client_id","client_secret","auth_url","token_url","audience","redirect_uri"]},"color":"#001eff","isPrivate":false,"metaSortKey":1625809817748,"_type":"environment"}]} \ No newline at end of file +{"_type":"export","__export_format":4,"__export_date":"2021-07-14T07:58:53.574Z","__export_source":"insomnia.desktop.app:v2021.3.0","resources":[{"_id":"req_aa4f04af413e42e98b6c7ff8f15b2d9f","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101183538,"created":1623864931076,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta","name":"All Canales de Venta","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_4b16c803edfb47008a4c88981b5088c0","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626100854066,"created":1623864914848,"name":"Canales de Venta","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1623864914848,"_type":"request_group"},{"_id":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","parentId":null,"modified":1625804982911,"created":1618956632139,"name":"Unified Restaurant","description":"","scope":"collection","_type":"workspace"},{"_id":"req_00bc36f0bb6a48dabae37a2eb59d45ef","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626124239633,"created":1623870507092,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta","name":"Create Canal de Venta","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"1\",\n\t\"sector_id\": \"82f8d4f4-c026-40b0-ad3b-bdcc8ad68211\",\n\t\"tipo_canal_id\": \"be7b4092-3688-4e4a-99b9-eca48704dc1e\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_c1f8f261c0df45d682ff619cc335fb79","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101185841,"created":1623870410352,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Get Canal de Venta","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bfb9991817234e69ba16207138ee708b","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101189573,"created":1626099439207,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Update Canal de Venta","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"2\",\n\t\"sector_id\": \"82f8d4f4-c026-40b0-ad3b-bdcc8ad68211\",\n\t\"tipo_canal_id\": \"be7b4092-3688-4e4a-99b9-eca48704dc1e\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370905.3438,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_7aa0252f5ca44043b4e44af1a52036fc","parentId":"fld_4b16c803edfb47008a4c88981b5088c0","modified":1626101191313,"created":1626099739694,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/canales-venta/4abd36ee-5a26-4b38-8cc7-767ef6a820b2","name":"Delete Canal de Venta","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_1e159f6fa1694f28a7f42dfc8343e73b"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370859.8281,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_85af88553451468684d58d89a10f6d95","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626096910172,"created":1626096879877,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores","name":"All Sectores","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_556c8426ee994ece88ae322735381e6f","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626096879869,"created":1626096879870,"name":"Sectores","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1622142484730,"_type":"request_group"},{"_id":"req_925f7fa50106493d85c80b7e4468c33a","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626124237844,"created":1626096879886,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores","name":"Create Sector","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Terraza\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ba8bd99d73d24d5fa13bfebe3173a716","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626097798491,"created":1626096879884,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/aa162454-d507-4cdb-b727-57e01b71e7ad","name":"Get Sectores","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e0e0e15fcc004a5292c2d21117d07cf8","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626101251139,"created":1626097865184,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/82f8d4f4-c026-40b0-ad3b-bdcc8ad68211","name":"Update Sector","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Salon Principal\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_05616d77833d4213a5313c65dea28190","parentId":"fld_556c8426ee994ece88ae322735381e6f","modified":1626101560124,"created":1626097988054,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/sectores/82f8d4f4-c026-40b0-ad3b-bdcc8ad68211","name":"Delete Sector","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_4a944a11bb1f4f62a51d26f6ffcf4c5f","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101152636,"created":1626100849209,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion","name":"All Zonas de Produccion","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_6f35aaa389a249e8a827f20b263ba299","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626100849202,"created":1626100849202,"name":"Zonas de Produccion","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1621281269671,"_type":"request_group"},{"_id":"req_c39597eb8f4144eea0ca0df155f23003","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626124236170,"created":1626100849219,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion","name":"Create Zona de Produccion","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Barra\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_2fe5879904004485bf1db2f313e122a8","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101155690,"created":1626100849217,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Get Zona de Produccion","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_03c92b4d20824466a8e4eb2c702b060b","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101171582,"created":1626100849221,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Update Zona de Produccion","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Barra\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fa4861c748814c7d8f5e35dcbc396f84","parentId":"fld_6f35aaa389a249e8a827f20b263ba299","modified":1626101178643,"created":1626100849222,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/zonas-produccion/8ca27646-7b15-44d4-acd8-c417b5f2b7fb","name":"Delete Zona de Produccion","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_1080aebb5a5a45f6bd0a0f442fa5edf7","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626122886546,"created":1626122837213,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias","name":"All Categorias","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626122837204,"created":1626122837204,"name":"Categorias","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620850662141.5,"_type":"request_group"},{"_id":"req_4a4ee41a7b96480b9cbe8d2a56745b4c","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626126605739,"created":1626122837220,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias","name":"Create Categoria","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Para Picar\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b1593f5c02264f1fbe298f7215e480a3","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123102194,"created":1626122837218,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Get Categorias","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d4b5649429044883a82360768a5e502d","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123119284,"created":1626122837221,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Update Categoria","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Bebidas\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d2acb3e2594145d6858644f2a0ef0eac","parentId":"fld_cf7c19d3f8964fcdaee98b38ed3157d9","modified":1626123161491,"created":1626122837223,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/categorias/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Delete Categoria","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e9e72d4685e84cc7997f55a70f2f74c9","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626123780265,"created":1626123770873,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores","name":"All Proveedores","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626123770871,"created":1626123770871,"name":"Proveedores","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620635358376.75,"_type":"request_group"},{"_id":"req_a0a5fece03f944d9b026eab55d5c2b8b","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626211815427,"created":1626123770874,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores","name":"Create Proveedor","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"rut\": \"12341234-0\",\n\t\"nombre\": \"Coca-Cola\",\n\t\"descripcion\": \"Bebidas y esas cosas\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_61f2e22c72ec46ad88f7a9ab97a93f48","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626123844100,"created":1626123770873,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/1320c4a5-674e-4cdb-95f3-59c68b3e67ef","name":"Get Proveedor","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d2db9d9baae94dc0940dc3bd561c479c","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626124219092,"created":1626123770875,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/f3577a66-8258-4fa5-b85b-b6bcece4f471","name":"Update Proveedor","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"rut\": \"19763899-0\",\n\t\"nombre\": \"Daniel Cortés\",\n\t\"descripcion\": \"No vende nada :c\",\n\t\"direccion\": \"Quitratue #635\",\n\t\"telefono\": \"+56986570622\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_afe6407e1f4c41c894f5a29d72b8325f","parentId":"fld_7e4bd916a6d14dfbaa9ae0fd92ac5e7e","modified":1626124196775,"created":1626123770876,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/proveedores/e24c9472-51d7-42d4-a7f4-99484a444ca7","name":"Delete Proveedor","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_03af7746de7a468f9ffc7a6c1fa73190","parentId":"fld_88d689859b344f509123d26cc974b0ae","modified":1626249178455,"created":1626248118417,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/8e0478dd-bcb5-44de-ba07-192900da9b39/ingredientes/","name":"Obtener Ingredientes de una Compra","description":"","method":"GET","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371084.1133,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_88d689859b344f509123d26cc974b0ae","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626247629042,"created":1626247629042,"name":"Ingredientes","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1626247629042,"_type":"request_group"},{"_id":"fld_0a9ed678fa094bd7b774849c821879b6","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626211713019,"created":1626211713019,"name":"Compras","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620581532435.5625,"_type":"request_group"},{"_id":"req_80cf6fa92d854cf7b5328a7cd60481ff","parentId":"fld_88d689859b344f509123d26cc974b0ae","modified":1626249183718,"created":1626236732246,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/8e0478dd-bcb5-44de-ba07-192900da9b39/ingredientes/57d24511-f650-4ee9-94fc-7d0e4ac7eb3c","name":"Agregar Ingrediente a Compra","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\t\"unidades\": 10,\n\t\t\"monto_unitario\": 1000\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371034.1133,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_5cc8ab05fd7248618f04be6f1da86bbf","parentId":"fld_88d689859b344f509123d26cc974b0ae","modified":1626249312535,"created":1626241676244,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/8e0478dd-bcb5-44de-ba07-192900da9b39/ingredientes/57d24511-f650-4ee9-94fc-7d0e4ac7eb3c","name":"Eliminar Ingrediente de la Compra","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370984.1133,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b55b6aae8ebf4c62b409c07f500c5cf1","parentId":"fld_9d6ddb51917a46b5a83bd422b81f93a6","modified":1626247656775,"created":1626247172380,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466/factura","name":"Get Factura de la Compra","description":"","method":"GET","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_c63e1c8d995743c5b88893fddd240780"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370997.0547,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_9d6ddb51917a46b5a83bd422b81f93a6","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626247624295,"created":1626247624295,"name":"Factura","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1626247624295,"_type":"request_group"},{"_id":"req_7ca883e73aba43ca8bb80ec7f677dc81","parentId":"fld_9d6ddb51917a46b5a83bd422b81f93a6","modified":1626247652658,"created":1626212064503,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466/factura","name":"Agregar Factura a la Compra","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"numero\": \"123\",\n\t\"monto_bruto\": 30000\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_c63e1c8d995743c5b88893fddd240780"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370947.0547,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a708b3325af5494abda5b6e4ceaea614","parentId":"fld_9d6ddb51917a46b5a83bd422b81f93a6","modified":1626247657987,"created":1626247527038,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466/factura","name":"Modifica Factura de la Compra","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"numero\": \"123\",\n\t\"monto_bruto\": 30000\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_c63e1c8d995743c5b88893fddd240780"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370897.0547,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_695676c921a44804b0dd27466cf70442","parentId":"fld_9d6ddb51917a46b5a83bd422b81f93a6","modified":1626247729543,"created":1626212199173,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466/factura","name":"Eliminar Factura de la Compra","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_c63e1c8d995743c5b88893fddd240780"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370847.0547,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_9a8c8298ad0a4cb988fb6764b99a7bb0","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626211719950,"created":1626211713073,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras","name":"All Compras","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_63e88680219f4ea791f39d19a1d1045c","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626242420375,"created":1626211713076,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras","name":"Create Compra","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"fecha_compra\": \"2021-07-13\",\n\t\"proveedor_id\": \"82ba44b3-30c8-4741-be69-8b276425fb20\",\n\t\"en_arqueo\": true\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_70e39c2218e64f478b1106d55943595f","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626247704497,"created":1626211713055,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466","name":"Get Compra","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371031.5312,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_36d69111460e4d559288f9f46d3c79d2","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626247237125,"created":1626242429329,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/414b4015-82ba-412a-b6df-8bcc6297e466","name":"Update Compra","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"fecha_compra\": \"2021-07-12\",\n\t\"proveedor_id\": \"82ba44b3-30c8-4741-be69-8b276425fb20\",\n\t\"en_arqueo\": true\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371029.1875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a74fd640fef04df98db152cee4f31a0f","parentId":"fld_0a9ed678fa094bd7b774849c821879b6","modified":1626243688330,"created":1626211713080,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/compras/e1d64b89-da34-450a-82c6-0b006c2de1bf","name":"Delete Compra","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a8c7a0d43bb0446d87f9dc7dbe6d4efe","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626124843232,"created":1626124814155,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes","name":"All Ingredientes","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626124814142,"created":1626124814142,"name":"Ingredientes","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620527706494.375,"_type":"request_group"},{"_id":"req_7d96db0b5d7c493d92d288354e78e853","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626211929562,"created":1626124814157,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes","name":"Create Ingrediente","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Coca-Cola Individual\",\n\t\"medida\": \"Unidad\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_edaa9062ac0d47c19b1a055919317013","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125057303,"created":1626124814150,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Get Ingrediente","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_64c4691a9f58457b813f9a47d7f008d1","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125063158,"created":1626124814158,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Update Ingrediente","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas KG\",\n\t\"medida\": \"KG\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ec6bcddd7d704662b9a2e78df8dfa947","parentId":"fld_ad3bae5495484a6e8a6fca2ca5f44ae5","modified":1626125069196,"created":1626124814159,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/ingredientes/a0966248-c47b-4015-879a-d0f15a8469a8","name":"Delete Ingrediente","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_775da3ed6c3d47e095f52795258bc325","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626126513401,"created":1626126501639,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos","name":"All Productos","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_9c294c575c3a49c99209ed0e3a79f446","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626126501614,"created":1626126501614,"name":"Productos","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620473880553.1875,"_type":"request_group"},{"_id":"req_54da0f449ab844a1b5edb36476caf0aa","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626126625611,"created":1626126501641,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos","name":"Create Producto","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas Fritas\",\n\t\"precio_venta\": 3000,\n\t\"categoria_id\": \"f6e300a1-484c-4878-b575-24d90997d1c6\",\n\t\"zona_produccion_id\": \"a72866a3-4bd6-44a3-a49d-7921ffe0dc67\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371033.875,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_959e2a6bd01e4eb9b9a33d1b71cfddeb","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127020382,"created":1626126501629,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Get Producto","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_592c888b407645f88434f10dcbb3b216","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127072504,"created":1626126501643,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Update Producto","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Papas Fritas\",\n\t\"precio_venta\": 5000,\n\t\"categoria_id\": \"f6e300a1-484c-4878-b575-24d90997d1c6\",\n\t\"zona_produccion_id\": \"a72866a3-4bd6-44a3-a49d-7921ffe0dc67\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fe735132f5414c1798117bb3f70ee2ed","parentId":"fld_9c294c575c3a49c99209ed0e3a79f446","modified":1626127092082,"created":1626126501645,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/88f4a4e5-fe06-4e50-89f7-9558699fef9f","name":"Delete Producto","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_d845d0f1057a44ebbc5b0208a6f95821","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130053216,"created":1626129963655,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes","name":"Receta de un producto","description":"","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_18767c6268c04ea08f2602b34108061d","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626129963625,"created":1626129963625,"name":"Recetas","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1620446967582.5938,"_type":"request_group"},{"_id":"req_ee66cf0c37874b299aa3ffb2914512f4","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130196614,"created":1626129963642,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Detalle de un ingrediente de la receta de un producto","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371021.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_61c5fcb5950548efa25735a7a05f42d2","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130734000,"created":1626129963658,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Agregar ingrediente a la receta de un producto","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"unidades\": 0.25\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370917.8438,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_680247f64a644c5193aa5b3c11828d26","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626130956531,"created":1626129963660,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Modificar ingrediente de la receta de un producto","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"unidades\": 0.2\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370814.3125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e130807eb74849c09af4259fb4e37bc6","parentId":"fld_18767c6268c04ea08f2602b34108061d","modified":1626131314411,"created":1626129963663,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6/productos/8de8e1b0-4300-4ad1-afcb-ed18c6e4a157/ingredientes/4aa5e656-4b4e-4770-94b6-cafdfb3ad279","name":"Eliminar ingrediente de la receta de un producto","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_f2e71cc25e3441ad8263f4aa19210d49"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370723.2812,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_296d76bfd9a24a0dbf7055469538c756","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842101868,"created":1619205352864,"url":"{{ _.base_url }}/users","name":"All Users","description":"Help\n","method":"GET","body":{},"parameters":[{"name":"page","value":"1","description":"","id":"pair_7c7c1cb4df8741e2b3af58c7928cd1d3","disabled":true},{"name":"per_page","value":"1","description":"","id":"pair_3a162ce44cc94062a9d1afbcab2cfc7c","disabled":true}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371460.5,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_bacd2b299b584c69b809f651b2cdbc01","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1620704135170,"created":1619205340049,"name":"Users","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1619205340049,"_type":"request_group"},{"_id":"req_4bfe2481b06b4b3fbcfa14ca95d5c3e5","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1626210854823,"created":1619205365462,"url":"{{ _.base_url }}/users","name":"Create User","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"John Doe\",\n\t\"email\": \"john.doe@gmail.com\",\n\t\"username\": \"johndoe\",\n\t\"password\": \"superPasswordWith123NumbersAnd----Symbols\",\n\t\"roles\": [\n\t\t\"admin\", \"recaudador\"\n\t],\n\t\"restaurant\": \"136be61f-201b-4dac-a9b1-72a57c5093b6\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_8ea173f0c52d4742826111cb99fa8084"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205371046.375,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_14439e12fd6944fb923d7975f5dcae18","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625841124601,"created":1619205346326,"url":"{{ _.base_url }}/users/0d383e70-0439-4fd6-b7f5-1ae4f8641675","name":"Get User with ID","description":"","method":"GET","body":{},"parameters":[{"name":"","value":"","description":"","id":"pair_a302e60ffd554de79a73d89d19d16901"}],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370632.25,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_f546af49097049ec85e4ecf8a10a5e24","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1626159142647,"created":1623863254779,"url":"{{ _.base_url }}/users/auth0%7C6083af726b4de900695cb232","name":"Get User with Auth0 ID","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205370218.125,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_5f16a64979e94ec78eb1c38b53f959ee","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625841423375,"created":1619205368160,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a","name":"Update User","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Jhon 2\",\n\t\"roles\": [\n\t\t\"admin\"\n\t]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_6ffcb9f5a8f44f058886f0993c64d3d2"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205368160,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e3fd5e0a4fee438a91c6bcb1ed1b5a59","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1626210867394,"created":1626210269921,"url":"{{ _.base_url }}/users/77cc11f1-54a1-4938-8714-4592f75ea069/restaurantes/","name":"Get Restaurantes","description":"","method":"GET","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a8d5b644cb2043a1ac1251e84af3b30f"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205367473,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_877481c68c224e979fd8f800380fc8ee","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842051539,"created":1619836477096,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a/restaurantes/0f8618c5-3b18-4006-9697-d796921113cf","name":"Add to Restaurant","description":"","method":"PUT","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a8d5b644cb2043a1ac1251e84af3b30f"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205366786,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_60aa45de070547bc8ead62e75850a6f0","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842073383,"created":1619836996180,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a/restaurantes/0f8618c5-3b18-4006-9697-d796921113cf","name":"Remove from Restaurant","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a8d5b644cb2043a1ac1251e84af3b30f"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205366099,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_9e4450009771406cae96fa403a140b4f","parentId":"fld_bacd2b299b584c69b809f651b2cdbc01","modified":1625842075731,"created":1619205371423,"url":"{{ _.base_url }}/users/fe7029b4-df0e-4755-8197-81a64f20745a","name":"Delete User","description":"","method":"DELETE","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619205365412,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bb53e00d3f254f7fbfe78317fe1968a2","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625806811290,"created":1619994417387,"url":"{{ _.base_url }}/restaurantes","name":"All Restaurantes","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619994417387,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_041ef290a606475f947ba2a22fd25d17","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1619994390433,"created":1619994385631,"name":"Restaurantes","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1619018897351,"_type":"request_group"},{"_id":"req_30a4713329224d009e8ef839f14eb866","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1626124247053,"created":1619995171350,"url":"{{ _.base_url }}/restaurantes","name":"Create Restaurante","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Todo Rico Restaurant: Mackena\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619806503594,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_00c1743ddad34dd499f648e2ac3cc162","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625806831343,"created":1619994603339,"url":"{{ _.base_url }}/restaurantes/510055e0-3cab-429b-b71b-5a943646cec8","name":"Get Restaurante","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619618589801,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3af1dfcee02548a7abd53f643a2ca4cc","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1625841257062,"created":1619995589467,"url":"{{ _.base_url }}/restaurantes/612ee91e-97f4-48a3-b9f1-c0cc8b246d30","name":"Update Restaurante","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n\t\"nombre\": \"Todo Rico Restaurant 2\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","usePkce":true,"redirectUrl":"{{ _.auth0.redirect_uri }}","audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619430675983,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_73030c4def144f15b841b1e77143c4dc","parentId":"fld_041ef290a606475f947ba2a22fd25d17","modified":1626101921512,"created":1619995652735,"url":"{{ _.base_url }}/restaurantes/136be61f-201b-4dac-a9b1-72a57c5093b6","name":"Delete Restaurante","description":"","method":"DELETE","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_a52630b25bdf4f8a847aac849df9c1e4"}],"authentication":{"type":"oauth2","grantType":"authorization_code","authorizationUrl":"{{ _.auth0.auth_url }}","accessTokenUrl":"{{ _.auth0.token_url }}","clientId":"{{ _.auth0.client_id }}","clientSecret":"{{ _.auth0.client_secret }}","redirectUrl":"{{ _.auth0.redirect_uri }}","usePkce":true,"audience":"{{ _.auth0.audience }}"},"metaSortKey":-1619336719099,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_cc4108b17b454daa84c7eb6ecdae401c","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1626154249138,"created":1626154236341,"url":"{{ _.base_url }}","name":"Cors","description":"","method":"OPTIONS","body":{},"parameters":[],"headers":[],"authentication":{},"metaSortKey":-1626154236341,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_20211198ef5548e585276a9fc6c2d8c3","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1626154231002,"created":1623862715805,"name":"General","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1618956749685,"_type":"request_group"},{"_id":"req_f8b303f807b94067abc80abe81c64878","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1623880133181,"created":1623862723082,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Admin Token","description":"","method":"POST","body":{"mimeType":"application/x-www-form-urlencoded","params":[{"name":"grant_type","value":"password","description":"","id":"pair_c202372f578b4c06904ac1543e863807"},{"name":"password","value":"superPasswordWith123NumbersAnd----Symbols","description":"","id":"pair_3375474304ee4e6a99fe025e3f06dd7c"},{"name":"username","value":"john.doe@gmail.com","description":"","id":"pair_fed6ac63d6bd490897339291270f6fd8"},{"name":"audience","value":"https://api.unified.restaurant","description":"","id":"pair_1a9cca2a200d4ac291389b24495359c9"},{"name":"client_id","value":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","description":"","id":"pair_1a66a9e3e9e54ba79ef979a2dd91cb08"},{"name":"client_secret","value":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","description":"","id":"pair_0cb45df9505d4215b72f95d074d5310c"}]},"parameters":[],"headers":[{"name":"Content-Type","value":"application/x-www-form-urlencoded","id":"pair_ea81b84996b14a3abe99c76551568528"}],"authentication":{},"metaSortKey":-1623862723082,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b94d4df26c2244299d3a11853f4b7fb0","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1625804883460,"created":1623877980738,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Global Admin Token","description":"","method":"POST","body":{"mimeType":"application/x-www-form-urlencoded","params":[{"name":"grant_type","value":"password","description":"","id":"pair_c202372f578b4c06904ac1543e863807"},{"name":"password","value":"ff9800s_a_d","description":"","id":"pair_3375474304ee4e6a99fe025e3f06dd7c"},{"name":"username","value":"register@danielcortes.xyz","description":"","id":"pair_336272efd280454abfaade129949e7ef"},{"name":"audience","value":"https://api.unified.restaurant","description":"","id":"pair_1a9cca2a200d4ac291389b24495359c9"},{"name":"client_id","value":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","description":"","id":"pair_1a66a9e3e9e54ba79ef979a2dd91cb08"},{"name":"client_secret","value":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","description":"","id":"pair_0cb45df9505d4215b72f95d074d5310c"}]},"parameters":[],"headers":[{"name":"Content-Type","value":"application/x-www-form-urlencoded","id":"pair_ea81b84996b14a3abe99c76551568528"}],"authentication":{},"metaSortKey":-1623688070335,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_7dca789f2c93484aba4a306bbecfafc9","parentId":"fld_20211198ef5548e585276a9fc6c2d8c3","modified":1623862720559,"created":1619206250828,"url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token ","name":"Get Client Token","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"client_id\": \"7jP8ZreA9Vmj1MTGc4HIbr8Wp5GDVzT7\",\n\t\"client_secret\": \"Z6xnSjItXJX1yqISn7RZTlgKvGNfv8rKMIeMznMpivKYuxxjOLQiGT2d0OPaxynU\",\n\t\"audience\": \"https://api.unified.restaurant\",\n\t\"grant_type\": \"client_credentials\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_5b755a57d3714d30af8d177cb7d6f349"}],"authentication":{},"metaSortKey":-1618956749735,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1620704001452,"created":1618956632180,"name":"Base Environment","data":{},"dataPropertyOrder":{},"color":null,"isPrivate":false,"metaSortKey":1618956632180,"_type":"environment"},{"_id":"jar_204c33a0808095e3efd1dbf6e7269cbca45232c6","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1619206274437,"created":1618956632182,"name":"Default Jar","cookies":[{"key":"__cfduid","value":"d4de3b27eb821e319a80136d1fec0bc771619206275","expires":"2021-05-23T19:31:15.000Z","domain":"us.auth0.com","path":"/","secure":true,"httpOnly":true,"extensions":["SameSite=Lax"],"hostOnly":false,"creation":"2021-04-23T19:31:14.433Z","lastAccessed":"2021-04-23T19:31:14.433Z","id":"3591506857326605"},{"key":"did","value":"s%3Av0%3A78535d30-a46a-11eb-b883-17455a04318d.z6Oig1APIfmXXyYfK99ZA1nob6WyC1fuqeVeavF5IZM","expires":"2022-04-24T01:31:15.000Z","maxAge":31557600,"domain":"dev-ygnrzo5i.us.auth0.com","path":"/","secure":true,"httpOnly":true,"extensions":["SameSite=None"],"hostOnly":true,"creation":"2021-04-23T19:31:14.434Z","lastAccessed":"2021-04-23T19:31:14.434Z","id":"6130484282560063"},{"key":"did_compat","value":"s%3Av0%3A78535d30-a46a-11eb-b883-17455a04318d.z6Oig1APIfmXXyYfK99ZA1nob6WyC1fuqeVeavF5IZM","expires":"2022-04-24T01:31:15.000Z","maxAge":31557600,"domain":"dev-ygnrzo5i.us.auth0.com","path":"/","secure":true,"httpOnly":true,"hostOnly":true,"creation":"2021-04-23T19:31:14.434Z","lastAccessed":"2021-04-23T19:31:14.434Z","id":"7310520988679066"}],"_type":"cookie_jar"},{"_id":"spc_b547dbb8370d46cb9a51a4dea953936d","parentId":"wrk_07f30ee2dcc148b1a0d91f1c2f4debec","modified":1618956632140,"created":1618956632140,"fileName":"Insomnia","contents":"","contentType":"yaml","_type":"api_spec"},{"_id":"env_f2c226abfe9446fa945965dd7b29f04c","parentId":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","modified":1625809831540,"created":1620703995253,"name":"Dev","data":{"base_url":"localhost:8080/api/v1","auth0":{"client_id":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","client_secret":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","auth_url":"https://dev-ygnrzo5i.us.auth0.com/authorize","token_url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token","audience":"https://api.unified.restaurant","redirect_uri":"http://dev.localhost.callback"},"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlhJRWFxOXJBVkpFVU5zekI5alJaMSJ9.eyJpc3MiOiJodHRwczovL2Rldi15Z25yem81aS51cy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NjA2ZGY0ZGVhMzJlOTcwMDY5NzU1YmQ4IiwiYXVkIjoiaHR0cHM6Ly9hcGkudW5pZmllZC5yZXN0YXVyYW50IiwiaWF0IjoxNjIzODc4MDAzLCJleHAiOjE2MjM5NjQ0MDMsImF6cCI6InVubHhOb293UVRrNFYwSkFEOEJ2M2oza1ZLcTNzZG9nIiwiZ3R5IjoicGFzc3dvcmQifQ.TxoIINR_7jxlC8Qg9P0eWrfqnnW8eHNVlZRFjTn83a4WkBWvD1YJSGzKMT6KRrk9G097hEOv-8LQboIJjFlg5eU7p5P7jesrz1bvErCE4sr9ljuHyNhPNQLCn33nCf56XqilCuBGnO1DZ3nKbuBdQMyfMp3ZccikVq43hc8b1ce1dOG-nV026urI_yjgT66M_bT7OZesR22xn6ai4egauX5dzgBc8rvETq04yQ2y-fH7zvQ0g5Memdb0XWr4DKE44yIsIxfOjub3O8mVLxEpMIk0jknt5KQvsr_BnqfADqI3w2XekkLAiFRr3XnHzKMlK_U-lLSPOcmCBWRN5NbaHg","token_admin":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlhJRWFxOXJBVkpFVU5zekI5alJaMSJ9.eyJpc3MiOiJodHRwczovL2Rldi15Z25yem81aS51cy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NjBjYTVlMTIxNDIwODgwMDY4MGFiZDM2IiwiYXVkIjoiaHR0cHM6Ly9hcGkudW5pZmllZC5yZXN0YXVyYW50IiwiaWF0IjoxNjIzODc1MTI2LCJleHAiOjE2MjM5NjE1MjYsImF6cCI6InVubHhOb293UVRrNFYwSkFEOEJ2M2oza1ZLcTNzZG9nIiwiZ3R5IjoicGFzc3dvcmQifQ.iZLaDLdobUkP_ohSXskYLdV3ikackY_ie3lnfjb34_1ebMZ8u_3JJOr4gdlnlJqWwMCJ_rRAHbg0N6GJ2ZH5UjqYkiqAzmCiMDmWKvFJ7kFtjkmJBtlybY0SV8rRaUdNBmHKE4aVqg2ktYYyjJE1m5Lm1gOQK0Hd0vHxoNJzZBVDH1ilNgPpbBP1OuB8fLGYm0q_IYMke69rjmimPR03_qGUCcPBO-1s9RXnm2Bfqjq38yBdCssR6ubnXo_FqZDKNiK19YQgx6i6grnvwJyrakQXJHbHXB-DZD3Z5no_SHlyuLfqAF9cg0P5dd-fnLLA7PkJRbhof48agxs5Wmp5pw"},"dataPropertyOrder":{"&":["base_url","auth0","token","token_admin"],"&~|auth0":["client_id","client_secret","auth_url","token_url","audience","redirect_uri"]},"color":null,"isPrivate":false,"metaSortKey":1620703995253,"_type":"environment"},{"_id":"env_8f006c56490e4794a8c98e9102c33805","parentId":"env_204c33a0808095e3efd1dbf6e7269cbca45232c6","modified":1626159735450,"created":1625809817748,"name":"Production","data":{"base_url":"https://api.unified.restaurant/api/v1","auth0":{"client_id":"unlxNoowQTk4V0JAD8Bv3j3kVKq3sdog","client_secret":"khvDShr6yHGPCX1p_OpJPeQ1rG5ZGgLJV2ahu-cE0b3pVUn6WS5-9YnQGJfQBKmj","auth_url":"https://dev-ygnrzo5i.us.auth0.com/authorize","token_url":"https://dev-ygnrzo5i.us.auth0.com/oauth/token","audience":"https://api.unified.restaurant","redirect_uri":"http://dev.localhost.callback"}},"dataPropertyOrder":{"&":["base_url","auth0"],"&~|auth0":["client_id","client_secret","auth_url","token_url","audience","redirect_uri"]},"color":"#001eff","isPrivate":false,"metaSortKey":1625809817748,"_type":"environment"}]} \ No newline at end of file From 7fa39a8b116d7baf32b2a35b152b41cb7cfae6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 00:36:50 -0400 Subject: [PATCH 03/13] Mejoras generales .w. se me olvida que agrego --- .../app/Exceptions/NotAuthorizedException.php | 22 +++++++++++ .../Controllers/RestaurantesController.php | 7 +++- .../Http/Controllers/UsuariosController.php | 7 ++++ .../app/Http/Middleware/RoleMiddleware.php | 16 ++++++++ backend/app/Models/Restaurante.php | 36 +++++++++++++----- backend/app/Models/Usuario.php | 8 +++- backend/bootstrap/app.php | 3 +- backend/routes/web.php | 7 ++-- database/modelo.vpp | Bin 994304 -> 994304 bytes 9 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 backend/app/Exceptions/NotAuthorizedException.php create mode 100644 backend/app/Http/Middleware/RoleMiddleware.php diff --git a/backend/app/Exceptions/NotAuthorizedException.php b/backend/app/Exceptions/NotAuthorizedException.php new file mode 100644 index 0000000..591a45c --- /dev/null +++ b/backend/app/Exceptions/NotAuthorizedException.php @@ -0,0 +1,22 @@ +user = $user; + } + + public function render($request) { + $path = $request->getPathInfo(); + + return response()->json([ + 'error' => 'not_authorized', + 'message' => 'El usuario ' . $this->user->id . ' no tiene permiso para acceder al endpoint ' . $path + ], 401); + } +} diff --git a/backend/app/Http/Controllers/RestaurantesController.php b/backend/app/Http/Controllers/RestaurantesController.php index 43d71bb..0ce3102 100644 --- a/backend/app/Http/Controllers/RestaurantesController.php +++ b/backend/app/Http/Controllers/RestaurantesController.php @@ -19,7 +19,11 @@ class RestaurantesController extends Controller { * Obtiene de forma paginada los restaurantes registrados en el backend */ public function all(Request $request) { - $restaurantes = Restaurante::all(); + if($request->user->isGlobalAdmin()) { + $restaurantes = Restaurante::all(); + } else { + $restaurantes = $request->user->restaurantes; + } $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), @@ -100,7 +104,6 @@ class RestaurantesController extends Controller { if($restaurant->zonasProduccion()->count() > 0) throw new CantDeleteHasChildException("restaurant", "zona_produccion"); if($restaurant->categorias()->count() > 0) throw new CantDeleteHasChildException("restaurant", "categoria"); - $restaurant->delete(); return response()->json([], 204); } diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index 4f0804b..a2a5ae0 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -49,6 +49,13 @@ class UsuariosController extends Controller { return response()->json($usuario); } + /** + * Se obtiene al usuario logeado + */ + public function getMe(Request $request) { + return response()->json($request->user); + } + /** * Crea un nuevo usuario localmente y en auth0 */ diff --git a/backend/app/Http/Middleware/RoleMiddleware.php b/backend/app/Http/Middleware/RoleMiddleware.php new file mode 100644 index 0000000..f8951da --- /dev/null +++ b/backend/app/Http/Middleware/RoleMiddleware.php @@ -0,0 +1,16 @@ +user->hasRole($role)) { + throw new NotAuthorizedException($request->user); + } + + return $next($request); + } +} diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index 2e484ca..9977660 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -22,14 +22,22 @@ class Restaurante extends Model { return $restaurante; } - public function usuarios() { - return $this->belongsToMany(Usuario::class, 'usuarios_restaurantes', 'restaurante_id', 'usuario_id'); - } - public function canalesVenta() { return $this->hasMany(CanalVenta::class, 'restaurante_id'); } + public function categorias() { + return $this->hasMany(Categoria::class, 'restaurante_id'); + } + + public function compras() { + return $this->hasMany(Compra::class, 'restaurante_id'); + } + + public function usuarios() { + return $this->belongsToMany(Usuario::class, 'usuarios_restaurantes', 'restaurante_id', 'usuario_id'); + } + public function sectores() { return $this->hasMany(Sector::class, 'restaurante_id'); } @@ -38,10 +46,6 @@ class Restaurante extends Model { return $this->hasMany(ZonaProduccion::class, 'restaurante_id'); } - public function categorias() { - return $this->hasMany(Categoria::class, 'restaurante_id'); - } - public function proveedores() { return $this->hasMany(Proveedor::class, 'restaurante_id'); } @@ -54,7 +58,19 @@ class Restaurante extends Model { return $this->hasMany(Producto::class, 'restaurante_id'); } - public function compras() { - return $this->hasMany(Compra::class, 'restaurante_id'); + public function ventas() { + return $this->hasMany(Venta::class, 'restaurante_id'); + } + + public function boletasElectronicas() { + return $this->hasMany(BoletaElectronica::class, 'restaurante_id'); + } + + public function boletasExentas() { + return $this->hasMany(BoletaExenta::class, 'restaurante_id'); + } + + public function cajas() { + return $this->hasMany(Caja::class, 'restaurante_id'); } } diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index 804db47..caea07d 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -32,11 +32,15 @@ class Usuario extends Model { } public function isGlobalAdmin() { - return in_array('global_admin', $this->roles); + return $this->hasRole('global_admin'); } public function isAdmin() { - return in_array('admin', $this->roles); + return $this->hasRole('admin'); + } + + public function hasRole($role) { + return in_array($role, $this->roles); } public function restaurantes() { diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php index 891d15e..9636337 100644 --- a/backend/bootstrap/app.php +++ b/backend/bootstrap/app.php @@ -76,7 +76,8 @@ $app->configure('logging'); $app->routeMiddleware([ 'auth' => App\Http\Middleware\Auth0Middleware::class, - 'log_endpoint' => App\Http\Middleware\LogEndpointHitMiddleware::class + 'log_endpoint' => App\Http\Middleware\LogEndpointHitMiddleware::class, + 'role' => App\Http\Middleware\RoleMiddleware::class ]); $app->middleware([ diff --git a/backend/routes/web.php b/backend/routes/web.php index ecbdf75..3f4d97d 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -9,6 +9,7 @@ $router->get('/', function () use ($router) { $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], function () use ($router) { $router->group(['prefix' => '/users'], function () use ($router) { $router->get( '/', ['as' => 'users.all', 'uses' => 'UsuariosController@all']); + $router->get( '/me', ['as' => 'users.get_me', 'uses' => 'UsuariosController@getMe']); $router->get( '/{id}', ['as' => 'users.get', 'uses' => 'UsuariosController@get']); $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create']); $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update']); @@ -21,9 +22,9 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->group(['prefix' => '/restaurantes'], function () use ($router) { $router->get( '/', ['as' => 'restaurant.all', 'uses' => 'RestaurantesController@all']); $router->get( '/{id}', ['as' => 'restaurant.get', 'uses' => 'RestaurantesController@get']); - $router->post( '/', ['as' => 'restaurant.create', 'uses' => 'RestaurantesController@create']); - $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update']); - $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete']); + $router->post( '/', ['as' => 'restaurant.create', 'uses' => 'RestaurantesController@create', 'middleware' => 'role:global_admin']); + $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => 'role:global_admin']); + $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete', 'middleware' => 'role:global_admin']); $router->get( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.all', 'uses' => 'CanalesVentaController@all']); $router->get( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.get', 'uses' => 'CanalesVentaController@get']); diff --git a/database/modelo.vpp b/database/modelo.vpp index ddb1d9fc8929d4b1390231d780c55d26f735251a..26e2ba9e5e68074fd024e359594d717f5b8ae86a 100644 GIT binary patch delta 108199 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ð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 X%Ufoy#bnX8EvAb&J delta 97894 zcmdRWg_^cGN%c9E7fkba|* zBn?p28PYL=pO|~Nnmf9?F^I^?Xq#KuTO%MK-bSGzVsKJ&a>Av@QRv9J%2_5AFw*mY zu7lwh2kkh+i+})lVXXu&*c9Les|>uLkcJm2&)@|XJG>yNJ7>fag111>NJ2IWM*(ku zzJQ97VvQ*3=$$JOlk`lq5JT&}mbvvfSXjq^&YAE+nHAO$BmYfHsrl9ESo~4n)I;P|l-az}tXTYwgjI>d>RMzRNvcq9k4KAO9k)(J?v6|2}uDCN9L{ zE4nrXHU|0|Cs*sYaN*dIZfKaC%>Nv>z=deXqZ<*x>zkv9P%;0lFD_h&=u@=6^}&$= zD43kY|L73~7owSorb+;p=WOn3?dUG+1^a^& z!6o2!@Kl}ptR*56F_;rn2mPhY_1KIZf{cbJ1QCq^;Xq!Rf$*V5Xo&Klzvn=UFc6Ji z!8OB;P=J8Yj4%no&_gtW*ythJL121_#F5*2i0}^xx~&H$$9)uL3qiI4_Y$vy=MkI1 zH;7*mD-lZ&^AIx;QxT(!7j3{`G_Y8>FTCsJL~h!F;U6UErX4c#89w{pA@+X;*WVrt z9WqD30l|9@_zk?%f~_&(g%$jMz?SInq6-yXRHMKPX6TJ23I^Fzba+pLKPnTb;s2A) zXAgii;N7owx4(=qaK&{bUEv@wKjwVzHzgP{*#GAFLbc0uxkdryKo~Y}+>D%V(n&J&kG&6n4T9_{okmB-5 z=3G>T;1luhv%Gz!jJFu*C12K!mEW<76{rAg?(6Syz!_y}pTb!Ga6VbDHrCN;Ds!Et z*0Gz_ApWZQh4zn;}kLN1{ zF1je5o=s4e{frd=tJ5NgA$#Q@#dV1nraeVIZwZ_6TQMvuCkl)Zg?iBftsRT`W5kEJ zG3Bt0)rUV@A8xs^s;KGP6THH&WEuAYp6h9vd+wsNd1R!IL-lH#MsMCWwm0sl+|;*Z zmARL@&#*5nMm3-w3AMF0wJeNsbxzFz$al`;@ASM2PxMkWNGXMhDxff=XIDqg2M|z6$5svN^t|_mfQOblE*iLHEXR}2W_dH28q(>#K+uEfB`X%JG zb8whlY@YncrQ7(^TCCGm7NUc@Yamu)vd0wb7nYClZu$G(c!mi(LyjVwVv`Uym0cY{ zUga2Gd>8tmCWT)~uCX!-AwYmz_Am8+f~#L0*Vbr>5i<2Qwev=-q-md5*gxRD38Ta9 zNnu?ws8z9iOn76ZuUG{r4d{%Z^ZAPDap24!bdK1iRQ}3Cj8&8d zk30@_LqKc#WV!Q%F2`R4gurYg1}aE?DSYm2_NlTA7iSFXp}8lw-=%O*if3HvJ6Z=0 zk~JzQ?pYw6voGCbPyVtLlm1USt!RleoO-n)+;YBTH|bNZt}a_S-l^l0hjnv z<7|@S$ek0!@l$!Xp7aFg?>h5rIpax5P$LBW5TQZPR9?~S>EgO|3V>>RTL&EP>{ZO8 z`}$3_#-cDTIi_H?0Ft1CK?R|UM|lFF^TXtUdbndogYn@<3S|vsl>5Lne@4hbEa4P&G!m=8uKC&Zn_NV`K_~Lwyw48Kz zAKQ}R-tG^Fu`^2Y=X-ebs4G!8(jUV04{L*m1V#-9+&bP5Wkx%1ZSXWK<2B5f z@jTSi?9`8KvSYxpJRq3^sd&wJ=UU^2@7(8QA}gKM$JZB|yQ{W)N+lW}_q?44$9|XZ zy_`g#ZSTCB9Ueex@b4o@*BT-7*xe7n=xs0o|#v7exoo2ff$F~6La3SL8 zf(jQw48rvO=UGuP&4w;A^Acq=_CGZ{Vq)*J ze#MUY?XAq1tdQ+8|Nc&ft36tFkSql6DY*uv>^HGaEIuWXP81rccVptn%nL}$Wn!6? z!}7||5xM~9^s0Aq4!-Q`{5~gu`>$SC4#JTL;Sdg4CT++BP9bk&CB3z>^iW}+;_Lge z8=ZXS83N85wRh&kroH9eMuJ`+D-J1d2Yv_bYeMoU)aT>Mr=AVO3-h*a^D zre832*VQc9&~(o$$)AE~S$U%Ba=m)lnl?lEQEkW6lR6lZ;H-g+y}0bdMRM@=!>aAD zd9Ts}$06-DUqI`%P2A1()jKtF-5kj&ONz|})=D1rV*45HK?jkbE5re<7}V$*vNf$} zBFyY1@X5FKlT)|7zR4&U;B5ZYT%nU?Kw)B>Gv*v2kZ~X5Y5>%(K!kf$psjZ||HGJj z8I??po`zN0B1(--VB=j+E@N%L+S=C74~U&!GcoobKdRXp*989NXBO?Qnl;^2`Nl)w zU2?*R$U%%L3H>r7N`U0ARzu4gZn3Y%265d@kor=A>-bB&C7@Va6F3#27~!XQ)?Jk^ z{cEDL=OZmPm5xHFutI3i3EKm>kWkP`xzxgOQCuEe|GML4go3BWs_m^3hEn~WI?uTJ z<7|a&9SMqi9>@xxtuWvtvpK~!U{2%T%Ng?=bzCOyiPUH?MIP_>iv_J|B&&g8Yw|+v zw>ctee>j0Yxe`ja1%y~4Xfj=}Rjl;fGw`J5RC>vM9##4JHLB?$`qF!GP%jdbVdm~f zcfqU$E=y}&iHw@#BscWR|?cg$|%2oN5bcH0z#>5@3hVnGKqKU^Y zBLTO#N%RnKmrd9*x^xki#@RybK4osBn9vf7o_M84`1!Y00=F977)cR^30=ILKHbmB z(F$LpOl9%ygmke}%i**00yoh_jOgWN`5v_+G{Rbp#vbH6NafyAZzD_JZIgm0vjv{= z$$ZQ9MEaxj7v3nAyY3A={(#M|A6B|&7lC0*#w4m2)uOr2)Wh7nYxM%3vC)r>Kk>%_ z^bO@4z78?=`ah{aoee`JTP(^?bfm!8khU@wP@MDTFr`q?qlzhcr4~-7#h8`(iUBH< zYvrlYOZ&$*zYqVA9^IqMTEan@-eaB0Ds#5C%v`6(c4XDpf~0NHoaho=Aq72++8=qRwEo~!xG8Oe~qh}|%lwaHmTe}}dLuyzu+Y1f0 zuS?AA{g~N#DHyPL#ev2#fcQiq&TFL4So&d^hdc|84@UbGna1@ogQ|7yXuxe^ThSc2B(KJiLNCdrk8rcfGnaGtJW#4> zi!nTQGfQ_kEA3>53+A=$r3CpU=WHMSUZd7S$J3b-u_hzjgl_jEtdWz3NLV|D9JWTIN`c zNd>KTKmu6L56Gx=Srp0g8-=fm;o!Cm7vnfXyzKgm@>8cxS3yP{;yZjU)wj)GgJj}& zHJ=S4dB9OYKN<1Bjj%2@?|tXt#wRJCoW_`HG5YP~NNVrW$pAriZkb(FZ_%}z*Uq#v zOP_|DK{wJ|YNnX!Q>j^BYuf3m-b&Vj&5HGCSb=YhJa9N+k1Mf2{_DEk?-&xbpWtV` z=OWO_>Y=CzM{L>{M5oZKx!n>Ds(^s)xsw(}*nx9|!n*Ffq{ z4N%Oh=?Km}*78*7YFK=ggEV}^E0w;PQE{MyaDljvkn|}r^|zVw>E)G5GEVggZX-bH z@Ur<`iGPPXF6H47i*wRs;F2-LJLnV^3_u)pESm13YSWPtQbl?>}~RK0xjH* zqT5&vF@+lr$mPL2cIaW~1}rY~j8r;`065YFSUl6D2EUMz9_o9yEX1*g!e9HzAR0KvMN3lJ zH984AQ~wm(%F$0t!9`e>o3y*9B?zAeo*$szBCN2r`b7_t?Q3D|Xqt7%PQ@HW#r_@3 zv!ReTcHdPr527z8QO4ZE;O|1^Sfzv^dPX$3OtvdiHW>Aa=uRBDxH=L(`4nO0U@au> zQ%Va%O^DF)RCY}ULVbXKuqIvNpKE2<`;$&^Y?TBX@hjoSMVrPuSxo^!4V@wmfoN_)D_dZZceM5vOfal{s{c16o@P@lKA z_s>*u%Qq=QmAxu{jP8TqelnJ9z3sz#P1@oUmtNr&O-o@-3!u=_s3q_X;hOIplWZAA z2dje*>~ikWJDi2(UmZQ4^o-yN?+9Hai2kGs+jxQ})-j$=G6UDu=9`~z*wMI z&1NNA!UKxXG%~_}^Ggh>xa683Y9hmjPH(h?MF#y{5y*+IYY8Q)6laeEJ;|5Cr|$Yb4dni`vC* zyAwN8CYF{_k*e)0rD4nW6{O`}H0`)LIXpd>4kb)NW`9~;-a$YuBU2n^g}#!g&%5C7 zztsDhP2r}RUG4t595Ql$vQ(*xdkHaZbMN!Ms=vN%i94FuQ-dC5lK@b=N8s@q+bD|S z?)UTww4B{--+3L!sDG73>)Wab$w$+JU#^N2R+&pnZSNi45rK#B&?2yHy zux!c;;)}wbE}xSJG;QMrF-qvm?1S0$B(OQI3d{>>2gPMrX0gLk@jY3>rV4{H_n*29 zyEzbyS8uGIu8nUm#5y1D8m@?eQ>pRpARlgrv$+pDcv?L}kL7<5cS9AMY3s$QSfoZ7 zkxsr5SkNM|MgF$yjbC{eAM=t~&6|R0;xg>mX*7E{6Z5(T;3a=fEzRSkFbc;_gt)n> zTfe6y!IyI_agvLsM<#P3L8?4K0*RI2Z4xEi&?Z`H>kstABMK;|s~oB21_htT>#jC& zCH*fq?^*hAb@^;r?GTjrpU#r?q z1uvXJ@f(J^f11*NCIsKb6=!suRdu+Bi7-@9 zX_ImTtRPB_neV&EwdAaa9SecrFN|BgONRD9*@XMc8K{Z$O~^u44io54Smzg__@mV} zcLJ}!z_t~l;lPm=x7#+tWQ=%+aKx;QK9JJKVjrI|ez|$dnQHG?cSp{3!|8YJf54UV z4;m2U2OUsrgrBG_vMIX->G&$Y}P<*T^{S zJlwA4jqk|2ihT>zP(^b!#p4t2kYdrE@vlRd_WZ{uHV_&FG|N6p+t3>MPo`*p(okC= zN~fJ2*sQukuX6DAao&c(hk9iS42X%_FfXuv+8!z)P~{idBWvkkVHwvz3up;iYIMWw z?q)^ONO>-QAj4;43^nftg9^D#yIF8G{Y z3v9`I2^eKimXq5(KSosbOh7*mtgf>|uPv9iS`IbFXi@CVx>AQkXT*_RIYVU9<0!5a zA>GL&`NfihDHL-XTztnaK%u~EPF|AZNm^Z3%N7F59!FTC0a;5T+3la5xblz2%XOHp zY5`_DqnxmW;Kz!Rx;+oIKqH5Jkt}0%%DYB`*>I7T-ploY>F&z$U)IgV5@RMz{UGLk zgMgbgTg!bFnO~joW3%49v%beJ%mO4#yg#=t;yCJSh~L+cX9IWYy0(^r1eTH)fYG~8 z#v0a!5|vZ^A&mXM_aE=%Hik^J0=A~?X#cExVv-gGv!Q6cpJW%-m`G_CLsni1KV-kp z*4@`RkTN^V(mTth1{i&7GXC~L4QS+OstJgy3H}|&QBgx1Rl|5AS^2fQQsYA~yrLTO z`w(DMIs(k9j*w;h&wH!Icu2?SBnBEO#TZM)1bh#q^5P#OV9SeJV?8K?{-GV1h#BsU z88?)4{1lmX@;=SQ_G(SpN?y)F{`4V^<1_hD6!~QY`~r@5^lzAIJE(z=^G;eA{HoL! zU5A!S7RvAXt9m4+0`?7!lov@b4<+z%1`^PMj<4UZK<>)D0=kW#XaeP|&U8 z^AQOB(y)0c{-tPk#PD7}Q?#*(;I8`qAB$tZ##YCvoY@VJH4rmb6(u68iw||b*6N>- z@vz2LoN_k!PYSKwKOv_f&8;~4Y#u(;MVh;RG_U!D{scDqwO$=hzvRE#gLK@F`t7X& zbui(htW#YB!IhrTINHh%-)nE!^>1J1`!xxcl@CtsK;8993jpiMIE8lHuG}680C&6A zTjgG`hse|pH_wNMjYAb+!S$sO3-_HbFZZ4M$<-<5t(}|Kt#`of)$}k_vwCKGWW?Sy zpL;x*rzedbg<^J;&XsWaXNvgidaM=*B50YyY+P zkQrq;%|bhZ${;$BN;+>sohw0o8U5B#YM7c+6_X{v1uXFT(xb_$C*`Kp5!0>ARtlnI}=Ygv9 z0_!&~3uH9M)+S96utyNm$bm}I&H5+;(moTg3ix9`F19=PY83V`Fo4S)*whX*HnrUE zG6#M%X>V+AYi((63V=-y!|qlxOiLlKTPSSYsl7e0wekA+cy8(LWJ0X{`gq|$&5OIT zl9ubpNkY8&3(V)%`}At%W_RO5MtPOV?vk-7@Q`$MbDklXA-J?e20PjKF!v#D#-(fk z2;@8K8D4tWoS6{ChE!s~(TQLCZB<73Kz4_(Qpx&Cxg>B-5Z(csgWX>;{c-|Mk5BuG z?X=1-*KOS{PuBVlrlFT!*^+IISiOD4*-l)vV@@eJylV+3Z}fLKD)F&eWveO z9$b<@8G=K)L-&(aJbWF^uqlohQ}fzWTmj(%PWFIs{i~I#YUd6w;Eq>+o#Tt=Ljo6O zz5O{yNOv4QsY^%P9d8vMfwd@1J)iuL#T08@j0BO9o% ziWOZ_{(0K1@$o=wYDb>M7VTlJ-bVf(Vx1L*4vWDDiFJiGiz{MAQJC4lL>U{u@%wPv zhiLT6mgP8~3je+-U`+CdbxqmG8Aoh4ZeZX0+xy-)C3#bqhEv>n{WKk|F;f@(z;%ww z`J;qDEX;f59AiMmBBQUYwzCQeUGgl&?C>%{a#II|y>Co%-nwR&W1SbO zuIu%ka^h#8nj=HUUCC65B=CxZZT=`kaj`3@Q0|J?GTXHy`-=D52y2w*J@0!5lJYMU9Y2`vzU!tpEr~v)J-tgI z5rsL!B^9PteZ`P$SgEJ}t#QWNBh2ssla;uje&ejL--+vS^u0lthc8r|U}7Lf8BqhPw{}!SEtkzKx4zP9saiUA!k8s4J{L8}QC}rIP>(S@YrrdF zy-8~(!$f*m+ORxLqtNnPj_ekVn)J4OFtbFir`385SjKe1BK`M8Rj@yvxPKqm^f+>+ zaC*vUk5zE7_AE}{FzW@aT^=S3Mj_EK;u)KRbEgQyDOT&Z=`x^IR!$Zh=MASZ} z_snujEUy~|><_e$E50njm-x}Kw3AtLUtPmJ8CP0fbFvHzkQC@hh_zz$XKgiY3^Z4f zwT~ISu-ttNcvo;ik@m4}!2tX_bkWnI2A5{-;|H{pP{G9;^T+{{gqS~}x+2wm*RL(G zo*E|X_0QdO*QfD|zj>}RmKKiZN0;n;OD0Z#x)811Ln0&3T4=!g=Ev-^Um1NH{|95m zRu%!HvVH3KP>$cjT>$s;KSm4vA2*X0ssbBN+ODM{Pcx{f#UxOHyng&=+c|1O`wblx4gl?f4|Hoe^^@ReJTQ3z8kl#l|2Mg|65j zG)?)|W!@sJqSo-_&CjV(H0;j=iOgXy1*TC9W**U9+a@D_Sy!;(+qHBWD3*lff-dx( z07T?TN%Z~l0Z=O@PmG@*9irDM%0x~4U&xkkRS=Ae^O^j94EB*jZcO$oe?$_5L zRG-?S4s%5iUDVVm=zV3D*(`tM&IxDP?O1}N9(EoMA;8{VdCP4@%?Fpy9C>Oa^=Tj4 z815!cqT53dp0@8cY9IUd-QJ(j1c?QEt2t9i`^$W1ll>XMQgAE(g&X(i@>d_lOf$p7 z6x>JF#t_KXi)wSCQ(U+@$+3DAcZINlKIkX2jkZo0vIcjOou+?WYf7aN47!?u9&sJQ zF0OAJF98hQYDufE&5LZ5)sCE&TtCLG=)=f0VT8!4r`*JV$w_NO*39t&1(orm_rr8s zSg60DH_H$5st!{>QI>IBR@?Adxe_|t>EB>R;t2o`W`vIY6U@;6aq;lOnG_dKX0HAi z8;>AYOj9pGtpBHD7Vna*Z$}vyg@q-6i#z7DQX||*(nhuH$J#H9_kfWlwXVD7F5GD> zqK?%;j*78ewY2jS>?n;Z@(lTP@(8+&Veg z;oT!wdg~GVAN>XYBI5;tBfFRUM1B$Mpcf?!XuEg_OpivOhd80I#I}Fiqf47^1gSOn zxOhXhHjLGqWs(a=CH`trmyc6w)n{;MYha<=AlDz5+2AI6+2_timOHkFK@=oBKt28` z{m_ErSJ9%QfTjr$@BQY(jq6)EZs(c_{@_oR_~OldB@8!{d1K>mG`@sm>%mmt<2@S? z>6IXpiT5UWaix?$c+5JKxBS5sA~&t!4%5(6GlShb^mnV`1#8Jv2K2LO+Bn+bXYjo3ZpiDdu89b)jtso$i`(Rw5 zgF11Ks-b>hHGdWsD-J`~IFzX{#wka*U%Hj3K;DM&M(W7bSIX|VN9tHvRITlvMCu@{ zmY3{qaLtrOnFeU=(;u?Ingd8Y=F=@d#HYR7dyS# zx^n+lp>fTpA$@pzDxscHz(CH@jX*YPhXUFF{Bde`{r;(KC!w|J^6N`-L zgEkuE`ag8A|r?5Lg~H9m*M&lrIQKR*@Uu;4jE}fL5ihI9}1~ z%S0(bM}kNC77aI3=}xgMB$gJ9jEx+OJwMnQx!lLwV*Z~i;uibAA01ndm z8V4NTX+dX_i>*+FbIUf$LBYgIIsj`BoO;z2^N>x(GEI%`*-nwj z3@m8J*LTiQ3h-;A9J~Fkn?p;x&8VSUAPL$5XCdhlu{Ug$Tiny@9pQ_;@KWQY%J)-F zP^!{9GmhVHbFd87!zGorkJFC>_KffYhpNww{tzF(l&kc+VtEz;Xxc+H!(p<^*()@i zmqatX%f&<-o52gmRU+I zbZL9>5SzWeoYmfWy+h+IzSc4*GRIjE5}_mQa;5Vz?_(BD&uf`ZveXzyz$L3t57mQ3 zYvG&wqqARQ(o)~D;PWd?QdIBg#x|@BDUDrESDx;8COK#GSIc)G5gFpy{`kIw^iH|F zh~H$5*LAI-fLHZ$ozN=|B{3xwb^XfXHByyZ9!c}1~(pPsd`)Av4{J_3D z2ArSjFEX`hvzyyY1HNGTtbj-_W)6$X{-If%8gtFy&RlvK-j$j2eb1!eOz$iYpe`S^ zeHt5Cp8PM!lWIYs4IJ5?S7sfHLR zeu?P*y-7Udg&*Sd*5#j12vxqbSE#I>e$q;U*e^~ek^ScFjG!jmpozuy0;#`2dE^uK zS$Ir-<4n`hqDyIiQ<+uSpTFr*(~xcb3XIppUwn0DfK?q21D1F5j8>%;Dr&6{tviM6 zDA8dd$sZ;=6I#ni`0PLTtTu0JI{$Wn2iI$7HE$hFbl&KSZy>%rsI%=|F_~^?SKzK0 zXAgevtE2Ucw!Zs8%zEj(tQM~4C&okhAJjf+-kQB4ui9;%c!RLprv9j73#wp0I57ad ztxOfT@?9dtOl7$1X)AMR<5*Wa)Oqzt_(|4%9_)q}A>rZI;j2UXryH4TyJ~@7=Mfyd z-g&dx)i*tmF-Hl`CKa9UAXPzX`Le5m6E#vkEm@8Hb7*Mz<;xg)7xrCAO2kPL$N+8fQ?L@d?T7gZLrM?^RCFbZbdZ`zf45mpD2Cv-!f(f@yk0dkMu_ zdE4pccX={!yC?n_5z{4=d$ME7b;u30H^RD)f8(!F`sl_iDJ`p|or#pTOL!y&O6Sr7 z_hz(oV&PtD8U&#M$}8{kAB+^-RdlEKP&ywTZdOiK>wGrW&T(7-jRlTvHR^i^dPgim zp#?&2G>x#yY#S7tW$R=c|@S0shW{Gh*hZb9QnR-rt|%cz^eg3_=~v4?jQc&sH0wC`z0X`YwJkRsW1ie|<4f zRWB*Ia;Y$d0Qb+C;#}N>Hq98wo^z4MVzu55y_h6_9!bS2$XG^hA?235d_SczyX@!DY zQ%a~}wIp30%C3ntkP5%_l?M_lg$5zQfNpkbi)dvm>hruJdFH9KxJO@q8>1~3cT9k@ z7vNTNZqKQQs40|LIjx6^+W!No!}$1iCF_KPdT!PKWetuk@buNk!oT6X}Wmi1K8KVQ5_Tu9>$F2d|PZ5Umhd#DWdmgj!=uRC&Nw49eKYCu(@Y z!cvVj8YTiHOZ)-tO*kgO=Yh`h8=doV`5#{x6Z^}lUN*~itqn(-EUC9!qFO1kwhro5 zCXmc?n#_ts5@NVR@&aW!;2gir*30)?nMoIttuP}vmb^1*ZdfG#!_raAN(^87H6g^z&N$P>#g0e1&|Mjm#?Fnq`j(=9aivse=QjGb z%0HBU=Hhg{K$KaD2l+Hw>OjjIMp;udN593_zNG(3cbg;fy4>&UL(Ke0@YarX7K8ri5nE zwv<%AQSLj}@R_?P=)Oi*KcOc|r|~8-PzxoUMJAtV4jIo}o_r>aoXz;#44A#qu2G*t zH_RpoP(y?Lyc33^-(bx^Q`OMTE7GJa)1NOjAq13!}`eyruoEYw+wG; zLAL_CGH<}pnxE9$U6vprm|o!>9C&>l&ox%kAD>CV!^Y)*_8iFa`& z4CZwK*(cMGV#i^xM@wt_d_pJwxD!6EMxYFH;(#Mo=i5!;(dWRQBevZ$uhP#37x#gIlFb z_M<&L@{N|YPb)?m#mV5ol?%)Y7q#vh@ux$5im&cRDDVITcg&4y zRTgAOnWs{VObqmA%>pFKYupmY%-Fh^?i@&;TG5*AEt-g{)Kyl57H*$-*n$JBr!ly<`Tw* zwZpYB0q51122`VbSj&Gp^S@~g%Xk&=`aTq+sv3Z|#xe z0d~@yg@B$JzB~c(lwg&QHX^!T2KYEUy`wM%-UiMDwV=@z7IdiL{smxJb6?qYbt-rH zj6;W~>^^t80M6REtmnBis6$?R2$=tZUkAEBD#uJfGM;SVZSL+60{Tw#yrg&g!WsWg zBRNib_xpyXP2t^Z^e@1;b^0(3p>{a1|Lqy?Y+Cv-S7EERMYYnO1Ao5JN$0w`Z_oB3 zG7!Ju{-qZi3~XmTI-bu(cXf&;$P48$!9-If zjKW$g-(K}9e3;knX2h;&x&O`Ka`4<|1kS>>WpVFRO)wigfrkx@nj>Nk-log{%tpzv z4dkI?gI5}Si;1-6`B|tjG)dx={ugYkC_6+KUX3fnE|;Wv5WT^N4sK5kK9qi4plPZB zY{TlD*@Z|#2#1(RRczk5{@Ity zX6=)ucpH~oK*ujD^5ToDl^)KaD*ha5S&`*5cYUSk@$Tt&+!x!hiR^eQ7k0r|!|}eK z1bSOTAXJAdiQIiewGSA@Hv;_!XT94{6UerI+vMUQ|-eP zLJzM<&r-U;G1WcW^^~H6FjogRHmA>B?FPd}Lo{)&g6y_@J8|x%!gdfkrv|>SK^V%_ zM~z?i6+AfARQKp?PhQxx9g&Q`pg)T=#xtPpcz?H!xK0-4xNeB=3xwgMeJ3CWa#>#3 z;CAq`_be5_VJWa`;n+isZ*V}Z+Qt+XF&#U%XG|iRQ$$=c0NQ=sPF!+{vWr4tkOw;d zD)q`8XY5$e&M4v}+sgJRcdhZR{TafPq_OFP|HbvsErt0fW7V3Ujb)K$}raezjwb!OYXT|KQHI%O^8p| z*;-jq9A(&|$0IH+eqr0?<{r_Zv&I_(BhnJZr5@P0EX*z3nTy=J9oQ@PB8_W#U2kzF zL3ZzbIzhv7eljVsS|QaYss3Rw5={>GxyP@uc#tZ=W9>KwW31QI5q^$s&8i zTDg|Wzm$Z44WYnP&3m@sKX1qUa7LT{Ami{d&hnz_vKAS*v!Zl8g>xe{Tnhpue)zc7 zv!%L*y%bk-zUkOx^SCOb7<9|ON{90QE=Wr3_ zEx)gAkIt5=#$fOBgSV4nK~TiU9FOS1eY7eXfvE*RWcQ`)3YMR#Cftcf9HJsEMlJAu zeu#=h9@(|37sn6D!Z;coWi+h$F{dZN?J=XQ!rXsH! zrw|Ooa~|B}%@}kxW^3(Vasr$XI;WR<(;J-D+Pbqd&Z_T4r{kY}N~SU+q@nZ9u!oaV zS&?)J%CH*9P(erli27|Kc~cxVvVhpS^K)y?`kit-D~#2h>h~KL5N<=^=z=e)eB<8T z!&pwms5xNxB2F$g7Wxa@$HFF-*D;j@*a2tb)LtJ1^#qE5QgfCITYMfUbmMsl`pNV zw4DQ2{>gXa;;0X<*k>eZhxIrjPnRLNCY3B5{BG|)8@#?zZWNfLyZ zngv`~=-LDCm`rLmzT=ImV}H^%&1zt3?5`V8L$uwQiQ`R_Wtpx6T~Jh?MosJ-u_~E;u>$iC_HD*1KBY_ZP%nL zFzv`hSxL$u;_T28+vNY4sD?2>c4JfzV9r&BnIKpscN=wu6HCuAQ2zC#&2?818 zj+4>^7iVnlU#z7P>9UhozwkezFp@XqIXV%SRmSDz?kv4Av`3YdOQx-ETuYHH)B$|h zMxFRLMQic0#!JOWq#lCm3)t?_+(u*CC2y4vxm+Aq#l`#RWa@I=NtB=Be_IXWwFC|Y z5Rin^z?2{LUphP+GhO3<*M0Nr8Sb(JQ?v@a$3}l)61S(rn}YN!=-(vXM2%%(NEgv% z;bh1;T7$B~QQnffWC%asFphQ+vc~(18;q<19vwFvAHU3?VX@76PpJPcjVu-#l36?m z6~kLN9O1{6TC9GhW;vlL?_mwFtW)!uKkw|9bS@NjV#RPeB^r}iyq)DSW0b+s)mqfd zXn(w5JWht5BXC`t!l*W6TM9kIONoLM$NP2QX3xZ`V^6e)?tVX+3qyKQg@!c6p-vzo zWXqHm#h-F8ckEe(Oi#-B)h2-bbFKW(I8uGuevtHY1)Go9u z%z)}2njlhK3bq`CzGXcXcz>~Ja^t%Ug0#gAWwr#zMSp=O9|c>74Bo`{ax_p;1jEVG ziMyntqHc~mm2@DWnD!VPQ;c`SCe+7SpaM@nvgq`BbPnOfeNihjnh0dzuO;>hzhTT> zv{Wjo&S#$*M?a^5JJc_UQg|DSwcYy9lGWob+h9(PZLD}^*;8#6587$)gbRy@nl#)T z0`{1f#^gd!cio`tah@`(Unlx@xI+I*S&YM}#zo-(p6x>=8t71w;~~gF*bGpXYE)DZ z(4nGERVn8eLFFb?+t%>_DzUA_{4}ciTGvarM$;lm%UBJO)e3Ztpvd%ayaYR)9B>M3 zX@|MOX;}-DzoG<}jFwCm0vem{H(CT?cU!=fvG?f`>j3tq;eW85y`sZ9Z4UfFW!HXrgV0T^`K<*Czfx zr=tfO#d{7@JwSl!jOpUt32w)dGQagP5D2F&_nZ$%KCJXCObd3HEZzOt>+y0*c4vni zKr{AWSJ{JJu%*$+NYf6#{BXgHst5QDTAUui=I(DLeXHT^hN~diRg-|>eV)XZBZ+|K z*8Ah0`-PeDB_jteE=icL+xf=o=F6d@3Rc)KwCt{GDgDgn5IFzY?lFGnL?}~4bU&y5 z5a(2=*s%;-sYrGzWPlBxg^j76ovCuLmH(OB8r04xw$DxSq~d z@66x2nmf4Jm^)j$aYN|dpb$fx2yjW+{M@LaHQYC_dm{GI-DD@?{N;Pr0pY?nDp3i@ zki^`{*w~mPd@l*a>IOKn^F~2N{EdM48-no^jR{{~mP=0Xe>Wg-kbd0Lg3jwdD(y}G z`y@zi9vTr1eDexK<^S2q;U$;#{}E&-_gB!f|E!e#@00!!Gzzyq=l?Cp-bF^?{|K_R z|3}b&R@(jdN&g5cf(vr|_Z|{F{8q32uOQ7NX+~0!|Ekpbuiu&?3>HpS)^E+-Ox@vI zdbpWeTE267++hO52vvNI)`*B5Macd?+j{Uoa&$3_kl~vbfXEtn(2$r=5D~Z#5V(?f zpE5zYgwQTPkcJC1CWs<8S~C=+hxYK8@e60F$oBNJuw_mhP^Dq#&S3Nq3iYcioN8^S$4D@9(OAXU?42`^;Xm_ROrc zX07=MhYE&;&Z&WD;hL;b;8DQjg5Nq&8z@d@lGRxg3iAyToJ><-^(=b!=Nen&y>4Od z_6*nd1gt40a!)RbKfn0v*6?Kw4Z?x9E08rSbu$-dgoc%k>&P)&lzaN&{ZcqmUw3w~ zUmwxNhwmPR0z3;EB>e((ffBR~)*=~Oux%Lh^gFbwf^X%pNQM_NB)|*XAJWC;KF*zM zqOd<(zNi6j)W^Z_$f6DGP{!5kKS{V_YQT&Q_@?wu>mZhcn#QhucQUXQi$h)67C$EV zth5Hih2*<=!Nr@uc0%oN8`l3-;MF;lz&@WET-Cf5x)T|@tNbHUY3hK;4SId;}EKSQmTyFC6}JBVKiv{7Ok zZDl9KDe&Mb_N4u~bntGS4vH(+l>Jre{)^aH#K=E@5Y0cckUT9yN=oSDR`dpz2Ym*$ zcT(0dk*05Y{^Ph^zDG|CWb14isBtri)XDP%7=C(6D4+7#HH zO->h~0)hWwFR|!~YG4EM*gX5vD_E~>z`A43}HlkfL0LwJ)Tr2%WpDAf2~ z<8cX_n>(u(5}M3!cg{qkb9G7Dx1S5M9%V$vUza%etk>T7YWJTxOeW`6Orb zf}p^y)+mGsPR(;l1`@FO=P||?oph?XGbic-Vac(-jJs0c=HLy(P@4v;9_~v&e!=t2YY}6=I+rI zitq;>5hnw18CN3iB=TKfI>|V*lm3V@TyRP7R9w%j(BmxpHe3YuQIih1vhVpyn8%Ud z9$)uge`rK*dfxQ#%rD5UVBfoMKE_!AuTSE)K6+g@37buDq!v;cCb*eyiD7J3lsvNx z)@EC?|Goc-sY)}pDR-?G{?a9CoRDyJZBS5^`zN{!!m2R7QIKKDs}NCMafj5FV(ws&{c;{SEmV~3O9*Imgi`SM z$Q3`y6_1|Muz&<&famvtPGHZO!n1#C@MSMfQ$kg$r~|*piEf*LuXhhF6P~h6jR5=v zJ~|^)Yf|T*rQ&C6Rde&uGdrb_7Jv2c$);Q=ALUOwN7l8rxD200W^}j10{x@oT5n!| z^?rumE)M(w-w^c586ae`+mGCXLten)&fLjsVS$(pf2Xk*7BX?gi@dOaOK5j{xpri< zBWr4G065dAh^xPN%Rq|!VBSAdX8WP3!@Qbaz*aq zrgZ)cEux-K^!CFtLlbvtpg}da}qahIBMh`QV;rSJO@87xkW}#q;U>^(N z?ng!}ch1Rru~3L%?c=+OE0eYIqmqaVxA%WF+@w-$F~5bLC7*ZISBsTAP$P7chfVO% z#lu6&cyl7ZPQe$X9j;1QW0W1Cr0d;1^=bV<=EX_MfKSgYkaCYYX9#g&C@2=761pIU zlC{&c!HPwO1uUI^-D@+74vTb+?Opyg zevkCLee|u})Ldufp*96OmSh}ogb|lgr;!xmCugnh2=+tqzvoDQpSHe!j=mF>W|TkI zd&Djv;gsid5MRxb{*wMoK&Ww2Q1-ijh`?ro3F=OOCkfX`bIM3iV=pur>XJI` z&HzgX`_KLwLNsH7y)-86=wM?pYC-F)*Dg-ZnnW0XP1O<}=-B`8ky&LG+UD-QPIA&8 z^$72s5|&MM<(H^Vv(K98%;slfwM@6ng^;IIfDvj1E3R;2ySCQl52WsTLc@}3LvbH> z#1mj7AaC-29tvnG*rYd3J{~j4WWbhS!DI)u=JSff)?g2} zhw7|avggPN#1&430GseuV41)XAeFs;$OOM5#|AcH<&=CL6)LPrhuvca{H9yFOs?k# zS{J*Pv|586Bu$oOfh6AKXtd{3dp_gL2y7tsw&6Xbx1qaZjTP$vG6`EN)e^Zl41dZR(UR^*AZ#uf!I`~57@me0ko zGRhfn#UMHA8JUdWpg>voeI_gUHvvS?9QUbJ^q?!bZG>VjJ1k1$ zOt$7dNLmB!%X^5oe!C8W*BT8}ZoneUUTe)qh%l^W077I)`vp+O%qqZN_)Rpg-AnQU zwb$$sG(fj_>?U zk)+z|oJ{LvS{ws^f&I%DW%CyE^f>|o5TAzQY~{9iZ{SCUv1e3{Go3o$y6Bq8s}=ZY z_!re+3r#ccdY0aapr}v2*cL*cPoJ%)pNf9e^r^o_Lz!9J!>50V_SL53{=MJXhp%qu z1>l=0f794mx8|TicfMeb@!Gz+T<&*x38bJu95$49v%$!Z4x(QZ9N|LTJ#&o7NqR_0 z=rK;YLJ}ws?dD3c%}*)+)P-+qZ!L(v;p3_<&=d10-Bne*?QZ?MU(M^a#j^@Q-}38) z$*8g*8Tbz@D|S!`I&@(oEt$2+7kIuV7vP_8Eg; zrIix7ztVbCIfG5E2mfn( zFv>~vv+aja6t7Gy5j6g6`&oDY*Y=a8@~`P9u;+8`5!q5ei#HgWA!ahIm?dViO&#`C zIfFol46yx#c>I5CKV;*2W|7DS{7{s zU@F2fB%Ds3FHS>NtrP(sC&y>iEQd#L(ZzL>Hk1hu=T$_E1r7X2Zk=T?eTSfP^PiXz zqur_q%9$G%Qr=e|R0bIQnNG;)W6!T_zaAMMX=+aoeJv-EQ$gX}l@hnsxQ1&+(a;{C zw)ucOAIi4T?4)IRbwfo?aW!dB! zp(Sw__$n22i_3Q-j8*VNJM1eh!{6$qchXag9ZRfLgmIP3>8kj&_ zh~+67_U_f~>kKO`e^Rz+t@u=ewArf6MgAGg*r`-$AaiZ z$AM91iQ4bOz>)n82Ul75qpEXfWFIHp>)8dpHccuc)HPKV=bO2e!LJE3V)4aaZ0wYr zy6;%J3rK_uk|w0fflXyu+y1P&6W_CC5gai3K^P27jtl)2SJKB*ajffpJq;Y%19)7P9+sll!+7k&m%Cm%H%z6&FgzyL{1LDRow8W#kq(~N6 zVz52I5vC#GyTEo~M=7JSQpah&3X7OzeOz8F&M`;1^;vM!^m$*)4jnHkeI4dT#)iLL zcj#P#B7p&-o)?vhWrG>D1$zU}Pz_tGw`J?KmDLuG(gEp5Da+jR!jFdWLRik0`R6A{ z9s+v|wK|e#mLZvlR9{oN4{Yq+Jd&#i8jQtw0bX%r>p>m&e08{T!XkL9w*8 zUvG;wkl$tpb}-k71ie~-Q>IMyd@+_wlf#sWMH_iLfES*V>`@On{mQ-fICULQsz9Po zVf+JK#oUTi!+h!!hT6asTUJhewP_byBWa87CvmXH4Yvxv1%}H0RI|HK?EtGrYdx&P z!ntOB#^gZBfR}8Q-NbHf%J1@Btx5e0UR~w`9A<|oPNz!5sQrF*M6P#ev$m{#*lNIj zIv{iuEWcn@;{n^y;9l?E3@e(k;I?+^%v#^)n(0&=DHIn4CKo#sBCojYV6_n+O5O2= zcQ3$At<%$OI3KU3Afw@8P`Ng8P^a{tk_{UXiE*+b3pZ|$Ha^xK~2bLSd<3J#wfLn9i2-2N?;y#l@m2xxriE8dn>}Hz zcW~+wq_?kBC!L7TJBmobth+%?>O~*Rb-xJgJrjMu4=5?#3_JYLj3>jzecBv=rc*$L zvBp(oOvG2sbtt4Dno4blf>|c#A5!6&6B|q=1ne|zGsGOWq&VxRro7%~@F56?yfy#& zv)F2CYJ3D&;)oNsq3LrTJ|9(oM33TjH^0?H?47!_(EX14n#VhLW>3m1j>))w+H?nS z`Rq3gGv6lWmhkM-!9MQTcO8LBaU7!=FEbGh`^jf`NT@jVzaRFKX*PrfoRt($3~}u4 z+xOz=7-)D*{ovNws29UnKG$k_>xZoedB~~wV&z1{;96ehuC>#M1>>>XnpgVP&8k6m z!%{LEyWw~6XH%$daEq+eYy3ZNwi)SOgLSip-Sto`nXSftjtpB8D%!z4?9bWUmVQ2Z zfn+>hQ&mKR5bdj?QrDz|K?kaQ6XgEIu3niNY%MwL^5Skx(3D?1G%Cm!D{98423a5n0GzQt`_NZO+SSm(DiLuG8P=8_MrW_ z8a{dyJ3+hIrV2_T{RFASAFq9iDex&@L21t?roiTov0@bE_LV~dvzpU= zojv-rb4W8NW`|Z{+>f(qtkK!~bZjc8599$h_7YCMWO4paGUQIG4fWZ$egq3Mje&ui%EP>`8>kYEiqs08{4SRHPF!@?JbTs=UjAjOr<|=7;|`9;PmS* z$1iprepBi@4L z?bz+E`zbH$B5Arjhrx-AV%c)H%n)MHY3q1P=FT{80Vb8?qF?4>ypiqmo9rt4M8_4U zy&jOc{zEh?)qYYg;k}>G=f%aIfR%JAf8GLt3r?DU=Av~W$8eHdJU*E9#qw|#GxI{~o_k!V?crvGr%=R z3PivAl~lL{^!12$JenHN`#qvtgw!W2wc5*ki&-tFe2#d}jGFOBmYI)G!d)l?4B5PR z5<7h+aR?Q*gL`G`SiVNh>%6opml-mnmbNuxZmvzZM6C>|#dxY7YMj|R#Q?ikaa9d9 zu58uK%bCuKch`kniYbbUtiQ+z-03ExNY8qcazPm}_g(snGEqt8j<$mqNFyK2j9l)&Zh)9%Y`benu}swuJOUPsHvlsJ^JT9{F;JUxciKr&Xtc>~bhS zTb*abe2e42BBOMDHYeNBmuYcm38iu%P<3i=;wFA;REwruo&`R1Z{J6$-fBnNYK2=q zf0J2D5?JhBU-1OabfSXafK2VVc=MfwG8@6+NuKkcUuJMm(=tv;zOo#Ut)CM|v!keN zZe>$@e>8F4@Vb{p)j&&N$oYXnof7LLss(MmrW&kJCn}ir`KvUGc~oVcZgFcpHbX+s z7}Ac@AYRfB5XTX3A|u*cS~)@1x0vy=#SZw2m+X-OF1TBtHo2_q593u;W3DT z0`KplA*$0)rg!fycQ%T)?>c^Ydh^r~#~l$j`n@4{eKu~>u{loZ9?I4mtm4c0P~{dz z(AQif5NV86_QQxZPwV#a<2!PnYT*fSjUHG~S@jtCfN1%De@@{Tot{*$C){BqWjIxq zAmIp55La=K+adwC{+6v9+sYbyXSE|sMr^W?}jb3gWsybF5ZKnVF|Q z6&6J)NV3_G>I<|FT=gxU{hlVat7u@;qlo90|Biy2iNpNsU|+Yq?-ed_M9quO6bzW2 zk*LZu3xYmMAU z!gQ$&Q!VuS4j<}#Q2hXZn&y>?6-CD1FB88hI#!6Ah9`*;Al1_-((DnPQ)--$qgi&aixi5Pyn0Wt z@VwkbyA`}fuPg_Y?d-K;;qTuB3mY;TQGBQ)N*t`EAsdn;Uw7*d92$p*Ir5;Dww{yw zc!V!7QMDEW-jy)H=2sw?%pdJj<0(?FDr>-(1+$o~LF!j7L{Xa^rs-LZRO9NDP52M+ zp^DbUu6`(X0?D>?0@Tgmw8GFd%R59y?nwhfyCK%ubD`kE$cL)EWAn2WJk)vNOHKAS z5l*BAPVg$*0S+6(?>sea&r9lMgWIhCU85)EtHlWM@9v@_GN4n}OrJrouM zclTp=&C-2pLX+Ia^%s@5r1cD!B-oA0(_=X!%Uj-gob>cf@GldCtvW(h5cDglipf+h z@{sp~pytB9Fv?+L6K`LZu%OD7lZvcNDa@mq=?zxvkd#?V+!XOm6HkWfSxYeZ1;^~D zSA_d|7}HBeF7mgwOr-}}Rx}PCGK{pwV9HE7D*P#R=vVC;$DW@5hSx_!m1#&rKKCtq zT<%VJz*@A$u1d8*#m5j;lscz z=FXp@BQc{*qowGdp_1*|9^?n+b7hHIbSkbp|IinWgCiDSEO{e z@iFBuqvN`|%k))xy=4{NfvnC{R4@;7xPYc{cT=%Ya+Ew+#3An7&1qw2IM=~^MC}mQ zj*Q5T+O0r0QKWIGa5Q`ZYdb^WZm9#ZDdTi$amhIKT|jV`!R74pR!jp~Q5t172E(7C z>Xya9=+~`n;4t$xWi4`>Is>j++cngf3XeR&A_d*MJ({@ol39(-6u+d6QPCGTDJCUNFHbt5%9=I+8wPtq79 z!(T!H_F?8UZ)fzK;74}VEw53pNWXtN6qs_WH0M!k25Z&b6>O{bvw&le7QJ3!v>x#i zyDodoVD4CdxvSFH6ke+Qhu&X?3k^K#b~hNJYCVbshZS|da*X4L6~2^{lOUKCf1Tt< z5i|{7*uKQL=Q=aqjz0;$)kCBqlL>f zCmT_DYrge&)3;|!B47eOwm+ z8+4Rb#PU3g7(cx$ZG{trj6G_1 z*TSPqCu7Ke#7sN;p^9TG!xtnJieuKQABG_0ZG7nd`2~n%oV=e9=Sfr~DDW$)x}}5O za5`1W^tWh~ldm8S$AvMlKzO!I$v>QPmFL(eD}8^KLCP zw5utUw(_~jDXW-6^eR=pLT~OSpI4{)vzcyGr4%<+8bdOA&EOfdd4CUh}*oGa3toV6pp|8xUD9mIa{R~?kS>*)<0 zBaS=KoAjrK@7R4m*^5V_0Su?gZ>rqmmqDI9uZ!hG31$(7DxA=jEkl4+Q7E?CK1;ql zLwlz8nN-@bOF5^5<{@jvob=`#{j1M!0eKQA!$u4l?^?fbFf!SJ%e9&AIZ7j1FWWu0vNR zYHsRnuCkkV$P8MB6)oO+>o!?1vFxzg-7FQ@hb&TvL3Qdp4vdWZ1L1DHaAL`5@=ZL( z=0ND*505eRX)QXJhf9MTlm+wpg$1qL9KT1Ph_v-T+q*Rg5mSkHz`+yZP$fW7zzrL) z>d$L9VU{hAh=H*K>bLX znz*!RE+er)XqTo&n)Tbu_Z!)WKYBkMnc{Wbl z(bsl9k?&{OfS+o&o#t`8;&EAs7MhABOeO6#?>ry1+eygG4q-|Jmu8xTdn1}9^>EKs z61Fo^SUWy{@oS4{)14-b3HID9lP%488=r%X?S^-3dh<4E2R)09^roSX;Db+3aHX#E z`BPJ1Jr2px*?HA5llzLjnm=<%ba=kD3hYt}eY@37AB!U~HSo7d1WRIns!0>yG-1E9 z(Ys_c9i3L%~|M#^Fertd|Cdg+z8D6fw?;~KL!589`x3EF?xzD`M`asH%a|Kq=ts0r zq2s&$b}GUKWbv>?HOqvceyrk5hT?j~|!n~fw7uD=#o@U1y2(R?nQEea!6mdhJCC%#QmW-1_VMczgQYqhT$K(Kbo>f zfWJ4{B1#*wVn-EUPFOg?UaHi869 zBRZ=c`(i1EmlE%d%8O$0M^z_l%hq==swQ*Dw+D4X=VawnW@s7fb){OBxShYFUss=9|i#EYhx9o>TNaIMyo zaQ@93v9o(&WJgOF&jcKz{oKD2DiGH+_gO*}zFbvPDb28A{6c$PJ9)!tCac2Jo_uKO z6g*`iLciy+doSy@RhFPd1A+a%jt&q*aCm<<+vUaK60CTg`W0Ea@F_8ilbh8|GX!2N z4m|lOYR!z)$Di0TaDsOm6V^_HxuG;+%4RMi>6C4{iE*wnj%46qt-e*J_Z{36?yewFAKPR*$S-79yIE`1q1!Fh|3e}jLWfYNp4s)%e5x~YT2oDq;sRH zWI3WBs@9nNk9*j1=XsDXm~41UQlR`@}E4AxlGunoZQ3fp=?7E-hS-J7<;RWz|z?DtYZDc{`#DY z2_~>IhV}`~e(Gu2M@DSd23wHZgy-6tPyS4N^}bwJBt}0|dO=8irF4cZ~rm$^=B}i{E6UAv?{9rp#9tKs$0GDhGeY(^jAJ;@3 z`A3j)+!9;2QT;oDRos+CYQ0pkSFH5B=k*lS8e@oUwIbxG*=2ZZ@k2v7^DXYjA~>3l zX^}c344mr0-WL)=PEy5}+CdyqHRIgBD9eKLG;B_Y@b>S&euTSX>a7dwc1}6cUsK+i zTChNX(}zR~frSReeWk^^5x?D=hvnC0ht|K;p93LnvJk7Ti;WOh2t(a6J0?H@v?f_RBm4@iC19_yA9r zvG=*K1lo-cQxk!|O{77MH!1V}9w@{XC~L&_MEjg_&0wl%L9IMA=UpRNQ;DkL{eY@a zSF5S5B%ZQnO`)V7mtVnfn8juHLKqNEEorP`BQqE|Uu`$8zL<0-Xp|OXWq;7DXfwkbyNSnn9tCS4Dszd`41++?%7IL5<#lnBZXpAn|Bu#2AVej#lp0LTs!8 z7@z=%(l!P!M06Je6&#@MPKgGho@5Q@eAWZ>V9)>g}C{Z6& zyT0wyQy4nuST-w&{VIFZdbkqKpv$!1Ln%@?u=uoChk%yK+^X^6zEr(u$4y?W`zv&q z7_HX`e1hAXlyltri!LX98GR5UK zW3pg~Hy{H%@W~@^WFswXlA?SMDVhH}#qJDW)B6_u&?E7wb4yapFMxP*4%JYkw%o}n zCWer}uEyiM7&_#npcGjud>c)00!ToCHHuhvs!jFTr@maAZ!HgPal1>UFGbVnRb)yz0r0kR@bSXXZwzUQdYaMibk`Da`HysE~Zs2H;gse z=_P@ny$FGe&aNEcMJ-)o$U(6we&8^M;A(G)*de$HY;ncU9V@%dEjzUcA9gxG9iWjv ztd!K&dRLXmSE7UU*T^(PHTxA*7gqYq^8kZ>y9f%%#bWOs^rABcnX3*F$#M2AzQ}ca^X{VJ744H36 zoBC;eQ^<2o$>i)*t;GpkE)nvbVPq1YDs1-mKL*qu{7|Q0sOkBZO9$1dCEEg&qU<~) zbrPHg9hmcqI3q}0?&CV(O~*s&_d*NEH0|0Bpr z-4135Wk1g~O}tElPOH6=zQn!Xl8$afBRtdG$siUqJv|Sz^|{e3s<((ykNiL*^Spf z?q{^LdM}1I?)1L`1~;#>68*KmUxwLOJ$wb$XYG>*mVKWhr~gqBZOWEDD~TGOl|*GU z6*LB#s0wYz8Ar?Zf!Bx2PsdyL2Szuv&@C!V?uUBWx?Ow7OI4!?Q((`V=QeuxJH*aHm< z9B~AXlZ=hd2^B^_9fw1RHx6-t5Fn%aL$Gc@cF*C-YnxC|5fB*a>CdM-@3w}(*-xx+ zN9+>!$8wZL3V3Bb?&gOqqda_KBM!Fe%+1?u5QJb%iZ{cb{n57T_%xKsZTl^Xm4scE z=JAR(wH2!LT=Dc=ONVJS0kRRS4wAY# zr^&#K!N37`?xF~TIDR)sN$C8U!E4B<0R}Z>B^VP0EZC15RK40I)OmN$;B#B~L`(g( z<#EUK>}&`*gZcIjh=03{1Jitn@0 z|GbUP#0ze=+jk&xC}A*O3ie%_Jr_ZjxqlRYXX|zM_qE_cTZlSwJy*BCB|Ej zUrxy^jh_orW!W;J4kn9KV{GXsOnyO15CxLkG;#)DkK7OS9)LaNjn zocal8)9j-;?SEC37K@%WetSOsgkl>-eyMHd#V@AeZ11#3W@9cXKlEKLihItg8)%Kq zEYKRE%AbXuq?sWL{fK^HSba3TY z&PKq_aAPgaH0}OEIx4o89&gb+N z!5LYDCVCdMh&%G9Wm@%xq0PtZfutCD{x=v!I7g#Mp{XloTW<#UmOP^KE`tPR$YJ-geU*?{49(49tqUU(OGWF(6jG<*} z9%sWf`-|hf%D&Qpu1Jf-V z)szDH@0+Wsu4CM7o0a!%{Aizi_shKZLo}Dz=zC0I^k|FfBG-%v6`QZMqt}9!-m(A>87t0ypA z%0-3o$l&(o+K7!;QJmyM@06r?i1Nqs%+}fF^7^8G9PWucBDdO1TpwP()3nx7)k-x216Hp?3c++ZK-yjYY z@Q@adjhRuo&gBh8FCYGJa$GK#PIKxI?h#k+2FuI9%k#sN@R7;y@?A%T^-9g!t1b0; zUF{4VQEfh?kyf^?52<|?cVo@-rW{HKn06F{>16aTRa@^K!pP0I9ykAJMVwd~mU=4n zeU7rOqJ4hTfNIt1Q9|u@{$3kk;V1Xm>%*n}qgDm8V@^`04zbrl@Z@GC%J?*3K7#zQ z1d@n8!R(P21djKfJoj~4t2{@Sv3WV{Mh2Vy6*EXxz3BdZkr0JVZh|jku4efsvw7c2 z!f68^u4F$NuRjp*>T41)YZ{IcUDNZWSg|J0Yx>I%L`U~++aNl=@`Nlq&+S$>i@YZ0 z2seC%MO15E&zg`gbz=!MbJQD5Z;&}UuD5W#_jq#?CIZz{Tp}fjDn0fdXp++$c8}`Q zKlvpIbW3+02|Ccm=c>(n!jIR4b|;Ve{H#CZ6ra3T7ZZRnCe~|L^?wHppq}@h@cs0I zLwWDh{WvU}y_`ba=;doWPI&UD<9DG7jLpES@k6GBID8n%quuLat(0(_eG` zO(7Rk{Qo?>)c~8e82ITL{B$c(-l-GDyE7q)hLkkiZQYjt$PT<6);-DLV^QEH`yCX$ z`!n)Ke4CTP1^viI`C;)_PDVjoUqaOOyjY^IN;ituIOaSb#{8R_d4rJlhK7vwF&?WQ z%vK8{0wVp}Jh9D@gx@#dnQMGi>Md?qn6dWHo-&@;cV1cmlkOZ1!FoFTYR`IKmZpBh zB60vrF+xkPlTt`XqE)IoAF*itQUk7D`<`u1W(hq!#)5Az4;CjI+pS)*ECgI1JYl(f zf7>I>i~GIq(k zL1Xr5xlG!3P|orouQ|?GGv(%3EQQ+G`iHkMUfZFOOZT=l-o4z4LPZasTKss1zaz;hKha#||J;6iaKcha$K;W*C)F8L#$e0i_YIG~e${`vKWQ`h)9K^=X z2S^*J-a_0de8_x%4=~1jF0i(+v9fj-V&mb3=+U6hVKB1`ym<|jql)?nF+<+JM-+yVyk-*nRq zfs!27`P_j{9IZ1gy$5BuL_*_iviaJc+UNMDzi2OO$}s>1dk1$ z0OJT*fYz1D68n@7!-txL35cTq>2(fX zNc1cGY{MxBC(xSXLdHU)!#LIiA}y-iUdI0PshI{G7gQxXUP9g2Ve zWZ~dipa}P9&o6fgP!$0#0R|3&lY=4+QKS`N47UJ6fWW1qgCXI~z>C|{jK&DZ#s@ih1=54% zgQ|Lv%>T8a6wL#L1~Z=t!T86Tr*Tja!zheHg0Y{R?25( z#s4TMK6aUa8J>@1heGUHkpND`N8JR5pg$m31XN=&4|gXGA4fCDms2DvD60YH7(6^& zhYy6}JHSCXUyx7}KOmw*c|RcighzJ;?$K%U-oxEONE0HuhQt8nib5KIM|20uyCIIi z6;R3~ByTu4UM@&x3Q{l}A1{Ogg0$Rp4}wR5?I}iRLjlNv0t|o{y~dIjmZl!|?i$uk zUJ#cDBxVTf3=$SpF$bv$pwQ1^gaRa>EMmqp&98B9s;+5B8|q&_J)~FfS30T zH`hOJk$od7E@Yh=jSR%b^Y3fK0l`59(L-M2A>%-pQBeP{SBagS3%m**`JuppKGg4)7^|kP#qD9B4GK zZN&&ZNYCp^m@`3zU}v$OrO5KnnaWJor73Ne42z062ks4UlpH0Dc7S zE0D?pPzCb+05X8Q7yxwu!ocSX0OtVi0bByO1Im*DBmqbO5Dy>@KrDb50MP)V07L?a z01yrX1BMR)GQj{o0SE$a(hi^lKqr8106hSD0sI6o0ALWnFn~4yEdZX?ZcP9h0n`K3 zBnCw5R3Ie^qG8Wz>Thf^!aFZ zGyv!T0MBdqj{txlgvS8t<^bt4xf=igKMb!0TuTF#1C)gQ0(=JY@XwU&0$>Kf9DoG? zYXEit8~`{0aD4^*=LWzNfENHC0R8|10e~T_d}zd$@OeP~xz7p!6ay#$0Q4jLbN`hC zr~pt6pcMc>J$Qh6@BsDTErAF54PX?&7=Q@?(*R}w%mSDLFb`l6sLKec;YWLk^W1aK zJ(vjKZx2Fy_|ZgR!IpJXK5jC>zkR1xWs63g$b6hTuJ#Aq%X75 zZ;aV)`SZGbQO)1f!<}kGfluQQ=i9LBDj%(H9!{{+Bfi0W0k?x<_5HIx2p6}zk?R(U z*BX995D@N8l2SBJS{2e*L7Eto(0;gAN)oVs`>iGBz1)h}qq#CqXHTY@{l0_ei=`!# z@CaWXZc0Tv+@8KZOFV-8jPsk~{bDK}mJJmNCXwPi{M)VVB9Y=3GV>%tJsu@8%T7OJ zYd=k`j@#o{c7mB{H!~_p=_*spM7}LyzpA`*B0I7l!Ca>J;GVZnP9KivfiddqalYt~ z2+_c-DHHZFdU1 z&BnLAUI_gPoD<2sbmPQB9?#R>_QRfc{Dq*mpJ2Og`wy_zsnO_qBLfNpsh`3<7KiPH zTKrDfv60oD;GAGsJjWx&dZ-w$a$`JRHj{+Td$+oq;IySwrJ-+VU2<0G_RHo!zH-^U zGyY<$co_G%1{{wtjS4ZcQO;B8yuF3fe9yJAx33q~tVj=GsKrw0= z3~}LC>qmTK_KvasrMWCbkf#ue?ED<{tGT{i(B32J#4lxvEGMMNX3E1m!C0O2hX;f| zy5Q-D!%1MI7`wm!ZXqB5H!HwFeQP+A*8v_RBEH(PwksyRK?)_}*2X_M$yA_Z;UXg^ z;+?Arh@>R*;d9`YOnU;=>td4k3apU0C|aiIzF}f!=DIjNjVN3jbs$FJ;Nrr_HjvEg zs(LMY*puXDZ|w+&6jKDLgTo&bLLI!n2j4upbuHuv%o3LlWy_Ku6Me^sH3~$*;P?BL z27R&Z+s^d+?#~kB`YbZ?eDFg^`5Vk{r56zph$FqL;>>u2e>%se-ds#$i286yeq-%u^)z*R@F`%~MvA zqsLa<`i+fvVi&@29NkEPp6YAseGmNEFoK__RCup~loD*?1A}ma=cAabBJc;%3N$`8 z7+x!Xav=^Mrol$zrn?|OZV(&6-|hv2j>#!jW9yZ7mFJ{(jgyd*d5;oYyTYfN*4>2K zgZ&^jWhpDo9Sy0owOFTyY&zFmrD;Ow#draIcYH<*uc{45Q6^8Zsl{`$rWK;D$ZPD) zvcp8elmZ1l8OFTfC%QsOL;H*oxK@>0r7w_f@}e<>@Hdw*?%~&4BD9L!O4(EJX9iR= z)dp3+7}@=}V%i^#h|)xBEx#p+!3=|@FkNniZ8z>g7gwo0-pZXR+fRnL9U@EUSL5j$ z4up=$Bpbrz$sWzsZy1c!S#Xfw*xn_i)ZF#HX=dbzWUdYNeAwS-B3FF%&Vwms20Qv@ z%40o`H;{o){AFFgqmWy89Ft!vIB@l*J%c-{nP&kuu*Wu3r)5?Cj4uvzF~NQ*HHICq z9||hRe~2k*5x;mUIExN?w|T^qW45f;7&-KIaZ8Mfx#*1}gYlzf%eE|+HErW`s}*0@ zzVR1{b*y=f+K(Ff4L{}|7b?FZ9w*~?g~i(>NKtsDfj2q6UnQTW4 zMZ9wpk6V!`P%nRL`)gT7)Xvka#{N zQ+rETb+A}sW+JB!k;xW+861twyukC6A*ayXQ{ZkIi*JK#O6#U{Cka~|NXsapj2qs%X?A`c3_ za)TTY^6tUyN4qliAd;iSA{^mM$Dq4sF=O`~!aX1-?encitjj^NuPWr>($zC*-1@mw z1VRI><){GRxUUPvk2kKp|n#G$&k0mpO#e-e`jKDb-Z z{IeGE5hLwjj`?HD{Hedr?wj=5d7Aqt;F+(#$JeslJhkDo@QA|Zvdo-jiJl#yaPqqv zpAR2yLmiy4s}K&dBAlF@TlYU&59^{BMKKDuH2b(5d0y@tUD?LEYqLziUr`Snvu97`> z&|-ho@~8IUTf&H}GBZFCs7xh@(e^Va22qd7_h|ZCw|>j#C3k8$*qpn&q#Di&+Nc{o zk;$QfsbId6S_br=GA)ryx4l6J*Ifo%eC}HA*yn_iwS@ms6RREJf1%YBeYc!ZuAAp# znoVaAuRtA!WAzKlZk(V9M>nXbCGL9ojl>JeKe+opt=ga;7OGCMS9l6_X9HR0Fn?4b zty$m=Ut<++p)-y(%n?>GiqM6aI)f_Y=@oOzrhM=B6>lwqJ&4tH%k$!s zb7B+3?;`QnbC2v-f6{Ve=F;ob!33ohQ8ym2hK6YLP2SE))VOn2h_CaNo9>Fcj!!F% zIZipsGfz9e@hi6N4l0{X&Me)G_{IUxD&zw#?c_>v%(WOfd(EFSo1zRdK`{$BRS}JI z=abssS5=qaJT#ADHs7ycPUF1b{uG*`RrjLAI2KmcBDq2yt==MTj)o$>%2j zi^vmQjZ@jK7SRKB*it$PF+c_3?l%&5*El5~Mb$N^d-U&|?y=%+TOi@Fk#jD+BUWU- z@9D7-?>gYie^*PmnGzp=0P!aAgD1ukLIQVZ-Y0~OS*5_6t^}Ad^}=}=U(t6118}Uv z20puyM22+)T9R{bXJ^O1zL{$e4u^k3-MVl&VJ>sHI61rG&Oa%Pi)LNE=;p?pxPP!4 zcOB?CXEWGf+Gy3s8}?!p0i+REA#1t_ZGG^G!@gj;6qm(8Jaah1XBhs`1ri%eQ@V?{ z|E5R_1b+Yk0@t4pZvrFJ>m1T6`%@bZ%yPzEgRDU#{+pq6+H<+sE~t;)Rz&!rlIYD1 z8b=3E?k@9DEm2uRg86iVcg+&~b0H|EbPhGr;d^M-*4|F)2SVf~BuprlmdMtuNU^gQ zcV9nsbU|NaW@fT(`}-a)9^-%&uC}7wnPvQr)_=bmls|BVHt>r5$D6#Q&doQrFCVs%yKfRrpDomuhEN}Y<&N2Rpny^6EhmFZgNd`@+*?<1Q-7fdenh_%+$L|%BX@#)(p%-0Bet)K$*M3H z>!B_#1w>^8*zkaq&Q>Jzh54tRqNgbs!Jx!`e!5D& zJ!%U7c)sHqN_7Re$Y2 zD{5!O^}B82&CV_wx1b^D;K|AhJI+<{i6}2NvphP9%JP*LLOL>C_HkCt-3>}XdJE%Z zjI+mb-YsG$QafN8Dk^}2jJv9@;;%ojWi4bQvKLCn#r;VngWE+jGaDXk?( z67MuCwFUHZ%JWZ2wIKbe5bC50?UcK}|29|LTAWMVc@^-I`UG}nrYNy-V#4U6d~e%X z^7He(Tj4CeQJ;&{nj3lrfpL!vA=xdsg5>3oA)8n0JppImR3LO!aAyVz#(&5*MTkjA z{FyZrHyL7zO7Q~0JW8lBjYU$*uPDgfG&$KS0Sx`c-}?eTliKFNW*W#Ar1H>gi?1sD;!!`4FNeW)PgMfa8B^4m|gXIAPBZxSmL7yM{l-J z3j_#%yB50`jT&%9EIkSOIx4E%Qaow*u$*>+60e3bX|>g3^sQTdn3U5oLF&|7bIvl< z%#J-LZ>R)?#P-E66XWI|Jtr|~lQ4z_CiW`IMw~DX6IghH#Eh93X!!3dOV^jqpYJS3 zQ7m`{#~urR^UPQb7ajVIUbma0FHZ&z&WhE4WKvP1zs`aQ-x*&|Zxu!Q=Y=>4)so(D zAPfklCU2R0@8jVVKgbef?Y~SvcSDI|DzyiNZ`nP(u`PCr)ktt5+8c&~qT42J2$H}? zCpXovKE+a5lwDb<5cs zFt71QMZ;6+7~abwPGl|giQHlGx5X>y8j!7ma9Ep8ucI?yJLpW&*6dxNThc7NP$#Zw zz3Ej>=1P3vVd9Va^0}z{PVS*2_V5JHMlt8F{k9Lf7@d7hDuW-QU(6T6_( zCL{rZgd0W_AiuuTJmfoX_)g$hOE8C_q6W$<;?<9cMkha&Iu`)DxWDkh)6&w~RFRh3 zq@66q&%M4L?L5+QSMJ+*X%J}R3!!KG)WQ$51%8(lI`Sj!^c_L=tUKT1F@f-ZJd&&Q z#ebzY$ZD#CK}^hwRYotK-792#eC@X0ma`V-fBEIcjvy%M|~Yi&8T0#3imqE z_3~DB?ueLH)~GBHkt<{nc%t|heK_!tj#_vY0hJM|23-bFSxyT7!fO@$fva1fCpgT%BOu?Fft;feti zP8QK5US^*`tmi>M>xCn&F&m}8&APpe4K2-Fl{v}q3(x(J{;d^{Y|HMLUDCBGmr>;A z@Wbu(thxNJ_7{dr2V9gm-%6t|d!;4nPJDyR&rK>%&YBJImb3|fS07oH0008nzF2)I zsh|I9F}u2p2!NH9I&Mx5l8VF39rcyrBm~O>BbRQ3*V9EReiqEf1O_z!j3~_BtVod| z{h}+Usmr)5CpdqcM*`DjK>z6vh)Q~|TY7yG>T%|4<62sZEs1IdepfDCZ}r{ z`6JWT7wkW2*vdXGHlsp@;=0b-K`;iB6f|;^OAYa>cvXXcn6_ccnCiFY%k+Q5+}MvO z{V4NnC*%BCwJ_hf?DrP%2HU;S9lQ#w{F{_TE0kq?M;WfI+AD`ly#bGh07wowEBH5fVW+Ir#Wd(WXLu#>+`a z;Q9__O>=J7XlGABX7_V4nRVwt*3HyKgqrA1SdSUz}Pj83FwUT0R!7jjM9ZCbISKSvi8H#a^aI;R_D zDI3%@TT9(Z4Re|?N%UH+M7S|G#)^A+c>$b%+TlBctmF0ZIA#utl;QNFL!VOKOV5~! zzO80|Y|UT%tLgH)ssF)!afbo1(L&o`K3jZZ0iJ9jAGfKxDXTB})oIv%J80kXkvPO= z%2c2ot=)35?U1N|YaG_b#rLmp{m`v2uiYx}dl%FA#_s!*2WA)YxJSkge4<}nolM?b zwms!4>5TCp3R!nVL;X020L)Thrh*#!aPVW%L!gds!yozv%J7E#^z-2VB^VeIpi~9AG7Po>I3eAkv zgLZAdR&KeUZg<~X{AWPRM|Y%x&%|)mh9i`*s(T!{D_UMXo4Izj)(iWV5 z%h8MbIuQ@|s+I*H2V4nrnP!F02gwzD?0I$5$B)J=JfDBq7SC0mX1D%{TSf+d8Ztui z!-4YAIJE*c&ix*Eg%S`0ce-st#hnbp%}hO`jS{6M$=Xh=9c5GM8eZeqsD{{Ix%=4< zv3QXP{E>V%Ycxb+^F88capK_D9=gnb)&QF4_bFLmwb zxNQhIgrOMciv`4Lr4HIb6OWr-$bbu&0XW-NF9m-+P4myY%dT%MNolyd{U9f9E6k53 z7iM`S3yqCEc|r~a{9W@R>S)D@%*k{NxuF zwQBhGGkzA+v7Xaf!>Vi>kV%H``#{CG_q4hi(oE&FJqfLefi9?oM=xQ8L#Z~MwN1(G zuQ^bI9Dc+_%3~CD;LuX&jPeiqNr_fXvV`m$)dwp#_kqQRIvv1E*?hf( zC4fz0T-l_;ViJSOCz>>W6&(cKTkn&00yM6)ySt7crbZ;hL6c-9&2^kd8oOvM%P+RU z!#7ROF8s+St;*q3=22!D(R6UhCp}t8b6vr)Wig#L0os3TfP=57G9sX_0a`P~E#0W# zjq!})jL;~-sHM=EG94!M5lGJ3Siu$G?jh6g9jrO{*B(9Wb+^iY3LMfzpch6!_$!No z=4fwjUumG3q8UHAe<5X2wh&JG@G7m9&U#C zT|2l*bn*L_$on+L*cL`$UYSPn;f{j4iFXz{GdtT=zox;3R0b52%KaQW=en8G5)k~9 zw&hf*m3bhynEZr)vNaEk=@UDudxtH9>Pa|DE_r1&!?SCws)`HR17|}95`MYpek6D) zgy!CPBKmG(fKe4b3ySfac2+_^786+$+NZ*=6=-wY_}TKz#lsOR^ZR(C$Q_Vi(Q7o9(HlhtPaKo#FDd@0008pmAwpw1kS7H#k?^fB%z<@iYfa* z72`|pv^w-#Hw!;r%XPrrI&%QM23MrQ_QuhPS#f#nm0NE21=slXE4^@$@V~DT?dS2q zaSJRiHx`b=UWDS~sH!ZN%EeLO+Mjpc)1y6gOm7~}f z8{cBp@aFDT#;LrK4f1hO{>QuE1>Fn%s*``DsaxpWQV0Ug`_7ii0@_N2KqF&|-v)Vl zX<*fAwM**uGe9o&ChsgI#9^e_`ok!#C$QLASJ8k(>qh8E1k;V={L2%$;ie9n27X7n zQ$>+~46&*X!<{0%Kmzzx$E6y>WkbZ9VK+53OT6^XkpPqS_YPP(!B_$BhZ0Xsc-ijC zUgNWKjgs!W1JXDp-F$=v`(4H7@XcF)6(MS(Zr^Uc6`+Ii!4v67QE|`USjrjAdBAok zlVzEJ%Hx-?El%Kxj@-{5Fb2}Nq&OB1=Q)0VUUi^Ihs{(^Q@zNWM$iVv`Tob?brE>; z69POD(JXLR5^bAc+M653K>JAd!IN#`Acs4qMI>YQt^<8D-USE6M6ZYN$yGE7rE_nzlIW+Ule?17pS{Y#BNTt?) z$e#xN!^J$|K0_?VdmYgZ9i?&38_X&glhj~r8OdtJ-$&jzjt#lk{KHOIK@WVkF%ZEc zP@Cs0-HD`T+aUYJ+1(REn^HpEVz!TEfe)-QivL|;KtMEM&pcToQ}C0_OE{CWK*@9$ zJQt#XKyZ8QXQ)`t8_2c3rrr;*Vc#%+F=bZ3Q58c&$BPSdgnTj$$#<%`o^rXA$~e=- zaZ)x4LJl3zC$P&hmKh2MAekckO(}Fa%8pW6n?n2}kqp(Ob}M|tTavu!wP;b)_FGEt zYRNc@sg(IAjb&}tpy?uh^{Z>Bfs1X+3jib5e=ERPyg1+Wkiz^76ifyD-I&OKO^7ao zaUEX2HnUy49ef7jGgSY|4&n!tU|av^)yBs~)SwcpKZYnrb=kpQkwoWEb{eNdNpD7$ z#kWbDKh%@hrJgbduHyi5e2WwIseaHxIvU#jY!;s!b+kvwKv9h?_P>lLRmH){G zAV2KyemNmy_|>NyT&A}Gy?&uR{*m(a0PJ+TVo=l zzkd4I2D5z&;_$?kVlJJ!Xr6Vr0008re*Ch;B{cIB7i+NS1e=8R?m+WzRao!oJL81k zWR;J<^}wh$=!b5Hau~eO_pHPlejA!YX?ls!{UL%p6aBQ2TvuG%Flt0%Q1EFfv^?`6 zJNl^W8Ln$U+ORpD_#;t&75X>Rq>ukw;6I=zyu-3#m%}^;aOWRUU0+39RowG$RROIZ z97kF%>9yW|`jp8{2uy0Y^F9uqAfW-h>?Rz-{%@~Wv>K~AgFaFln)zIisE(!7KxMj4 z2RuHjkw6OP+9zMQAUijJ-h$N!o%31AO#E?uBEc~`jX!OIKNjGB$qAWC0((tR*A#FP zZC|^q8BiOx%s;?VJ;Su#ckgvmOP+SyI*KEkX*i7mc3%)qI#>01f%8Hc;?AHL=^PeOC5ia8+W%yGO0L9GS&}ry^_=bW{l}WN5 zf<&NqQ`WOal1_HVMcQ%mlOPT71TW_Q<^ij*1pjXyT}b|as1Stf5?^(QU0`r@+Kdm(UIGdys_Bavrw^w0b#mMoZGQocPo)xFs!OSN+lj_X6ol^wd`%I+c^5JwZyUWO zs4t1XN!4$ELQ;0S<2&Z6-2U9kGWHziGf$NWEMj{$9J0wGZ$*`+nGL#Lwg(Jaeip~r z=>rY}=Ifi5x_IjXC)Ank)KpptWdd&s&Fg!}RosCeGmWn*NBcmFXBBqQS}r%adM}9H z$U_ZO|790E3W&&%-==6GMhu0`c6!DAFCKdV0V1=1xXil!uc&-vW&dp{vhshaFU`V| z2vmwS_)kPm{_nUo_#Yu8$KrG7O#h(%CmJ1$`lstj^iQZ$#} z|B$lOLsw49aR?s@`PKWF4mpNpM0INkp4|MF42WT!$dxV409AkFNPT%c{wl*HUo7U59Ih)QXx3= zo8MLaI!p>eif!G4q!{iQFL?f_4@m`k;qruio_`R<$4altGOQ&#T$PL|R;@7qNUU;I zJDa#wg_j<{NPm?_6kE96uM9CAaqQ`HTRcdj5_GZCfRGD^mx}>flIP*T*$O%7cQItl zwDqWGAcBj5>Ik#l7u~+}hvIZW*T4%xK41UH+Oy z;ry+%b-W4>yVe>So-Qisw*eZ&CaaS{9wHXTO;W)?sIj;|DrC^w43W6R^3W-3`cF#u z65zWRuz&NvPg(wdFHUPF%yOK0$zoB5WgW&*jUfshqNBZ2bjWga!~_SvCE?RGv20Y8 zih9)cENt3!+_W<%@O8B;rpM|<2>(`k;?$|Xe7kJl05SPJ13!02PzFj%bjkk}rs?#) zaj%j}z3u&Mp@wXN)ts#FUL6(l23?{6$|D-qjckou;u>n%-zR%j1 z=t61NOIBcOCw2Yie;Pw1XwLRrqWh`xxu}m>OfJ@vtDCD*Mv|K)e&4VH5u}@rG@=~Z z0%essjN0h}1ekcj&sI+@fqwEdFWesM%R?3w^P@6(x4OLU@SqdZMJmj1&x?EZ+Uj6; z^?xGCd1h36A$hf4HvOGC(yQC_0pc=-l52x*)RPypzP~-qo;{6CY=IU?+7cR9Z1wjM z@28Ys6E;33k8=*pbdDxs;S=C1{8rKd^+i4&B2oIOc1m%;+7`%WA;#6a%)meURi)Rb ztrnh)RKa{vL?n9Gv+u?S(!@8ATyKrh@PBzSN6YLFlTsliI&FPL59`Pw%gdP@8OibO z-UC5ZCoAkMjNr5BJ=;Yax>?Z6^suBxKG!aj?@1_T?tVdcKV)OJa5dTbOUxG}V2Xct zdHU&@9F)dkLOa1`U)e+uU}ri+K?f@*TZN>ggo}!b)~kTQM-w5vcNx3}mfJVXWq&$3 zpj`RTAmaOWj)z-Kb8~Z^u-m|=I8;xbz__`%#8jj=dq!HPjC<}b%wgdrg9p3?lO=Ye zX*p%&y{{BJbb!YmV&%+G1ysla?93f#760Ea!0^|e%AQ4+UC4_kI=e@?fXcC@-Db3N zzI1L>Z0u<73^0Otah&+g@!A9S5q~OXifv4-6zgBpP}5cYrfePg{{S1lC5pW%003ik z0008t*vR>8XQaJpdGgAzh22Hp>qj0nycVb}iv3+{W#OoI8Hwz$PH6nHK|8tyt0G*F zeh{KZpF|P;IRVL>szKAuREUUIh4dKYaHQ*VMUzf+4gn;#34NyUz#5iw7Jb!d(mE%DZ%`Hw~xYeJ-*r zj57F9=V^AJ^T!c5j?w}JOua#1Hy7l@fm}HhT=2O&Rh=pAVW_F7=!Wc(7<;iI#W)h5 zte<#e#-F+*@*Yk!iVB2IhGx#y#kCe@gP(0~{F2o7JYPQ}(~pqb%YSsacdbvg7lCov zQ8x$kQFNp7yQ2Apu+SkB7W<#Co|25kN#D!;O_D%*L#G@VbTCY}FQ$J?s)XTmWRadC+krLj+Ll~IK{ z2%2gd?II2=eB>E0;eTo_DMH$q%#M-Q;bICKksBVOCqWrB_sO5Ju2$pL_5Er@7=OWUe{r|eMK1BarfEhlj|!)=W8a7 zr?Z?a1XTtCbKz|Qsx-o(b6_PCQ_`NXTC94dbkS7m)|e%~_mk{inpkhkd5-G}{*g7= zl>5`n%^tPgJ&+HieK#+ZSo>JF?lOOLe_0O%rKX%NJ%5hN*DF^J){D8xzkM1boPV)|f%|9iBRF8%PXL;ap(=rjZV> zHaUCx!+*Y4DB`_s(=01ry?b?AHr6X`q(E{jH>K52m^X$cTHa{!q9*zR0008vk<6^# z%>Mqpt&zU|0{rS=dbHkDOKU2;0Ua)6n7K%{cj;zeL9@3d3KNna^W1gI>H)gATsR?w zR1?Rhv(8WKJ`IuN*9Y!GGv{6M5INvWakI0rTz`>(h&c}Z-h~9y=v8?04XG>qA2j&rBVLkq5EKZm$%E->jJ} z*9d_9_T&pgQO|9=5EY(0^m~tZ^KGo#L_xpzCsG&IUH4*d8a%DVNI4l@ar(u`0r6M( zi+|3kJT_TS9M9}vYG&w64^L;^M;&NtzjYEqZfOzvZgMrsEzu;6?=(~@Leit(9u8@5x76Bd+rVyMHX1oIgXAi!g34iMD7OWr2g>cbqQ_t?UQe z-qITID6<%O^0a1{_stUhl1Jf|Nm(aVu@>+i_VqQyWiuqDEzK%aP9}Mk;RxRu)1Msp z5%c+LI37j7r|F8Xhy7qd@^sYJ_tFR8)+|=rmqh|0Z(iD>2LlTWIsjm3j*#1X)qhIX ztEfEU`xw*vEz|D%7So4+nMsCbF=w&3`TgCOI50h`w_PNMjoJ0!3I)Np^*mKZ#JlAk z@PFHUPw2lKtSMXPKZ2+IEfz*FYcWd#=4S$XAgUoG{`395cQ>QK(=_~e`nRig#nyrA z>?|kdu=6TR!4|ohtksz`HnL=YmVX|zL*i->Xdt2D>aURJVb`Q)@~EjtlWg_0;~@O= zTD4j!`WvTwp-$;IZ<;a$QFZg`t!8eEg;#UJ0ho6D zp4fKTexXe{ott~#G#)>PhK947a}>GhSN>S0)-vP|%0p|MncPxPrsD8AE`LT(NPBP+ z+pEoXcn6xJdr8$;?^V+CQco^2scozsfR7@^8V^nNyF=wRl>6iItKl(EH|x_lQpsMV zG`CybVKHd+y-~F#u$VpfEvVUU8GnOE=1g6ucsSD$)J4ok`LJ%@s>sF04=$~JLD1Lb8&E3bp@?`6gI-+hv(E4*AM+WA(2@T z=MgYp?q>$XarG6VTdYAN$-k*Yd{0#&TeTxpeW9mHPPtsI8}byIn=Wq9{Lre|p%zu! z7~mF9Z$Hr}SBGFOkLLPfG5kJ6DO}^69`+-?9WXu)KNCxQwtNc&1b@Wf0DTgNWThvP z|3DS}!KZWr+Uk$O!S$STt^7mXo!(rKYkqheKySX+J5q0#a&QAtA*>7xXmI!$iMu^- zPT)BJr21e8@R{+$sR%61%1CAO-H-pcI0E@IN;XmAU>LBPzyA=jPlr6}39YE%9;V0f zvpUgC))<8fS53w;X@3|QaW|s`<``^rF@ytgNMg;AyLXW&_gjoo$6qRH1=FaGxL9@I1Y_pkM-b}13F_ZmS*GnR7T=I(}mjQw3@@N7&@P9?hiFls+Op~R!K9cP{ z=PbaEVbYkKQ%B#U`@1~jtzP8n>5t>Fc(Ry6AbVCMVMR0^u?oGeUEjheM`uzOR zV%f##rJgUO;ns=a{(cHCFJVb{uUfRT_~6R0>K|z;ESWaxdEpr)+2#$kZA00k682)< z(klc-^Ufdk5PxEm>k)|p_7})8>xdmKk=dTVA1DI0FQg0!$o&Z5KDF9+h8*OoMF(ct z^Ar_wd~=2@1NJ-Gd1AiJizRXO1Gh4S0_Qtpte|GBem`1fm8$yt>r=t{fxY#!IP28x zqQ#wS&0}QWG)F&Fxq%+5ys$)ghaiHeAAWi0lDfOB@qe~}7zAtwQ~+LlS==9pf9^@W zB+nwW)@bB6UQMG-lzRZI)5F-m&!g7Tt|WJuVNGadD-2JcY8qYxl(;J&C(EWnJonPq z>V3WyEIC(Ff>W1|Swk>;$9|3bEf-CGx0fA2Tzx9WV;c^7%#Fx&lG24zv$nZ~Tie%8 zY(+wI7k_uPQys%~!*zczntNM^|8pp^RNPq7MmUL3dFwl&!KgyDpcR48Ub6(fy@V5r zH{z{-84M{`%Ph7g@=lUcZ3y$u%m?UnJHVZi#5x68!#P1Rj)U9%VaIiN9D6`4$gY-2 z3KoB`AuPflEC8j7fm;&3bHUz}iN{Z>E$Tf;{%G-GnqFJ2~CO;Pb6x|&1E+RDma%*K;>xp>|j=Bi0qhAKe6BZ=P8;S#*R+7oID@N zhzkt?Zhzs2Um%oS$6}M%J3!DTI0x|$40E7SlgaOF_#sHcDG?x&N3r3e% zkPF-d6$32-w>Xgt%mRPW%;-1wrB(eFM`LYu^>L{&Xr`N+8%2=2k$Rg%pI3FWt4C`JVQAGaQiCdN6=*bv-_4_PM7I(rg=Ad5gaR+1Ca##UdSKx(Co+XX~ zDWawq$MbTlle&K@;pS)SS(Rc4HD?0#l`;8~|E=m@gcCGNaKBJAPh_^?@V>Y4_wrez z{|<-kx>?`oLI#&5kH4DIR+d}v-92C)8g=aziR|;Af~l2au6&tomBO?&-I}Vn73L(a|{7}o@{?cANIsTRs}LE@J{H$QHM;t zH_@|Q-WYhb48(jWkK^iE{b}xgBVdBp^Vq6+npmIssBO{rP*$pz&*ivitw?s*6w@mg zVAU$nWNxc?53b^lSa0$ebZ+)f6WEq+6#ft(OVDIvlojBm=_6UvWfyXlSz#>F-}ToQ z+@O0V^v{3(Iow4gm;>~!G}fvsCY5g+7P^0O8{obxWK&H^c~757(6;YrAK460WAg{M zl8|MzH;QXPuS0w_nOAWm5gLPEDi3Ai$Ta(a2n=oeO153MzagY-Zo;noz7JJIUuv8nvt_)_5Epn!iB&)v7ItyYSb0T#dt?;ny2lL`Mi5Y{+gV`dux*Q4G$O3dh?XHT0?3&3dbaJYg2$RTAJv5t)*nE+ONv zENy>dWAj4CLc&PT6irE}{d*O8%Qztp#nQlzZsDGW++&`^xt7V>t;d5bg2>op<>jAiLK~YZseSV?6jiwDW#B*?jNv1JQq&bnZ|e7FptS6q#|t@lw0Y4;%>)uxB$< zSb0aZ@ivDN%#n?;}}`dpG6f((KB=3(HTAWp8M~-!i5%(0c`24$!W`h zEAi+5*U!Kmq5z5bP$UI|0bb)`*TDkL?vurIMb%48t;j?=|||X z^<&z4p!b|0AwCYpPmS_qakszTZ%cnqNduB^T7znwCqZ~GBUQw8IJmdQi8H^jpW=wJ!sH+U+eATG$*!-Tup=v>*h5cXI3z$ENmWXXoMyhUIQlqfEE^A#u(`Mg<%A6|RvpWOHD9D4`oAKdS?ms%L9!>*kx*)3%~|`=aSb|Al`}H|2e|m#1}` zNTIv2m@EPE(fefD3d2 zbwFt$bU!5)S6c2bqllTgUi7gV4db75vw8Qw>Xa6w|7mJsAlrStkZ#C0-HWU?1+AqU z4j(I?+F+z=O%~)a1touZ52Tr$f>j77EuEcIxMzt&2{`;A3M;tPH9})d9pD7PV7?TG zYo6sS2R94j{`E>n19bg0((%{h4D_~=vpnC&)x-r5$7%Ao8S?)j1&i{wl`afWvImj& zIbI}XihDJkQc?Pbf=EhorDy1Za%0-W$RW+-{$K-ifDlitv21@@zyO5Zae^p|vEeFn z@{wf^{pJ02?M=pA;12oVI})nU-%bv3gm}h$0y4Bg4im1WRH-Qx! z&+KJ2mG;AOOebOF>d)gm58d5r2F1!Ai5RE%$I+*mCDxFN@K6WT4_cX2w}~`(w&|4H za3GqhwyR}+ybKI8pF`|V`_Z-I?d{}2@b00Qd9 zbOALZGu~Mm;V$CzRhAmy4A$cn5_j}mN>`rNwhVjc#j^oMvwRQ-4ih|5+Iz!A&fDmD z{2770z55SMh)1o_vehGkbB&fWp+sXq{cu_nQBLG=8WmnC-PU#|xo#+}IPOH^?BV zKXZYdPIbo7M)doFT9OIPy6XSKl!X?7e_s4%m^QU|#zh}>u2XaLq;Iy*1cL-dDnsxVgs+!&VW0{-i&?q4jez~2xiTkbK^9;>Y;2d zU#H~nFhpBd2eXMQH3?eJ7hFs1_;vEi+0=i2DtXB$|iCVAf<8=&HjV2L2ked~s( zn7D47(bFm}!Fx2_#u&G2Zf^Q^l12zSS0Zk`o}<4&S<#CtHEhv4!s+H>6aFSQF8kRg2cM z!+R#m?dnId{{R?D3s91GUXR3a?`4p)`713nOt$zlEg-9AruWJM}5KU?6I-C!6Sc; zk1c1eY=!UJ+5-6vpN5s1cefN7kAsk46YY`)o<97B?eWK5W?NX6@Ch218lVdvxA36| zGy%74@d=j#f9zC9)_APMOM2Nxo#q|zExwP07z4x0%@Ft+V$SnPx*N?8Q>LbsS~lj7 zP%M0vD?z_-=w)#*8F~u6;`!uBEYNfZQCXti{~~+C~EyW3^=S z*4CGi4?jgX#j4hay?bc#mB?3*pvOT8(WD7a|Nf;AiYZO^A#-!6COW)G)U`d=FW^!{ z&*=-5e|!29BS${K?~Nmd61bJ0*Ff#0-JM}LK0~+CCUQ|AfUe`vH!YVu;9Kr)Al>8n z^jd^|rh4MSR)RRcWdciXOc#!R)D0m}@E!$8cb;T0j4RN$Wnld=Bs!(oS!rrguxY2m zYqV8!)L--WC*l-Aam%x7lKPg)en0yK6IvZCe*juqQ^Fe_TNcVb#IC_`O$H7rlIFVw z!PvP9IC9hroKEWxwn|O7@aM()uqS7Tg;VlZ&SX`)M~Dr43#DOibAT{l=i8*DQ*l>D zn@c4uZZ^J23zhhB?>AefZ(p0h`nLaZO$u?80*5k|4>X+z0~FHEw6+_$yLzYSL?^{c zf3pCiTvIO@-+@!0T8%6YPIsn_t|cs1%VtLf9;Re(h<$Y@BnQE7E}lXkpOB=;28+Ma zvQ>lJkNHJ#sjATdFkaGdX&gA?p)^xL1(F_w=yzcMIW-$Jn#KJ1+if0P&{$81UtSLv!skY2zS5-pbS^S=-FjAE*l z*(4QGp~*z>y7(&EK#hWJjVqVxw!vgJ!9?eo%Z#w3MP$Z#Sc2E-o6|R=okL=f296hV zbryLY3yQU3u>zEGcR$x~&eZZmg;ve_#AIhE8|liz3-Qo%H=ZKE(Niz_1<@Nrf4{9F zS5~!b``1*6|05a;GmeDUL<5cfIB8d0){531#(9IT>BC04?<^0EG<3L&VpY?v8C2tm z_-E=>jLjnfoxLzM@xS=ox&9faS&84UPM7X;k5Mr2#vsdicJxzbN)KnO@G#ul-dt`) zE*Po9UD`SlhqftxLfxs@s%72Ef3J?eepZ*Q*(hj+`4Bi$p7WzvMWIL0L0qfcWAq22 z##ZO9b1bs$tb@aZ?7tHYcP6xjF8^t>EG7i-ue^Tl5b(fC8Mk?(Dx-QORvYlRx>FF< zAdBlX`E!G_rXBE_vES(T!)9@34<@0uUf)}8`V4!ADg`tu=#)=7P6^0+1ud&*mT$JG z3j_pzvxQrE)6InM&wDgttXVKy$n*K>)`??1Z3Umyw zmLmT43o|rH;GKH=7MPNLSC#{yKl@Kc5`| zbYSznjkv1ccBCS`a%=-Rc81WOIyH)4HJ&L?p77&OK;g6La6|*8(GC2eMvIv+3$CNp zxy{4^x7)?%^?B=)zkMMr81TY>F8(c3gCRoG05tc8wBOH63PL-lw5}DCMAmr<>Dg)! zRlvWYzF4xE9xX@z&vNjC_Fj$>Juu zJu--rkPot8(UIDXyS2a{fM2u+?{ET#$-o5F|)|5L^QU2<{F+8;6kKkb&TCNpJ|kAt5*fhakb-E%Sm4evIg%mPY{Bton4u{(E zGh(_GsrRT&Rafj4;Z3hozllRpjo${=mf!UROLlc+`4Wn*!ZUyfvXkdJdD+YgCLLB_ z7^>!jun(Sx(UqNLv!BIY`a3!$B76^!c$&j|V9MN_!*|cD-b?<`*y~CmL)4nw&>13L zlCGVK>2W%e`GIVg-dO9W{Mok>(V}KapXj$`l^Rf8(CX8j=Yt;Jyk{D@a?0L+RvKlS z4Rj~Pqge7N9YpT~R^rBAd|HB1qnl57-_|{@7-Lx_Gir7$bIXlC7sK{^E%CxK{o!u1 z98Wvv#O9`clx#ib<1rIyKs+sjldX?(u6APR$?I*2+B2TdS540M?U9xokYlNO<_TkV zjVW*Ecz!WUeXqRFVY5KdxwLk--_uKdPmyp*~Z;pIX`kX~Z&Zv2}Y&v=ScH`B>fqAgD-^}b-7m^s2IQ)`@!$Q!S8Ly?n zPp)?ESDpuZs)dCaoh}5szw3%I& zAENX#)CVp#O#-diFC|)NG}uj138(j`8V2+Y@`s%qffS(rTuOwx zttWni);mjLrS^2Sb|muoj-}I}i>`lRsNVBVZ)l;UkJaW({>O`ngA)6%v=eXTZfdVe zLPr}iD68?llnA(IKiwdb%%1y&Ng!5l>U1+%gK@K+#4YfYqf9g8)HPE&Ns=a0Yv{~K zD}uT`PbYoS_lSdh8e73^+S4C6;h1h-KbP6&`bAkyKvFj-qAtw*OK*AQo9stA4HJ&# z9|sgcK2NVCzQS6A`yXH-9+`HLGL~rAL%vUO74isBUA3;HsnbO{RYGzwtTEiEJ>1lI z=aAX8=r&jpQ?96n9B1UdO!vcS`clD|6Lu?^2a|k7Z_cI`i+Q0r#k>O-qmv6?d=h(n z8EMU_zi%5wF)fDmQTSE#w3<*{kqJ>Xt1o+n97+(DQM}n66^_{;R0tNp;@mHNWA*+x zYc}%3`)oDbnGbpih^;z9P_{Yc@Pbd6u;0uQq!=4@`)|-J5#e3Rf27Pr6oQwNWAG#X zp287{mzxLf+=0e`is5JO;O6KG&)z_}51-S-K!tN-W8DK&Eg&GYbqz|{9oh3>w>>0X z;s3EW|Gnx*4LQ|4mRr*RDlz+?1&)z1M-5qO9<^`NdywH=X4%-tii&F0Md38}B$tB1 z-;y7gRP~qV$7}|5m&oLfH07KWrM*x{^pvzW*jD+Ro@LsIE2|d6A`l%B^n%-7;x>QBGl|MY>k(u-hX)w`tNAf)y5r*mfZm}Q-sw$l6)bq{kxic;fc z&H)+QMjHhI&jP6NPqVW7v-P1WY{A81n3jb?PAWMex`2=w8f2US+kt`TrITYV`my*R zNzcy@-`zOHui|!y<`fKu*gFH#kX%Me~(Wo&#<*IxprLxt%np!?8_~(JNXe@uk0>cI} zKWIghax_&;NCYzy2YLscgQ;i4*ROfX)mam`g$(Tq%<%>>oE#4YT-u84%6{diw2Sjo z6^T9}ZnjwYdc7jE3oA@}J?NMuT5`_TIEEYsNb`N8Gd{EPVn6(&aLOgJ6okbXpg&#K%u?P zSKT=#;0WJR+pGSO<81-z&G&0XqYO+=x>^zXOn7?a<28!2`r~v#gqjJd$XEI`r%Od) zn$~-s{4NWT$%A;E@k0|Zru*m^)C8jP5}Q^=_da|cT6tk`jrE8Plaa1B$|zqFS;4E? zrt$-(o{hEFqANx)Grx4gQ{wvO3s0WXIKiLv!2qv|YiJ%$51&l3&9hw_;q`+47n+f` zd^ciO>vP4?veZTa$xt?$5BF*9dsmmnTONe&$i7S5Nzh86I9!>0QIN9< zqeLwfmx5-nx)~cA|I|`bugs@mZ1QT^{bDK*zqm2sH*Cd6C2Cl(%TM>c67EQz5bJa* znhl7Kw!@$hqT9_ddVAt4fE4gg%-_8uA;Fc%qqU|?-u~QpKlN_qots2_ z#@9vh0^cO^-MZ(B&CWakMeEnsYTfuN^NhDFJ$sswW`$vXX6MVA>Z}RZ zJ2s(QgKsmmwhrw!G-|j8ZEh{9JkHh{!h2)pn-n_do6nc1{kwa;&sFq>*qDIH{bT|`(Is3+#VO6Ncf$h_@3MVw;d8< zL|Gh8H-kdQ2Ec9NY{2{512mB{{Hum;hF|B03lolqWhbCP;$)}8)6qZi(T3a?(x#d= zxt$$0=Nh@l6kp zQnW>96IRV5u18ZBwDRP*MbQR%9y`e8L-4eev2C751xI#P`EbJV!u`EUl~(&xk6#7?Xu5I@FHhBt#sa0p_Q~21ByYVn?XXbcxFt-K7pEFUiWn&EaXU(cZ4aiVVd; z?z*`C?LZXWTGOoHjrY-kDck8Rs4JQGy&b{1r9bf=_jg=W84jbyzrChD&vp^Lwr^|M zdwzI!PV`C2Id~DJ#{PzSckgD0T#)r3;g{6$vl05rEBmIr=KAJqV85ZXcW}N5&$0RZ zrK`_%1JKmaJ)i|1xg9zA-8RGsZ8)yQjf($j7~oM5yy!PAvA43U&xVQ}L1e7|4%BFXH~1V-k2lv$ia=s9rUtp|n9*(DOqO|L7lJcJLsn(< zajzw5@s{cdb&#=Na*X(Br$Ro-tZiDN^JNqP)WiaH^|3UTfby`oV+KQNVO4VBH3K>$ zCqD$Lsw_whtcZy^wz@qwk+w`uN1m3>X>2yUoVEOkFOj*OkQ=> zX(!DOUNI#5+hUzRUVE%G{=|0vS>5@8qdiMY%yB|xgkyTv4TF+#h77{4vU^M{Kn zisLOOfmcht^m^a@c-dbZCBVYiS~AZSxUU6C4`T*me!X9BYsPXoN_b<)a(BMm>=b&! z9C$>pr-_K)BHa1!rD9gm%V&{%{w5V#+2Ve${zij-`d#jk@@G z%5hlA4(wu*3rkNiVeWoa>NgcOTPEW3y*ZWkQl**E)|l->4g)S8@|1}F5#}VmgV(2f zq?u_J-ugr+{$Qr}?0{ES@|?Be8;1D6iq-9JSL~byZ$uDFi(mYJD#dCL{Fp#o-05Dd ziZXqZ$%`k!;^$NGa^HV_d1FQ=uacSL#gyP#b<&+S;|{Ftcbg9c2XXH&HSkA@Gj=i% zID20aqA(I5CcMfyktm*fzj1T#qI+XyAy%~go5u!;HFGo*0n#=wEGqgPxOw<1Vfe`v zD^^O(ew?A#6N#ktbR~w0TQE1z#P!4DgpnsTEA4pV%}-j^4Ho@*4|;Eyn`{?f?##pe z508pH8b#V4*KITmbKwglzOobd8}>OLx_;QnycTD}&eJTFd1a@NdmR4CzURy1O!19b z{9L=+frEs3S_OuoeEF!RF%d9VoGCm(y9za7tbS*66` zb5@v+tLPX@%6G%ctMXp2vwUe}HPJE&dJz{o!4_BeYBV~ABSMVbEaQAVsB&Y;!`Dvg z*D<=Ncr%T$>?|y@Gb9?p|_+TMl{n_vkOD)Qc6KZ5KAmX2kX$xeWSY z7-_x=Ecv1hUbId@OvAcrNn?)ASuE+(^GjAnWtckSY5lE+V)~~X#k7N|7_NNfMm5Hp z2yiHUn(;`$M?4=GebrX{Mesny>-CpG%|+{9g^6O${N`Ves7D5d3gVf$LIA~XP{8|Y zY#~#9@k?Q%JNP}myvi*4qLBf9j~`<0>>0O{>W5$aG#4dRGS#QQP-`yYfmaz{QLwIC z(oozweB-(jep0Mf^=+BEtbB=@-y8Qn;M4{r=ElOT*>Z>z$}u zX1r--FWX%v=gYE+r{oh%J8Lqe3bfy;5F#tuSO*3uXr>a*%V@pdVz>s}PPd=fMck6h zqVxd;W`~_8M!7wiB7=EE0mAyhYB;((2w$rN%BBPDB_yU|!_(bzn->yoUMM~yqmOdJ z$iK&+nhNelrpe$eG1MdUDReF{=-)_Qsyxo>3aam(dOEV!a39BLugvu<_j!*d_PaEx zq`+4_Z>j_3K^`Mm)3?6kcv)*C0r|rJ>5tbgyW%|t4F(OaA7&#Z{OX&%KQ+v6>Bqz} zbH?gr?04lEZR^L>^Tlm5V}TZabg{k~QqePXO>fKkc-bkRU zZK#-fSLxcqRt!x2j@3JfYvMb59^B;VT<7r??KUH@Bw=*Qg%s5s4`}cs;r5(M@AuV@Y!Cw~p;A$gM#=H8<7snv%hw5;$h$))tTLD6djw1J za8Lk)(4Re8ueXhAx;D{l8W)X=elD!CQ1 z8%HPDvOa!R*l%befmRwSb^1m~%UBn`t3y?YTNEG7%#(Ni;yt^&OknWhK4-NW?Bqk? z=xyLu9cEJ3mG4&ZXQ!@1PWBEju&Y(Qd>RFi?EgZ=$KVmwI2|8 z+AyZ^rL}r_TYH1w;Y8EiIGUHYFL!84oZt`(%)&2r6Pcwz5VKH_bb_XW z7{TS9_ej9DJWcGZNO6>P2RC;OSs*YiHsjmu1GsznoIB%IA?6rc@ZHxJWU2z&T1r3I z*1GI)mx49#OY&5CjrCas`kWLrZMpAWcGr8nU0(EF&c~}Y`JPw8+p#HN z&Q6lhFS@j;bGY=1(zFF{Eoxa;-eFWM2B1;mF5ES?_|SU+*aM#xk+6nM3C*&{7WHU(gWaoEF#?=GZ zSzWDNI0>!Xr(S%+iK6MJQBk|0F{LCX3)E++Q+3E*s#cATKTmxsWtA&`D}6$Ivh zXjHq52`Y520-|zjMj_{c+oRrV5`-)(fDhXDs>gKr7v z&ni+QTSe!BshH$@_%*v%-iI*4jkii$XBPrPRy01}ln?%hU_fW$sN&Y@=#Yx52_Wk| z9t!|^bRTpCjd|98?F&ii#=enUqC;Sm1x#rbW#ws-=es=^Uig{oygOyjuo1CtMGg{6 zZc*xRO1H43Q=?7p>3d3F^aZ6tHkkq84f@~~vlymZR_3X8V*TFn;`GXNy6p}m@}$@A zf=zF{sZdZlI*F=&0RvtaEW}E8Z!Th9gg+MGC$zDDRhz0_S&YjuSJ3r?(8xJx#6)lX zXWp*ZVRuHvEnY}I5Rj|OqpNvxN>AJNoQwi#(v7CAEe|27t`4n=y7ujZll#{R+7)6o z&~$Efe;6{`5+t~-#4wlp@&fO8se_}1oK;s@ExNRda4!Qb$?lhk{QkV;^-fmUQ3HGL9Q1V=&2af5iu@} zN6E;KOa$rpa&^O>2DK?MPZ&qnXs3Pt`aGmXlWZ*Baf7uyX6U4dRr(C z`g!s}=iis#EPQ9h^Jn4L$mzC4bT2`z;Lx3=Ub9Sy1DH)| z6$nf$8iRAfUEXeLPQ!N%44mjE+w{cejf`ez;&Sp6mfQNwi3M#nSA*CP`QRJ2h)MNs zr^uyy2Lln$D~F6wrKPN)Q3;Zoo?oU;$7L8ElW+Qdlck@{-=TWaTg4U5n_Sv!*08(l z$c27Ma`q(nyqBM2;??Q>VZxyLK46AFsLPI9KSb-mIXe1zrA;G#XYf7_eo`RKT3{h| zJT;b<*rF5d2P~9T_h_ zB#Jgt+`FBr+|p@MAr5RlUq^#96m1q=hVW)Rh8B5xvF8_OhLqQ6N{xS&Jk)Fp{$hNt zrfEn8>j6}$*L|E}sDmiwNBqQ|>J@WfYv ztB)2>l6XegW7pP>xeTrME1@&xXX8d=#B>X<{fLFqq6=DAn2L66JsVnEtVvj?MIKF0 zuSK}Yv>&Qr+QU?!pZA1P!uHBU(DqU_*2DudB4lTLrXgQ#hq#2=uFm2E&FF&Yi?`er zl&r(YK__M?4yw@IDig+r6j&nxR^<6s(Mc>4azUL>XOqN{XHrr z_p+@o7y4(vC)vVnJwMi9ddNM`S9V1UCB{g>JT&?AT5xsy5nqlB=?mLeZ&NjEQ@9JQ zh3Pt9@|}YBd=>O~qFG6b}pbg-g5V_5!SZy1>a<&LK7IAe!A?coAb7G1a?o;FqU@M zjb_(AQJiR&is)7w9~)C?r8!0EjtV2UN-|SLrN->@u(oTE`6)-LlYMY6LQ(pd%E0oB zD)z7&xcb5EUNxrk-T`$eD?D{eC3A1Cuwv$VCESmBD=x1s(Mnw~wl(OUgZRp)noRK+ zM*mgGk+%}=AJjDiT0^U~(!(^r3zX2FpEQPW%eDR@^4@&9p zvzsdFLs3Jq5Of_zVXF$PMI8qmqfDMxy?h>wi-m68F?Vpxj-k!c zWSiY#NjvJJU*V)}u~CY)xaP*s_?YdphRLnGjjzW^3k1qi$2qv!+Nzg)`X2gX zPjF4_8rYH;;^k)yzZTh-4-_VASfI@s>OUovR)k2|KB=Cmc6l1A?+pB6#=bp{BuK;l z{-~3&N7tyKA<)VNH?hmbuY?KZaEvFZM>vT-E}1euk79m(Q|zI6W6?Ls&*CZ?^_o4g z%>;_64%}M7<2@_1VKIVV%8{xSN%a|_Poj)BCt3n%bmMHH%Su$*D2dN>abc*9;;m-I zV?^juwk&uILPhlDqfp=>Idj?@Hs;|qmq>hxPRu}q9?dl0-y61nIdei-oYXZ<5;@_{ zD++ocIfpj{=(-&h>CsAj#uQS|?7=kM*4Ck9koZpA2X+`}7DDw*E_q2aGnm>x_JiJA z_BgUo)UF zGV%u@sj=~k77gx-(yVBFm2D;Dgj>AaFF5{LT`Dga9X<2~IP~con^ThRB?zA(ia>BJ{zHH-Bi}c)0n5gavqh z*X#YqA@?78Jv11o>-QXOOnR0h7CLB*`Yq=cPe)&MXL84&7jPk8M|&zZn9NXyKeQ zu=;;!1pmw`m~~f@;PV{q8Yb0$78>i_NrpPkW!T7n7B5vHBmxGO!VK6c*CD5Y=EA#o zG5(?9ONN04LZ<)8+Q$c5s)J^McL>7*D-wbj1`6E}!>VYVyb;ky3~*320t@VL;CpuH z_kntMP0jf;aqJ*B#o&Nyeqm|PSNw`-^50aY6@-FXhtzptR1o~(*(h%5Z$m8H(u!~J z)s2iY&-Pm8^|msqcBefhEcg5d<_7DxzHDrjB;fPlo0yoy*)*#A9XZ-vorU22yxw|f zmuYTla^OFzs>KT{7sF=c&sN*}^sAZa$O-W250;8SlYbp;x29u-AS+Ae9&r3&u#S#) z@WD51I&?brG+6N%Osjb8I6RpV)}M5d!W#Btl$>#dOtE?XBKUc==}#{Vln)fcEAARM zR2nffM4pElLgL7%hjQ6K1IG<1XJgF^x;XKdN-WeRG!uMo>Wn(Eqq*_@ZtH7~OH)8E zo4CyMR5$u=!}~>A$H90f>1R;A-9b4PN^8SpYg6Laiiw*|Eh0A=h|MQH)Dblo%&CP( zdHo+CI^=5DH4YrIkEVexD9X#v z&B4RX|GS~l(HspQ{zDgo3dYGRcxP37`H+*B2Tr?#CIWXz$Ht?$JNF-ITYlcVBTs8H zH>-!dBHVCiM$CR(P9E^|Kb)tawDC9RY2z8_%Y7t)Ch@!Kw$&0#60|f5)l+ zZv|Q-AxQjpmQC=4z#sNYN~{$m48cDWU&0}uK)!pw2Lq*!J`dXt2~?N5L6C&u&e<45 z@V+k?=ymj2*t1B;=wPvkz$dveXzqlzKah~^z!O4spwbcatR|zNV4fl%o`Sh5?tbd< zcu`jn>rVYJU=SFR=zmj0Dq)WyVLtp*qa*}Lybdaf4c@v$9TW!s#*+M>teNl8YLIXc zKO>+ZK0!cyg4hbV56P&*gmh9PKS!+fS6quhl=Hbi>UZN^$ex3MTo*5-RxbLtN2Ivd)K!-`K{YV1gLfUDDBaKI%DFq{eRF2f66M&Qnb zijMB*2euw~Avrc1{KEzc{qJCnQ#^(Wx*#97FgVBv3&RhZQ177#i->UZ3d0fEG5Fxr z2^f^{1`6;F+WF8JsD=6Y1waMyKdDs%rj7j_u)y?0NKfIkxmYad!Xm=_d;&atpjQ+? zy9W;_MMH(>Fm@mgvsEIidei3MhBF*#BM(E==GR`M@jk z|Cdq#OT))o$Hn149nM~GYF~8TT45|CDB{!qdkm?A$Y4$(!CNL^%n&3s_`?}k5e6t> z=I0X@5dxLEp!U`d+uPC6Ufsma+VLR|sMdp5OhE|Y_Omej|MJGW5&QSbSFa z8|iTG+Kd()aS)vi?f=zs~Loo=6|@VpX0!_ zk5LWq!P}?_cfkC|d0ia1?(*;Ft0Pb_FgYoHU-HGrfh$y_>Z5}<{+q{CqmB>?18YR4 z4~AO{PL9wDL1Q#HD>1{mK`n%g-c2E#upnq)zlwc>R0r_|+X*tl90I}|*grQtz|NYF4;L1Zz5oFm9H-0aWa9*ul+^lxasb#e8)oTZqG5Sllb ze?IH?ss4JULFo2s4ftjF@@W3{*X`B9-bZRKM{$1;Ou5;hoozn->-sRxudO_l#Yy{B1&JhPu1i#OX*ZUpUvlD~!2KHQB z61U#2Co7AqPkQz~u-x|6m0Xq0zdQEY1y07B-3PB62_6*?UjIY@eO~5HvoSj-|%O61MnB}4S$9=0DmFh@Mm}f@E7t8e}*>ze<9!SXLtkf7xE2% zhBqMJ@eOOWSy-T3>aQmr{|R^m{(9o^pMXc;uO}Y=33vqldgAe)fJfl3Cm#O^cm)1> z;_;t=N8qm~9{&k=1pa#B@t=T4C`dfY)xHNG5`n7ERA0ilTEwr|=5Q8dRPp;>F-IFc}|GAZ(K^&f@U3CnX z-$af!y5=Q2s_CTyV{EBkCL+sO%7Bmujtys$P?U^t9$^9NTcHxFkGmZ`!EEmU)?UXzTY4 ztI;Md*Rfx<^M)b#g4VjTwTWzoyWYg5BQ0&@f#ZR&;B|mK)V5y0hBAtg_%Ze)R<6)l)?%HC+I%TQ^n7ouL?5Gs!;-&1EtRxgn()*NrU zvKf8$Y>#}*m0yat8qoqRGCDx=x0(YhF5iB~3i8^ars$sZpCfONS#2J3zZzT}@y#SCv%mx<^J^mH~aq~Iww-ShRRKVX#AolYDe=C8gst5e71mdG1 z;BO@mSC)all|a1u0sO55;tC7wzYvI0wSC}L6@cXVzX;<0B8dNsApU=fAOgQ3i1Of^ zz{@w}iyf{ihqNif>vSQ>%EH%=P~7`ckqqkJzBf%uzjV7^xyZl|d_x1V5IuS&B)~K) zMHIL(pu`_2tPo5}M1v5ppzuy-YpW)+v|8o`^GSeE5dMiZlv@wKsDCl-ih(5HynEql zdGqk}aEZnn!q9qbCN5_UD0v65K}Hf%tRQh2U#QrdR(uL*d-G}0jA(dppk_+B!z68& zMLC#=`OJ4qB5yR!HAoBCP}P$zw-+x37|)#^hLlT+aGRvWq>#sz|BP%6F=u)wNzak| zwV0jcMRFHMa+joq)FKO7*SWVdes?q!GL@dtMOx)vOG1!>v}yp{B)LRzOCj_bubS3% znsFD=aR;ZoV!|bZy|6(DMkKZ1#;8keCH!mFKA9x#=OPCSLNlJ{f`tF%%x*fNuyeFplSlRGveg5IN{@S1a-D zb|YfKLoFHE_W-c%(ZFjY5?dxVV*p(Eo;6cy3xcrsMWXe4T2(i;F8& zpd?!1EzTh!duojH`;1C|LC*6b$DrC7x)p z0Rj^+1G?S~yb~9Ax>gjL5c4deI0xEqIx^FmuBMr&8}jaeKrO#)Y92FQmHS(FP4p56 z(dx&twcWQ{bfcxc<5M>}W{HT*4W=T)sx;p;kU9G>G%{_6h%A!VPSy20TU$f(E+p)b zos02P4EG;Za@qC2so+&IAY;p2PN3b`p#!A*pMIRWF2IzQat&UQ2gBwRha04k$SU>7 zr#SFF;k9d8y+@VGFZ19|pY@dNDLl+?Pvj)Bcq!A7&#rHdaO>@NvbA!_PkH6r@+~tG zjG~j);0;(h*Nh7tJhmJjW*(TNp=7AW?3fl|lpQTn`#F`Wvtuaxla(rXvj0J>C@nC0 zKvkY-T@>G2e41~P{(`G@Tqn?{bzx@t=z7+1VuE^i_sroby~17m@P`qF+QPV`!1}w8 z;Vy$`e8Ck-F5zT7!(U>+CXFfwPkKYlj*XT9xDhaNAZ&3PzA7E z!~4k-+Gt8zugv8>OD^9Z+BY`9M#)N^;7FUG;SZM4#f`0>BxPSoNj*!hq3Kp1>XqX#EG}KQHxircZmyH z5i8L2wGY1s1oAccvQzED}p*e(_=XLq!84gSV?>_p*OV3SmNc-WrPsPo(dy{b5 zc{iNb*E_j-MfHbDLzE;K5OTt^%QRnNcN_vG=x8IrZ9NOCurR+T64X^sRKi@Ylb6 z^~|XYuwg1~n-aW6-G4V!?zU~VhGiugYo?Hut<8jGg*`Vh=wZPjT9vs#lNc=XoQCBB zg_%RtF~Ce^6^<;>mnwaFcweW(=J8P(PPooPjg(iD+z_Ahox_{WiQY>`jpz3Z?-wnn zG%INxSBnr?am13N(qtHUec;l)6p??7>!FU}1kmSsf2{i&2>waI*L;W3X%a`#!Cv2f z-^#%$^DDSVP%B}oj-z>~^ss=#o!d(+nFSkmiV900zWIZAMqscJjBr(3k;>czX&IvSRGN@h$loXh;l+px=g z6NX>13ybLL#%yA#`#+cLmA{MycpZox2Xty?DM%$_An<5-eNZwF1bEsCs0>A!7>I# zXapBcO~NC6>sduMtZ4Mds&X50ogZ?8#!2O0PVJS-Ycgb;5IS1pPlp}9DGSw?Fm`AvEIe6&~sNv3@YdF5CmbkkUXXhl=QdEV^3|bHabx1d1W!dN z{IyNVe6zqttRSd6!>cDRRAq@ZB2bErFekZ%BfUlPffOART36V#2?{tlDyb6HgCXU8 z+wN&!UNJs&aR<&ej;>d3a8WKpTN78dwYT_9U{)oqFpIkZgs*kc*sTDCCspr3YT$8@ zj3%yXK&nOTZ#Cq4NJdfHSd=_Sxj5l-2?l0wz9WQNw=g7+_Vva_DS-J^jn(<+4Qb-Z zjbC!BYXm2cHrl9HwF*NzU)+?&<3p(`!9B|%F!t`UFs30v?cXgNw$Tsf@3?n-z6OhCSoi}~`9>)jO%hXLS& z)coV?D)#%dlhwDZ3+mNF)1+kvyKZ%_;~F+@a!YrSf2JEOWuf3sk{3VapqBBKw^sPf zt^ATCg_qNj%Vmgo1G#ayC#jTps>LQQ;dR}Y53lq`@bw8$pS<%eXV9c#ADgp*pQJli zCq55BWZ@K$q%~yuZ8vvIc!1Yt0}-f$f7j{JGGVm)SYhmaG_0vvUVbPAMhf=rY2w94 zem-6!63q9y>TI?mHYvt3HI86-hk&gwWmqC_K|=rPBaF6^w@-%5CU-e){hPaNe-!5D zitA~bcHGxURSbbBsf^aw*(ULm+)?()rwR0LN@I0Zu!eKCIYae+o1i8!Ba;hL1L{c@D|Vfe;5@-|2fB_RcwoS$t*j&09TsE1i4`ZWjLP?? zBc>mdYC{o{Qo25C)7nJIqjlq|QR=!ydPJ>0&aLu%^Y%vuUlaQXDB|h5(R!Vh1L%+o zsW@cJh~e00Y_AHU3JGOJVb|j2J%xr5KCxMR3l z5R64~Vi8fQpS%B7bs=1iCGXIt5-mPiw$V{^I>Cj45U`(b8s^Ebt{=*2h6TU%)*~C( zJhUjy?Nf7I@_p|+Rm2T^S#0G{$ZE5&ri2R#Dt&YJqIV|3-zt`p`!ZhjVc^9YR`NEw z;aosYsEu>P$unr>5@!1MqOPY!v>;DTgTn?7`dIn-+mLDd6Z?sDHIT{T-x{6S%6 z_fW&;^jfAcB6T+%=9;^lGpaG<5kR|`O)LyADNvSq zW2}fvpyf$R51@!jub~#n-w52iRWcn)zSWq7S=q51%o7I6E3Sot;d3twbD}$K z?7EY~Hrc#2&gsbQcz~3!M=oNy6X_U!^C(2v=`MPTTcm>r*l}&^m;+DZdTjTbeq`gQ zi)u%lv&h(IHRh4BII^H%WT}oIx#VSsQLr#(2&r{k?M=#1%_8Gia`6*u<~Dvc-0|>> z$@7+@ZoI(k|LnmfB*ubaA*;b1w08KV<0Me;dm~|x;94*rkt)!J_GZmDns<$l7T(xo zXVJm$!IN-tN!q#ykxvL>-N=k3O+9Q1k4hL`E+2zk~?3&RM}U6ZF$ z-s6eDKH~J5tmfnLV~?az=;p7W93@T+Xb`WD2-@!r)i)Tq{sCfOk5z7lOZ`9zpkk$D zi^Qt~6T7@$`VCG`erxrKl`$0~crgm8(fQ}^>0jQ6Cpzz}&VqsFsEqKcggT#SPm-Rg zp_uBR+{QhX7=;gZ5|fx2#8?7ij{|t+5DAOW&>#clFS;h5q#QfEVAMJmq04hoqlJ4# za~pa5+^j^7*)8Qtx==vBmF}^KEqh=)!VA<`zuoTQPNPN{1=`bC}n~K^kn6H)QNaT&-;isWKk|sdAPj7qiDTxf&t}+oRc8F0icj# zFZU5;XTkh+`p;b+hx{4E`lRSFMayotf)0A+Dm<8)Jo*pxabHBcyxEv9kkIV%B87(! z@KAWu4T449Nvpb-yO&^2;IO8a_UWKnXsF52qziP#g+W9z9N3eKRdRed`iFkyVmeR< z3k9p?ITiH|1+DOQ>=%KDS#HVZjK#eF%<^JA>htR@x1iQzZY}6I zIMX4g4q_=xrJ}UDi+X3-mdDZ*!Tk`cwae|{=5w~OcDcpF&<3-1S&fy9^lxZvxc~vG zABhvV+95WGRXH1_i0-whJRG|D5YoX@O6yw7M+0Nf)5-;+2B03Tk$_T{T2j3rTal~q z2X@$TY&}%psEOa9JxIS5yVK=&bVu=U;axe!8#+7-t`TlM=4o6xE%X8&*AaBK;te|- z?GG!&3GfM(=fvyYg7#;(^?M)x7$4}QNSf_r4PWx)_F$_zJ?|=B_|buT#u^!ym#zBx zN%cIC82>a>>EM)m?%wHL$oL2ywoINzqQhfrX=iF}IlP(hqyy-gNdVh!NA2_llG@Z` z9f9e`g~2~UpCxg9QpO;>hZq?7Nm8|3dxErwd|kwV#E@K-ubdbG?SxX!IC+cvEn|U5 z`7y&a`Iwh*l9t;|J4U^x$Qkq50@xe}+k1h`R8}Dkhk}H|XBI-Yxf%qM&&mZ2a-#*@ zBjKpE&&icc{1C^r5{$V=x@+JGAAT|QuYXv}dD6(QS}hM?{g&WhaAPqOvua0Z1N-^2 zXG%+?-@j5Tnp~Ox{Mxmm_376VInN;*cj=dN!z;X_|3lYX2F1BWZKAll1$TG%U_lyp zcXtTxG;X1BcXxMpcXvsG1-AeJLUNmP&Ub6>ota-$LGc##_GYcMA6uavSJVbd+&TnP~`?ky<5oDqHIr-8X1JO7j1=6pTkg_5F@%GX{dVqZ^ z>i^@73~7hK`Nt#~`afpGuyU9ixOb-u8p{7_M~wd8?TE|JkTLI;!avX`&|m(~w!zr{ zi)|3}pKUPiKigpZ|IIdtfYuHTna~bX^KO_-Om`fHBWSlNA> zJ=zO3PGBgsaQd2}vOv}KSX`%?$SJI>yF4yQK>i5+D9j1J^`KFjoT-kKX zjVbK?;%A6xiDbISQyXs^AcMHePu8o_N9@IHAh*1lS0Oh-YpwNUbP4L2%TYd(0AAHB zlkC%zDTS0M)1 zCfbeNNrpwIDuDW0_1t%pi1BmeHpBlNgR8^hMtA2UtvHYV5ajHViywFIVCKyWV z`QP{iK^b4tl(rL_mXlu$*3Akwg)My`#H~{G5q9DLJ~rROC0(8RFBJ@h zGt#$Pg$pHo_)l6I_cdNR5$?X&R%aOdxmZ;*1aWCbBZMC|jDSQE3u8=OOePD;jITAC znqOQdth4*&^S}LbP${8$x}J!N@1 z6fbVlC@{|MqT=70HUvjcIsS0|fHT$^sGRtM9VN#XV~*@9Q+d(h>vlay3M#n-9eqw?SN;l;4Q&|QYhaY%dvCnj{sWJQb05(TO- zqPPJLct;#<1RSG2&X-;LMA#HZI>Oi{L-53n#c2_vSe}0r@wS$i7$l}!SBpDzP3s=o zV=TLE1NQk>a#+7s7fWiyHblY^B#E*2tFCFGnmY1S%LBDc)w9N(FQ$(%@V3~|41roS zh~Eb+SHokDxu>ni??tJqBT{OJ?pHu>X~fdL$jd)W5k1o9^%+}B{VwnF<=JTZYDDDtrV?u^U=)M+-O zH^ZeyS-`>|Aom!L9q`l9Q#B_Cf5`=;LTigh{wwZxb)_ipi2jW2!=o7X=0$tm5AC5k zmpTAm(Yl|! zjl6+^tf&`!BO$pVl2wIi;vgyETD0OcN8Be`P82L{NOI%ftqI_SMKN?w{!!V949{S7 zUY%|ufPqtgU{_zi-{1S)@sTaEq&LAUBra7#4jtUZ7V-t>jZ@;kmH`SioSiZd8 z_iEkHP=K$rMi;g%XlD-;SwJr`vq{+O0>*EB2>rK-p@R zYlNy*hG4B`hGVoU(eM8<64R$1E;v6xPb~U`Q4@}g0&C|EDik9&DEWcsKrj9OQ!S(X z6V%CoSD#ENv!Q7j8HaM@@boA3d@js6@eK(6m+!oE`d7GosOY&|OjZmxIo5*NhFJrK z=MuTow1_brzl6D}VG4dGL^|g0Omi(E-|S?%7>86WezeOEb+7b0mB9p;YJ3^0e;`$L z$4;iMrTlZS-rNLXDV#SZIQts#05sWH441R;+`gIU`pR-Xq~Ko2D^uAGbRH6M!)dX9 zSDcGSl?H>K@abJ~z5w!dNRZ|Qydq+bsQ?Vh;RL=BrtJTNOsuATRG63Oof!7z^}pZy z*JF?XnVio+APlu%c)d?GosT%5a-^J7IhX-o0|wlByXBL7X?(&wm* z%%1l$2JRUf?imI83nW$zSG1GbTUCq`T2&=H$c}_9sYDf)5;)3rT1k|Y?RIQ{sy zUozV9M6}+5S%8*NRsbv<#?9Ub2dYeO!}0$G#^-v&&IvY9bb6Cc`W`{1X>|GrXY&ay`aa)FcsGYj2hkyxU0%*>Lx8(nnfT6FztHP{e@F(>- zHUX9={M+E})B4Mxi#Q&2Hh&^mPLbYt)+-VhDyl zlxwj`L>AHME&|2==2v2>L!of51bhY5m`Wp+wWfPGg~u?8`5;dzpP;`RoUQgYC~I#X z^Cia$c$XT3b2f|vHCA^(L9r|s@eBA0-=J><>DoUy+R_t*o5FK{L+vb(M&BCI$wQ?w z&jBRlATz>#18LhHkR95JJ+u2epUU=Jh^&|)Ph~+9iv?4y-HZ9N^O+b$q2dymY85b%X6%}PIKW_ zja;2xc&bu{F@``vB@Jmqer$mbEM=#`va#`mIJBVWp!n+7 z?iJ)!j?bBrw3x;pQZ#}IULf%KsD;%9M&IIZl~ml7MlRayQ`7~A8W`6xzU(X1l8``iqySW=(eN~DH*W>LRNAlty4ls27O0~AXw$6 zbJtKthzzd}01t3zF9O^&sw@Itc7eM2W!{7k#`|a`Nmk-X<={xf+CBnrM5=zo?9*~{>rH}LUL0;7o%b>B zOUcMRZ*;?DwBwTMlV~D8QuHNx0R~adH*jG{`l$KaL2_12H^LdH*Oj&Ut@)ppBV+)h z@E+%k5F1JQF`F^4OgK4B)TIcH0Abh;%zgnYd{zS|Upr;xi9OX&y+6?|={dWFoGz(2 z(ppX)lp2vWZ6WJ#$q zHO+1Vj+RH~;Gy~EAv6^t_fT+Q%elaZ?=@jCP|vyXg~E6d3{&{$QvHT;g_P1`(47wg=)uF4joEj2vAjLvh?r!_xQd4bf zMZ4Gku>=opIjM5HoWll@)}xFj8BZuN%^{)`z>_AVAeyEmN-kS~iH2hN5O|_Ph;Zno z6taX{c1{w0IQN-fsLRaa%O{Cp^URh@OXW>C z79}wn3}PI9x`IGINQ)3jdG-Xa*8mG!@EcaoU5)a{GSubGE&ERD%J0$H_4@NU@bBg# zH3z$kK=-NO!*Nvltd>{>N2)2j>eP4Ur;WExw+gLq)vmL# z)hA)@d5utEK}sW1GaC~74^df_eI-EO2*!eTWS%up2g>o_ij2~IypxT8N4*o6E^b89 z%kkQ}!&5nm_ECGg6U4*z9PrSltfwEvHU|Tp<)|0FUf3nf(w&qNfl)^xDw4gE633A# z8(mK1XZ+W*DZ72V67qjIH@c5aO+C_Gev2dH*bQtFkg zn}Gr?ir3Vf1VwPQRdU3Tz1=qqw|n17BlKP~2qWW-raG`&ktBjj#1>UC3U&~X)_xFv zI%=IVnkAQdDu927XOmz||BVEn!B8hqaZfS=x%K2kAK?h(3k_<#Ee%xD8}yweyx%N3 zxyatlY=;rgzRxI2hrR1>pT?VkHWKD9My&W#9i+yJj>yo@W41)0%a^xDd)Z?`R6o;{ zG8aU@@A$3LH+ooMjFezWEs~?3;IU?BG^M;`5{o6v$id})Y#_yrr$ne3}L-paz_0aUp9WJ<>f8_%e!3}~_tR3VEKBGKK91JKi zOah;M>>rjBCTog8n1`5aSTmKv#p4FA+LTTPiozovoW#3IkY|@YS=`pI8hA~H}fSxLmaGRE>Dr;{tSE5InOpBXoq#R_^a zl5tQVWUWGo(VZhrw{%#in~X=i&CYA#lYcLDTEb`j0sh|UqJK}0Uqt_Gvz_jr-rreP zNalXy)WA>U@0vu7%kOxR_ml4s~BMprJw0db-B!IK!1G(2ad3%Uw_%&OYepZ z#Ibogl3EX_9M}b}AHsz#JDCteM_}hnt6*m8ML&ovcy=4D=8{(=23yGJJDdh?7?8UU>@zz zwF(py(hQ(o(30BE6SnKmQq7JVTrF|;wZBtj_TApx$9YTfHFqN2hczAws4spoF0iT+ z7MvnEWknK{8EtD8*~ov{2?_}#w?6|w(ocoDUaXpC75$Cs=UXx)XVWR}7(V$7S&sN2 zhyw$?gGFu>!U3nYG!0&9Y0(6d)Ga8{6${BqAb1Vviex=96Lh|tWbzY}WT!?J5*G5< z0;~m~Pxw~pkJ;R|lDt>RJWK`0+-@3+!4*Ue8WzS%XUZ4&MGY1TK-5dF1#yj_lIy`` zrHZRe@d;i06PC$Em}`*n%>_EGdI??%jeIhAcJ`-GHnbUhf=3X`+(>E=ubuP-qFyn? z7_j(Q`wB(bgqb9LV^%alNNYui?O)ZFfUexTWQz@%yusj-j8r0s8m5eXxm}4WF3JVg zB#_eumHaMwEvcYY$B6^olr*FPmhfIoWly6KssTloJYioTQ%*aB0unZDTTmK-K`a4w zIrWsNn&T9SGLV)DJ6$xfMhrW24M-ov5e=RQihPc!t%A3u%6f0@u7rsGlZU{|;ECyI z?oF~=SwPNM4T3&Y@X!nuESBniR-2@iuI6upcrvT6^}OAHT2EPkI{Y(TU04X)@%Q^z zC}M*k@Oieu6xz|LtSVNKfOf`(p{cEVL^3C*yJIye4?S1X((Kzh24=C>^`9VKrNd^d z=p$i17OklPve9XtrVbq)RN<*b88mipheC=Ax{z4eacbsxkksq;_+xQMMWQre#ApzQ zC`mJ@$~X&dsCx;mpPJ?m;!=7Xyrg1&mwi<`9*$GzY1#OriJWU-1L>5t!`*31 zy1{*dr$a7nNU~Gs3gpow3g<|vRJN26FY8wpl}_d>LuOjRE)%>Jkp>Iu;4+vM7^*A- zqozPcJe;^aa+k3*ep(4s@wiMLt?e1VA|KuY>7MdB(pVfQ4O zWqLMm&XQ;#`CExa1;-L5N-$`Mn||78wyg4R{IBlNJs99P;n-u)0a_026@;{kLH9>m zUu&UUDQ`VkLMd}wO9Hs0xhHXY<^A|du57Va{_u3OvJnq51Zk>0iBJV7Db;nM8Bj?yA%PQgo!Pqzsgq#waaFPOuKYfu?~o)!_6!OwVxvtPL3=K zXLVx2BLS&-7q8Fb5hNE@I1?n7SqVv);DFsrj57H_U<&cvgrFQGX}{T=OAb3kSd4WS zhi0~V^y~1^@B{slRSbu$%QC&RHQ~YwQ+tLIbE*MqQ;S@QdeRO zr@QgrCB0#U?q@_SlRXa2Pu$;Q1!&#N$dXe869ZS^U}`6kMp6zn)skSZ`Z69x$~v!c z4#9;T2+sE>?a?OFr%=P%t|l8VQU1&ZZ6_7ou(hF9!&|9=O{LnSobT7LuGRfZ4W9&D{1{o?i@H!z!5yWjjpT9&v4|=P_0DHIO)o;me+u?R$ z?py;&wKJqHBa^$d6U`*d`Jw_{c1J5GhY zrb6=$ESJt(Syp|giwh{+9bjyRy4`qc?TW^p0Lb8aE+Zc*p;7E+<4P`-n#iG9my&Ox z?;-Y!fyhj~2&Ir_KG8ZvjS+8~g;*nTYEG&%0Ic~M7@6BMfKEMHU5#SK!?u2xbGvML z{~}6$H+9_ZJOe-bn=Ub9L*o;q9Pz%ZMd_+hqTm}OozkY-n~g+!mASAzZrOd<&-C

-^wAcdnU4y{h+S(^MYg_i}~(K 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 Date: Tue, 20 Jul 2021 00:45:53 -0400 Subject: [PATCH 04/13] Aceptar multiples roles en el middleware de roles --- backend/app/Http/Middleware/RoleMiddleware.php | 12 ++++++++++-- backend/routes/web.php | 16 ++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/backend/app/Http/Middleware/RoleMiddleware.php b/backend/app/Http/Middleware/RoleMiddleware.php index f8951da..7bf4643 100644 --- a/backend/app/Http/Middleware/RoleMiddleware.php +++ b/backend/app/Http/Middleware/RoleMiddleware.php @@ -6,8 +6,16 @@ use Closure; use App\Exceptions\NotAuthorizedException; class RoleMiddleware { - public function handle($request, Closure $next, $role) { - if(!$request->user->hasRole($role)) { + public function handle($request, Closure $next, $raw_roles) { + $user = $request->user; + $roles = explode('|', $raw_roles); + $has_permission = false; + + foreach($roles as $role){ + $has_permission = $has_permission || $user->hasRole($role); + } + + if(!$has_permission) { throw new NotAuthorizedException($request->user); } diff --git a/backend/routes/web.php b/backend/routes/web.php index 3f4d97d..5ab2de4 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -8,15 +8,15 @@ $router->get('/', function () use ($router) { $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], function () use ($router) { $router->group(['prefix' => '/users'], function () use ($router) { - $router->get( '/', ['as' => 'users.all', 'uses' => 'UsuariosController@all']); + $router->get( '/', ['as' => 'users.all', 'uses' => 'UsuariosController@all', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{id}', ['as' => 'users.get', 'uses' => 'UsuariosController@get', 'middleware' => ['role:admin|global_admin']]); + $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/me', ['as' => 'users.get_me', 'uses' => 'UsuariosController@getMe']); - $router->get( '/{id}', ['as' => 'users.get', 'uses' => 'UsuariosController@get']); - $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create']); - $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update']); - $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete']); - $router->get( '/{id}/restaurantes/', ['as' => 'users.get_restaurantes', 'uses' => 'UsuariosController@getRestaurantes']); - $router->put( '/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant']); - $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant']); + $router->get( '/{id}/restaurantes/', ['as' => 'users.get_restaurantes', 'uses' => 'UsuariosController@getRestaurantes', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant', 'middleware' => ['role:admin|global_admin']]); }); $router->group(['prefix' => '/restaurantes'], function () use ($router) { From 3534fdd02a6156e5b480497773854c9e4a763088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 00:56:34 -0400 Subject: [PATCH 05/13] Forzando el uso de roles segun la vista Principlamente aplica a los post/put/delete de cada ruta, ya que estos pueden ser destructivos y solamente un administrador o global admin puede hacer esta accion --- backend/routes/web.php | 70 +++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/backend/routes/web.php b/backend/routes/web.php index 5ab2de4..628c191 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -22,71 +22,71 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->group(['prefix' => '/restaurantes'], function () use ($router) { $router->get( '/', ['as' => 'restaurant.all', 'uses' => 'RestaurantesController@all']); $router->get( '/{id}', ['as' => 'restaurant.get', 'uses' => 'RestaurantesController@get']); - $router->post( '/', ['as' => 'restaurant.create', 'uses' => 'RestaurantesController@create', 'middleware' => 'role:global_admin']); - $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => 'role:global_admin']); - $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete', 'middleware' => 'role:global_admin']); + $router->post( '/', ['as' => 'restaurant.create', 'uses' => 'RestaurantesController@create', 'middleware' => ['role:global_admin']]); + $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => ['role:global_admin']]); + $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete', 'middleware' => ['role:global_admin']]); $router->get( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.all', 'uses' => 'CanalesVentaController@all']); $router->get( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.get', 'uses' => 'CanalesVentaController@get']); - $router->post( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.create', 'uses' => 'CanalesVentaController@create']); - $router->put( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.update', 'uses' => 'CanalesVentaController@update']); - $router->delete('/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.delete', 'uses' => 'CanalesVentaController@delete']); + $router->post( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.create', 'uses' => 'CanalesVentaController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.update', 'uses' => 'CanalesVentaController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.delete', 'uses' => 'CanalesVentaController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/sectores', ['as' => 'sectores.all', 'uses' => 'SectoresController@all']); $router->get( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.get', 'uses' => 'SectoresController@get']); - $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->post( '/{restaurante_id}/sectores', ['as' => 'sectores.create', 'uses' => 'SectoresController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete', 'middleware' => ['role:admin|global_admin']]); $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']); + $router->post( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.create', 'uses' => 'ZonasProduccionController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/categorias', ['as' => 'categorias.all', 'uses' => 'CategoriasController@all']); $router->get( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.get', 'uses' => 'CategoriasController@get']); - $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->post( '/{restaurante_id}/categorias', ['as' => 'categorias.create', 'uses' => 'CategoriasController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.update', 'uses' => 'CategoriasController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/categorias/{id}', ['as' => 'categorias.delete', 'uses' => 'CategoriasController@delete', 'middleware' => ['role:admin|global_admin']]); $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']); + $router->post( '/{restaurante_id}/proveedores', ['as' => 'proveedores.create', 'uses' => 'ProveedoresController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.update', 'uses' => 'ProveedoresController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.delete', 'uses' => 'ProveedoresController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.all', 'uses' => 'IngredientesController@all']); $router->get( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.get', 'uses' => 'IngredientesController@get']); - $router->post( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.create', 'uses' => 'IngredientesController@create']); - $router->put( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.update', 'uses' => 'IngredientesController@update']); - $router->delete('/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.delete', 'uses' => 'IngredientesController@delete']); + $router->post( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.create', 'uses' => 'IngredientesController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.update', 'uses' => 'IngredientesController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.delete', 'uses' => 'IngredientesController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/productos', ['as' => 'productos.all', 'uses' => 'ProductosController@all']); $router->get( '/{restaurante_id}/productos/{id}', ['as' => 'productos.get', 'uses' => 'ProductosController@get']); - $router->post( '/{restaurante_id}/productos', ['as' => 'productos.create', 'uses' => 'ProductosController@create']); - $router->put( '/{restaurante_id}/productos/{id}', ['as' => 'productos.update', 'uses' => 'ProductosController@update']); - $router->delete('/{restaurante_id}/productos/{id}', ['as' => 'productos.delete', 'uses' => 'ProductosController@delete']); + $router->post( '/{restaurante_id}/productos', ['as' => 'productos.create', 'uses' => 'ProductosController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/productos/{id}', ['as' => 'productos.update', 'uses' => 'ProductosController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/productos/{id}', ['as' => 'productos.delete', 'uses' => 'ProductosController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/', ['as' => 'productos.receta.all', 'uses' => 'RecetasController@all']); $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.get', 'uses' => 'RecetasController@get']); - $router->post( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.add_ingrediente', 'uses' => 'RecetasController@create']); - $router->put( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.update_ingrediente', 'uses' => 'RecetasController@update']); - $router->delete('/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.remove_ingrediente', 'uses' => 'RecetasController@delete']); + $router->post( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.add_ingrediente', 'uses' => 'RecetasController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.update_ingrediente', 'uses' => 'RecetasController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.remove_ingrediente', 'uses' => 'RecetasController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/compras', ['as' => 'compras.all', 'uses' => 'ComprasController@all']); $router->get( '/{restaurante_id}/compras/{id}', ['as' => 'compras.get', 'uses' => 'ComprasController@get']); - $router->post( '/{restaurante_id}/compras', ['as' => 'compras.create', 'uses' => 'ComprasController@create']); - $router->put( '/{restaurante_id}/compras/{id}', ['as' => 'compras.update', 'uses' => 'ComprasController@update']); - $router->delete('/{restaurante_id}/compras/{id}', ['as' => 'compras.delete', 'uses' => 'ComprasController@delete']); + $router->post( '/{restaurante_id}/compras', ['as' => 'compras.create', 'uses' => 'ComprasController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/compras/{id}', ['as' => 'compras.update', 'uses' => 'ComprasController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/compras/{id}', ['as' => 'compras.delete', 'uses' => 'ComprasController@delete', 'middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/compras/{id}/ingredientes', ['as' => 'compras.ingredientes.get', 'uses' => 'ComprasController@getIngredientes']); - $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente']); - $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente']); + $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente','middleware' => ['role:admin|global_admin']]); $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get']); - $router->post( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.create', 'uses' => 'FacturasController@create']); - $router->put( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.update', 'uses' => 'FacturasController@update']); - $router->delete('/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.delete', 'uses' => 'FacturasController@delete']); + $router->post( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.create', 'uses' => 'FacturasController@create', 'middleware' => ['role:admin|global_admin']]); + $router->put( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.update', 'uses' => 'FacturasController@update', 'middleware' => ['role:admin|global_admin']]); + $router->delete('/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.delete', 'uses' => 'FacturasController@delete', 'middleware' => ['role:admin|global_admin']]); }); }); From 6a7e08478fcfb302c3cb1a06b590a44630f9a0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 02:03:29 -0400 Subject: [PATCH 06/13] Middleware se encarga de validar que usuario pertenezca al restaurant --- .../app/Http/Middleware/Auth0Middleware.php | 9 ++ backend/app/Http/Middleware/Authenticate.php | 22 ---- .../app/Http/Middleware/CorsMiddleware.php | 6 +- .../Middleware/InRestauranteMiddleware.php | 31 +++++ .../Middleware/LogEndpointHitMiddleware.php | 11 +- .../app/Http/Middleware/RoleMiddleware.php | 6 + backend/app/Models/Usuario.php | 4 + backend/bootstrap/app.php | 3 +- backend/routes/web.php | 106 +++++++++--------- 9 files changed, 112 insertions(+), 86 deletions(-) delete mode 100644 backend/app/Http/Middleware/Authenticate.php create mode 100644 backend/app/Http/Middleware/InRestauranteMiddleware.php diff --git a/backend/app/Http/Middleware/Auth0Middleware.php b/backend/app/Http/Middleware/Auth0Middleware.php index 5744dd9..2a9ba50 100644 --- a/backend/app/Http/Middleware/Auth0Middleware.php +++ b/backend/app/Http/Middleware/Auth0Middleware.php @@ -17,12 +17,20 @@ class Auth0Middleware { $token = $request->bearerToken(); if (!$token) { + Log::warning('Se intento acceder a una ruta protegida sin un token', [ + 'path' => $request->getPathInfo() + ]); return response()->json(['error' => 'no_token', 'message' => 'No se envío el token'], 401); } try { $validated = $this->validateToken($token); } catch (InvalidTokenException $e) { + Log::warning('Se intento acceder a una ruta protegida con un token invalido', [ + 'path' => $request->getPathInfo(), + 'message' => $e->getMessage(), + 'token' => $token + ]); return response()->json([ 'error' => 'auth0_invalid_token', 'message' => $e->getMessage() @@ -30,6 +38,7 @@ class Auth0Middleware { } $user = Usuario::where('auth0_id', $validated['sub'])->first(); + Log::debug('Se identifico al usuario', ['id' => $user->id, 'auth0_id' => $user->auth0_id]); return $next($request->merge(['user' => $user])); } diff --git a/backend/app/Http/Middleware/Authenticate.php b/backend/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 4a88761..0000000 --- a/backend/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,22 +0,0 @@ -auth = $auth; - } - - public function handle($request, Closure $next, $guard = null) { - if ($this->auth->guard($guard)->guest()) { - return response('Unauthorized.', 401); - } - - return $next($request); - } -} diff --git a/backend/app/Http/Middleware/CorsMiddleware.php b/backend/app/Http/Middleware/CorsMiddleware.php index 58a9a99..2722a8d 100644 --- a/backend/app/Http/Middleware/CorsMiddleware.php +++ b/backend/app/Http/Middleware/CorsMiddleware.php @@ -14,15 +14,13 @@ class CorsMiddleware { 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With' ]; - if ($request->isMethod('OPTIONS')) - { + if ($request->isMethod('OPTIONS')) { return response()->json([], 200, $headers); } $response = $next($request); - foreach($headers as $key => $value) - { + foreach($headers as $key => $value) { $response->header($key, $value); } diff --git a/backend/app/Http/Middleware/InRestauranteMiddleware.php b/backend/app/Http/Middleware/InRestauranteMiddleware.php new file mode 100644 index 0000000..196866d --- /dev/null +++ b/backend/app/Http/Middleware/InRestauranteMiddleware.php @@ -0,0 +1,31 @@ +route('restaurante_id')); + $user = $request->user; + + + if(!$user->isOnRestaurante($restaurante)) { + Log::debug('El usuario intento acceder a un restaurante que no le pertenece', [ + 'user' => $user->id, + 'restaurante' => $restaurante->id + ]); + throw new ModelNotFoundException('restaurante', $restaurante->id); + } else { + Log::debug('El usuario accedio a un restaurante que si le pertenece', [ + 'user' => $user->id, + 'restaurante' => $restaurante->id + ]); + } + + return $next($request); + } +} diff --git a/backend/app/Http/Middleware/LogEndpointHitMiddleware.php b/backend/app/Http/Middleware/LogEndpointHitMiddleware.php index 47eac84..4b152f4 100644 --- a/backend/app/Http/Middleware/LogEndpointHitMiddleware.php +++ b/backend/app/Http/Middleware/LogEndpointHitMiddleware.php @@ -7,17 +7,16 @@ use Illuminate\Support\Facades\Log; class LogEndpointHitMiddleware { public function handle($request, Closure $next) { - $userId = $request->user ? $request->user->id : null; + $user = $request->user; $method = $request->getMethod(); $path = $request->getPathInfo(); - Log::debug('User ' . $userId . ' hitting ' . $method . ' ' . $path . ' endpoint', [ - 'user' => $userId, + Log::debug('User ' . $user->id . ' hitting ' . $method . ' ' . $path . ' endpoint', [ + 'user' => $user->id, + 'roles' => implode('|', $user->roles), 'method' => $method, 'path' => $path, - 'input' => array_filter($request->input(), function ($key) { - return $key !== 'user'; - }, ARRAY_FILTER_USE_KEY) + 'input' => array_filter($request->input(), function ($key) { return $key !== 'user'; }, ARRAY_FILTER_USE_KEY) ]); return $next($request); diff --git a/backend/app/Http/Middleware/RoleMiddleware.php b/backend/app/Http/Middleware/RoleMiddleware.php index 7bf4643..d9787f8 100644 --- a/backend/app/Http/Middleware/RoleMiddleware.php +++ b/backend/app/Http/Middleware/RoleMiddleware.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Support\Facades\Log; use App\Exceptions\NotAuthorizedException; class RoleMiddleware { @@ -16,6 +17,11 @@ class RoleMiddleware { } if(!$has_permission) { + Log::warning('El usuario intento acceder a una ruta sin los roles necesarios', [ + 'user' => $user->id, + 'required_roles' => $raw_roles, + 'user_roles' => implode('|', $user->roles) + ]); throw new NotAuthorizedException($request->user); } diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index caea07d..01a4d22 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -43,6 +43,10 @@ class Usuario extends Model { return in_array($role, $this->roles); } + public function isOnRestaurante($restaurante) { + return $this->restaurantes()->where('id', $restaurante->id)->count() > 0; + } + public function restaurantes() { return $this->belongsToMany(Restaurante::class, 'usuarios_restaurantes', 'usuario_id', 'restaurante_id'); } diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php index 9636337..7d54447 100644 --- a/backend/bootstrap/app.php +++ b/backend/bootstrap/app.php @@ -77,7 +77,8 @@ $app->configure('logging'); $app->routeMiddleware([ 'auth' => App\Http\Middleware\Auth0Middleware::class, 'log_endpoint' => App\Http\Middleware\LogEndpointHitMiddleware::class, - 'role' => App\Http\Middleware\RoleMiddleware::class + 'role' => App\Http\Middleware\RoleMiddleware::class, + 'in_restaurante' => App\Http\Middleware\InRestauranteMiddleware::class ]); $app->middleware([ diff --git a/backend/routes/web.php b/backend/routes/web.php index 628c191..c52b711 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -9,11 +9,11 @@ $router->get('/', function () use ($router) { $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], function () use ($router) { $router->group(['prefix' => '/users'], function () use ($router) { $router->get( '/', ['as' => 'users.all', 'uses' => 'UsuariosController@all', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/me', ['as' => 'users.get_me', 'uses' => 'UsuariosController@getMe']); $router->get( '/{id}', ['as' => 'users.get', 'uses' => 'UsuariosController@get', 'middleware' => ['role:admin|global_admin']]); $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create', 'middleware' => ['role:admin|global_admin']]); $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update', 'middleware' => ['role:admin|global_admin']]); $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete', 'middleware' => ['role:admin|global_admin']]); - $router->get( '/me', ['as' => 'users.get_me', 'uses' => 'UsuariosController@getMe']); $router->get( '/{id}/restaurantes/', ['as' => 'users.get_restaurantes', 'uses' => 'UsuariosController@getRestaurantes', 'middleware' => ['role:admin|global_admin']]); $router->put( '/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant', 'middleware' => ['role:admin|global_admin']]); $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant', 'middleware' => ['role:admin|global_admin']]); @@ -26,67 +26,67 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => ['role:global_admin']]); $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete', 'middleware' => ['role:global_admin']]); - $router->get( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.all', 'uses' => 'CanalesVentaController@all']); - $router->get( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.get', 'uses' => 'CanalesVentaController@get']); - $router->post( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.create', 'uses' => 'CanalesVentaController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.update', 'uses' => 'CanalesVentaController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.delete', 'uses' => 'CanalesVentaController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.all', 'uses' => 'CanalesVentaController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.get', 'uses' => 'CanalesVentaController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.create', 'uses' => 'CanalesVentaController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.update', 'uses' => 'CanalesVentaController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.delete', 'uses' => 'CanalesVentaController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/sectores', ['as' => 'sectores.all', 'uses' => 'SectoresController@all']); - $router->get( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.get', 'uses' => 'SectoresController@get']); - $router->post( '/{restaurante_id}/sectores', ['as' => 'sectores.create', 'uses' => 'SectoresController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/sectores', ['as' => 'sectores.all', 'uses' => 'SectoresController@all', 'middleware' => ['in_restaurante']); + $router->get( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.get', 'uses' => 'SectoresController@get', 'middleware' => ['in_restaurante']); + $router->post( '/{restaurante_id}/sectores', ['as' => 'sectores.create', 'uses' => 'SectoresController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $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', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.all', 'uses' => 'ZonasProduccionController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.get', 'uses' => 'ZonasProduccionController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.create', 'uses' => 'ZonasProduccionController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/categorias', ['as' => 'categorias.all', 'uses' => 'CategoriasController@all']); - $router->get( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.get', 'uses' => 'CategoriasController@get']); - $router->post( '/{restaurante_id}/categorias', ['as' => 'categorias.create', 'uses' => 'CategoriasController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.update', 'uses' => 'CategoriasController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/categorias/{id}', ['as' => 'categorias.delete', 'uses' => 'CategoriasController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/categorias', ['as' => 'categorias.all', 'uses' => 'CategoriasController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.get', 'uses' => 'CategoriasController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/categorias', ['as' => 'categorias.create', 'uses' => 'CategoriasController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.update', 'uses' => 'CategoriasController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/categorias/{id}', ['as' => 'categorias.delete', 'uses' => 'CategoriasController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $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', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.update', 'uses' => 'ProveedoresController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.delete', 'uses' => 'ProveedoresController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/proveedores', ['as' => 'proveedores.all', 'uses' => 'ProveedoresController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.get', 'uses' => 'ProveedoresController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/proveedores', ['as' => 'proveedores.create', 'uses' => 'ProveedoresController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.update', 'uses' => 'ProveedoresController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/proveedores/{id}', ['as' => 'proveedores.delete', 'uses' => 'ProveedoresController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.all', 'uses' => 'IngredientesController@all']); - $router->get( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.get', 'uses' => 'IngredientesController@get']); - $router->post( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.create', 'uses' => 'IngredientesController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.update', 'uses' => 'IngredientesController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.delete', 'uses' => 'IngredientesController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.all', 'uses' => 'IngredientesController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.get', 'uses' => 'IngredientesController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/ingredientes', ['as' => 'ingredientes.create', 'uses' => 'IngredientesController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.update', 'uses' => 'IngredientesController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/ingredientes/{id}', ['as' => 'ingredientes.delete', 'uses' => 'IngredientesController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/productos', ['as' => 'productos.all', 'uses' => 'ProductosController@all']); - $router->get( '/{restaurante_id}/productos/{id}', ['as' => 'productos.get', 'uses' => 'ProductosController@get']); - $router->post( '/{restaurante_id}/productos', ['as' => 'productos.create', 'uses' => 'ProductosController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/productos/{id}', ['as' => 'productos.update', 'uses' => 'ProductosController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/productos/{id}', ['as' => 'productos.delete', 'uses' => 'ProductosController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/productos', ['as' => 'productos.all', 'uses' => 'ProductosController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/productos/{id}', ['as' => 'productos.get', 'uses' => 'ProductosController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/productos', ['as' => 'productos.create', 'uses' => 'ProductosController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/productos/{id}', ['as' => 'productos.update', 'uses' => 'ProductosController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/productos/{id}', ['as' => 'productos.delete', 'uses' => 'ProductosController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/', ['as' => 'productos.receta.all', 'uses' => 'RecetasController@all']); - $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.get', 'uses' => 'RecetasController@get']); - $router->post( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.add_ingrediente', 'uses' => 'RecetasController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.update_ingrediente', 'uses' => 'RecetasController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.remove_ingrediente', 'uses' => 'RecetasController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/', ['as' => 'productos.receta.all', 'uses' => 'RecetasController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.get', 'uses' => 'RecetasController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.add_ingrediente', 'uses' => 'RecetasController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.update_ingrediente', 'uses' => 'RecetasController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/productos/{producto_id}/ingredientes/{ingrediente_id}', ['as' => 'productos.receta.remove_ingrediente', 'uses' => 'RecetasController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/compras', ['as' => 'compras.all', 'uses' => 'ComprasController@all']); - $router->get( '/{restaurante_id}/compras/{id}', ['as' => 'compras.get', 'uses' => 'ComprasController@get']); - $router->post( '/{restaurante_id}/compras', ['as' => 'compras.create', 'uses' => 'ComprasController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/compras/{id}', ['as' => 'compras.update', 'uses' => 'ComprasController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/compras/{id}', ['as' => 'compras.delete', 'uses' => 'ComprasController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/compras', ['as' => 'compras.all', 'uses' => 'ComprasController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/compras/{id}', ['as' => 'compras.get', 'uses' => 'ComprasController@get', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/compras', ['as' => 'compras.create', 'uses' => 'ComprasController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/compras/{id}', ['as' => 'compras.update', 'uses' => 'ComprasController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/compras/{id}', ['as' => 'compras.delete', 'uses' => 'ComprasController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/compras/{id}/ingredientes', ['as' => 'compras.ingredientes.get', 'uses' => 'ComprasController@getIngredientes']); - $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente','middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/compras/{id}/ingredientes', ['as' => 'compras.ingredientes.get', 'uses' => 'ComprasController@getIngredientes', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente','middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get']); - $router->post( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.create', 'uses' => 'FacturasController@create', 'middleware' => ['role:admin|global_admin']]); - $router->put( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.update', 'uses' => 'FacturasController@update', 'middleware' => ['role:admin|global_admin']]); - $router->delete('/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.delete', 'uses' => 'FacturasController@delete', 'middleware' => ['role:admin|global_admin']]); + $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get', 'middleware' => ['in_restaurante']]]); + $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']]); }); }); From 8f2e4a9d17ac5657ded6105450c369f92d4c0f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 02:23:22 -0400 Subject: [PATCH 07/13] Si el usuario es un global admin se considera que esta en todos los restaurantes --- backend/app/Http/Middleware/InRestauranteMiddleware.php | 1 - backend/app/Models/Usuario.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/Http/Middleware/InRestauranteMiddleware.php b/backend/app/Http/Middleware/InRestauranteMiddleware.php index 196866d..eb013f6 100644 --- a/backend/app/Http/Middleware/InRestauranteMiddleware.php +++ b/backend/app/Http/Middleware/InRestauranteMiddleware.php @@ -12,7 +12,6 @@ class InRestauranteMiddleware { $restaurante = Restaurante::findOrFail($request->route('restaurante_id')); $user = $request->user; - if(!$user->isOnRestaurante($restaurante)) { Log::debug('El usuario intento acceder a un restaurante que no le pertenece', [ 'user' => $user->id, diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index 01a4d22..50f0c0b 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -44,6 +44,7 @@ class Usuario extends Model { } public function isOnRestaurante($restaurante) { + if($this->isGlobalAdmin()) return true; return $this->restaurantes()->where('id', $restaurante->id)->count() > 0; } From a5b91eb5850f37da4ff52453ae504c7aaf4e70a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 02:40:57 -0400 Subject: [PATCH 08/13] Restaurantes se fija en el usuario que esta llamadno --- .../Controllers/RestaurantesController.php | 27 ++++++++++++++----- .../Http/Controllers/UsuariosController.php | 6 ++++- backend/routes/web.php | 8 +++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/backend/app/Http/Controllers/RestaurantesController.php b/backend/app/Http/Controllers/RestaurantesController.php index 0ce3102..76171a8 100644 --- a/backend/app/Http/Controllers/RestaurantesController.php +++ b/backend/app/Http/Controllers/RestaurantesController.php @@ -50,8 +50,8 @@ class RestaurantesController extends Controller { app(UuidService::class)->validOrFail($id); $restaurante = Restaurante::findOrFail($id); - if(!$request->user->isOnRestaurant($restaurante)){ - return ModelNotFoundException('restaurante', $restaurante->id); + if(!$request->user->isOnRestaurante($restaurante)){ + throw new ModelNotFoundException('restaurante', $restaurante->id); } return response()->json($restaurante); @@ -84,6 +84,11 @@ class RestaurantesController extends Controller { ]); $restaurant = Restaurante::findOrFail($id); + + if(!$request->user->isOnRestaurante($restaurant)){ + throw new ModelNotFoundException('restaurante', $restaurant->id); + } + $restaurant->nombre = $request->input('nombre'); $restaurant->save(); @@ -98,11 +103,19 @@ class RestaurantesController extends Controller { $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"); - if($restaurant->categorias()->count() > 0) throw new CantDeleteHasChildException("restaurant", "categoria"); + if($restaurant->canalesVenta()->count() > 0) throw new CantDeleteHasChildException("restaurant", "canal_venta"); + if($restaurant->categorias()->count() > 0) throw new CantDeleteHasChildException("restaurant", "categoria"); + if($restaurant->compras()->count() > 0) throw new CantDeleteHasChildException("restaurant", "compra"); + if($restaurant->usuarios()->count() > 0) throw new CantDeleteHasChildException("restaurant", "usuario"); + if($restaurant->sectores()->count() > 0) throw new CantDeleteHasChildException("restaurant", "sector"); + if($restaurant->zonasProduccion()->count() > 0) throw new CantDeleteHasChildException("restaurant", "zona_produccion"); + if($restaurant->proveedores()->count() > 0) throw new CantDeleteHasChildException("restaurant", "proveedor"); + if($restaurant->ingredientes()->count() > 0) throw new CantDeleteHasChildException("restaurant", "ingrediente"); + if($restaurant->productos()->count() > 0) throw new CantDeleteHasChildException("restaurant", "producto"); + if($restaurant->ventas()->count() > 0) throw new CantDeleteHasChildException("restaurant", "venta"); + if($restaurant->boletasElectronicas()->count() > 0) throw new CantDeleteHasChildException("restaurant", "boleta_electronica"); + if($restaurant->boletasExentas()->count() > 0) throw new CantDeleteHasChildException("restaurant", "boleta_exenta"); + if($restaurant->cajas()->count() > 0) throw new CantDeleteHasChildException("restaurant", "caja"); $restaurant->delete(); return response()->json([], 204); diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index a2a5ae0..4ce0aee 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -21,7 +21,11 @@ class UsuariosController extends Controller { * Obtiene de forma paginada los usuarios registrados en el backend */ public function all(Request $request) { - $usuarios = Usuario::all(); + if($request->user->isGlobalAdmin()) { + $usuarios = Usuario::all(); + } else { + $usuarios = Restaurante::all()->intersect($request->user->restaurantes); + } $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), diff --git a/backend/routes/web.php b/backend/routes/web.php index c52b711..d1ab1f3 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -23,7 +23,7 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->get( '/', ['as' => 'restaurant.all', 'uses' => 'RestaurantesController@all']); $router->get( '/{id}', ['as' => 'restaurant.get', 'uses' => 'RestaurantesController@get']); $router->post( '/', ['as' => 'restaurant.create', 'uses' => 'RestaurantesController@create', 'middleware' => ['role:global_admin']]); - $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => ['role:global_admin']]); + $router->put( '/{id}', ['as' => 'restaurant.update', 'uses' => 'RestaurantesController@update', 'middleware' => ['role:admin|global_admin']]); $router->delete('/{id}', ['as' => 'restaurant.delete', 'uses' => 'RestaurantesController@delete', 'middleware' => ['role:global_admin']]); $router->get( '/{restaurante_id}/canales-venta', ['as' => 'canales-venta.all', 'uses' => 'CanalesVentaController@all', 'middleware' => ['in_restaurante']]); @@ -32,8 +32,8 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->put( '/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.update', 'uses' => 'CanalesVentaController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->delete('/{restaurante_id}/canales-venta/{id}', ['as' => 'canales-venta.delete', 'uses' => 'CanalesVentaController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/sectores', ['as' => 'sectores.all', 'uses' => 'SectoresController@all', 'middleware' => ['in_restaurante']); - $router->get( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.get', 'uses' => 'SectoresController@get', 'middleware' => ['in_restaurante']); + $router->get( '/{restaurante_id}/sectores', ['as' => 'sectores.all', 'uses' => 'SectoresController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.get', 'uses' => 'SectoresController@get', 'middleware' => ['in_restaurante']]); $router->post( '/{restaurante_id}/sectores', ['as' => 'sectores.create', 'uses' => 'SectoresController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); @@ -84,7 +84,7 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->post( '/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.add', 'uses' => 'ComprasController@addIngrediente', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->delete('/{restaurante_id}/compras/{id}/ingredientes/{ingrediente_id}', ['as' => 'compras.ingredientes.delete', 'uses' => 'ComprasController@deleteIngrediente','middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get', 'middleware' => ['in_restaurante']]]); + $router->get( '/{restaurante_id}/compras/{id}/factura', ['as' => 'factura.get', 'uses' => 'FacturasController@get', 'middleware' => ['in_restaurante']]); $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']]); From 245c8bfa4b124dab1d5b5aa75b276c777722e77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 03:17:55 -0400 Subject: [PATCH 09/13] Controlador de bodega --- .../app/Http/Controllers/BodegaController.php | 126 ++++++++++++++++++ backend/app/Models/BodegaActual.php | 20 +++ backend/app/Models/BodegaEgreso.php | 20 +++ backend/app/Models/BodegaIngreso.php | 20 +++ backend/app/Models/BodegaMovimiento.php | 20 +++ backend/app/Models/Restaurante.php | 16 +++ backend/routes/web.php | 5 + database/init/00-schema.sql | 8 +- .../04-remove-references-from-bodega.sql | 11 ++ 9 files changed, 242 insertions(+), 4 deletions(-) create mode 100644 backend/app/Http/Controllers/BodegaController.php create mode 100644 backend/app/Models/BodegaActual.php create mode 100644 backend/app/Models/BodegaEgreso.php create mode 100644 backend/app/Models/BodegaIngreso.php create mode 100644 backend/app/Models/BodegaMovimiento.php create mode 100644 database/modifications/04-remove-references-from-bodega.sql 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 From 6314c125f7f9c6f54226c2ead7645fe1f6287293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 03:24:32 -0400 Subject: [PATCH 10/13] Ocultando los campos de timestamps de los modelos --- backend/app/Models/Administrador.php | 1 + backend/app/Models/BodegaActual.php | 1 + backend/app/Models/BodegaEgreso.php | 1 + backend/app/Models/BodegaIngreso.php | 1 + backend/app/Models/BodegaMovimiento.php | 1 + backend/app/Models/BoletaElectronica.php | 1 + backend/app/Models/BoletaExenta.php | 1 + backend/app/Models/Caja.php | 1 + backend/app/Models/CanalVenta.php | 1 + backend/app/Models/Categoria.php | 1 + backend/app/Models/Compra.php | 1 + backend/app/Models/CompraIngrediente.php | 1 + backend/app/Models/Efectivo.php | 1 + backend/app/Models/EstadoProduccion.php | 1 + backend/app/Models/Factura.php | 1 + backend/app/Models/Ingrediente.php | 1 + backend/app/Models/MedioPago.php | 1 + backend/app/Models/Mesero.php | 1 + backend/app/Models/Producto.php | 1 + backend/app/Models/Productor.php | 1 + backend/app/Models/Proveedor.php | 1 + backend/app/Models/Recaudador.php | 1 + backend/app/Models/Receta.php | 1 + backend/app/Models/Restaurante.php | 2 +- backend/app/Models/Sector.php | 1 + backend/app/Models/TipoCanal.php | 1 + backend/app/Models/Usuario.php | 1 + backend/app/Models/Venta.php | 1 + backend/app/Models/VentaProducto.php | 1 + backend/app/Models/ZonaProduccion.php | 1 + 30 files changed, 30 insertions(+), 1 deletion(-) diff --git a/backend/app/Models/Administrador.php b/backend/app/Models/Administrador.php index cc3a484..98b35c2 100644 --- a/backend/app/Models/Administrador.php +++ b/backend/app/Models/Administrador.php @@ -11,6 +11,7 @@ class Administrador extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'administradores'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function usuario() { return $this->belongsTo(Usuario::class); diff --git a/backend/app/Models/BodegaActual.php b/backend/app/Models/BodegaActual.php index 9e4ec30..e4fb8af 100644 --- a/backend/app/Models/BodegaActual.php +++ b/backend/app/Models/BodegaActual.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaActual extends Model { protected $table = 'bodega_actual'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function restaurante() { diff --git a/backend/app/Models/BodegaEgreso.php b/backend/app/Models/BodegaEgreso.php index 5d4d7d5..d1bdc6a 100644 --- a/backend/app/Models/BodegaEgreso.php +++ b/backend/app/Models/BodegaEgreso.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaEgreso extends Model { protected $table = 'bodega_egresos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function restaurante() { diff --git a/backend/app/Models/BodegaIngreso.php b/backend/app/Models/BodegaIngreso.php index 50f6f82..97db037 100644 --- a/backend/app/Models/BodegaIngreso.php +++ b/backend/app/Models/BodegaIngreso.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaIngreso extends Model { protected $table = 'bodega_ingresos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function restaurante() { diff --git a/backend/app/Models/BodegaMovimiento.php b/backend/app/Models/BodegaMovimiento.php index 79d6d09..64ae5f9 100644 --- a/backend/app/Models/BodegaMovimiento.php +++ b/backend/app/Models/BodegaMovimiento.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaMovimiento extends Model { protected $table = 'bodega_movimientos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function restaurante() { diff --git a/backend/app/Models/BoletaElectronica.php b/backend/app/Models/BoletaElectronica.php index dccffcd..e734eb3 100644 --- a/backend/app/Models/BoletaElectronica.php +++ b/backend/app/Models/BoletaElectronica.php @@ -11,6 +11,7 @@ class BoletaElectronica extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'boletas_electronicas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/BoletaExenta.php b/backend/app/Models/BoletaExenta.php index 5499930..0dc3149 100644 --- a/backend/app/Models/BoletaExenta.php +++ b/backend/app/Models/BoletaExenta.php @@ -11,6 +11,7 @@ class BoletaExenta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'boletas_exentas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/Caja.php b/backend/app/Models/Caja.php index 120ee75..b0766c1 100644 --- a/backend/app/Models/Caja.php +++ b/backend/app/Models/Caja.php @@ -11,6 +11,7 @@ class Caja extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'cajas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/app/Models/CanalVenta.php b/backend/app/Models/CanalVenta.php index 7818eea..e47cda0 100644 --- a/backend/app/Models/CanalVenta.php +++ b/backend/app/Models/CanalVenta.php @@ -11,6 +11,7 @@ class CanalVenta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'canales_venta'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre', 'restaurante_id', 'sector_id', 'tipo_canal_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Categoria.php b/backend/app/Models/Categoria.php index 4af8929..f838576 100644 --- a/backend/app/Models/Categoria.php +++ b/backend/app/Models/Categoria.php @@ -11,6 +11,7 @@ class Categoria extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'categorias'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Compra.php b/backend/app/Models/Compra.php index 4097bad..9c6c893 100644 --- a/backend/app/Models/Compra.php +++ b/backend/app/Models/Compra.php @@ -11,6 +11,7 @@ class Compra extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compras'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = [ 'id', 'fecha_compra', 'proveedor_id', 'en_arqueo', 'restaurante_id' ]; diff --git a/backend/app/Models/CompraIngrediente.php b/backend/app/Models/CompraIngrediente.php index e2135cc..90f2b3e 100644 --- a/backend/app/Models/CompraIngrediente.php +++ b/backend/app/Models/CompraIngrediente.php @@ -11,6 +11,7 @@ class CompraIngrediente extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compra_ingredientes'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'unidades', 'monto_unitario', 'compra_id', 'ingrediente_id']; public function ingrediente() { diff --git a/backend/app/Models/Efectivo.php b/backend/app/Models/Efectivo.php index d929fbb..802f9bf 100644 --- a/backend/app/Models/Efectivo.php +++ b/backend/app/Models/Efectivo.php @@ -11,6 +11,7 @@ class Efectivo extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'efectivos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function caja() { return $this->belongsTo(Caja::class); diff --git a/backend/app/Models/EstadoProduccion.php b/backend/app/Models/EstadoProduccion.php index 4038757..721720e 100644 --- a/backend/app/Models/EstadoProduccion.php +++ b/backend/app/Models/EstadoProduccion.php @@ -11,4 +11,5 @@ class EstadoProduccion extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'estados_produccion'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; } diff --git a/backend/app/Models/Factura.php b/backend/app/Models/Factura.php index 531b5d7..80f5ecf 100644 --- a/backend/app/Models/Factura.php +++ b/backend/app/Models/Factura.php @@ -11,6 +11,7 @@ class Factura extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'facturas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'numero', 'monto_bruto', 'compra_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Ingrediente.php b/backend/app/Models/Ingrediente.php index c68612c..cb958c8 100644 --- a/backend/app/Models/Ingrediente.php +++ b/backend/app/Models/Ingrediente.php @@ -11,6 +11,7 @@ class Ingrediente extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'ingredientes'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre', 'medida', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/MedioPago.php b/backend/app/Models/MedioPago.php index 0a34c9a..52151dd 100644 --- a/backend/app/Models/MedioPago.php +++ b/backend/app/Models/MedioPago.php @@ -11,4 +11,5 @@ class MedioPago extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'medios_pago'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; } diff --git a/backend/app/Models/Mesero.php b/backend/app/Models/Mesero.php index f787e2a..7cbb4da 100644 --- a/backend/app/Models/Mesero.php +++ b/backend/app/Models/Mesero.php @@ -11,6 +11,7 @@ class Mesero extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'meseros'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function usuario() { return $this->belongsTo(Usuario::class); diff --git a/backend/app/Models/Producto.php b/backend/app/Models/Producto.php index a938c65..8fa10aa 100644 --- a/backend/app/Models/Producto.php +++ b/backend/app/Models/Producto.php @@ -11,6 +11,7 @@ class Producto extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'productos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = [ 'id', 'nombre', 'precio_venta', 'categoria_id', 'zona_produccion_id', 'restaurante_id' diff --git a/backend/app/Models/Productor.php b/backend/app/Models/Productor.php index 4fb02a2..0c49b2a 100644 --- a/backend/app/Models/Productor.php +++ b/backend/app/Models/Productor.php @@ -11,6 +11,7 @@ class Productor extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'productores'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function usuario() { return $this->belongsTo(Usuario::class); diff --git a/backend/app/Models/Proveedor.php b/backend/app/Models/Proveedor.php index b43788a..b745f41 100644 --- a/backend/app/Models/Proveedor.php +++ b/backend/app/Models/Proveedor.php @@ -11,6 +11,7 @@ class Proveedor extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'proveedores'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = [ 'id', 'rut', 'nombre', 'descripcion', 'direccion', 'telefono', 'restaurante_id' diff --git a/backend/app/Models/Recaudador.php b/backend/app/Models/Recaudador.php index 44ad161..626d0cd 100644 --- a/backend/app/Models/Recaudador.php +++ b/backend/app/Models/Recaudador.php @@ -11,6 +11,7 @@ class Recaudador extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'recaudadores'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function usuario() { return $this->belongsTo(Usuario::class); diff --git a/backend/app/Models/Receta.php b/backend/app/Models/Receta.php index f8834e8..fee3eb3 100644 --- a/backend/app/Models/Receta.php +++ b/backend/app/Models/Receta.php @@ -10,6 +10,7 @@ class Receta extends Model { use UuidPrimaryKey; protected $table = 'recetas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['unidades', 'producto_id', 'ingrediente_id']; public function ingrediente() { diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index 5389b44..1f16faa 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -13,7 +13,7 @@ class Restaurante extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'restaurantes'; - + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre']; public static function findOrFail($id) { diff --git a/backend/app/Models/Sector.php b/backend/app/Models/Sector.php index b36d2ba..4a7ffdc 100644 --- a/backend/app/Models/Sector.php +++ b/backend/app/Models/Sector.php @@ -11,6 +11,7 @@ class Sector extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'sectores'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/TipoCanal.php b/backend/app/Models/TipoCanal.php index d08f5df..1d30f2c 100644 --- a/backend/app/Models/TipoCanal.php +++ b/backend/app/Models/TipoCanal.php @@ -11,4 +11,5 @@ class TipoCanal extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'tipos_canal'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; } diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index 50f0c0b..5af8ae5 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -16,6 +16,7 @@ class Usuario extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'usuarios'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'auth0_id', 'nombre']; protected $appends = ['roles']; diff --git a/backend/app/Models/Venta.php b/backend/app/Models/Venta.php index 4ba7854..ee35578 100644 --- a/backend/app/Models/Venta.php +++ b/backend/app/Models/Venta.php @@ -11,6 +11,7 @@ class Venta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'ventas'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function mesero() { return $this->belongsTo(Mesero::class); diff --git a/backend/app/Models/VentaProducto.php b/backend/app/Models/VentaProducto.php index 5b3c929..c24b2c1 100644 --- a/backend/app/Models/VentaProducto.php +++ b/backend/app/Models/VentaProducto.php @@ -11,6 +11,7 @@ class VentaProducto extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'venta_productos'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/ZonaProduccion.php b/backend/app/Models/ZonaProduccion.php index 95bc971..15199aa 100644 --- a/backend/app/Models/ZonaProduccion.php +++ b/backend/app/Models/ZonaProduccion.php @@ -11,6 +11,7 @@ class ZonaProduccion extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'zonas_produccion'; + protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { From 448856e6275a8da5eab014e41fdd524b0c267acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 03:34:01 -0400 Subject: [PATCH 11/13] Agregando ingredientes en las respuestas de bodega --- backend/app/Http/Controllers/BodegaController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/app/Http/Controllers/BodegaController.php b/backend/app/Http/Controllers/BodegaController.php index fe7a86f..7174e15 100644 --- a/backend/app/Http/Controllers/BodegaController.php +++ b/backend/app/Http/Controllers/BodegaController.php @@ -47,7 +47,7 @@ class BodegaController extends Controller { app(UuidService::class)->validOrFail($restaurante_id); $restaurante = Restaurante::findOrFail($restaurante_id); - $egresos = $restaurante->bodegaEgresos(); + $egresos = $restaurante->bodegaEgresos()->with('ingrediente'); $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), @@ -75,7 +75,7 @@ class BodegaController extends Controller { app(UuidService::class)->validOrFail($restaurante_id); $restaurante = Restaurante::findOrFail($restaurante_id); - $movimientos = $restaurante->bodegaMovimientos(); + $movimientos = $restaurante->bodegaMovimientos()->with('ingrediente'); $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), @@ -103,7 +103,7 @@ class BodegaController extends Controller { app(UuidService::class)->validOrFail($restaurante_id); $restaurante = Restaurante::findOrFail($restaurante_id); - $actual = $restaurante->bodegaActual(); + $actual = $restaurante->bodegaActual()->with('ingrediente'); $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), From 02871ab73bca088276725e4a43845f95fb709434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 13:42:22 -0400 Subject: [PATCH 12/13] Agregando endpoint para consultar el estado de distintos ingredientes --- .../app/Http/Controllers/BodegaController.php | 115 +++++++++++++++++- backend/routes/web.php | 12 +- 2 files changed, 119 insertions(+), 8 deletions(-) diff --git a/backend/app/Http/Controllers/BodegaController.php b/backend/app/Http/Controllers/BodegaController.php index 7174e15..8ffca68 100644 --- a/backend/app/Http/Controllers/BodegaController.php +++ b/backend/app/Http/Controllers/BodegaController.php @@ -13,13 +13,15 @@ use Ramsey\Uuid\Uuid; class BodegaController extends Controller { /** - * Obtiene de forma paginada los ingresos de productos + * Obtiene de forma paginada los ingresos de ingredientes */ public function ingresos(Request $request, $restaurante_id) { app(UuidService::class)->validOrFail($restaurante_id); $restaurante = Restaurante::findOrFail($restaurante_id); - $ingresos = $restaurante->bodegaIngresos()->with('ingrediente'); + $ingresos = $restaurante->bodegaIngresos() + ->orderBy('fecha', 'desc') + ->with('ingrediente'); $paginate = app(PaginatorService::class)->paginate( perPage: $request->input('per_page', 15), @@ -41,7 +43,37 @@ class BodegaController extends Controller { } /** - * Obtiene de forma paginada los egresos de productos + * Obtiene los ingresos de un ingrediente + */ + public function ingresos_ingrediente(Request $request, $restaurante_id, $ingrediente_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $ingresos = $restaurante->bodegaIngresos() + ->where('ingrediente_id', $ingrediente_id) + ->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 ingredientes */ public function egresos(Request $request, $restaurante_id) { app(UuidService::class)->validOrFail($restaurante_id); @@ -69,7 +101,37 @@ class BodegaController extends Controller { } /** - * Obtiene de forma paginada los movimientos de productos + * Obtiene los egresos de un ingrediente + */ + public function egresos_ingrediente(Request $request, $restaurante_id, $ingrediente_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $egresos = $restaurante->bodegaEgresos() + ->where('ingrediente_id', $ingrediente_id) + ->with('ingrediente'); + + $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 ingredientes */ public function movimientos(Request $request, $restaurante_id) { app(UuidService::class)->validOrFail($restaurante_id); @@ -96,6 +158,36 @@ class BodegaController extends Controller { ]); } + /** + * Obtiene de forma paginada los movimientos de un ingrediente + */ + public function movimientos_ingrediente(Request $request, $restaurante_id, $ingrediente_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $movimientos = $restaurante->bodegaMovimientos() + ->where('ingrediente_id', $ingrediente_id) + ->with('ingrediente'); + + $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 */ @@ -123,4 +215,19 @@ class BodegaController extends Controller { 'data' => $data ]); } + + /** + * Obtiene el estado actual de un ingrediente + */ + public function actual_ingrediente(Request $request, $restaurante_id, $ingrediente_id) { + app(UuidService::class)->validOrFail($restaurante_id); + $restaurante = Restaurante::findOrFail($restaurante_id); + + $actual = $restaurante->bodegaActual() + ->where('ingrediente_id', $ingrediente_id) + ->with('ingrediente') + ->first(); + + return response()->json($actual); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index 340b2c4..e8199c3 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -89,9 +89,13 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $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']]); + $router->get( '/{restaurante_id}/bodega/ingresos', ['as' => 'bodega.ingresos', 'uses' => 'BodegaController@ingresos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/ingresos/{ingrediente_id}', ['as' => 'bodega.ingresos_ingrediente', 'uses' => 'BodegaController@ingresos_ingrediente', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/egresos', ['as' => 'bodega.egresos', 'uses' => 'BodegaController@egresos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/egresos/{ingrediente_id}', ['as' => 'bodega.egresos_ingrediente', 'uses' => 'BodegaController@egresos_ingrediente', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/movimientos', ['as' => 'bodega.movimientos', 'uses' => 'BodegaController@movimientos', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/movimientos/{ingrediente_id}', ['as' => 'bodega.movimientos_ingrediente', 'uses' => 'BodegaController@movimientos_ingrediente', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/actual', ['as' => 'bodega.actual', 'uses' => 'BodegaController@actual', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/bodega/actual/{ingrediente_id}', ['as' => 'bodega.actual_ingrediente', 'uses' => 'BodegaController@actual_ingrediente', 'middleware' => ['in_restaurante']]); }); }); From 1d6082a5905733aca1f6cb3097d3e2f1bd48a577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Tue, 20 Jul 2021 15:27:55 -0400 Subject: [PATCH 13/13] Mcuhos cambios .w. --- .../Http/Controllers/UsuariosController.php | 44 ++++++++++--------- .../Controllers/ZonasProduccionController.php | 17 +++++++ backend/app/Models/Administrador.php | 19 -------- backend/app/Models/BodegaActual.php | 3 +- backend/app/Models/BodegaEgreso.php | 2 +- backend/app/Models/BodegaIngreso.php | 2 +- backend/app/Models/BodegaMovimiento.php | 3 +- backend/app/Models/BoletaElectronica.php | 2 +- backend/app/Models/BoletaExenta.php | 2 +- backend/app/Models/Caja.php | 2 +- backend/app/Models/CanalVenta.php | 2 +- backend/app/Models/Categoria.php | 2 +- backend/app/Models/Compra.php | 2 +- backend/app/Models/CompraIngrediente.php | 2 +- backend/app/Models/Efectivo.php | 2 +- backend/app/Models/EstadoProduccion.php | 2 +- backend/app/Models/Factura.php | 2 +- backend/app/Models/Ingrediente.php | 2 +- backend/app/Models/MedioPago.php | 2 +- backend/app/Models/Mesero.php | 19 -------- backend/app/Models/Producto.php | 2 +- backend/app/Models/Productor.php | 23 ---------- backend/app/Models/Proveedor.php | 2 +- backend/app/Models/Recaudador.php | 19 -------- backend/app/Models/Receta.php | 2 +- backend/app/Models/Restaurante.php | 2 +- backend/app/Models/Sector.php | 2 +- backend/app/Models/TipoCanal.php | 2 +- backend/app/Models/Usuario.php | 17 ++----- backend/app/Models/Venta.php | 2 +- backend/app/Models/VentaProducto.php | 2 +- backend/app/Models/ZonaProduccion.php | 6 ++- backend/routes/web.php | 12 ++--- .../modifications/05-simplify-usuario.sql | 6 +++ database/selects.sql | 8 ---- 35 files changed, 85 insertions(+), 155 deletions(-) delete mode 100644 backend/app/Models/Administrador.php delete mode 100644 backend/app/Models/Mesero.php delete mode 100644 backend/app/Models/Productor.php delete mode 100644 backend/app/Models/Recaudador.php create mode 100644 database/modifications/05-simplify-usuario.sql delete mode 100644 database/selects.sql diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index 4ce0aee..c783649 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -48,16 +48,12 @@ class UsuariosController extends Controller { * Obtiene un usuario por su id */ public function get(Request $request, $id) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); - $usuario = Usuario::findOrFail(urldecode($id)); - return response()->json($usuario); - } + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); - /** - * Se obtiene al usuario logeado - */ - public function getMe(Request $request) { - return response()->json($request->user); + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); + + return response()->json($usuario); } /** @@ -107,7 +103,7 @@ class UsuariosController extends Controller { * Actualiza un usuario */ public function update(Request $request, $id) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); $this->validate($request, [ 'nombre' => 'sometimes', @@ -118,7 +114,8 @@ class UsuariosController extends Controller { 'roles.*' => ['sometimes', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])], ]); - $usuario = Usuario::findOrFail(urldecode($id)); + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); $metadata = []; if ($request->input('roles')) $metadata['roles'] = $request->input('roles'); @@ -149,9 +146,10 @@ class UsuariosController extends Controller { * Elimina un usuario */ public function delete(Request $request, $id) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); - $usuario = Usuario::findOrFail(urldecode($id)); + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); $auth0 = app(Auth0Service::class); $auth0Response = $auth0->deleteUser($usuario->auth0_id); @@ -172,8 +170,10 @@ class UsuariosController extends Controller { * Obtiene los usuarios de un restaurant */ public function getRestaurantes(Request $request, $id) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); - $usuario = Usuario::findOrFail(urldecode($id)); + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); + + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); return response()->json($usuario->restaurantes); } @@ -182,10 +182,12 @@ class UsuariosController extends Controller { * Agrega usuario a un restaurant */ public function addToRestaurant(Request $request, $id, $restaurant) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); app(UuidService::class)->validOrFail($restaurant); - $usuario = Usuario::findOrFail(urldecode($id)); + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); + $restaurant = Restaurante::findOrFail($restaurant); if ($usuario->restaurantes->contains($restaurant)) { @@ -204,10 +206,12 @@ class UsuariosController extends Controller { * Saca a un usuario de un restaurant */ public function removeFromRestaurant(Request $request, $id, $restaurant) { - if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); - app(UuidService::class)->validOrFail($restaurant); + if (!str_starts_with($id, 'auth0') && $id != 'me') app(UuidService::class)->validOrFail($id); + app(UuidService::class)->validOrFail($restaurant); + + if ($id == 'me') $usuario = $request->user; + else $usuario = Usuario::findOrFail(urldecode($id)); - $usuario = Usuario::findOrFail(urldecode($id)); $restaurant = Restaurante::findOrFail($restaurant); if (!$usuario->restaurantes->contains($restaurant)) { diff --git a/backend/app/Http/Controllers/ZonasProduccionController.php b/backend/app/Http/Controllers/ZonasProduccionController.php index ff6ca53..ea4f838 100644 --- a/backend/app/Http/Controllers/ZonasProduccionController.php +++ b/backend/app/Http/Controllers/ZonasProduccionController.php @@ -60,6 +60,23 @@ class ZonasProduccionController extends Controller { return response()->json($zonaProduccion); } + /** + * Obtiene los usuarios de una zona de produccion + */ + public function users(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->usuarios); + } + /** * Crea una nueva zona de produccion */ diff --git a/backend/app/Models/Administrador.php b/backend/app/Models/Administrador.php deleted file mode 100644 index 98b35c2..0000000 --- a/backend/app/Models/Administrador.php +++ /dev/null @@ -1,19 +0,0 @@ -belongsTo(Usuario::class); - } -} diff --git a/backend/app/Models/BodegaActual.php b/backend/app/Models/BodegaActual.php index e4fb8af..e07f985 100644 --- a/backend/app/Models/BodegaActual.php +++ b/backend/app/Models/BodegaActual.php @@ -8,8 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaActual extends Model { protected $table = 'bodega_actual'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; - + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/app/Models/BodegaEgreso.php b/backend/app/Models/BodegaEgreso.php index d1bdc6a..b37b27b 100644 --- a/backend/app/Models/BodegaEgreso.php +++ b/backend/app/Models/BodegaEgreso.php @@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaEgreso extends Model { protected $table = 'bodega_egresos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function restaurante() { diff --git a/backend/app/Models/BodegaIngreso.php b/backend/app/Models/BodegaIngreso.php index 97db037..5f43dbe 100644 --- a/backend/app/Models/BodegaIngreso.php +++ b/backend/app/Models/BodegaIngreso.php @@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaIngreso extends Model { protected $table = 'bodega_ingresos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function restaurante() { diff --git a/backend/app/Models/BodegaMovimiento.php b/backend/app/Models/BodegaMovimiento.php index 64ae5f9..da77c2f 100644 --- a/backend/app/Models/BodegaMovimiento.php +++ b/backend/app/Models/BodegaMovimiento.php @@ -8,8 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class BodegaMovimiento extends Model { protected $table = 'bodega_movimientos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; - + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/app/Models/BoletaElectronica.php b/backend/app/Models/BoletaElectronica.php index e734eb3..b75faf6 100644 --- a/backend/app/Models/BoletaElectronica.php +++ b/backend/app/Models/BoletaElectronica.php @@ -11,7 +11,7 @@ class BoletaElectronica extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'boletas_electronicas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/BoletaExenta.php b/backend/app/Models/BoletaExenta.php index 0dc3149..a74a8df 100644 --- a/backend/app/Models/BoletaExenta.php +++ b/backend/app/Models/BoletaExenta.php @@ -11,7 +11,7 @@ class BoletaExenta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'boletas_exentas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/Caja.php b/backend/app/Models/Caja.php index b0766c1..f7e2b32 100644 --- a/backend/app/Models/Caja.php +++ b/backend/app/Models/Caja.php @@ -11,7 +11,7 @@ class Caja extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'cajas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function restaurante() { return $this->belongsTo(Restaurante::class); diff --git a/backend/app/Models/CanalVenta.php b/backend/app/Models/CanalVenta.php index e47cda0..11176f2 100644 --- a/backend/app/Models/CanalVenta.php +++ b/backend/app/Models/CanalVenta.php @@ -11,7 +11,7 @@ class CanalVenta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'canales_venta'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre', 'restaurante_id', 'sector_id', 'tipo_canal_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Categoria.php b/backend/app/Models/Categoria.php index f838576..fe6f4fd 100644 --- a/backend/app/Models/Categoria.php +++ b/backend/app/Models/Categoria.php @@ -11,7 +11,7 @@ class Categoria extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'categorias'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Compra.php b/backend/app/Models/Compra.php index 9c6c893..e78e0c7 100644 --- a/backend/app/Models/Compra.php +++ b/backend/app/Models/Compra.php @@ -11,7 +11,7 @@ class Compra extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compras'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = [ 'id', 'fecha_compra', 'proveedor_id', 'en_arqueo', 'restaurante_id' ]; diff --git a/backend/app/Models/CompraIngrediente.php b/backend/app/Models/CompraIngrediente.php index 90f2b3e..26f9e1f 100644 --- a/backend/app/Models/CompraIngrediente.php +++ b/backend/app/Models/CompraIngrediente.php @@ -11,7 +11,7 @@ class CompraIngrediente extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'compra_ingredientes'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'unidades', 'monto_unitario', 'compra_id', 'ingrediente_id']; public function ingrediente() { diff --git a/backend/app/Models/Efectivo.php b/backend/app/Models/Efectivo.php index 802f9bf..ed037de 100644 --- a/backend/app/Models/Efectivo.php +++ b/backend/app/Models/Efectivo.php @@ -11,7 +11,7 @@ class Efectivo extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'efectivos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function caja() { return $this->belongsTo(Caja::class); diff --git a/backend/app/Models/EstadoProduccion.php b/backend/app/Models/EstadoProduccion.php index 721720e..44122c8 100644 --- a/backend/app/Models/EstadoProduccion.php +++ b/backend/app/Models/EstadoProduccion.php @@ -11,5 +11,5 @@ class EstadoProduccion extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'estados_produccion'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; } diff --git a/backend/app/Models/Factura.php b/backend/app/Models/Factura.php index 80f5ecf..68f989c 100644 --- a/backend/app/Models/Factura.php +++ b/backend/app/Models/Factura.php @@ -11,7 +11,7 @@ class Factura extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'facturas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'numero', 'monto_bruto', 'compra_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/Ingrediente.php b/backend/app/Models/Ingrediente.php index cb958c8..497516b 100644 --- a/backend/app/Models/Ingrediente.php +++ b/backend/app/Models/Ingrediente.php @@ -11,7 +11,7 @@ class Ingrediente extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'ingredientes'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre', 'medida', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/MedioPago.php b/backend/app/Models/MedioPago.php index 52151dd..0b12f3e 100644 --- a/backend/app/Models/MedioPago.php +++ b/backend/app/Models/MedioPago.php @@ -11,5 +11,5 @@ class MedioPago extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'medios_pago'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; } diff --git a/backend/app/Models/Mesero.php b/backend/app/Models/Mesero.php deleted file mode 100644 index 7cbb4da..0000000 --- a/backend/app/Models/Mesero.php +++ /dev/null @@ -1,19 +0,0 @@ -belongsTo(Usuario::class); - } -} diff --git a/backend/app/Models/Producto.php b/backend/app/Models/Producto.php index 8fa10aa..2ffd88d 100644 --- a/backend/app/Models/Producto.php +++ b/backend/app/Models/Producto.php @@ -11,7 +11,7 @@ class Producto extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'productos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = [ 'id', 'nombre', 'precio_venta', 'categoria_id', 'zona_produccion_id', 'restaurante_id' diff --git a/backend/app/Models/Productor.php b/backend/app/Models/Productor.php deleted file mode 100644 index 0c49b2a..0000000 --- a/backend/app/Models/Productor.php +++ /dev/null @@ -1,23 +0,0 @@ -belongsTo(Usuario::class); - } - - public function zonaProduccion() { - return $this->belongsTo(ZonaProduccion::class); - } -} diff --git a/backend/app/Models/Proveedor.php b/backend/app/Models/Proveedor.php index b745f41..d6631bf 100644 --- a/backend/app/Models/Proveedor.php +++ b/backend/app/Models/Proveedor.php @@ -11,7 +11,7 @@ class Proveedor extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'proveedores'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = [ 'id', 'rut', 'nombre', 'descripcion', 'direccion', 'telefono', 'restaurante_id' diff --git a/backend/app/Models/Recaudador.php b/backend/app/Models/Recaudador.php deleted file mode 100644 index 626d0cd..0000000 --- a/backend/app/Models/Recaudador.php +++ /dev/null @@ -1,19 +0,0 @@ -belongsTo(Usuario::class); - } -} diff --git a/backend/app/Models/Receta.php b/backend/app/Models/Receta.php index fee3eb3..aea1261 100644 --- a/backend/app/Models/Receta.php +++ b/backend/app/Models/Receta.php @@ -10,7 +10,7 @@ class Receta extends Model { use UuidPrimaryKey; protected $table = 'recetas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['unidades', 'producto_id', 'ingrediente_id']; public function ingrediente() { diff --git a/backend/app/Models/Restaurante.php b/backend/app/Models/Restaurante.php index 1f16faa..83deb8d 100644 --- a/backend/app/Models/Restaurante.php +++ b/backend/app/Models/Restaurante.php @@ -13,7 +13,7 @@ class Restaurante extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'restaurantes'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre']; public static function findOrFail($id) { diff --git a/backend/app/Models/Sector.php b/backend/app/Models/Sector.php index 4a7ffdc..0b2f918 100644 --- a/backend/app/Models/Sector.php +++ b/backend/app/Models/Sector.php @@ -11,7 +11,7 @@ class Sector extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'sectores'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { diff --git a/backend/app/Models/TipoCanal.php b/backend/app/Models/TipoCanal.php index 1d30f2c..38283a3 100644 --- a/backend/app/Models/TipoCanal.php +++ b/backend/app/Models/TipoCanal.php @@ -11,5 +11,5 @@ class TipoCanal extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'tipos_canal'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; } diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index 5af8ae5..e2a487f 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -16,7 +16,7 @@ class Usuario extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'usuarios'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'auth0_id', 'nombre']; protected $appends = ['roles']; @@ -53,21 +53,10 @@ class Usuario extends Model { return $this->belongsToMany(Restaurante::class, 'usuarios_restaurantes', 'usuario_id', 'restaurante_id'); } - public function administrador() { - return $this->hasOne(Administrador::class); + public function zonasProduccion() { + return $this->belongsToMany(ZonaProduccion::class, 'productores', 'usuario_id', 'zona_produccion_id'); } - public function recaudador() { - return $this->hasOne(Recaudador::class); - } - - public function mesero() { - return $this->hasOne(Mesero::class); - } - - public function productor() { - return $this->hasOne(Productor::class); - } public function getRolesAttribute() { $auth0Service = app(Auth0Service::class); diff --git a/backend/app/Models/Venta.php b/backend/app/Models/Venta.php index ee35578..8fcce20 100644 --- a/backend/app/Models/Venta.php +++ b/backend/app/Models/Venta.php @@ -11,7 +11,7 @@ class Venta extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'ventas'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function mesero() { return $this->belongsTo(Mesero::class); diff --git a/backend/app/Models/VentaProducto.php b/backend/app/Models/VentaProducto.php index c24b2c1..20eb00c 100644 --- a/backend/app/Models/VentaProducto.php +++ b/backend/app/Models/VentaProducto.php @@ -11,7 +11,7 @@ class VentaProducto extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'venta_productos'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; public function venta() { return $this->belongsTo(Venta::class); diff --git a/backend/app/Models/ZonaProduccion.php b/backend/app/Models/ZonaProduccion.php index 15199aa..c98ee76 100644 --- a/backend/app/Models/ZonaProduccion.php +++ b/backend/app/Models/ZonaProduccion.php @@ -11,7 +11,7 @@ class ZonaProduccion extends Model { use UuidPrimaryKey, SoftDeletes; protected $table = 'zonas_produccion'; - protected $hidden = ['created_at', 'updated_at', 'deleted_at']; + protected $hidden = ['created_at', 'updated_at', 'deleted_at', 'pivot']; protected $fillable = ['id', 'nombre', 'restaurante_id']; public static function findOrFail($id) { @@ -23,4 +23,8 @@ class ZonaProduccion extends Model { public function restaurante() { return $this->belongsTo(Restaurante::class); } + + public function usuarios() { + return $this->belongsToMany(Usuario::class, 'productores', 'zona_produccion_id', 'usuario_id'); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index e8199c3..511659a 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -9,7 +9,6 @@ $router->get('/', function () use ($router) { $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], function () use ($router) { $router->group(['prefix' => '/users'], function () use ($router) { $router->get( '/', ['as' => 'users.all', 'uses' => 'UsuariosController@all', 'middleware' => ['role:admin|global_admin']]); - $router->get( '/me', ['as' => 'users.get_me', 'uses' => 'UsuariosController@getMe']); $router->get( '/{id}', ['as' => 'users.get', 'uses' => 'UsuariosController@get', 'middleware' => ['role:admin|global_admin']]); $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create', 'middleware' => ['role:admin|global_admin']]); $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update', 'middleware' => ['role:admin|global_admin']]); @@ -38,11 +37,12 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->put( '/{restaurante_id}/sectores/{id}', ['as' => 'sectores.update', 'uses' => 'SectoresController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->delete('/{restaurante_id}/sectores/{id}', ['as' => 'sectores.delete', 'uses' => 'SectoresController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->get( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.all', 'uses' => 'ZonasProduccionController@all', 'middleware' => ['in_restaurante']]); - $router->get( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.get', 'uses' => 'ZonasProduccionController@get', 'middleware' => ['in_restaurante']]); - $router->post( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.create', 'uses' => 'ZonasProduccionController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); - $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->get( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.all', 'uses' => 'ZonasProduccionController@all', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.get', 'uses' => 'ZonasProduccionController@get', 'middleware' => ['in_restaurante']]); + $router->get( '/{restaurante_id}/zonas-produccion/{id}/users', ['as' => 'zonas-produccion.users', 'uses' => 'ZonasProduccionController@users', 'middleware' => ['in_restaurante']]); + $router->post( '/{restaurante_id}/zonas-produccion', ['as' => 'zonas-produccion.create', 'uses' => 'ZonasProduccionController@create', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->put( '/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.update', 'uses' => 'ZonasProduccionController@update', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); + $router->delete('/{restaurante_id}/zonas-produccion/{id}', ['as' => 'zonas-produccion.delete', 'uses' => 'ZonasProduccionController@delete', 'middleware' => ['role:admin|global_admin', 'in_restaurante']]); $router->get( '/{restaurante_id}/categorias', ['as' => 'categorias.all', 'uses' => 'CategoriasController@all', 'middleware' => ['in_restaurante']]); $router->get( '/{restaurante_id}/categorias/{id}', ['as' => 'categorias.get', 'uses' => 'CategoriasController@get', 'middleware' => ['in_restaurante']]); diff --git a/database/modifications/05-simplify-usuario.sql b/database/modifications/05-simplify-usuario.sql new file mode 100644 index 0000000..47fbdc7 --- /dev/null +++ b/database/modifications/05-simplify-usuario.sql @@ -0,0 +1,6 @@ +alter table ventas drop column mesero_id; +alter table ventas add column usuario_id uuid references usuarios; + +drop table meseros; +drop table administradores; +drop table recaudadores; \ No newline at end of file diff --git a/database/selects.sql b/database/selects.sql deleted file mode 100644 index 34559cf..0000000 --- a/database/selects.sql +++ /dev/null @@ -1,8 +0,0 @@ -select * -from bodega_ingresos; -select * -from bodega_egresos; -select * -from bodega_movimientos; -select * -from bodega_actual; \ No newline at end of file