diff --git a/app/Http/Controllers/Api/SubpedidoController.php b/app/Http/Controllers/Api/SubpedidoController.php index f09e9fd..dac3027 100644 --- a/app/Http/Controllers/Api/SubpedidoController.php +++ b/app/Http/Controllers/Api/SubpedidoController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use App\Filtros\FiltroDeSubpedido; use App\Subpedido; use App\GrupoDeCompra; +use App\Http\Resources\SubpedidoResource; use Illuminate\Validation\Rule; use Symfony\Component\HttpKernel\Exception\HttpException; @@ -53,4 +54,15 @@ class SubpedidoController extends Controller ] ]); } + + /** + * Display the specified resource. + * + * @param \App\Subpedido $subpedido + * @return \Illuminate\Http\Response + */ + public function show(Subpedido $subpedido) + { + return new SubpedidoResource($subpedido); + } } diff --git a/app/Http/Resources/SubpedidoResource.php b/app/Http/Resources/SubpedidoResource.php new file mode 100644 index 0000000..e6361ba --- /dev/null +++ b/app/Http/Resources/SubpedidoResource.php @@ -0,0 +1,28 @@ + $this->id, + 'nombre' => $this->nombre, + 'subtotal_productos' => $this->getSubtotalProductos(), + 'subtotal_bonos' => $this->getSubtotalBonos(), + 'bonos_de_transporte' => $this->cantidadBDT(), + 'subtotal_bonos_de_transporte' => $this->getSubtotalBDT(), + 'total' => $this->getTotal(), + 'grupo_de_compra' => $this->grupoDeCompra + ]; + } +} diff --git a/app/Subpedido.php b/app/Subpedido.php index 291690b..0cfb039 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -15,18 +15,77 @@ class Subpedido extends Model public function productos() { - return $this->belongsToMany('App\Producto','pedidos_productos')->withPivot(["cantidad"]); + return $this->belongsToMany('App\Producto')->withPivot(["cantidad"]); } + //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte + private function bonos() + { + return $this->productos()->where('bono',1); + } + + private function productosSinBonos() + { + return $this->productos()->where('bono',false); + } + + public function grupoDeCompra() { return $this->belongsTo('App\GrupoDeCompra'); } - //Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) + //Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) public function scopeFiltrar($query, FiltroDeSubpedido $filtros) { return $filtros->aplicar($query); } + //Subtotal de dinero de productos del pedido, sin bonos ni transporte + public function getSubtotalProductos() + { + return $this->productosSinBonos()->sum('total'); + } + + //Cantidad de bonos de transporte + public function cantidadBDT() + { + return ceil($this->getSubtotalProductos() / 500); + } + + //Subtotal de dinero de bonos de transporte + public function getSubtotalBDT() + { + return $this->cantidadBDT() * 15; + } + + //Subtotal de dinero de bonos (MPS, Sororo, etc) + public function getSubtotalBonos() + { + return $this->bonos()->sum('total'); + } + + + public function getTotal() + { + return $this->getSubtotalProductos() + $this->getSubtotalBDT() + $this->getSubtotalBonos(); + } + + //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto. + public function syncProducto(Producto $producto, Int $cantidad) { + if ($cantidad){ + //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad + $this->productos()->syncWithoutDetaching([ + $producto->id => [ + 'cantidad' => $cantidad, + 'total' => $cantidad * $producto->precio + ] + ]); + + } else { + //si la cantidad es 0, se elimina el producto del subpedido + $this->productos()->detach($producto->id); + } + } + } diff --git a/database/migrations/2022_02_23_204330_agregar_columna_bono_a_tabla_de_productos.php b/database/migrations/2022_02_23_204330_agregar_columna_bono_a_tabla_de_productos.php new file mode 100644 index 0000000..0054add --- /dev/null +++ b/database/migrations/2022_02_23_204330_agregar_columna_bono_a_tabla_de_productos.php @@ -0,0 +1,32 @@ +boolean('bono')->after('apto_celiacxs'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('productos', function (Blueprint $table) { + $table->dropColumn('bono'); + }); + } +} diff --git a/database/migrations/2022_02_23_220046_agregar_columna_total_a_tabla_de_producto_subpedido.php b/database/migrations/2022_02_23_220046_agregar_columna_total_a_tabla_de_producto_subpedido.php new file mode 100644 index 0000000..3dea517 --- /dev/null +++ b/database/migrations/2022_02_23_220046_agregar_columna_total_a_tabla_de_producto_subpedido.php @@ -0,0 +1,32 @@ +double('total',10,2)->after('cantidad')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('producto_subpedido', function (Blueprint $table) { + $table->dropColumn('total'); + }); + } +} diff --git a/database/seeds/ProductoSeeder.php b/database/seeds/ProductoSeeder.php index c6e8494..95cab3e 100644 --- a/database/seeds/ProductoSeeder.php +++ b/database/seeds/ProductoSeeder.php @@ -27,7 +27,8 @@ class ProductoSeeder extends Seeder 'precio' => $registro['precio'], 'proveedor_id' => isset($registro['proveedor']) ? Proveedor::firstOrCreate([ 'nombre' => $registro['proveedor'] - ])->id : null + ])->id : null, + 'bono' => $registro['categoria'] == 'BONOS Y FINANCIAMIENTO SORORO' ]; } diff --git a/routes/api.php b/routes/api.php index 57de256..3df6a0b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,6 +30,7 @@ Route::middleware('api')->group(function () { Route::prefix('subpedidos')->group(function () { Route::get('/','Api\SubpedidoController@index'); + Route::get('{subpedido}','Api\SubpedidoController@show'); Route::post('/','Api\SubpedidoController@store'); });