88 lines
2.4 KiB
PHP
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() ?? []
|
|
];
|
|
}
|
|
}
|