Files
oficial/app/src/Model/Venta/Promotion.php
2025-04-03 17:22:11 -03:00

88 lines
2.4 KiB
PHP

<?php
namespace Incoviba\Model\Venta;
use DateTimeInterface;
use Incoviba\Common;
use Incoviba\Model\Proyecto\Broker;
use Incoviba\Model\Venta\Promotion\State;
use Incoviba\Model\Venta\Promotion\Type;
class Promotion extends Common\Ideal\Model
{
public string $description;
public float $amount;
public DateTimeInterface $startDate;
public ?DateTimeInterface $endDate;
public ?DateTimeInterface $validUntil;
public Type $type;
public State $state = State::ACTIVE;
protected array $projects;
public function projects(): array
{
if (empty($this->projects)) {
$this->projects = $this->runFactory('projects') ?? [];
}
return $this->projects;
}
protected array $brokers;
public function brokers(): array
{
if (empty($this->brokers)) {
$this->brokers = $this->runFactory('brokers') ?? [];
}
return $this->brokers;
}
protected array $unitTypes;
public function unitTypes(): array
{
if (empty($this->unitTypes)) {
$this->unitTypes = $this->runFactory('unitTypes') ?? [];
}
return $this->unitTypes;
}
protected array $unitLines;
public function unitLines(): array
{
if (empty($this->unitLines)) {
$this->unitLines = $this->runFactory('unitLines') ?? [];
}
return $this->unitLines;
}
protected array $units;
public function units(): array
{
if (empty($this->units)) {
$this->units = $this->runFactory('units') ?? [];
}
return $this->units;
}
public function value(float $price): float
{
if ($this->type === Type::FIXED) {
return $price + $this->amount;
}
return $price / (1 - $this->amount);
}
protected function jsonComplement(): array
{
return [
'description' => $this->description,
'amount' => $this->amount,
'start_date' => $this->startDate->format('Y-m-d'),
'end_date' => $this->endDate?->format('Y-m-d'),
'valid_until' => $this->validUntil?->format('Y-m-d'),
'type' => $this->type,
'state' => $this->state,
'projects' => $this->projects() ?? [],
'contracts' => $this->brokers() ?? [],
'units' => $this->units() ?? []
];
}
}