Files
oficial/app/src/Model/Venta/Reservation.php

133 lines
3.6 KiB
PHP
Raw Normal View History

2025-02-18 16:02:10 -03:00
<?php
namespace Incoviba\Model\Venta;
use DateTimeInterface;
use Incoviba\Common;
use Incoviba\Model;
class Reservation extends Common\Ideal\Model
{
2025-07-22 18:20:48 -04:00
public Model\Proyecto $project;
2025-02-18 16:02:10 -03:00
public Model\Persona $buyer;
public DateTimeInterface $date;
public array $units = [];
public array $promotions = [];
public ?Model\Proyecto\Broker $broker = null;
2025-07-22 18:20:48 -04:00
public function offer(): float
{
return array_sum(array_column($this->units, 'value'));
}
public function withCommission(): float
{
$base = 0;
foreach ($this->units as $unit) {
foreach ($this->promotions as $promotion) {
$base += $promotion->activate()->reverse($unit['unit'], $unit['value'], $this->broker);
}
}
return $base;
}
public function base(): float
{
$base = $this->withCommission();
if ($this->broker !== null) {
$base = $this->broker->reverseCommission($this->project, $base, $this->date);
}
return $base;
}
public function price(): float
{
$price = 0;
foreach ($this->units as $unit) {
$price += $unit->unit->precio($this->date);
}
return $price;
}
2025-02-18 16:02:10 -03:00
protected array $states = [];
public function states(): array
{
if (!isset($this->states)) {
$this->states = $this->runFactory('states');
}
return $this->states;
}
protected Model\Venta\Reservation\State $currentState;
public function currentState(): Model\Venta\Reservation\State
{
if (!isset($this->currentState)) {
$this->currentState = last($this->states());
}
return $this->currentState;
}
public function addUnit(Model\Venta\Unidad $unit, float $value): self
{
if (($i = $this->findUnit($unit->id)) !== null) {
2025-08-22 09:28:53 -04:00
$this->units[$i]->value = $value;
2025-02-18 16:02:10 -03:00
return $this;
}
2025-07-22 18:20:48 -04:00
$this->units[] = (object) [
2025-02-18 16:02:10 -03:00
'unit' => $unit,
'value' => $value,
];
return $this;
}
public function removeUnit(int $unit_id): self
{
if (($i = $this->findUnit($unit_id)) === null) {
return $this;
}
unset($this->units[$i]);
$this->units = array_values($this->units);
return $this;
}
public function findUnit(int $unit_id): ?int
{
2025-08-22 09:28:53 -04:00
return array_find_key($this->units, fn($unit) => $unit->unit->id == $unit_id);
2025-02-18 16:02:10 -03:00
}
public function hasUnit(int $unit_id): bool
{
return $this->findUnit($unit_id) !== null;
}
2025-07-22 18:20:48 -04:00
public function summary(): string
{
$unitSummary = array_map(function($unit) {
$type = $unit->unit->proyectoTipoUnidad->tipoUnidad->descripcion;
$cap = strtoupper(strstr($type, 0, 1));
return "{$cap}{$unit->unit->descripcion}";
}, $this->units);
return implode('', $unitSummary);
}
public function valid(): bool
{
$base = $this->base();
$price = $this->price();
return $base >= $price;
}
2025-02-18 16:02:10 -03:00
protected function jsonComplement(): array
{
return [
2025-07-22 18:20:48 -04:00
'project_id' => $this->project->id,
'buyer' => $this->buyer,
2025-02-18 16:02:10 -03:00
'date' => $this->date->format('Y-m-d'),
'units' => $this->units,
'promotions' => $this->promotions,
2025-07-22 18:20:48 -04:00
'broker' => $this->broker,
'offer' => $this->offer(),
'with_commission' => $this->withCommission(),
'base' => $this->base(),
'price' => $this->price(),
'valid' => $this->valid(),
'summary' => $this->summary()
2025-02-18 16:02:10 -03:00
];
}
}