Implemented repository mapper, and venta show
This commit is contained in:
@ -17,6 +17,6 @@ class Comuna extends Model
|
||||
}
|
||||
public function __toString(): string
|
||||
{
|
||||
return implode(', ', [$this->descripcion, '' . $this->provincia]);
|
||||
return $this->descripcion;
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,14 @@ class Direccion extends Model
|
||||
public string $extra;
|
||||
public Comuna $comuna;
|
||||
|
||||
public function full(): string
|
||||
{
|
||||
return implode(', ', [
|
||||
"{$this}",
|
||||
$this->comuna->provincia
|
||||
]);
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
@ -30,7 +38,7 @@ class Direccion extends Model
|
||||
if ($this->extra !== '') {
|
||||
$array[]= $this->extra;
|
||||
}
|
||||
$array []= '' . $this->comuna;
|
||||
$array []= $this->comuna;
|
||||
return implode(', ', $array);
|
||||
}
|
||||
}
|
||||
|
@ -5,21 +5,36 @@ use Incoviba\Common\Ideal;
|
||||
|
||||
class Proyecto extends Ideal\Model
|
||||
{
|
||||
public Inmobiliaria $inmobiliaria;
|
||||
protected Inmobiliaria $inmobiliaria;
|
||||
public string $descripcion;
|
||||
public Direccion $direccion;
|
||||
protected Direccion $direccion;
|
||||
public Proyecto\Terreno $terreno;
|
||||
public Proyecto\Superficie $superficie;
|
||||
public float $corredor;
|
||||
public int $pisos;
|
||||
public int $subterraneos;
|
||||
|
||||
public function inmobiliaria(): Inmobiliaria
|
||||
{
|
||||
if (!isset($this->inmobiliaria)) {
|
||||
$this->inmobiliaria = $this->runFactory('inmobiliaria');
|
||||
}
|
||||
return $this->inmobiliaria;
|
||||
}
|
||||
public function direccion(): Direccion
|
||||
{
|
||||
if (!isset($this->direccion)) {
|
||||
$this->direccion = $this->runFactory('direccion');
|
||||
}
|
||||
return $this->direccion;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'inmobiliaria' => $this->inmobiliaria,
|
||||
'inmobiliaria' => $this->inmobiliaria(),
|
||||
'descripcion' => $this->descripcion,
|
||||
'direccion' => $this->direccion,
|
||||
'direccion' => $this->direccion(),
|
||||
'terreno' => $this->terreno,
|
||||
'superficie' => $this->superficie,
|
||||
'corredor' => $this->corredor,
|
||||
|
20
app/src/Model/Proyecto/Elemento.php
Normal file
20
app/src/Model/Proyecto/Elemento.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Proyecto;
|
||||
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
class Elemento extends Ideal\Model
|
||||
{
|
||||
public string $descripcion;
|
||||
public string $abreviacion;
|
||||
public int $orden;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'descripcion' => $this->descripcion,
|
||||
'abreviacion' => $this->abreviacion,
|
||||
'orden' => $this->orden
|
||||
]);
|
||||
}
|
||||
}
|
@ -15,6 +15,8 @@ class ProyectoTipoUnidad extends Ideal\Model
|
||||
public float $terraza;
|
||||
public string $descripcion;
|
||||
|
||||
public array $tipologias;
|
||||
|
||||
public function superficie(): float
|
||||
{
|
||||
return array_reduce([$this->util, $this->logia, $this->terraza], function($sum, $item) {return $sum + $item;}, 0);
|
||||
@ -23,6 +25,23 @@ class ProyectoTipoUnidad extends Ideal\Model
|
||||
{
|
||||
return array_reduce([$this->util, $this->logia, $this->terraza / 2], function($sum, $item) {return $sum + $item;}, 0);
|
||||
}
|
||||
public function tipologia(): string
|
||||
{
|
||||
if (isset($this->tipologias) and count($this->tipologias) > 0) {
|
||||
$temp = [...$this->tipologias];
|
||||
usort($temp, function(Tipologia $a, Tipologia $b) {
|
||||
$el = $a->elemento->orden - $b->elemento->orden;
|
||||
if ($el === 0) {
|
||||
return strcmp($a->elemento->abreviacion, $b->elemento->abreviacion);
|
||||
}
|
||||
return $el;
|
||||
});
|
||||
return implode('/', array_map(function(Tipologia $tipologia) {
|
||||
return $tipologia->cantidad . $tipologia->elemento->abreviacion;
|
||||
}, $temp));
|
||||
}
|
||||
return $this->abreviacion;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
@ -36,7 +55,8 @@ class ProyectoTipoUnidad extends Ideal\Model
|
||||
'terraza' => $this->terraza,
|
||||
'superficie' => $this->superficie(),
|
||||
'vendible' => $this->vendible(),
|
||||
'descripcion' => $this->descripcion
|
||||
'descripcion' => $this->descripcion,
|
||||
'tipologia' => $this->tipologia()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
8
app/src/Model/Proyecto/TipoTipologia.php
Normal file
8
app/src/Model/Proyecto/TipoTipologia.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Proyecto;
|
||||
|
||||
use Incoviba\Model\Tipo;
|
||||
|
||||
class TipoTipologia extends Tipo
|
||||
{
|
||||
}
|
20
app/src/Model/Proyecto/Tipologia.php
Normal file
20
app/src/Model/Proyecto/Tipologia.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Proyecto;
|
||||
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
class Tipologia extends Ideal\Model
|
||||
{
|
||||
public ProyectoTipoUnidad $proyectoTipoUnidad;
|
||||
public TipoTipologia $tipoTipologia;
|
||||
public int $cantidad;
|
||||
public Elemento $elemento;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'cantidad' => $this->cantidad,
|
||||
'elemento' => $this->elemento
|
||||
]);
|
||||
}
|
||||
}
|
@ -3,32 +3,103 @@ namespace Incoviba\Model;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Incoviba\Common\Ideal;
|
||||
use Incoviba\Controller\Ventas;
|
||||
|
||||
class Venta extends Ideal\Model
|
||||
{
|
||||
public Venta\Propietario $propietario;
|
||||
public Venta\Propiedad $propiedad;
|
||||
public Venta\FormaPago $formaPago;
|
||||
protected Venta\Propietario $propietario;
|
||||
protected Venta\Propiedad $propiedad;
|
||||
protected Venta\FormaPago $formaPago;
|
||||
public DateTimeInterface $fecha;
|
||||
public DateTimeInterface $fechaIngreso;
|
||||
public float $valor;
|
||||
public bool $relacionado;
|
||||
protected ?Venta\Entrega $entrega;
|
||||
|
||||
public array $estados;
|
||||
public Venta\EstadoVenta $currentEstado;
|
||||
|
||||
public function propietario(): Venta\Propietario
|
||||
{
|
||||
if (!isset($this->propietario)) {
|
||||
$this->propietario = $this->runFactory('propietario');
|
||||
}
|
||||
return $this->propietario;
|
||||
}
|
||||
public function propiedad(): Venta\Propiedad
|
||||
{
|
||||
if (!isset($this->propiedad)) {
|
||||
$this->propiedad = $this->runFactory('propiedad');
|
||||
}
|
||||
return $this->propiedad;
|
||||
}
|
||||
public function formaPago(): Venta\FormaPago
|
||||
{
|
||||
if (!isset($this->formaPago)) {
|
||||
$this->formaPago = $this->runFactory('formaPago');
|
||||
}
|
||||
return $this->formaPago;
|
||||
}
|
||||
public function entrega(): ?Venta\Entrega
|
||||
{
|
||||
if (!isset($this->entrega)) {
|
||||
$this->entrega = $this->runFactory('entrega');
|
||||
}
|
||||
return $this->entrega;
|
||||
}
|
||||
|
||||
public function estados(): array
|
||||
{
|
||||
if (!isset($this->estados)) {
|
||||
$this->estados = $this->runFactory('estados');
|
||||
}
|
||||
return $this->estados;
|
||||
}
|
||||
public function currentEstado(): ?Venta\EstadoVenta
|
||||
{
|
||||
if (!isset($this->currentEstado)) {
|
||||
$this->currentEstado = $this->runFactory('currentEstado');
|
||||
}
|
||||
return $this->currentEstado;
|
||||
}
|
||||
|
||||
public function proyecto(): Proyecto
|
||||
{
|
||||
return $this->propiedad()->departamentos()[0]->proyectoTipoUnidad->proyecto;
|
||||
}
|
||||
|
||||
protected float $valor_util;
|
||||
public function util(): float
|
||||
{
|
||||
if (!isset($this->valor_util)) {
|
||||
$sum = $this->valor;
|
||||
$sum -= array_reduce($this->propiedad()->estacionamientos(), function(float $sum, Venta\Unidad $unidad) {
|
||||
return $unidad->precio($this->fecha)->valor;
|
||||
}, 0);
|
||||
$sum -= array_reduce($this->propiedad()->bodegas(), function(float $sum, Venta\Unidad $unidad) {
|
||||
return $unidad->precio($this->fecha)->valor;
|
||||
}, 0);
|
||||
$this->valor_util = $sum;
|
||||
}
|
||||
return $this->valor_util;
|
||||
}
|
||||
public function saldo(): float
|
||||
{
|
||||
return $this->valor - $this->formaPago->total();
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'propietario' => $this->propietario,
|
||||
'propiedad' => $this->propiedad,
|
||||
'forma_pago' => $this->formaPago,
|
||||
'propietario' => $this->propietario(),
|
||||
'propiedad' => $this->propiedad(),
|
||||
'forma_pago' => $this->formaPago()->ids(),
|
||||
'fecha' => $this->fecha->format('Y-m-d'),
|
||||
'fecha_ingreso' => $this->fechaIngreso->format('Y-m-d'),
|
||||
'valor' => $this->valor,
|
||||
'relacionado' => $this->relacionado,
|
||||
'estados' => $this->estados,
|
||||
'current_estado' => $this->currentEstado
|
||||
'estados' => array_map(function(Venta\EstadoVenta $estado) {return $estado->id;}, $this->estados()),
|
||||
'current_estado' => $this->currentEstado()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -5,4 +5,14 @@ use Incoviba\Common\Ideal;
|
||||
|
||||
class BonoPie extends Ideal\Model
|
||||
{
|
||||
public float $valor;
|
||||
public Pago $pago;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'valor' => $this->valor,
|
||||
'pago' => $this->pago
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
21
app/src/Model/Venta/Comentario.php
Normal file
21
app/src/Model/Venta/Comentario.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Venta;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
class Comentario extends Ideal\Model
|
||||
{
|
||||
public DateTimeInterface $fecha;
|
||||
public string $texto;
|
||||
public bool $activo;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'fecha' => $this->fecha->format('Y-m-d'),
|
||||
'texto' => $this->texto,
|
||||
'activo' => $this->activo
|
||||
]);
|
||||
}
|
||||
}
|
@ -4,4 +4,13 @@ namespace Incoviba\Model\Venta;
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
class Credito extends Ideal\Model
|
||||
{}
|
||||
{
|
||||
public Pago $pago;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'pago' => $this->pago
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,19 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Venta;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
class Escritura extends Ideal\Model
|
||||
{}
|
||||
{
|
||||
public Pago $pago;
|
||||
public DateTimeInterface $fecha;
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
'pago' => $this->pago,
|
||||
'fecha' => $this->fecha->format('Y-m-d')
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -6,19 +6,62 @@ use JsonSerializable;
|
||||
class FormaPago implements JsonSerializable
|
||||
{
|
||||
public ?Pie $pie;
|
||||
public ?BonoPie $bonoPie;
|
||||
public ?Credito $credito;
|
||||
public ?Escritura $escritura;
|
||||
public ?BonoPie $bonoPie;
|
||||
public ?Subsidio $subsidio;
|
||||
public ?Credito $credito;
|
||||
public ?Pago $devolucion;
|
||||
|
||||
public function anticipo(string $moneda = Pago::UF): float
|
||||
{
|
||||
$sum = 0;
|
||||
if ($this->pie !== null) {
|
||||
$sum += $this->pie->pagado($moneda);
|
||||
if (isset($this->pie->reajuste) and $this->pie->reajuste !== null) {
|
||||
$sum += $this->pie->reajuste->valor($moneda);
|
||||
}
|
||||
}
|
||||
if ($this->escritura !== null) {
|
||||
$sum += $this->escritura->pago->valor($moneda);
|
||||
}
|
||||
return $sum;
|
||||
}
|
||||
public function total(string $moneda = Pago::UF): float
|
||||
{
|
||||
$sum = $this->anticipo($moneda);
|
||||
if (isset($this->bonoPie)) {
|
||||
$sum += $this->bonoPie->pago->valor($moneda);
|
||||
}
|
||||
if (isset($this->subsidio)) {
|
||||
$sum += $this->subsidio->ahorro->valor($moneda);
|
||||
$sum += $this->subsidio->subsidio->valor($moneda);
|
||||
}
|
||||
if (isset($this->credito)) {
|
||||
$sum += $this->credito->pago->valor($moneda);
|
||||
}
|
||||
return $sum;
|
||||
}
|
||||
public function ids(): array
|
||||
{
|
||||
return [
|
||||
'pie_id' => $this->pie?->id,
|
||||
'escritura_id' => $this->escritura?->id,
|
||||
'bono_pie_id' => $this->bonoPie?->id,
|
||||
'credito_id' => $this->credito?->id,
|
||||
'subsidio_id' => $this->subsidio?->id,
|
||||
'devolucion_id' => $this->devolucion?->id
|
||||
];
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return [
|
||||
'pie' => $this->pie ?? null,
|
||||
'bono_pie' => $this->bonoPie ?? null,
|
||||
'credito' => $this->credito ?? null,
|
||||
'escritura' => $this->escritura ?? null,
|
||||
'subsidio' => $this->subsidio ?? null
|
||||
'bono_pie' => $this->bonoPie ?? null,
|
||||
'subsidio' => $this->subsidio ?? null,
|
||||
'credito' => $this->credito ?? null,
|
||||
'devolucion' => $this->devolucion ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,9 @@ use Incoviba\Model\Banco;
|
||||
|
||||
class Pago extends Model
|
||||
{
|
||||
const UF = 'uf';
|
||||
const PESOS = 'pesos';
|
||||
|
||||
public float $valor;
|
||||
public ?Banco $banco;
|
||||
public ?TipoPago $tipoPago;
|
||||
@ -16,6 +19,14 @@ class Pago extends Model
|
||||
public ?string $pagador;
|
||||
public ?Pago $asociado;
|
||||
|
||||
public array $estados;
|
||||
public EstadoPago $currentEstado;
|
||||
|
||||
public function valor(string $moneda = Pago::UF): float
|
||||
{
|
||||
return $this->valor / (($moneda === Pago::UF) ? ($this->uf > 0 ? $this->uf : 1) : 1);
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
|
@ -13,6 +13,24 @@ class Pie extends Model
|
||||
public ?Pie $asociado;
|
||||
public ?Pago $reajuste;
|
||||
|
||||
public array $cuotasArray;
|
||||
public function cuotas(bool $pagadas = false): array
|
||||
{
|
||||
if (!$pagadas) {
|
||||
return $this->cuotasArray;
|
||||
}
|
||||
return array_filter($this->cuotasArray, function(Cuota $cuota) {
|
||||
return $cuota->pago->currentEstado->tipoEstadoPago->descripcion !== 'no pagado';
|
||||
});
|
||||
}
|
||||
|
||||
public function pagado(string $moneda = Pago::UF): float
|
||||
{
|
||||
return array_reduce($this->cuotas(true), function(float $sum, Cuota $cuota) use ($moneda) {
|
||||
return $sum + $cuota->pago->valor($moneda);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
|
@ -20,6 +20,14 @@ class Propiedad extends Ideal\Model
|
||||
return array_filter($this->unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion === 'bodega';});
|
||||
}
|
||||
|
||||
protected float $vendible;
|
||||
public function vendible(): float
|
||||
{
|
||||
return array_reduce($this->departamentos(), function(float $sum, Unidad $unidad) {
|
||||
return $sum + $unidad->proyectoTipoUnidad->vendible();
|
||||
}, 0);
|
||||
}
|
||||
|
||||
public function summary(): string
|
||||
{
|
||||
return implode(' - ', array_merge(
|
||||
|
@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace Incoviba\Model\Venta;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Incoviba\Common\Ideal;
|
||||
use Incoviba\Model;
|
||||
|
||||
@ -15,6 +16,33 @@ class Unidad extends Ideal\Model
|
||||
public array $precios = [];
|
||||
public ?Precio $currentPrecio = null;
|
||||
|
||||
public function precio(DateTimeInterface $dateTime): Precio
|
||||
{
|
||||
if ($dateTime > $this->currentPrecio->current->fecha) {
|
||||
return $this->currentPrecio;
|
||||
}
|
||||
$precio = array_reduce(array_filter($this->precios, function(Precio $precio) use ($dateTime) {
|
||||
return $dateTime > $precio->current->fecha;
|
||||
}), function(?Precio $max, Precio $precio) {
|
||||
if ($max === null) {
|
||||
return $precio;
|
||||
}
|
||||
return $max->current->fecha > $precio->current->fecha ? $max : $precio;
|
||||
});
|
||||
if ($precio === null) {
|
||||
$precio = array_reduce(array_filter($this->precios, function(Precio $precio) use ($dateTime) {
|
||||
return $dateTime < $precio->current->fecha;
|
||||
}), function(?Precio $min, Precio $precio) {
|
||||
if ($min === null) {
|
||||
return $precio;
|
||||
}
|
||||
return $min->current->fecha < $precio->current->fecha ? $min : $precio;
|
||||
});
|
||||
}
|
||||
|
||||
return $precio;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), [
|
||||
|
Reference in New Issue
Block a user