Compare commits
5 Commits
a569a2a497
...
59428f04b8
Author | SHA1 | Date |
---|---|---|
Alejandro Tasistro | 59428f04b8 | |
Alejandro Tasistro | 03b9c4c065 | |
Alejandro Tasistro | f872b1e9fd | |
Alejandro Tasistro | 27960f17e7 | |
Alejandro Tasistro | 76199273c9 |
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
class Constants
|
||||||
|
{
|
||||||
|
public const COSTO_TRANSPORTE = 15;
|
||||||
|
public const DIVISOR_TRANSPORTE = 500;
|
||||||
|
}
|
|
@ -33,6 +33,36 @@ public function pedidos(): HasMany
|
||||||
return $this->hasMany(Pedido::class);
|
return $this->hasMany(Pedido::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pedidosConfirmados() {
|
||||||
|
return $this->pedidos()->where('confirmed',true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function calcularTotalConfirmados($closure = null) : float {
|
||||||
|
if (!$closure)
|
||||||
|
$closure = fn($p) => $p->totalChismosa();
|
||||||
|
|
||||||
|
return $this->pedidosConfirmados()->sum($closure);
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalARecaudar() : float {
|
||||||
|
return $this->calcularTotalConfirmados();
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalNoBarriales() : float {
|
||||||
|
return $this->calcularTotalConfirmados(fn($p) => $p->total($p->productosNoBarriales()));
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalTransporte() : float {
|
||||||
|
$totalSinTransporte = $this->calcularTotalConfirmados(
|
||||||
|
fn($p) => $p->total($p->productosSinTransporte())
|
||||||
|
);
|
||||||
|
return ($totalSinTransporte / Constants::DIVISOR_TRANSPORTE) * Constants::COSTO_TRANSPORTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalATransferir() : float {
|
||||||
|
return $this->totalNoBarriales() + $this->totalTransporte();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Los productos que pertenecen al barrio.
|
* Los productos que pertenecen al barrio.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Constants;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
@ -14,38 +16,84 @@ class Pedido extends Model
|
||||||
* @var array<int, string>
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name',
|
'name', 'confirmed'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* El barrio al que pertenece el pedido.
|
* El barrio al que pertenece el pedido.
|
||||||
*/
|
*/
|
||||||
public function barrio(): BelongsTo
|
public function barrio(): BelongsTo {
|
||||||
{
|
|
||||||
return $this->belongsTo(Barrio::class);
|
return $this->belongsTo(Barrio::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Los productos que pertenecen al pedido.
|
* Los productos que pertenecen al pedido.
|
||||||
*/
|
*/
|
||||||
public function productos(): BelongsToMany
|
public function productos(): BelongsToMany {
|
||||||
{
|
|
||||||
return $this->belongsToMany(Producto::class)->withPivot(['cantidad']);
|
return $this->belongsToMany(Producto::class)->withPivot(['cantidad']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function productosSinBonos() {
|
/**
|
||||||
return $this->productos()->where('bono',0)->all();
|
* Los productos del pedido que no aportan para el
|
||||||
|
* bono de transporte
|
||||||
|
*/
|
||||||
|
function productosSinTransporte() {
|
||||||
|
return $this->productos()->orWhere(['bono' => true, 'barrial' => true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Los productos del pedido que aportan para el
|
||||||
|
* bono de transporte.
|
||||||
|
*/
|
||||||
|
function productosConTransporte() {
|
||||||
|
return $this->productos()->where(['bono' => false, 'barrial' => false]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Los productos no barriales del pedido.
|
||||||
|
*/
|
||||||
|
function productosNoBarriales() {
|
||||||
|
return $this->productos()->where('barrial',false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Los bonos del pedido.
|
||||||
|
*/
|
||||||
function bonos() {
|
function bonos() {
|
||||||
return $this->productos()->where('bono',1)->all();
|
return $this->productos()->where('bono',true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function bonosDeTransporte() : int {
|
/**
|
||||||
$total = 0;
|
* Toma como parámetro una colección de productos
|
||||||
foreach ($this->productosSinBonos() as $key => $producto) {
|
* y devuelve la suma de los totales (precio * cantidad)
|
||||||
$total += $producto->price * $producto->pivot->cantidad;
|
* de cada uno.
|
||||||
|
*
|
||||||
|
* Si la colección es null o no se pasa ningún parámetro
|
||||||
|
* se toman todos los productos del pedido.
|
||||||
|
*/
|
||||||
|
function total($productos = null) : float {
|
||||||
|
if (!$productos)
|
||||||
|
$productos = $this->productos();
|
||||||
|
|
||||||
|
return $productos->sum(fn($p) => $p->price * $p->pivot->cantidad);
|
||||||
}
|
}
|
||||||
return 1 + ($total / 500);
|
|
||||||
|
/**
|
||||||
|
* El total de bonos de transporte del pedido
|
||||||
|
*/
|
||||||
|
function totalTransporte() : int {
|
||||||
|
if ($this->productos()->every(fn($prod) => !$prod->pagaTransporte()))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
$cantidad = 1 + floor($this->total($this->productosConTransporte()) / Constants::DIVISOR_TRANSPORTE);
|
||||||
|
return $cantidad * Constants::COSTO_TRANSPORTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* El total de los productos del pedido
|
||||||
|
* sumado al total de los bonos de transporte
|
||||||
|
*/
|
||||||
|
function totalChismosa() : float {
|
||||||
|
return $this->total() + $this->totalTransporte();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ class Producto extends Model
|
||||||
* @var array<int, string>
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name', 'price', 'solidario', 'bono', 'categoria_id', 'barrio_id'
|
'name', 'price', 'solidario', 'bono', 'barrial', 'categoria_id', 'barrio_id'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,4 +48,8 @@ public function barrio(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Barrio::class);
|
return $this->belongsTo(Barrio::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pagaTransporte() : bool {
|
||||||
|
return !$this->bono && !$this->barrial;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ public function up(): void
|
||||||
Schema::create('pedidos', function (Blueprint $table) {
|
Schema::create('pedidos', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('name', 100);
|
$table->string('name', 100);
|
||||||
|
$table->boolean('confirmed')->default(false);
|
||||||
$table->unsignedBigInteger('barrio_id');
|
$table->unsignedBigInteger('barrio_id');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
$table->foreign('barrio_id')->references('id')->on('barrios');
|
$table->foreign('barrio_id')->references('id')->on('barrios');
|
||||||
|
|
|
@ -18,17 +18,17 @@ public function up(): void
|
||||||
$table->unsignedBigInteger('categoria_id');
|
$table->unsignedBigInteger('categoria_id');
|
||||||
$table->boolean('solidario');
|
$table->boolean('solidario');
|
||||||
$table->boolean('bono');
|
$table->boolean('bono');
|
||||||
|
$table->boolean('barrial')->default(false);
|
||||||
$table->unsignedBigInteger('barrio_id')->nullable();
|
$table->unsignedBigInteger('barrio_id')->nullable();
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
$table->foreign('categoria_id')->references('id')->on('categorias');
|
$table->foreign('categoria_id')->references('id')->on('categorias');
|
||||||
$table->foreign('barrio_id')->references('id')->on('barrios');
|
$table->foreign('barrio_id')->references('id')->on('barrios');
|
||||||
});
|
});
|
||||||
|
|
||||||
Schema::create('producto_pedido', function (Blueprint $table) {
|
Schema::create('pedido_producto', function (Blueprint $table) {
|
||||||
$table->unsignedBigInteger('pedido_id');
|
$table->unsignedBigInteger('pedido_id');
|
||||||
$table->unsignedBigInteger('producto_id');
|
$table->unsignedBigInteger('producto_id');
|
||||||
$table->unsignedInteger('cantidad');
|
$table->unsignedInteger('cantidad');
|
||||||
$table->unsignedDecimal('total', 15, 8);
|
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
$table->primary(['pedido_id','producto_id']);
|
$table->primary(['pedido_id','producto_id']);
|
||||||
$table->foreign('pedido_id')->references('id')->on('pedidos');
|
$table->foreign('pedido_id')->references('id')->on('pedidos');
|
||||||
|
@ -41,7 +41,7 @@ public function up(): void
|
||||||
*/
|
*/
|
||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::dropIfExists('producto_pedido');
|
Schema::dropIfExists('pedido_producto');
|
||||||
Schema::dropIfExists('productos');
|
Schema::dropIfExists('productos');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -101,7 +101,7 @@ private function insertCaracteristicas($caracteristicasToInsert) : void {
|
||||||
$match = Producto::where('name',$name)->first();
|
$match = Producto::where('name',$name)->first();
|
||||||
if ($match) {
|
if ($match) {
|
||||||
foreach ($item['caracteristicas'] as $key => $caracteristica) {
|
foreach ($item['caracteristicas'] as $key => $caracteristica) {
|
||||||
DB::table('productos_caracteristicas')->insert([
|
DB::table('producto_caracteristica')->insert([
|
||||||
'producto_id' => $match->id,
|
'producto_id' => $match->id,
|
||||||
'caracteristica_id' => $caracteristica,
|
'caracteristica_id' => $caracteristica,
|
||||||
]);
|
]);
|
||||||
|
|
Loading…
Reference in New Issue