Compare commits

...

5 Commits

7 changed files with 111 additions and 19 deletions

9
app/Constants.php Normal file
View File

@ -0,0 +1,9 @@
<?php
namespace App;
class Constants
{
public const COSTO_TRANSPORTE = 15;
public const DIVISOR_TRANSPORTE = 500;
}

View File

@ -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.
*/ */

View File

@ -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.
} *
return 1 + ($total / 500); * 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);
}
/**
* 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();
} }
} }

View File

@ -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;
}
} }

View File

@ -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');

View File

@ -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');
} }
}; };

View File

@ -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,
]); ]);