old models

This commit is contained in:
2019-12-23 18:01:23 -03:00
parent 50c2bb0f15
commit f67ab72e2a
72 changed files with 4625 additions and 0 deletions

29
src/old/Common/Banco.php Normal file
View File

@ -0,0 +1,29 @@
<?php
namespace Incoviba\old\Common;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string nombre
*
*/
class Banco extends Model
{
public function nombreCompleto()
{
$str = '';
switch ($this->nombre) {
case 'Estado':
case 'Chile':
case 'Edwards':
$str .= 'Banco ';
}
$str .= $this->nombre;
return $str;
}
}
?>

22
src/old/Common/Comuna.php Normal file
View File

@ -0,0 +1,22 @@
<?php
namespace Incoviba\old\Common;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property Provincia provincia
*
*/
class Comuna extends Model
{
public function provincia()
{
return $this->belongs_to(Provincia::class, 'provincia')->findOne();
}
}
?>

View File

@ -0,0 +1,36 @@
<?php
namespace Incoviba\old\Common;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string calle
* @property int numero
* @property string extra
* @property Comuna comuna
*
*/
class Direccion extends Model
{
public function comuna()
{
return $this->belongs_to(Comuna::class, 'comuna')->findOne();
}
public function completa($comuna = false)
{
$str = $this->calle . ' ' . $this->numero;
if ($this->extra != '') {
$str .= ', ' . $this->extra;
}
if ($comuna) {
$str .= ', ' . $this->comuna()->descripcion;
}
return $str;
}
}
?>

View File

@ -0,0 +1,26 @@
<?php
namespace Incoviba\old\Common;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property Region region
*
*/
class Provincia extends Model
{
public function region()
{
return $this->belongsTo(Region::class, 'region')->findOne();
}
public function comunas()
{
return $this->hasMany(Comuna::class, 'provincia')->findMany();
}
}
?>

44
src/old/Common/Region.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace Incoviba\old\Common;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property char numeral
* @property int numeracion
*
*/
class Region extends Model
{
private $provincias = null;
private $comunas = null;
public function provincias()
{
if ($this->provincias == null) {
$this->provincias = $this->hasMany(Provincia::class, 'region')->findMany();
}
return $this->provincias;
}
public function comunas()
{
if ($this->comunas == null) {
$provincias = $this->provincias();
$comunas = [];
foreach ($provincias as $prov) {
$comunas = array_merge($comunas, $prov->comunas());
}
usort($comunas, function($a, $b) {
return strcmp($a->descripcion, $b->descripcion);
});
$this->comunas = $comunas;
}
return $this->comunas;
}
}
?>

View File

@ -0,0 +1,23 @@
<?php
namespace Incoviba\old\Inmobiliaria;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Banco;
/**
* @property int $id
* @property Inmobiliaria $inmobiliaria
* @property Banco $banco
* @property string $cuenta
*/
class Cuenta extends Model
{
public function inmobiliaria()
{
return $this->belongsTo(Inmobiliaria::class, 'inmobiliaria', 'rut')->findOne();
}
public function banco()
{
return $this->belongsTo(Banco::class, 'banco')->findOne();
}
}

View File

@ -0,0 +1,135 @@
<?php
namespace Incoviba\old\Inmobiliaria;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Banco;
use Incoviba\old\Proyecto\Proyecto;
/**
*
* @author Aldarien
*
* @property int $rut
* @property char $dv
* @property string $razon
* @property string $abreviacion
* @property string $cuenta
* @property Banco $banco
* @property TipoSociedad $sociedad
*
*/
class Inmobiliaria extends Model
{
public static $_id_column = 'rut';
public function banco()
{
return $this->cuenta()->banco();
//return $this->belongsTo(Banco::class, 'banco')->findOne();
}
public function proyectos()
{
return $this->hasMany(Proyecto::class, 'inmobiliaria', 'rut')->orderByAsc('descripcion')->findMany();
}
public function nombre(bool $tipo = false)
{
return $this->abreviacion . (($tipo) ? ' ' . $this->sociedad()->abreviacion . '.' : '');
}
public function rut()
{
return format('rut', $this->rut) . '-' . $this->dv;
}
public function sociedad() {
return $this->belongsTo(TipoSociedad::class, 'sociedad')->findOne();
}
public function razon(bool $tipo = false, bool $abreviado = false) {
return $this->razon . (($tipo) ? ' ' . (($abreviado) ? $this->sociedad()->abreviacion . '.' : $this->sociedad()->descripcion) : '');
}
/**
* $data = ['descripcion', 'calle', 'numero', 'extra', 'comuna']
*/
public function addProyecto(array $data)
{
//$proyecto = model(Proyecto::class)->where('inmobiliaria', $this->rut)->where('descripcion', $data['descripcion'])->findOne();
$data = [
'inmobiliaria' => $this->rut,
'descripcion' => $data['descripcion']
];
$proyecto = (new Factory(Proyecto::class))->where($data)->find();
if (!$proyecto) {
//$proyecto = model(Proyecto::class)->create();
$proyecto = (new Factory(Proyecto::class))->create($data);
/*$proyecto->inmobiliaria = $this->rut;
$proyecto->descripcion = $data['descripcion'];*/
$proyecto->setDireccion($data);
$proyecto->save();
}
}
public function removeProyecto(array $data)
{
$proyecto = (new Factory(Proyecto::class))->where([
'inmobiliaria' => $this->rut,
'descripcion' => $data['descripcion']
])->find();
if ($proyecto) {
$proyecto->delete();
}
}
public function cuenta()
{
if (count($this->cuentas()) == 0) {
return false;
}
return $this->cuentas()[0];
}
public function cuentas()
{
return $this->hasMany(Cuenta::class, 'inmobiliaria', 'rut')->findMany();
}
public function addCuenta(array $data)
{
if (!is_numeric($data['banco'])) {
$banco = (new Factory(Banco::class))->where(['descripcion' => $data['banco']])->find();
$data['banco'] = $banco->id;
}
$data = [
'inmobiliaria' => $this->rut,
'cuenta' => $data['cuenta'],
'banco' => $data['banco']
];
$cuenta = (new Factory(Cuenta::class))->where($data)->find();
if (!$cuenta) {
$cuenta = (new Factory(Cuenta::class))->create($data);
$cuenta->save();
}
}
public function removeCuenta(array $data)
{
$cuenta = (new Factory(Cuenta::class))->where(['inmobiliaria' => $this->rut]);
if (isset($data['cuenta'])) {
$cuenta = $cuenta->where(['cuenta' => $data['cuenta']]);
}
if (isset($data['banco'])) {
if (!is_numeric($data['banco'])) {
$banco = (new Factory(Banco::class))->where(['descripcion' => $data['banco']])->find();
$data['banco'] = $banco->id;
}
$cuenta = $cuenta->where(['banco' => $data['banco']]);
}
$cuenta = $cuenta->find();
if ($cuenta) {
$cuenta->delete();
}
}
public function modify(array $data)
{
$fields = ['rut', 'dv', 'razon', 'abreviacion'];
foreach ($data as $column => $value) {
if (array_search($column, $fields) !== false) {
$this->$column = $value;
}
}
$this->cuenta()->modify($data);
}
}
?>

View File

@ -0,0 +1,24 @@
<?php
namespace Incoviba\old\Inmobiliaria;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int padre
* @property int hijo
*
*/
class RelacionInmobiliarias extends Model
{
public function padre()
{
return $this->belongsTo(Inmobiliaria::class, 'padre', 'rut')->findOne();
}
public function hijo()
{
return $this->belongsTo(Inmobiliaria::class, 'hijo', 'rut')->findOne();
}
}
?>

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Inmobiliaria;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
* @property string $abreviacion
*/
class TipoSociedad extends Model {
}

View File

@ -0,0 +1,41 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Direccion;
/**
*
* @author Aldarien
*
* @property int id
* @property TipoAgente tipo
* @property int rut
* @property string descripcion
* @property string representante
* @property int telefono
* @property string correo
* @property Direccion direccion
* @property string giro
* @property string abreviacion
*
*/
class Agente extends Model
{
public function direccion()
{
return $this->belongs_to(Direccion::class, 'direccion')->findOne();
}
public function tipo()
{
return $this->belongs_to(TipoAgente::class, 'tipo')->findOne();
}
public function tipos(int $tipo = 0)
{
if ($tipo == 0) {
return $this->hasMany(AgenteTipo::class, 'agente')->findMany();
}
return $this->hasMany(AgenteTipo::class, 'agente')->where('tipo', $tipo)->findOne();
}
}
?>

View File

@ -0,0 +1,20 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property Agente $agente
* @property TipoAgente $tipo
*/
class AgenteTipo extends Model
{
public function agente()
{
return $this->belongsTo(Agente::class, 'agente')->findOne();
}
public function tipo()
{
return $this->belongsTo(TipoAgente::class, 'tipo')->findOne();
}
}

View File

@ -0,0 +1,86 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property int $proyecto
* @property \DateTime $fecha
* @property double $avance
* @property double $estado_pago
* @property int $pagado
* @property double $uf
* @property \DateTime $fecha_pagado
*/
class AvanceConstruccion extends Model
{
public static $_table = 'avance_construccion';
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
protected $pagare;
public function pagare()
{
if ($this->pagare == null) {
$this->pagare = $this->hasMany(Pagare::class, 'estado_pago', 'numero')
->where('proyecto', $this->proyecto)
->findOne();
}
return $this->pagare;
}
protected $pagares;
public function pagares()
{
if ($this->pagares == null) {
$this->pagares = $this->hasMany(Pagare::class, 'estado_pago', 'numero')
->where('proyecto', $this->proyecto)
->findMany();
}
return $this->pagares;
}
public function uf()
{
if ($this->uf == 0) {
$uf = uf($this->fecha());
if ($uf->total > 0) {
$this->uf = $uf->uf->value;
$this->save();
}
}
return $this->uf;
}
public function pagado($tipo = 'ufs')
{
if ($tipo == 'ufs') {
return $this->pagado / $this->uf();
}
return $this->pagado;
}
public function fechaPago(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha_pagado, config('app.timezone'));
}
$this->fecha_pagado = $fecha->format('Y-m-d');
}
public function edit(array $data)
{
foreach ($data as $column => $value) {
if (isset($this->$column) and $this->$column != $value) {
$this->$column = $value;
}
}
$this->save();
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property Proyecto proyecto
* @property Agente agente
* @property TipoCobro tipo
* @property date fecha
* @property float valor
* @property float iva
* @property float uf
* @property string identificador
* @property string glosa
*
*/
class Cobro extends Model
{
public function proyecto()
{
return $this->has_one(Proyecto::class);
}
public function agente()
{
return $this->has_one(Agente::class);
}
public function tipo()
{
return $this->has_one(TipoCobro::class);
}
}
?>

View File

@ -0,0 +1,21 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property Proyecto proyecto
* @property int tipo
* @property float valor
*
*/
class Costo extends Model
{
public function proyecto()
{
return $this->has_one(Proyecto::class, 'proyecto')->findOne();
}
}
?>

View File

@ -0,0 +1,25 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property Cobro cobro
* @property date fecha
* @property TipoEstadoCobro estado
*
*/
class EstadoCobro extends Model
{
public function cobro()
{
return $this->has_one(Cobro::class, 'cobro')->findOne();
}
public function tipo()
{
return $this->has_one(TipoEstadoCobro::class, 'estado')->findOne();
}
}
?>

View File

@ -0,0 +1,30 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property Proyecto proyecto
* @property TipoEstadoProyecto estado
* @property date fecha
*
*/
class EstadoProyecto extends Model
{
public function proyecto()
{
return $this->belongs_to(Proyecto::class, 'proyecto')->findOne();
}
public function tipo()
{
return $this->belongs_to(TipoEstadoProyecto::class, 'estado')->findOne();
}
public function fecha()
{
return Carbon::parse($this->fecha, config('app.timezone'));
}
}
?>

View File

@ -0,0 +1,29 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property ProyectoAgente $agente
* @property \DateTime $fecha
* @property TipoEstadoProyectoAgente $tipo
*/
class EstadoProyectoAgente extends Model
{
public function agente()
{
return $this->belongsTo(ProyectoAgente::class, 'agente')->findOne();
}
public function fecha(\DateTime $fecha = null) {
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
public function tipo()
{
return $this->belongsTo(TipoEstadoProyectoAgente::class, 'tipo')->findOne();
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property int orden
*
*/
class EtapaProyecto extends Model
{
}
?>

142
src/old/Proyecto/Pagare.php Normal file
View File

@ -0,0 +1,142 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Proyecto $proyecto
* @property TipoMonedaPagare $moneda
* @property double $capital
* @property double $tasa
* @property \DateTime $fecha
* @property int $duracion
* @property double $uf
* @property int $abonado
* @property int $estado_pago
*/
class Pagare extends Model
{
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
public function moneda()
{
return $this->belongsTo(TipoMonedaPagare::class, 'moneda')->findOne();
}
public function renovaciones()
{
return $this->hasMany(RenovacionPagare::class, 'pagare')->findMany();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
public function fechaBanco(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha_banco, config('app.timezone'));
}
$this->fecha_banco = $fecha->format('Y-m-d');
}
public function vencimiento()
{
return $this->fechaBanco()->addDays($this->duracion);
}
public function uf()
{
if ($this->uf == 0 and $this->fecha != '0000-00-00') {
$uf = uf($this->fecha());
if ($uf->total > 0) {
$this->uf = $uf->uf->value;
$this->save();
}
}
return $this->uf;
}
protected $valores;
public function valor($tipo = 'ufs')
{
if ($this->valores == null) {
$valores = [];
switch (strtolower($this->moneda()->descripcion)) {
case 'uf':
$valores = (object) ['uf' => $this->capital, 'pesos' => $this->capital * $this->uf()];
break;
case 'pesos':
$valores = (object) ['uf' => $this->capital / $this->uf(), 'pesos' => $this->capital];
break;
}
$this->valores = $valores;
}
switch (strtolower($tipo)) {
case 'uf':
case 'ufs':
return $this->valores->uf;
case 'peso':
case 'pesos':
case '$':
return $this->valores->pesos;
}
}
public function abonado($tipo = 'ufs')
{
if ($tipo == 'ufs') {
if ($this->uf() > 0) {
return $this->abonado / $this->uf();
}
return 0;
}
return $this->abonado;
}
public function edit(array $data)
{
foreach ($data as $column => $value) {
if (isset($this->$column) and $this->$column != $value) {
$this->$column = $value;
}
}
$this->save();
}
protected $intereses;
public function intereses($tipo = 'ufs') {
if ($this->intereses == null) {
$this->intereses = (object) ['uf' => 0, 'pesos' => 0];
if ($this->renovaciones()) {
$arr = $this->renovaciones();
$this->intereses->uf = array_reduce($arr, function($accum, $item) {
return $accum + $item->intereses();
});
$this->intereses->pesos = array_reduce($arr, function($accum, $item) {
return $accum + $item->intereses('pesos');
});
}
}
switch (strtolower($tipo)) {
case 'uf':
case 'ufs':
return $this->intereses->uf;
case 'peso':
case 'pesos':
case '$':
return $this->intereses->pesos;
}
if ($fecha == null) {
$fecha = $this->vencimiento();
}
$dif = $fecha->diffInDays($this->fecha());
$duracion = ($dif > $this->duracion) ? $this->duracion : $dif;
return $this->valor() * ($this->tasa / 365 * $duracion) / 100;
}
public function estado_pago() {
if ($this->estado_pago == 0) {
return false;
}
return $this->belongsTo(AvanceConstruccion::class, 'estado_pago', 'numero')->findOne();
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int rut
* @property string nombre
* @property int tipo
* @property string representante
* @property int telefono
* @property string correo
* @property int direccion
*
*/
class Proyectista extends Model
{
}
?>

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int proyecto
* @property int proyectista
* @property date fecha
*
*/
class Proyectistas extends Model
{
}
?>

View File

@ -0,0 +1,859 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Direccion;
use Incoviba\old\Inmobiliaria\Inmobiliaria;
use Incoviba\old\Venta\Cierre;
use Incoviba\old\Venta\Cuota;
use Incoviba\old\Venta\Promocion;
use Incoviba\old\Venta\TipoUnidad;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\Venta;
/**
*
* @author Aldarien
*
* @property int $id
* @property Inmobiliaria $inmobiliaria
* @property string $descripcion
* @property Direccion $direccion
* @property float $superficie_terreno
* @property float $valor_terreno
* @property float $corredor
* @property float $superficie_sobre_nivel
* @property float $superficie_bajo_nivel
* @property int $pisos
* @property int $subterraneos
*
*/
class Proyecto extends Model
{
protected $unidades;
protected $valores;
protected $tipo_unidades;
protected $ventas;
protected $escrituras;
protected $entregas;
protected $estado;
protected $agentes;
protected $operadores;
protected $promociones;
protected $cuotas;
protected $superficies;
public function inmobiliaria()
{
return $this->belongs_to(Inmobiliaria::class, 'inmobiliaria', 'rut')->findOne();
}
public function direccion()
{
return $this->belongs_to(Direccion::class, 'direccion')->findOne();
}
public function unidades($tipo = null)
{
if ($tipo == null) {
if (!isset($this->unidades) or !isset($this->unidades->total)) {
$unidades = [];
if (isset($this->unidades)) {
$unidades = (array) $this->unidades;
}
$unidades['total'] = $this->has_many(Unidad::class, 'proyecto')->findMany();
$this->unidades = (object) $unidades;
}
return $this->unidades->total;
}
switch ($tipo) {
case 1:
case 'departamento':
case 'departamentos':
$tipo = 'departamento';
$id_tipo = 1;
break;
case 2:
case 'estacionamiento':
case 'estacionamientos':
$tipo = 'estacionamiento';
$id_tipo = 2;
break;
case 3:
case 'bodega':
case 'bodegas':
$tipo = 'bodega';
$id_tipo = 3;
break;
default:
return $this->unidades();
}
if (!isset($this->unidades) or !isset($this->unidades->{$tipo})) {
$unidades = [];
if (isset($this->unidades)) {
$unidades = (array) $this->unidades;
}
$unidades[$tipo] = $this->has_many(Unidad::class, 'proyecto')->where('tipo', $id_tipo)->findMany();
$this->unidades = (object) $unidades;
}
return $this->unidades->{$tipo};
}
public function unidadesDisponibles($tipo = null)
{
switch ($tipo) {
case 1:
case 'departamento':
case 'departamentos':
$tipo = 'departamento';
$id_tipo = 1;
break;
case 2:
case 'estacionamiento':
case 'estacionamientos':
$tipo = 'estacionamiento';
$id_tipo = 2;
break;
case 3:
case 'bodega':
case 'bodegas':
$tipo = 'bodega';
$id_tipo = 3;
break;
default:
$tipo = 'total';
$id_tipo = null;
}
if (!isset($this->unidades) or !isset($this->unidades->disponibles) or !isset($this->unidades->disponibles->{$tipo})) {
$unidades = ['disponibles' => []];
if (isset($this->unidades)) {
$unidades = (array) $this->unidades;
$unidades['disponibles'] = [];
if (isset($this->unidades->disponibles)) {
$unidades['disponibles'] = (array) $this->unidades->disponibles;
}
}
$q_s = "SELECT u.*
FROM
(SELECT * FROM unidad WHERE proyecto = ? ORDER BY tipo) AS u
LEFT JOIN
(SELECT unidad.*
FROM venta
JOIN propiedad ON propiedad.id = venta.propiedad
JOIN unidad ON unidad.id = propiedad.unidad_principal
WHERE venta.estado = 1) AS v ON v.id = u.id
LEFT JOIN
(SELECT unidad.*
FROM venta
JOIN propiedad ON propiedad.id = venta.propiedad
JOIN unidad ON propiedad.estacionamientos LIKE unidad.id
OR propiedad.estacionamientos LIKE CONCAT(unidad.id, ';%')
OR propiedad.estacionamientos LIKE CONCAT('%;', unidad.id)
OR propiedad.estacionamientos LIKE CONCAT('%;', unidad.id, ';%')
WHERE venta.estado = 1) AS e ON e.id = u.id
LEFT JOIN
(SELECT unidad.*
FROM venta
JOIN propiedad ON propiedad.id = venta.propiedad
JOIN unidad ON propiedad.bodegas LIKE unidad.id
OR propiedad.bodegas LIKE CONCAT(unidad.id, ';%')
OR propiedad.bodegas LIKE CONCAT('%;', unidad.id)
OR propiedad.bodegas LIKE CONCAT('%;', unidad.id, ';%')
WHERE venta.estado = 1) AS b ON b.id = u.id
WHERE v.id IS NULL AND e.id IS NULL AND b.id IS NULL";
$q_p = " ORDER BY u.tipo, LPAD(u.descripcion, 4, '0')";
switch (strtolower($id_tipo)) {
case null:
default:
$q = $q_s . $q_p;
break;
case 1:
case 'departamento':
case 'departamentos':
$q = $q_s . ' AND u.tipo = 1' . $q_p;
break;
case 2:
case 'estacionamiento':
case 'estacionamientos':
$q = $q_s . ' AND u.tipo = 2' . $q_p;
break;
case 3:
case 'bodega':
case 'bodegas':
$q = $q_s . ' AND u.tipo = 3' . $q_p;
break;
}
$disponibles = model(Unidad::class)->rawQuery($q, [$this->id])->findMany();
$unidades['disponibles'][$tipo] = $disponibles;
$unidades['disponibles'] = (object) $unidades['disponibles'];
$this->unidades = (object) $unidades;
}
return $this->unidades->disponibles->{$tipo};
}
public function proyectoTipoUnidades()
{
return $this->hasMany(ProyectoTipoUnidad::class, 'proyecto')->orderByAsc('tipo')->findMany();
}
public function tipoUnidades()
{
if (!isset($this->tipos_unidades)) {
$tipos = \Model::factory(TipoUnidad::class)
->select('tipo_unidad.*')
->join('unidad', ['unidad.tipo', '=', 'tipo_unidad.id'])
->join('proyecto', ['proyecto.id', '=', 'unidad.proyecto'])
->where('proyecto.id', $this->id)
->order_by_asc('tipo_unidad.id')
->group_by('tipo_unidad.id')
->findMany();
$this->tipos_unidades = $tipos;
}
return $this->tipos_unidades;
}
public function ventas($order = 'departamento')
{
if (!isset($this->ventas)) {
$ventas = model(Venta::class)
->select('venta.*')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->rawJoin('JOIN (SELECT `e1`.* FROM (SELECT `venta`, MAX(`id`) AS `id` FROM `estado_venta` GROUP BY `venta`) AS `e0` JOIN `estado_venta` AS `e1` ON `e1`.`id` = `e0`.`id`)', ['estado_venta.venta', '=', 'venta.id'], 'estado_venta')
->join('tipo_estado_venta', ['tipo_estado_venta.id', '=', 'estado_venta.estado'])
->where('unidad.proyecto', $this->id)
->where('unidad.tipo', 1)
->where('tipo_estado_venta.activa', 1);
switch (strtolower($order)) {
case 'fecha':
$ventas = $ventas->orderByAsc('venta.fecha');
case 'departamento':
default:
$ventas = $ventas->orderByExpr('LPAD(`unidad`.`descripcion`, 4, "0")');
break;
}
$ventas = $ventas->find_many();
$this->ventas = $ventas;
}
return $this->ventas;
}
protected $resciliaciones;
public function resciliaciones()
{
if ($this->resciliaciones == null) {
$resciliaciones = model(Venta::class)
->select('venta.*')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->rawJoin('JOIN (SELECT `e1`.* FROM (SELECT `venta`, MAX(`id`) AS `id` FROM `estado_venta` GROUP BY `venta`) AS `e0` JOIN `estado_venta` AS `e1` ON `e1`.`id` = `e0`.`id`)', ['estado_venta.venta', '=', 'venta.id'], 'estado_venta')
->join('tipo_estado_venta', ['tipo_estado_venta.id', '=', 'estado_venta.estado'])
->where('unidad.proyecto', $this->id)
->where('unidad.tipo', 1)
->where('tipo_estado_venta.activa', 0)
->orderByExpr('LPAD(`unidad`.`descripcion`, 4, "0")')
->find_many()
;
$this->resciliaciones = $resciliaciones;
}
return $this->resciliaciones;
}
public function escrituras()
{
if (!isset($escrituras)) {
$ventas = model(Venta::class)
->select('venta.*')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->where('unidad.proyecto', $this->id)
->where('venta.estado', 1)
->where('unidad.tipo', 1)
->whereNotEqual('venta.escriturado', '0')
->orderByExpr('LPAD(unidad.descripcion, 4, "0")')
->find_many()
;
$this->escrituras = $ventas;
}
return $this->escrituras;
}
public function entregas()
{
if (!isset($this->entregas)) {
$entregas = [];
$escrituras = $this->escrituras();
foreach ($escrituras as $escritura) {
if ($escritura->entrega == '0') {
continue;
}
$entregas []= $escritura;
}
usort($entregas, function($a, $b) {
$fa = \Carbon\Carbon::parse($a->entrega()->find_one()->fecha);
$fb = \Carbon\Carbon::parse($b->entrega()->find_one()->fecha);
$dif = $fb->diffInDays($fa, false);
if ($dif == 0) {
return $a->unidad()->descripcion - $b->unidad()->descripcion;
}
return $dif;
});
$this->entregas = $entregas;
}
return $this->entregas;
}
public function estados()
{
return $this->has_many(EstadoProyecto::class, 'proyecto')->orderByAsc('fecha')->findMany();
}
public function estado()
{
if (!isset($this->estado)) {
$id = $this->has_many(EstadoProyecto::class, 'proyecto')->max('id');
$this->estado = $this->has_many(EstadoProyecto::class, 'proyecto')->findOne($id);
}
return $this->estado;
}
public function avances()
{
return $this->hasMany(AvanceConstruccion::class, 'proyecto')->orderByAsc('fecha')->findMany();
}
protected $avance;
public function avance()
{
if ($this->avance == null and $this->avances()) {
$avance = array_reduce($this->avances(), function($carry, $item) {
return ($carry += $item->avance);
});
$this->avance = $avance;
}
return $this->avance;
}
protected $inicio;
public function inicio()
{
if (!isset($this->inicio) or $this->inicio == null) {
$id = $this->has_many(EstadoProyecto::class, 'proyecto')->min('id');
$this->inicio = $this->has_many(EstadoProyecto::class, 'proyecto')->findOne($id);
}
return $this->inicio;
}
public function valores()
{
if (!isset($this->valores)) {
$ventas = $this->ventas();
/**
* vendidos
* departamentos
* cantidad
* ingreso
* neto
* bruto // suma estacionamientos, bodegas, comision y premios
* pagado
* abonado
* precio
* minimo
* promedio
* maximo
* mts
* minimo
* promedio // total dividido cantidad
* maximo
* total
* uf_m2
* minimo // minimo de precio dividido mts
* promedio // ingreso neto dividido mts total
* maximo // maximo de precio dividido mts
* estacionamientos // valor estacionamientos
* bodegas // valor bodegas
* comision // valor comisiones
* premios // valor total cada premio
* estimados // idem vendidos, pero valores estimados proporcional a mts
* totales // vendidos + estimados
*/
$premios = model(Promocion::class)->findMany();
$valores = (object) [
'vendidos' => new BaseValores(),
'estimados' => new BaseValores(),
'totales' => new BaseValores()
];
foreach ($valores as &$name) {
$name->basePremios($premios);
}
if ($ventas) {
$valores->vendidos->ingreso->neto = 0;
$valores->vendidos->ingreso->neto = array_reduce($ventas, function($sum, $item) {
return $sum + $item->valorFinal();
});
foreach ($ventas as $venta) {
//$valores->vendidos->ingreso->neto += $venta->valorFinal();
$valores->vendidos->ingreso->bruto += $venta->valor_uf;
$valores->vendidos->ingreso->pagado += $venta->valorPagado();
$valores->vendidos->ingreso->abonado += $venta->valorAbonado();
$valores->vendidos->departamentos->cantidad ++;
if ($venta->unidad()->precio($venta->fecha())) {
$valores->vendidos->departamentos->addPrecio($venta->unidad()->precio($venta->fecha())->valor);
}
$valores->vendidos->departamentos->addMts('totales', $venta->unidad()->m2('total'));
$valores->vendidos->departamentos->addMts('vendibles', $venta->unidad()->m2());
//$valores->vendidos->otros->cantidad += ($venta->estacionamientos() or $venta->bodegas()) :
$valores->vendidos->otros->valor += $venta->valorEstacionamientosYBodegas();
if ($venta->bono_pie) {
$valores->vendidos->bono->cantidad ++;
$valores->vendidos->bono->valor += $venta->bonoPie()->pago()->valor('ufs');
}
$valores->vendidos->comision += $venta->valorComision();
$ps = $venta->promociones();
if (count($ps) > 0) {
foreach ($ps as $promo) {
if ($promo->descripcion != '') {
$valores->vendidos->premios->{$promo->descripcion} += $promo->valor;
}
}
}
}
$valores->vendidos->departamentos->setPromedios();
}
$valores->estimados->departamentos->cantidad = count($this->unidades(1)) - count($this->ventas());
$valores->estimados->departamentos->mts->vendibles->total = 0;
$valores->estimados->departamentos->mts->vendibles->promedio = 0;
$valores->estimados->departamentos->precio->promedio = 0;
$valores->estimados->departamentos->uf_m2->promedio = 0;
if ($valores->estimados->departamentos->cantidad > 0) {
$valores->estimados->departamentos->mts->vendibles->total = array_reduce($this->unidadesDisponibles(1), function($sum, $item) {
return $sum + $item->m2();
});
$valores->estimados->departamentos->mts->vendibles->promedio = $valores->estimados->departamentos->mts->vendibles->total / $valores->estimados->departamentos->cantidad;
$valores->estimados->ingreso->neto = array_reduce($this->unidadesDisponibles(1), function($sum, $item) {
if (!$item->precio()) {
return $sum;
}
return $sum + $item->precio()->valor;
});
if ($valores->estimados->ingreso->neto == null) {
$valores->estimados->ingreso->neto = 0;
}
$valores->estimados->departamentos->precio->promedio = $valores->estimados->ingreso->neto / $valores->estimados->departamentos->cantidad;
$valores->estimados->departamentos->uf_m2->promedio = $valores->estimados->ingreso->neto / $valores->estimados->departamentos->mts->vendibles->total;
}
$valores->estimados->otros->cantidad = count($this->unidadesDisponibles(2)) + count($this->unidadesDisponibles(3));
$valores->estimados->otros->valor = count($this->unidadesDisponibles(2)) * 330 + count($this->unidadesDisponibles(3)) * 50;
foreach ($premios as $premio) {
$valores->estimados->premios->{$premio->descripcion} = 0;
if ($valores->vendidos->ingreso->neto > 0) {
$valores->estimados->premios->{$premio->descripcion} = $valores->vendidos->premios() * $valores->estimados->ingreso->neto / $valores->vendidos->ingreso->neto;
}
}
$valores->estimados->bono->valor = 0;
$valores->estimados->comision = 0;
if ($valores->vendidos->ingreso->neto > 0) {
$valores->estimados->bono->valor = $valores->vendidos->bono->valor * $valores->estimados->ingreso->neto / $valores->vendidos->ingreso->neto;
$valores->estimados->comision = $valores->vendidos->comision * $valores->estimados->ingreso->neto / $valores->vendidos->ingreso->neto;
}
$valores->estimados->ingreso->bruto = $valores->estimados->ingreso->neto
+ $valores->estimados->otros->valor
+ $valores->estimados->bono->valor
+ $valores->estimados->premios()
+ $valores->estimados->comision;
$this->valores = $valores;
}
return $this->valores;
}
public function agentes()
{
if (!isset($this->agentes)) {
$this->agentes = \Model::factory(Agente::class)
->select('agente.*')
->join('proyecto_agente', ['proyecto_agente.agente', '=', 'agente.id'])
->where('proyecto_agente.proyecto', $this->id)
->orderByAsc('agente.abreviacion')
->findMany();
}
return $this->agentes;
}
public function operadores()
{
if (!isset($this->operadores)) {
$this->operadores = \Model::factory(Agente::class)
->select('agente.*')
->select('agente_tipo.id', 'agente_tipo')
->join('agente_tipo', ['agente_tipo.agente', '=', 'agente.id'])
->join('proyecto_agente', ['proyecto_agente.agente', '=', 'agente_tipo.id'])
->where('agente_tipo.tipo', 19)
->where('proyecto_agente.proyecto', $this->id)
->orderByAsc('agente.abreviacion')
->groupBy('agente_tipo.id')
->findMany();
}
return $this->operadores;
}
public function operadoresVigentes()
{
return $this->hasMany(ProyectoAgente::class, 'proyecto')
->select('proyecto_agente.*')
->join('agente_tipo', ['agente_tipo.id', '=', 'proyecto_agente.agente'])
->rawJoin('JOIN (SELECT e1.* FROM estado_proyecto_agente e1 JOIN (SELECT agente, MAX(id) AS id FROM estado_proyecto_agente GROUP BY agente) e0 ON e0.id = e1.id)', ['ep.agente', '=', 'proyecto_agente.id'], 'ep')
->where('agente_tipo.tipo', 19)
->where('ep.tipo', 1)
->findMany();
}
public function promociones()
{
if (!isset($this->promociones)) {
$this->promociones = \Model::factory(Promocion::class)
->select('promocion.*')
->join('promocion_venta', ['promocion_venta.promocion', '=', 'promocion.id'])
->join('venta', ['venta.id', '=', 'promocion_venta.venta'])
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->where('unidad.proyecto', $this->id)
->groupBy('promocion.id')
->orderByAsc('promocion.titulo')
->findMany();
}
return $this->promociones;
}
public function pisos()
{
if ($this->pisos == 0) {
$pisos = $this->has_many(Unidad::class, 'proyecto')->where('tipo', 1)->max('piso');
if (!$pisos) {
return 0;
}
$this->pisos = $pisos;
$this->save();
}
return $this->pisos;
}
public function cuotasHoy()
{
if (!isset($this->cuotas) or !isset($this->cuotas->hoy)) {
$cuotas = [];
if (isset($this->cuotas)) {
$cuotas = (array) $this->cuotas;
}
$f = Carbon::today(config('app.timezone'));
$cuotas['hoy'] = model(Venta::class)
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->join('cuota', ['cuota.pie', '=', 'venta.pie'])
->join('pago', ['pago.id', '=', 'cuota.pago'])
->raw_join('JOIN (SELECT e1.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago e1 ON e1.id = e0.id)', ['ep.pago', '=', 'pago.id'], 'ep')
->where('unidad.proyecto', $this->id)
->where('venta.estado', 1)
->where('pago.fecha', $f->format('Y-m-d'))
->whereLt('ep.estado', 1)
->whereGte('ep.estado', 0)
->count('cuota.id');
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->hoy;
}
public function cuotasPendientes()
{
if (!isset($this->cuotas) or !isset($this->cuotas->pendientes)) {
$cuotas = [];
if (isset($this->cuotas)) {
$cuotas = (array) $this->cuotas;
}
$f = Carbon::today(config('app.timezone'));
$cuotas['pendientes'] = model(Cuota::class)
->join('venta', ['cuota.pie', '=', 'venta.pie'])
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->join('pago', ['pago.id', '=', 'cuota.pago'])
->raw_join('JOIN (SELECT e1.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago e1 ON e1.id = e0.id)', ['ep.pago', '=', 'pago.id'], 'ep')
->where('unidad.proyecto', $this->id)
->where('venta.estado', 1)
->whereLt('pago.fecha', $f->format('Y-m-d'))
->whereLt('ep.estado', 1)
->whereGte('ep.estado', 0)
->count('cuota.id');
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->pendientes;
}
public function cuotasMes()
{
if (!isset($this->cuotas) or !isset($this->cuotas->mes)) {
$cuotas = [];
if (isset($this->cuotas)) {
$cuotas = (array) $this->cuotas;
}
$f = Carbon::today(config('app.timezone'));
$cuotas['mes'] = model(Cuota::class)
->join('venta', ['cuota.pie', '=', 'venta.pie'])
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->join('pago', ['pago.id', '=', 'cuota.pago'])
->raw_join('JOIN (SELECT e1.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago e1 ON e1.id = e0.id)', ['ep.pago', '=', 'pago.id'], 'ep')
->where('unidad.proyecto', $this->id)
->where('venta.estado', 1)
->whereGt('pago.fecha', $f->format('Y-m-d'))
->whereLte('pago.fecha', $f->copy()->addMonth(1)->format('Y-m-d'))
->where('ep.estado', 0)
->findMany();
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->mes;
}
public function tiposMediciones()
{
$tipos = $this->has_many_through(\Incoviba\nuevo\Venta\TipoMedicion::class, \Incoviba\nuevo\Venta\ProyectoTipoMedicion::class, 'proyecto_id', 'tipo_medicion_id');
if ($tipos) {
return $tipos->orderByAsc('descripcion')->findMany();
}
return null;
}
public function superficie($tipo = 'total')
{
if (!isset($this->superficies) or !isset($this->superficies->{$tipo})) {
$superficies = [];
if (isset($this->superficies)) {
$superficies = (array) $this->superficies;
}
switch (strtolower($tipo)) {
case 'total':
$superficies['total'] = $this->superficie('snt') + $this->superficie('bnt');
break;
case 'terreno':
$superficies['terreno'] = $this->superficie_terreno;
break;
case 'sobre_nivel':
case 'snt':
$superficies['snt'] = $superficies['sobre_nivel'] = $this->superficie_sobre_nivel;
break;
case 'bajo_nivel':
case 'bnt':
$superficies['bnt'] = $superficies['bajo_nivel'] = $this->superficie_bajo_nivel;
break;
case 'vendible':
$superficies['vendible'] = 0;
if ($this->unidades()) {
$metros = $this->hasMany(Unidad::class, 'proyecto')->selectExpr('SUM(m2 + logia + terraza /2)', 'metros')->where('tipo', 1)->groupBy('proyecto')->findOne();
$superficies['vendible'] = $metros->metros;
}
break;
case 'vendida':
$superficies['vendida'] = 0;
if ($this->ventas()) {
$metros = model(Venta::class)
->selectExpr('SUM(unidad.m2 + unidad.logia + unidad.terraza / 2)', 'metros')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->where('unidad.proyecto', $this->id)
->where('venta.estado', 1)
->where('unidad.tipo', 1)
->groupBy('unidad.proyecto')
->findOne();
if ($metros) {
$superficies['vendida'] = $metros->metros;
}
}
break;
case 'por vender':
$superficies['por vender'] = $this->superficie('vendible') - $this->superficie('vendida');
break;
default:
return 0;
}
$this->superficies = (object) $superficies;
}
return $this->superficies->{$tipo};
}
public function setDireccion(array $data)
{
if (!is_numeric($data['comuna'])) {
$comuna = model(Comuna::class)->where('descripcion', $data['comuna'])->findOne();
$data['comuna'] = $comuna->id;
}
$direccion = model(Direccion::class)
->where('calle', $data['calle'])
->where('numero', $data['numero'])
->where('extra', $data['extra'])
->where('comuna', $data['comuna'])
->findOne();
$this->direccion = $direccion->id;
}
public function addAgente(array $data)
{
$data = ['agente' => $data['agente'], 'tipo' => $data['tipo']];
$agente = (new Factory(AgenteTipo::class))->create($data);
$agente->save();
$this->agentes []= $agente;
}
protected $tipologias;
public function tipologias()
{
if ($this->tipologias == null) {
$pts = $this->proyectoTipoUnidades();
$tipologias = [];
foreach ($pts as $pt) {
if ($pt->tipologia()) {
if (!isset($tipologias[$pt->tipologia()->tipologia->descripcion])) {
$tipologias[$pt->tipologia()->tipologia->descripcion] = (object) ['tipologia' => $pt->tipologia()->tipologia, 'tipos' => []];
}
$tipologias[$pt->tipologia()->tipologia->descripcion]->tipos []= $pt;
continue;
}
}
$this->tipologias = $tipologias;
}
return $this->tipologias;
}
public function pagares()
{
return $this->hasMany(Pagare::class, 'proyecto')->findMany();
}
protected $cierres;
public function cierres(int $vigentes = 0)
{
if (!isset($this->cierres[$vigentes]) or $this->cierres[$vigentes] == null) {
$orm = model(Cierre::class)
->select('cierre.*')
->rawJoin('join (select e1.* from estado_cierre e1 join (select cierre, max(id) as id from estado_cierre group by cierre) e0 on e0.id = e1.id)', ['ec.cierre', '=', 'cierre.id'], 'ec')
->join('tipo_estado_cierre', ['tipo_estado_cierre.id', '=', 'ec.tipo'])
->join('proyecto', ['proyecto.id', '=', 'cierre.proyecto'])
->join('unidad_cierre', ['unidad_cierre.cierre', '=', 'cierre.id'])
->join('unidad', ['unidad.id', '=', 'unidad_cierre.unidad'])
->where('proyecto.id', $this->id)
->where('unidad_cierre.principal', 1)
->orderByAsc('proyecto.descripcion')
->orderByDesc('tipo_estado_cierre.vigente')
->orderByAsc('cierre.fecha')
->orderByExpr('LPAD(unidad.descripcion, 4, "0")')
->groupBy('cierre.id');
switch ($vigentes) {
case Cierre::VIGENTES:
$orm = $orm->where('tipo_estado_cierre.vigente', 1);
break;
case Cierre::NO_VIGENTES:
$orm = $orm->where('tipo_estado_cierre.vigente', 0);
break;
case Cierre::VIGENTES + 1:
$orm = $orm
->where('tipo_estado_cierre.vigente', 1)
->whereNotLike('tipo_estado_cierre.descripcion', 'promesado')
;
break;
case Cierre::VIGENTES + 2:
$orm = $orm
->where('tipo_estado_cierre.vigente', 1)
->whereLike('tipo_estado_cierre.descripcion', 'promesado')
;
break;
}
$this->cierres[$vigentes] = $orm->findMany();
}
return $this->cierres[$vigentes];
}
public function tipos() {
return $this->hasMany(ProyectoTipoUnidad::class, 'proyecto')->findMany();
}
}
class Departamentos {
public $cantidad;
public $precio;
public $mts;
public $uf_m2;
public function __construct() {
$this->cantidad = 0;
$base = [
'minimo' => 1000000,
'promedio' => 0,
'maximo' => -1
];
$this->precio = (object) $base;
$this->mts = (object) [
'totales' => (object) array_merge($base, ['total' => 0]),
'vendibles' => (object) array_merge($base, ['total' => 0])
];
$this->uf_m2 = (object) $base;
}
protected function setMin(&$var, $val) {
if ($var > $val) {
$var = $val;
}
}
protected function setMax(&$var, $val) {
if ($var < $val) {
$var = $val;
}
}
public function addPrecio($val) {
$this->precio->promedio += $val;
$this->setMin($this->precio->minimo, $val);
$this->setMax($this->precio->maximo, $val);
$this->uf_m2->promedio += $val;
return $this;
}
public function addMts($name, $val) {
$this->mts->$name->total += $val;
$this->mts->$name->promedio += $val;
$this->setMin($this->mts->{$name}->minimo, $val);
$this->setMax($this->mts->{$name}->maximo, $val);
return $this;
}
public function addUfM2($val) {
$this->setMin($this->uf_m2->minimo, $val);
$this->setMax($this->uf_m2->maximo, $val);
return $this;
}
public function setPromedios() {
$this->precio->promedio /= $this->cantidad;
$this->mts->totales->promedio /= $this->cantidad;
$this->mts->vendibles->promedio /= $this->cantidad;
$this->uf_m2->promedio /= $this->mts->vendibles->total;
return $this;
}
};
class BaseValores {
public $ingreso;
public $departamentos;
public $otros;
public $bono;
public $comision;
public $premios;
public function __construct() {
$this->ingreso = (object) [
'neto' => 0,
'bruto' => 0,
'pagado' => 0,
'abonado' => 0
];
$this->departamentos = new Departamentos();
$this->otros = (object) [
'cantidad' => 0,
'valor' => 0
];
$this->bono = (object) [
'cantidad' => 0,
'valor' => 0
];
$this->comision = 0;
$this->premios = [];
}
public function basePremios(array $premios) {
foreach ($premios as $premio) {
$this->premios[$premio->descripcion] = 0;
}
$this->premios = (object) $this->premios;
return $this;
}
protected $total_premios;
public function premios() {
if ($this->total_premios == null) {
$this->total_premios = array_reduce((array) $this->premios, function($sum, $item) {
return $sum + $item;
});
}
return $this->total_premios;
}
};

View File

@ -0,0 +1,54 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Venta\UnidadBloqueada;
/**
*
* @author Aldarien
*
* @property int id
* @property Proyecto proyecto
* @property AgenteTipo agente
* @property date fecha
* @property float comision
*
*/
class ProyectoAgente extends Model
{
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
public function agente()
{
return $this->belongsTo(AgenteTipo::class, 'agente')->findOne();
}
public function estado()
{
return $this->hasMany(EstadoProyectoAgente::class, 'agente')
->orderByDesc('id')->findOne();
}
public function estados()
{
return $this->hasMany(EstadoProyectoAgente::class, 'agente')->findMany();
}
public function unidadesBloqueadas()
{
return $this->hasMany(UnidadBloqueada::class, 'agente')->findMany();
}
public function new()
{
parent::save();
$tipo = model(TipoEstadoProyectoAgente::class)->where('descripcion', 'vigente')->findOne();
$data = [
'agente' => $this->id,
'fecha' => $this->fecha,
'tipo' => $tipo->id
];
$estado = model(EstadoProyectoAgente::class)->create($data);
$estado->save();
}
}
?>

View File

@ -0,0 +1,160 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Venta\TipoUnidad;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\Venta;
/**
*
* @property int id
* @property int proyecto
* @property string nombre
* @property int tipo
* @property string abreviacion
* @property float m2
* @property float logia
* @property float terraza
* @property string descripcion
*
*/
class ProyectoTipoUnidad extends Model
{
protected $lineas;
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
public function unidades()
{
return $this->hasMany(Unidad::class, 'pt')->orderByExpr('LPAD(subtipo, 3, "0")')->orderByExpr('LPAD(descripcion, 4, "0")')->findMany();
}
public function tipo()
{
return $this->belongsTo(TipoUnidad::class, 'tipo')->findOne();
}
public function m2($tipo = 'vendible')
{
return $this->m2 + $this->logia + $this->terraza / (($tipo == 'vendible') ? 2 : 1);
}
public function lineas()
{
if ($this->lineas == null) {
$lineas = [];
foreach ($this->unidades() as $unidad) {
if (array_search($unidad->subtipo, $lineas) === false) {
$lineas []= $unidad->subtipo;
}
}
sort($lineas);
$this->lineas = implode(', ', $lineas);
}
return $this->lineas;
}
public function precio($fecha = null)
{
$sum = 0;
$cnt = 0;
foreach ($this->unidades() as $unidad) {
if ($unidad->precio($fecha)) {
$sum += $unidad->precio($fecha)->valor;
$cnt ++;
}
}
if ($cnt == 0) {
return 0;
}
return $sum / $cnt;
}
protected $precios;
public function precioSubtipo($subtipo, $fecha = null)
{
if (!isset($this->precios[$subtipo])) {
$sum = 0;
$cnt = 0;
foreach ($this->unidades() as $unidad) {
if ($unidad->subtipo == $subtipo and $unidad->precio($fecha)) {
$sum += $unidad->precio($fecha)->valor;
$cnt ++;
}
}
if ($this->precios == null) {
$this->precios = [];
}
$prom = 0;
if ($cnt > 0) {
$prom = $sum / $cnt;
}
$this->precios[$subtipo] = $prom;
}
return $this->precios[$subtipo];
}
public function setPrecios($fecha, $valor)
{
foreach ($this->unidades() as $unidad) {
$unidad->setPrecio($fecha, $valor);
}
}
public function setPreciosSubtipo($subtipo, $fecha, $valor)
{
foreach ($this->unidades() as $unidad) {
if ($unidad->subtipo == $subtipo) {
$unidad->setPrecio($fecha, $valor);
}
}
}
protected $tipologia;
public function tipologia()
{
if ($this->tipologia == null) {
$tipologias = $this->hasMany(TipoTipologia::class, 'tipo')->findMany();
if (!$tipologias) {
$this->tipologia = false;
return false;
}
usort($tipologias, function($a, $b) {
return $a->elemento()->orden - $b->elemento()->orden;
});
$tipologia = ['tipologia' => $tipologias[0]->tipologia(), 'detalles' => $tipologias];
$resumen = [];
foreach ($tipologias as $t) {
if (strpos($t->elemento()->descripcion, 'cocina ') !== false) {
$resumen []= $t->elemento()->abreviacion;
continue;
}
$resumen []= $t->cantidad . '' . $t->elemento()->abreviacion;
}
$tipologia['descripcion'] = implode('/', $resumen);
$this->tipologia = (object) $tipologia;
}
return $this->tipologia;
}
protected $ventas;
public function ventas($order = 'departamento')
{
if ($this->ventas == null) {
$ventas = model(Venta::class)
->select('venta.*')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->join('proyecto_tipo_unidad', ['proyecto_tipo_unidad.id', '=', 'unidad.pt'])
->rawJoin('JOIN (SELECT e1.* FROM estado_venta e1 JOIN (SELECT venta, MAX(id) AS id FROM estado_venta GROUP BY venta) e0 ON e0.id = e1.id)', ['ev.venta', '=', 'venta.id'], 'ev')
->join('tipo_estado_venta', ['tipo_estado_venta.id', '=', 'ev.estado'])
->where('tipo_estado_venta.activa', 1)
->where('proyecto_tipo_unidad.id', $this->id);
switch (strtolower($order)) {
case 'fecha':
$ventas = $ventas->orderByAsc('venta.fecha');
case 'departamento':
default:
$ventas = $ventas->orderByExpr('LPAD(unidad.descripcion, 4, "0")');
break;
}
$ventas = $ventas->findMany();
$this->ventas = $ventas;
}
return $this->ventas;
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int agente1
* @property int agente2
*
*/
class RelacionAgentes extends Model
{
}
?>

View File

@ -0,0 +1,90 @@
<?php
namespace Incoviba\old\Proyecto;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Pagare $pagare
* @property double $insoluto
* @property double $intereses
* @property double $tasa
* @property \DateTime $fecha
* @property \DateTime $fecha_banco
* @property int $duracion
*/
class RenovacionPagare extends Model
{
public function pagare()
{
return $this->belongsTo(Pagare::class, 'pagare')->findOne();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
public function fechaBanco(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha_banco, config('app.timezone'));
}
$this->fecha_banco = $fecha->format('Y-m-d');
}
public function vencimiento()
{
return $this->fecha()->addDays($this->duracion);
}
public function uf()
{
if ($this->uf == 0) {
$uf = uf($this->fecha());
if ($uf->total > 0) {
$this->uf = $uf->uf->value;
$this->save();
}
}
return $this->uf;
}
protected $valores;
public function valor($tipo = 'ufs')
{
if ($this->valores == null) {
$valores = [];
switch (strtolower($this->pagare()->moneda()->descripcion)) {
case 'uf':
$valores = (object) ['uf' => $this->insoluto, 'pesos' => $this->insoluto * $this->uf()];
break;
case 'pesos':
$valores = (object) ['uf' => $this->insoluto / $this->uf(), 'pesos' => $this->insoluto];
break;
}
$this->valores = $valores;
}
switch (strtolower($tipo)) {
case 'uf':
case 'ufs':
return $this->valores->uf;
case 'peso':
case 'pesos':
return $this->valores->pesos;
}
}
protected $intereses_arr;
public function intereses($tipo = 'ufs') {
if ($this->intereses_arr == null) {
$this->intereses_arr = (object) ['uf' => $this->intereses / $this->uf(), 'pesos' => $this->intereses];
}
switch (strtolower($tipo)) {
case 'uf':
case 'ufs':
return $this->intereses_arr->uf;
case 'peso':
case 'pesos':
return $this->intereses_arr->pesos;
}
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property string icono
* @property string color
* @property string bgcolor
*
*/
class TipoAgente extends Model
{
public function agentes()
{
return $this->hasManyThrough(Agente::class, AgenteTipo::class, 'tipo', 'agente')->findMany();
}
}
?>

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoCobro extends Model
{
}
?>

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoElemento extends Model
{
}

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoEstadoCobro extends Model
{
}
?>

View File

@ -0,0 +1,23 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
* @property int orden
* @property EtapaProyecto etapa
*
*/
class TipoEstadoProyecto extends Model
{
public function etapa()
{
return $this->belongs_to(EtapaProyecto::class, 'etapa')->findOne();
}
}
?>

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoEstadoProyectoAgente extends Model
{
}

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoMonedaPagare extends Model
{
}

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoProyectista extends Model
{
}
?>

View File

@ -0,0 +1,27 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property ProyectoTipoUnidad $tipo
* @property Tipologia $tipologia
* @property int $cantidad
* @property TipoElemento $elemento
*/
class TipoTipologia extends Model
{
public function tipo()
{
return $this->belongsTo(ProyectoTipoUnidad::class, 'tipo')->findOne();
}
public function tipologia()
{
return $this->belongsTo(Tipologia::class, 'tipologia')->findOne();
}
public function elemento()
{
return $this->belongsTo(TipoElemento::class, 'elemento')->findOne();
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Proyecto;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class Tipologia extends Model
{
}

22
src/old/Venta/BonoPie.php Normal file
View File

@ -0,0 +1,22 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property float valor
* @property Pago pago
*
*/
class BonoPie extends Model
{
public function pago()
{
return $this->belongs_to(Pago::class, 'pago')->findOne();
}
}
?>

335
src/old/Venta/Cierre.php Normal file
View File

@ -0,0 +1,335 @@
<?php
namespace Incoviba\old\Venta;
use Carbon\Carbon;
use Incoviba\Common\Service\Factory;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Proyecto\Proyecto;
/**
* @property int $id
* @property Proyecto $proyecto
* @property float $precio
* @property \DateTime $fecha
* @property int $relacionado
* @property Propietario $propietario
*/
class Cierre extends Model
{
const VIGENTES = 1;
const NO_VIGENTES = -1;
public static function find(Proyecto $proyecto, Unidad $unidad, float $precio)
{
return model(Cierre::class)
->select('cierre.*')
->join('unidad_cierre', ['unidad_cierre.cierre', '=', 'cierre.id'])
->where('cierre.proyecto', $proyecto->id)
->where('unidad_cierre.unidad', $unidad->id)
->where('cierre.precio', $precio);
}
public static function vigentes()
{
return model(Cierre::class)
->select('cierre.*')
->join('estado_cierre', ['estado_cierre.cierre', '=', 'cierre.id'])
->join('tipo_estado_cierre', ['tipo_estado_cierre.id', '=', 'estado_cierre.tipo'])
->join('proyecto', ['proyecto.id', '=', 'cierre.proyecto'])
->where('tipo_estado_cierre.vigente', 1)
->orderByAsc('proyecto.descripcion')
->orderByAsc('cierre.fecha')
->groupBy('cierre.id')
->findMany();
}
public static function proyectos()
{
return model(Proyecto::class)
->select('proyecto.*')
->join('cierre', ['proyecto.id', '=', 'cierre.proyecto'])
->join('estado_cierre', ['estado_cierre.cierre', '=', 'cierre.id'])
->join('tipo_estado_cierre', ['tipo_estado_cierre.id', '=', 'estado_cierre.tipo'])
->where('tipo_estado_cierre.vigente', 1)
->orderByAsc('proyecto.descripcion')
->orderByAsc('cierre.fecha')
->groupBy('proyecto.id')
->findMany();
}
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
public function unidades()
{
return $this->hasMany(UnidadCierre::class, 'cierre')->where('principal', 0)->findMany();
}
public function unidadPrincipal()
{
return $this->hasMany(UnidadCierre::class, 'cierre')->where('principal', 1)->findOne();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
public function propietario()
{
$propietario = $this->belongsTo(Propietario::class, 'propietario');
if ($propietario) {
return $propietario->findOne();
}
return false;
}
public function uf_m2()
{
return $this->neto() / $this->unidadPrincipal()->unidad()->m2();
}
public function neto()
{
$valor = $this->precio;
foreach ($this->unidades() as $unidad) {
$valor -= $unidad->unidad()->precio($this->fecha())->valor;
}
foreach ($this->valores() as $v) {
if ($v->tipo()->descripcion == 'pie') {
continue;
}
$valor -= $v->valor;
}
return $valor;
}
public function valores()
{
return $this->hasMany(ValorCierre::class, 'cierre')->findMany();
}
public function valor($tipo = 'pie')
{
return $this->hasMany(ValorCierre::class, 'cierre')
->select('valor_cierre.*')
->join('tipo_valor_cierre', ['tipo_valor_cierre.id', '=', 'valor_cierre.tipo'])
->where('tipo_valor_cierre.descripcion', $tipo)
->findOne();
}
public function estados()
{
return $this->hasMany(EstadoCierre::class, 'cierre')->findMany();
}
public function estado(\DateTime $fecha = null)
{
if ($fecha == null) {
$estado = $this->hasMany(EstadoCierre::class, 'cierre')->orderByDesc('id')->findOne();
if ($estado->tipo()->vigente == 1 and $this->oldest()) {
if ($this->promesa() and $estado->tipo()->descripcion != 'promesado') {
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'promesado')->findOne();
$data = [
'cierre' => $this->id,
'tipo' => $tipo->id,
'fecha' => $this->promesa()->fecha
];
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
}
}
} else {
$estado = $this->hasMany(EstadoCierre::class, 'cierre')->whereLte('fecha', $fecha->format('Y-m-d'))->orderByDesc('id')->findOne();
}
return $estado;
}
public function new(\DateTime $fecha)
{
$this->save();
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'revisado')->findOne();
$data = [
'cierre' => $this->id,
'tipo' => $tipo->id,
'fecha' => $fecha->format('Y-m-d')
];
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
if ($this->other()) {
$this->replace($fecha);
}
}
protected function cierresUnidad() {
$up = $this->unidadPrincipal();
if (!$up) {
return false;
}
$up = $up->id;
$cierres = model(Cierre::class)
->select('cierre.*')
->join('unidad_cierre', ['unidad_cierre.cierre', '=', 'cierre.id'])
->where('unidad_cierre.unidad', $up)
->findMany();
$id = $this->id;
$cierres = array_filter($cierres, function($item) use ($id) {
return ($id != $item->id);
});
return $cierres;
}
protected function other(): bool {
$cierres = $this->cierresUnidad();
if ($cierres and count($cierres) > 0) {
return true;
}
return false;
}
protected function oldest(): bool {
if ($this->other()) {
$last = $this->cierresUnidad()[count($this->cierresUnidad()) - 1];
if ($last->fecha < $this->fecha) {
return true;
}
return false;
}
return true;
}
protected function replace(\DateTime $fecha) {
$cierres = $this->cierresUnidad();
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'abandonado')->findOne();
array_walk($cierres, function($item) use ($tipo, $fecha) {
$data = [
'cierre' => $item->id,
'tipo' => $tipo->id,
'fecha' => $fecha->format('Y-m-d')
];
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
});
}
public function addUnidad(array $data)
{
$data['cierre'] = $this->id;
$unidad = model(UnidadCierre::class)->create($data);
$unidad->save();
}
public function addValor(array $data)
{
$data['cierre'] = $this->id;
$tipo = model(TipoValorCierre::class)->where('descripcion', $data['tipo'])->findOne();
$data['tipo'] = $tipo->id;
$valor = model(ValorCierre::class)->create($data);
$valor->save();
}
public static function evaluar($precio_neto, $unidad, $fecha, $relacionado = false)
{
$precio_oferta = round($precio_neto, 2);
$precio_lista = round($unidad->precio($fecha)->valor * (($relacionado) ? (1 - 0.06) : 1), 2);
if ($precio_oferta >= $precio_lista) {
return true;
}
return false;
}
public function guardar(object $input)
{
$this->proyecto = $input->proyecto->id;
$this->precio = $input->precio;
$this->fecha = $input->fecha->format('Y-m-d');
$this->relacionado = 0;
if (isset($input->relacionado) and $input->relacionado) {
$this->relacionado = 1;
}
if (isset($input->subrelacionado) and $input->subrelacionado) {
$this->relacionado = 2;
}
$fecha = Carbon::today(config('app.timezone'));
$this->new($fecha);
$data = [
'unidad' => $input->departamento->id,
'principal' => 1
];
$this->addUnidad($data);
foreach ($input->unidades as $unidad) {
$data = ['unidad' => $unidad->id];
$this->addUnidad($data);
}
if (isset($input->pie)) {
$data = [
'tipo' => 'pie',
'valor' => $input->pie
];
$this->addValor($data);
}
if (isset($input->bono)) {
$data = [
'tipo' => 'bono pie',
'valor' => $input->bono
];
$this->addValor($data);
}
if (isset($input->promocion)) {
$data = [
'tipo' => 'premio',
'valor' => $input->promocion
];
$this->addValor($data);
}
if (isset($input->operador)) {
$data = [
'tipo' => 'operador',
'valor' => $input->operador * $this->precio / 100
];
$this->addValor($data);
}
}
public function aprobar(\DateTime $fecha)
{
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'aprobado')->findOne();
$data = [
'cierre' => $this->id,
'tipo' => $tipo->id
];
$estado = (new Factory(EstadoCierre::class))->where($data)->find();
if (!$estado) {
$data['fecha'] = $fecha->format('Y-m-d');
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
}
}
public function rechazar(\DateTime $fecha)
{
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'rechazado')->findOne();
$data = [
'cierre' => $this->id,
'tipo' => $tipo->id
];
$estado = (new Factory(EstadoCierre::class))->where($data)->find();
if (!$estado) {
$data['fecha'] = $fecha->format('Y-m-d');
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
}
}
protected $promesa;
public function promesa()
{
if ($this->promesa == null) {
$propiedad = model(Propiedad::class)->where('unidad_principal', $this->unidadPrincipal()->unidad)->findOne();
if (!$propiedad) {
return false;
}
$this->promesa = model(Venta::class)->where('propiedad', $propiedad->id)->where('estado', 1)->findOne();
if ($this->promesa != null and $this->propietario == 0) {
$this->propietario = $this->promesa->propietario;
$this->save();
}
}
return $this->promesa;
}
public function isRelacionado() {
return ($this->relacionado == 1) ? true : false;
}
public function isSubrelacionado() {
return ($this->relacionado == 2) ? true : false;
}
public function periodo() {
$today = Carbon::today(config('app.timezone'));
$dif = $today->diffInDays($this->fecha());
return $dif;
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int venta
* @property datetime fecha
* @property string texto
* @property int estado
*
*/
class Comentario extends Model
{
public function venta()
{
return $this->belongsTo(Venta::class, 'venta')->findOne();
}
}
?>

29
src/old/Venta/Credito.php Normal file
View File

@ -0,0 +1,29 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property string banco
* @property int valor
* @property date fecha
* @property float uf
* @property int abonado
* @property date fecha_abono
* @property Pago pago
*
*/
class Credito extends Model
{
public function pago()
{
return $this->belongs_to(Pago::class, 'pago')->findOne();
}
public function venta()
{
return $this->hasOne(Venta::class, 'credito')->findOne();
}
}
?>

72
src/old/Venta/Cuota.php Normal file
View File

@ -0,0 +1,72 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int pie
* @property date fecha
* @property int valor_$
* @property int estado
* @property string banco
* @property date fecha_pago
* @property int abonado
* @property date fecha_abono
* @property float uf
* @property Pago pago
* @property int numero
*
*/
class Cuota extends Model
{
public function pago()
{
return $this->belongs_to(Pago::class, 'pago')->findOne();
}
public function pie()
{
return $this->belongs_to(Pie::class, 'pie')->findOne();
}
public function uf()
{
if ($this->uf == 0) {
$uf = $this->pago()->uf();
if ($uf == 1) {
$uf = $this->pie()->uf();
}
$this->uf = $uf;
}
return $this->uf;
}
public function valor($tipo = 'pesos')
{
$valor = $this->pago()->valor;
if ($tipo == 'pesos') {
return $valor;
}
$uf = $this->uf();
if ($uf == 0) {
return 0;
}
return $valor / $uf;
}
public function numero()
{
if ($this->numero == '') {
$cuotas = $this->pie()->cuotas('fecha');
$n = 0;
foreach ($cuotas as $cuota) {
$n ++;
if ($cuota->id == $this->id) {
$this->numero = $n;
$this->save();
break;
}
}
}
return $this->numero;
}
}
?>

21
src/old/Venta/Entrega.php Normal file
View File

@ -0,0 +1,21 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property date fecha
* @property int fondo_operacion
* @property int fondo_reserva
* @property date fecha_fondo_operacion
* @property date fecha_fondo_reserva
* @property int pago_operacion
* @property int pago_reserva
*
*/
class Entrega extends Model
{
}
?>

View File

@ -0,0 +1,24 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int valor
* @property date fecha
* @property float uf
* @property int abonado
* @property date fecha_abono
* @property Pago pago
*
*/
class Escritura extends Model
{
public function pago()
{
return $this->belongs_to(Pago::class, 'pago')->findOne();
}
}
?>

View File

@ -0,0 +1,30 @@
<?php
namespace Incoviba\old\Venta;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Cierre $cierre
* @property TipoEstadoCierre $tipo
* @property \DateTime $fecha
*/
class EstadoCierre extends Model
{
public function cierre()
{
return $this->belongsTo(Cierre::class, 'cierre')->findOne();
}
public function tipo()
{
return $this->belongsTo(TipoEstadoCierre::class, 'tipo')->findOne();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Carbon\Carbon;
/**
*
* @property int id
* @property int pago
* @property date fecha
* @property int estado
*
*/
class EstadoPago extends Model
{
public function tipo()
{
return $this->belongs_to(TipoEstadoPago::class, 'estado')->findOne();
}
public function fecha()
{
return Carbon::parse($this->fecha, config('app.timezone'));
}
}
?>

View File

@ -0,0 +1,33 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Carbon\Carbon;
/**
* @property int $id
* @property Precio $precio
* @property \DateTime $fecha
* @property TipoEstadoPrecio $estado
*/
class EstadoPrecio extends Model
{
public function precio()
{
return $this->belongsTo(Precio::class, 'precio')->findOne();
}
public function fecha($fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
if (is_a($fecha, \DateTime::class)) {
$fecha = $fecha->format('Y-m-d');
}
$this->fecha = $fecha;
}
public function estado()
{
return $this->belongsTo(TipoEstadoPrecio::class, 'estado')->findOne();
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int problema
* @property date fecha
* @property int estado
*
*/
class EstadoProblema extends Model
{
}
?>

View File

@ -0,0 +1,30 @@
<?php
namespace Incoviba\old\Venta;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property UnidadBloqueada $unidad
* @property \DateTime $fecha
* @property TipoEstadoUnidadBloqueada $tipo
*/
class EstadoUnidadBloqueada extends Model
{
public function unidad()
{
return $this->belongsTo(UnidadBloqueada::class, 'unidad')->findOne();
}
public function fecha(\DateTime $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha, config('app.timezone'));
}
$this->fecha = $fecha->format('Y-m-d');
}
public function tipo()
{
return $this->belongsTo(TipoEstadoUnidadBloqueada::class, 'tipo')->findOne();
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Incoviba\old\Venta;
use Carbon\Carbon;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Venta $venta
* @property TipoEstadoVenta $estado
* @property Carbon $fecha
*/
class EstadoVenta extends Model
{
public function venta()
{
return $this->belongsTo(Venta::class, 'venta')->findOne();
}
public function tipo()
{
return $this->belongsTo(TipoEstadoVenta::class, 'estado')->findOne();
}
public function fecha()
{
return Carbon::parse($this->fecha, config('app.timezone'));
}
}

156
src/old/Venta/Pago.php Normal file
View File

@ -0,0 +1,156 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Banco;
use Carbon\Carbon;
/**
*
* @author Aldarien
*
* @property int id
* @property double valor
* @property Banco banco
* @property TipoPago tipo
* @property string identificador
* @property date fecha
* @property float uf
* @property string pagador
*
*/
class Pago extends Model
{
public function banco()
{
$banco = $this->belongs_to(Banco::class, 'banco');
if ($banco) {
return $banco->findOne();
}
return null;
}
public function tipo()
{
return $this->belongs_to(TipoPago::class, 'tipo')->findOne();
}
public function estados($order = 'fecha', $direction = 'desc')
{
$estados = $this->has_many(EstadoPago::class, 'pago');
if ($direction == 'desc') {
$estados->orderByDesc($order);
if ($order != 'id') {
$estados->orderByDesc('id');
}
} else {
$estados->orderByAsc($order);
if ($order != 'id') {
$estados->orderByAsc('id');
}
}
return $estados->findMany();
}
public function estado()
{
$estado = $this->has_many(EstadoPago::class, 'pago')->order_by_desc('id')->findOne();
return $estado;
}
public function fecha()
{
return Carbon::parse($this->fecha, config('app.timezone'));
}
public function uf()
{
if ($this->uf == 0) {
$uf = uf($this->fecha);
if (!$uf or $uf->total == 0) {
return 1;
}
if ($uf->total > 0) {
$this->uf = $uf->uf->value;
$this->save();
}
}
return $this->uf;
}
public function valor($tipo = 'pesos')
{
$valor = $this->valor;
if ($tipo == 'ufs') {
$uf = $this->uf();
if ($uf == 1) {
$uf = $this->fuente()[0]->obj->uf();
}
$valor /= $uf;
if ($this->asociado() and $this->asociado == 0) {
$valor += $this->asociado()->valor('ufs');
}
return $valor;
}
if ($this->asociado() and $this->asociado == 0) {
$valor += $this->asociado()->valor();
}
return $valor;
}
public function new()
{
$this->save();
$estado = \Model::factory(EstadoPago::class)->create();
$estado->pago = $this->id;
$estado->fecha = $this->fecha;
$estado->estado = 0;
$estado->save();
}
public function newPagado()
{
$this->new();
$estado = \Model::factory(EstadoPago::class)->create();
$estado->pago = $this->id;
$estado->fecha = $this->fecha;
$estado->estado = 1;
$estado->save();
}
public function fuente()
{
$results = [];
$cuota = model(Cuota::class)->where('pago', $this->id)->findOne();
if ($cuota) {
$results []= (object) ['tipo' => 'cuota', 'obj' => $cuota];
}
$credito = model(Credito::class)->where('pago', $this->id)->findOne();
if ($credito) {
$results []= (object) ['tipo' => 'credito', 'obj' => $credito];
}
$escritura = model(Escritura::class)->where('pago', $this->id)->findOne();
if ($escritura) {
$results []= (object) ['tipo' => 'escritura', 'obj' => $escritura];
}
$subsidio = model(Subsidio::class)->where('pago', $this->id)->findOne();
if ($subsidio) {
$results []= (object) ['tipo' => 'subsidio', 'obj' => $subsidio];
}
$bono = model(BonoPie::class)->where('pago', $this->id)->findOne();
if ($bono) {
$results []= (object) ['tipo' => 'bono_pie', 'obj' => $bono];
}
return $results;
}
public function asociado()
{
if ($this->asociado == 0) {
return $this->hasOne(Pago::class, 'asociado')->findOne();
}
return $this->belongsTo(Pago::class, 'asociado')->findOne();
}
public static function filterEstado(\ORM $orm)
{
return $orm->rawJoin(
'JOIN (SELECT ep.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago ep ON ep.id = e0.id)',
['estado_pago.pago', '=', 'pago.id'],
'estado_pago'
);
}
}
?>

225
src/old/Venta/Pie.php Normal file
View File

@ -0,0 +1,225 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Carbon\Carbon;
/**
*
* @property int id
* @property date fecha
* @property float valor
* @property float uf
* @property int cuotas
* @property int asociado
* @property int reajuste
*
*/
class Pie extends Model
{
public function cuotas($order = 'numero')
{
if ($this->asociado != 0) {
return $this->asociado()->cuotas();
}
$cuotas = $this->hasMany(Cuota::class, 'pie')
->select('cuota.*')
->join('pago', ['pago.id', '=', 'cuota.pago'])
->rawJoin('JOIN (SELECT e1.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago e1 ON e1.id = e0.id)', ['ep.pago', '=', 'pago.id'], 'ep')
->join('tipo_estado_pago', ['tipo_estado_pago.id', '=', 'ep.estado'])
->whereNotEqual('tipo_estado_pago.descripcion', 'reemplazado')
->whereNotEqual('tipo_estado_pago.descripcion', 'anulado');
switch ($order) {
case 'numero':
case 'number':
default:
$cuotas = $cuotas->orderByAsc('cuota.numero');
case 'fecha':
case 'date':
$cuotas = $cuotas->orderByAsc('pago.fecha')
->orderByDesc('pago.valor');
break;
}
$cuotas = $cuotas->findMany();
return $cuotas;
}
public function pagadas()
{
$estado = model(TipoEstadoPago::class)->where('descripcion', 'depositado')->findOne();
$cuotas = $this->cuotas();
foreach ($cuotas as $i => &$cuota) {
if ($cuota->pago()->estado()->estado < $estado->id) {
unset($cuotas[$i]);
}
}
array_values($cuotas);
return $cuotas;
}
public function abonadas()
{
$estado = model(TipoEstadoPago::class)->where('descripcion', 'abonado')->findOne();
$cuotas = $this->pagadas();
foreach ($cuotas as $i => &$cuota) {
if ($cuota->pago()->estado()->estado != $estado->id) {
unset($cuotas[$i]);
}
}
array_values($cuotas);
return $cuotas;
}
public function rebotadas()
{
$estado = model(TipoEstadoPago::class)->where('descripcion', 'devuelto')->findOne();
$cuotas = $this->cuotas();
foreach ($cuotas as $i => &$cuota) {
if ($cuota->pago()->estado()->estado != $estado->id) {
unset($cuotas[$i]);
}
}
array_values($cuotas);
return $cuotas;
}
public function valorPesos()
{
return $this->valor * $this->uf();
}
public function valorPagado($tipo = 'uf')
{
$cuotas = $this->pagadas();
$sum = 0;
foreach ($cuotas as $cuota) {
$pago = $cuota->pago();
if ($tipo == 'uf' or $tipo == 'ufs') {
if ($pago->uf() == 0) {
$sum += $pago->valor / $this->uf();
continue;
}
$sum += $pago->valor / $pago->uf();
} else {
$sum += $pago->valor;
}
}
return $sum * $this->proporcion();
}
public function valorAbonado($tipo = 'uf')
{
$cuotas = $this->abonadas();
$sum = 0;
foreach ($cuotas as $cuota) {
$pago = $cuota->pago();
if ($tipo == 'uf' or $tipo == 'ufs') {
if ($pago->uf() == 0) {
$sum += $pago->valor / $this->uf();
continue;
}
$sum += $pago->valor / $pago->uf;
} else {
$sum += $pago->valor;
}
}
return $sum * $this->proporcion();
}
public function reajuste()
{
$reajuste = $this->belongsTo(Pago::class, 'reajuste');
if ($reajuste) {
$reajuste = $reajuste->findOne();
return $reajuste;
}
return null;
}
public function venta()
{
return $this->has_one(Venta::class, 'pie')->findOne();
}
public function asociado()
{
$pie = $this->belongs_to(Pie::class, 'asociado')->findOne();
if ($pie) {
return $pie;
}
return null;
}
private $asociados = null;
public function asociados()
{
if ($this->asociados == null) {
$pie = $this->has_many(Pie::class, 'asociado');
if (!$pie) {
return null;
}
$asociados = $pie->findMany();
usort($asociados, function($a, $b) {
return strcmp($a->venta()->unidad()->descripcion, $b->venta()->unidad()->descripcion);
});
$this->asociados = $asociados;
}
return $this->asociados;
}
public function proporcion()
{
$pie = $this;
if ($this->asociado != 0) {
$pie = $this->asociado();
}
if ($pie->asociados() != null) {
$pies = $pie->asociados();
$base = $pie->valor;
foreach ($pies as $p) {
$base += $p->valor;
}
return $this->valor / $base;
}
return 1;
}
public function pendientes()
{
return count($this->cuotas()) - count($this->pagadas());
}
public function pagos($estado = 0)
{
$pagos = model(Pago::class)
->select('pago.*')
->join('cuota', ['cuota.pago', '=', 'pago.id'])
->filter('filterEstado')
->where('estado_pago.estado', $estado)
->where('cuota.pie', $this->id)
->findMany();
if ($this->reajuste != 0 and $this->reajuste()->estado()->estado == $estado) {
$pagos []= $this->reajuste();
}
return $pagos;
}
public function uf()
{
if ($this->uf == 0) {
$uf = uf($this->fecha);
if (!$uf) {
return 1;
}
if ($uf->total > 0) {
$this->uf = $uf->uf->value;
$this->save();
}
}
return $this->uf;
}
public function valor($tipo = 'pesos')
{
switch ($tipo) {
case 'uf':
case 'ufs':
return $this->valor;
break;
case 'peso':
case 'pesos':
default:
return $this->valorPesos();
break;
}
}
}
?>

81
src/old/Venta/Precio.php Normal file
View File

@ -0,0 +1,81 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Unidad $unidad
* @property double $valor
*/
class Precio extends Model
{
public function unidad()
{
return $this->belongsTo(Unidad::class, 'unidad')->findOne();
}
public function estados()
{
return $this->hasMany(EstadoPrecio::class, 'precio')->findMany();
}
public function estado()
{
return \model(EstadoPrecio::class)
->select('estado_precio.*')
->rawJoin('JOIN (SELECT precio, MAX(id) AS id FROM estado_precio GROUP BY precio)', ['e0.id', '=', 'estado_precio.id'], 'e0')
->where('estado_precio.precio', $this->id)
->findOne();
}
public function inicio()
{
return \model(EstadoPrecio::class)
->where('estado_precio.precio', $this->id)
->orderByAsc('id')
->findOne();
}
public function vigente()
{
if ($this->estado()->estado()->descripcion == 'vigente') {
return true;
}
return false;
}
public function reemplazar($fecha)
{
if ($this->estado()->estado()->descripcion == 'reemplazado') {
return;
}
$tipo = model(TipoEstadoPrecio::class)->where('descripcion', 'reemplazado')->findOne();
$data = [
'precio' => $this->id,
'fecha' => $fecha->format('Y-m-d'),
'estado' => $tipo->id
];
$estado = model(EstadoPrecio::class)->create($data);
$estado->save();
}
public function actualizar($fecha)
{
$tipo = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne();
$data = [
'precio' => $this->id,
'fecha' => $fecha->format('Y-m-d'),
'estado' => $tipo->id
];
$estado = model(EstadoPrecio::class)->create($data);
$estado->save();
}
public function new($fecha)
{
$this->save();
$tipo = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne();
$data = [
'precio' => $this->id,
'fecha' => $fecha->format('Y-m-d'),
'estado' => $tipo->id
];
$estado = model(EstadoPrecio::class)->create($data);
$estado->save();
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property int venta
* @property string descripcion
*
*/
class Problema extends Model
{
}
?>

View File

@ -0,0 +1,23 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Proyecto\Proyecto;
/**
*
* @property int id
* @property Proyecto proyecto
* @property string descripcion
* @property string titulo
* @property date fecha_inicio
*
*/
class Promocion extends Model
{
public function proyecto()
{
return $this->belongsTo(Proyecto::class, 'proyecto')->findOne();
}
}
?>

View File

@ -0,0 +1,24 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property Promocion promocion
* @property Venta venta
* @property double valor
*
*/
class PromocionVenta extends Model
{
public function promocion()
{
return $this->belongsTo(Promocion::class, 'promocion')->findOne();
}
public function venta()
{
return $this->belongsTo(Venta::class, 'venta')->findOne();
}
}
?>

117
src/old/Venta/Propiedad.php Normal file
View File

@ -0,0 +1,117 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\nuevo\Venta\Propiedad as P;
use Incoviba\nuevo\Venta\UnidadPropiedad;
/**
*
* @property int id
* @property Unidad unidad_principal
* @property string estacionamientos
* @property string bodegas
* @property int estado
*
*/
class Propiedad extends Model
{
private $estacionamientos_arr = null;
private $bodegas_arr = null;
public function unidad()
{
return $this->belongs_to(Unidad::class, 'unidad_principal')->findOne();
}
protected $unidades;
public function unidades() {
if ($this->unidades == null) {
$this->unidades = $this->hasMany(PropiedadUnidad::class, 'propiedad')->findMany();
}
return $this->unidades;
}
protected $departamentos;
public function departamentos() {
if ($this->departamentos == null) {
$this->departamentos = array_map(function($item) {
return $item->unidad();
}, array_filter($this->unidades(), function($item) {
return ($item->unidad()->tipo()->descripcion == 'departamento');
}));
}
return $this->departamentos;
}
public function estacionamientos($mod = null)
{
if ($this->estacionamientos_arr == null) {
if (($unidades = $this->unidades()) !== false) {
$estacionamientos = array_filter($unidades, function($item) {
return ($item->unidad()->tipo()->descripcion == 'estacionamiento');
});
$this->estacionamientos_arr = array_map(function($item) {
return $item->unidad();
}, $estacionamientos);
} else {
$ests = explode(';', $this->estacionamientos);
$estacionamientos = [];
foreach ($ests as $e) {
$estacionamiento = \Model::factory(Unidad::class)->findOne($e);
if ($estacionamiento) {
$estacionamientos []= $estacionamiento;
}
}
$this->estacionamientos_arr = $estacionamientos;
}
}
if ($mod != null) {
switch ($mod) {
case 'array':
$result = [];
foreach ($this->estacionamientos_arr as $est) {
$result []= $est->descripcion;
}
return $result;
}
}
return $this->estacionamientos_arr;
}
public function bodegas($mod = null)
{
if ($this->bodegas_arr == null) {
if (($unidades = $this->unidades()) !== false) {
$bodegas = array_filter($unidades, function($item) {
return ($item->unidad()->tipo()->descripcion == 'bodega');
});
$this->bodegas_arr = array_map(function($item) {
return $item->unidad();
}, $bodegas);
} else {
$bods = explode(';', $this->bodegas);
$bodegas = [];
foreach ($bods as $b) {
$bodega = \Model::factory(Unidad::class)->findOne($b);
if ($bodega) {
$bodegas []= $bodega;
}
}
$this->bodegas_arr = $bodegas;
}
}
if ($mod != null) {
switch ($mod) {
case 'array':
$result = [];
foreach ($this->bodegas_arr as $bod) {
$result []= $bod->descripcion;
}
return $result;
}
}
return $this->bodegas_arr;
}
public function venta()
{
return $this->has_one(Venta::class, 'propiedad')->findOne();
}
}
?>

View File

@ -0,0 +1,25 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
class PropiedadUnidad extends Model {
protected $propiedad_model;
public function propiedad() {
if ($this->propiedad_model == null) {
$this->propiedad_model = $this->belongsTo(Propiedad::class, 'propiedad')->findOne();
}
return $this->propiedad_model;
}
protected $unidad_model;
public function unidad() {
if ($this->unidad_model == null) {
$this->unidad_model = $this->belongsTo(Unidad::class, 'unidad')->findOne();
}
return $this->unidad_model;
}
protected $is_principal;
public function isPrincipal() {
return ($this->principal == 0) ? false : true;
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Direccion;
use Incoviba\nuevo\Venta\Propietario as P;
/**
*
* @property int $rut
* @property char $dv
* @property string $nombres
* @property string $apellido_paterno
* @property string $apellido_materno
* @property string $sexo
* @property string $estado_civil
* @property string $profesion
* @property Direccion $direccion
* @property int $telefono
* @property string $email
* @property int $representante
* @property int $otro
*
*/
class Propietario extends Model
{
public static $_id_column = 'rut';
public function direccion()
{
return $this->belongs_to(Direccion::class, 'direccion')->findOne();
}
public function nombreCompleto($ap = false)
{
$str = '';
if ($ap) {
$str = $this->apellido_paterno . ' ' . $this->apellido_materno . ', ' . $this->nombres;
} else {
$str = $this->nombres . ' ' . $this->apellido_paterno . ' ' . $this->apellido_materno;
}
return $str;
}
public function representante()
{
$r = $this->belongsTo(Propietario::class, 'representante', 'rut');
if ($r) {
return $r->findOne();
}
return null;
}
public function ventas() {
return $this->hasMany(Venta::class, 'propietario', 'rut')
->select('venta.*')
->join('propiedad', ['propiedad.id', '=', 'venta.propiedad'])
->join('unidad', ['unidad.id', '=', 'propiedad.unidad_principal'])
->join('proyecto', ['proyecto.id', '=', 'unidad.proyecto'])
->orderByAsc('proyecto.descripcion')
->orderByExpr("LPAD(unidad.descripcion, 4, '0')")
->findMany();
}
public function rut()
{
return format('rut', $this->rut) . '-' . $this->dv;
}
}
?>

View File

@ -0,0 +1,44 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @property int id
* @property Pago pago
* @property null|Pago subsidio
*
*/
class Subsidio extends Model
{
public function pago()
{
return $this->belongs_to(Pago::class, 'pago')->findOne();
}
public function subsidio()
{
$pago = $this->belongs_to(Pago::class, 'subsidio');
if ($pago) {
return $pago->findOne();
}
return null;
}
public function total($tipo = 'pesos')
{
$sum = 0;
if ($tipo == 'pesos') {
$sum = $this->pago()->valor;
if ($this->subsidio != 0) {
$sum += $this->subsidio()->valor;
}
} else {
$sum = $this->pago()->valor('ufs');
if ($this->subsidio != 0) {
$sum += $this->subsidio()->valor('ufs');
}
}
return $sum;
}
}
?>

View File

@ -0,0 +1,13 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
* @property int $vigente
*/
class TipoEstadoCierre extends Model
{
}

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoEstadoPago extends Model
{
}
?>

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoEstadoPrecio extends Model
{
}

View File

@ -0,0 +1,19 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
* @property int $activo
*/
class TipoEstadoUnidadBloqueada extends Model
{
public function activo() {
if ($this->activo == 1) {
return true;
}
return false;
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
* @property int $activa
*/
class TipoEstadoVenta extends Model
{
public function estados()
{
return $this->hasMany(EstadoVenta::class, 'estado')->findMany();
}
public function activa()
{
return ($this->activa == 1) ? true : false;
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoPago extends Model
{
}
?>

View File

@ -0,0 +1,17 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
*
* @author Aldarien
*
* @property int id
* @property string descripcion
*
*/
class TipoUnidad extends Model
{
}
?>

View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoValorCierre extends Model
{
}

242
src/old/Venta/Unidad.php Normal file
View File

@ -0,0 +1,242 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Proyecto\ProyectoTipoUnidad;
/**
*
* @property int id
* @property Proyecto proyecto
* @property TipoUnidad tipo
* @property string subtipo
* @property int piso
* @property string descripcion
* @property string abreviacion
* @property float m2
* @property float terraza
* @property float cubierta
* @property float logia
* @property char orientacion
* @property float costo_inmobiliaria
* @property ProyectoTipoUnidad pt
* @property float valor
*
*/
class Unidad extends Model
{
public function proyecto()
{
return $this->belongs_to(Proyecto::class, 'proyecto')->findOne();
}
protected $propiedad;
public function propiedad()
{
if ($this->propiedad == null) {
$this->propiedad = $this->hasMany(PropiedadUnidad::class, 'unidad')->findOne();
}
return $this->propiedad;
if ($this->tipo()->descripcion == 'departamento') {
$propiedad = $this->has_one(Propiedad::class, 'unidad_principal');
if ($propiedad) {
return $propiedad->findOne();
}
return null;
}
if ($this->tipo()->descripcion == 'estacionamiento') {
// id | id; | ;id | ;id;
$propiedad = model(Propiedad::class)->whereLike('estacionamientos', $this->id)->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('estacionamientos', '%;' . $this->id)->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('estacionamientos', $this->id . ';%')->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('estacionamientos', '%;' . $this->id . ';%')->findOne();
if ($propiedad) {
return $propiedad;
}
return null;
}
if ($this->tipo()->descripcion == 'bodega') {
// id | id; | ;id | ;id;
$propiedad = model(Propiedad::class)->whereLike('bodegas', $this->id)->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('bodegas', '%;' . $this->id)->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('bodegas', $this->id . ';%')->findOne();
if ($propiedad) {
return $propiedad;
}
$propiedad = model(Propiedad::class)->whereLike('bodegas', '%;' . $this->id . ';%')->findOne();
if ($propiedad) {
return $propiedad;
}
return null;
}
}
public function tipo()
{
return $this->belongs_to(TipoUnidad::class, 'tipo')->findOne();
}
private $venta = null;
public function venta()
{
if ($this->venta == null) {
$propiedad = $this->propiedad();
if ($propiedad) {
$venta = $propiedad->propiedad()->venta();
if ($venta) {
$this->venta = $venta;
}
}
}
return $this->venta;
}
private $m2t = null;
public function m2($tipo = 'vendible')
{
if ($this->m2t == null or !isset($this->m2t->{$tipo})) {
if ($this->m2t == null) {
$this->m2t = [];
} else {
$this->m2t = (Array) $this->m2t;
}
$this->m2t[$tipo] = $this->tipologia()->m2($tipo);
$this->m2t = (object) $this->m2t;
}
return $this->m2t->{$tipo};
}
public function precios()
{
return $this->hasMany(Precio::class, 'unidad')->findMany();
}
public function precio($fecha = null)
{
if ($fecha == null) {
return \model(Precio::class)
->select('precio.*')
->rawJoin('JOIN (SELECT e1.* FROM (SELECT precio, MAX(id) AS id FROM estado_precio GROUP BY precio) e0 JOIN estado_precio e1 ON e1.id = e0.id)', ['ep.precio', '=', 'precio.id'], 'ep')
->where('unidad', $this->id)
->where('ep.estado', 1)
->findOne();
}
return \model(Precio::class)
->select('precio.*')
->join('estado_precio', ['ep.precio', '=', 'precio.id'], 'ep')
->where('precio.unidad', $this->id)
->where('ep.estado', 1)
->whereLte('ep.fecha', $fecha->format('Y-m-d'))
->orderByDesc('ep.fecha')
->orderByDesc('ep.id')
->findOne();
}
public function setPrecio($fecha, $valor)
{
$exists = false;
// Dejar valores antiguos reemplazados (estado = 'reemplazado')
foreach ($this->precios() as $precio) {
if (!$precio->vigente()) {
continue;
}
// Ya existe precio a este valor
if ($precio->valor == $valor) {
// La fecha es anterior
if ($precio->estado()->fecha != $fecha->format('Y-m-d')) {
$precio->actualizar($fecha);
}
$exists = true;
continue;
}
$precio->reemplazar($fecha);
}
if ($exists) {
return;
}
// Agregar precio
$data = [
'unidad' => $this->id,
'valor' => $valor
];
$precio = model(Precio::class)->create($data);
$precio->new($fecha);
}
public function tipologia()
{
return $this->belongsTo(ProyectoTipoUnidad::class, 'pt')->findOne();
}
protected $is_vendida;
public function isVendida() {
if ($this->is_vendidad == null) {
$this->is_vendida = false;
$p = $this->propiedad();
if ($p) {
$v = $p->venta();
if ($v) {
$this->is_vendida = true;
}
}
}
return $this->is_vendida;
}
protected $cierres;
public function cierres() {
if ($this->cierres == null) {
$ucs = $this->hasMany(UnidadCierre::class, 'unidad')->findMany();
if (!$ucs) {
$this->cierres = false;
return $this->cierres;
}
$cierres = [];
foreach ($ucs as $uc) {
$c = $uc->cierre();
if ($c) {
$cierres []= $c;
}
}
usort($cierres, function($a, $b) {
return $a->fecha()->diffInDays($b->fecha());
});
$this->cierres = $cierres;
}
return $this->cierres;
}
public function cierre() {
if ($this->cierres()) {
return $this->cierres[count($this->cierres) - 1];
}
return false;
}
protected $is_reservada;
public function isReservada() {
if ($this->is_reservada == null) {
$this->is_reservada = false;
if (!$this->isVendida() and $this->cierres() !== false) {
$this->is_reservada = true;
}
}
return $this->is_reservada;
}
protected $linea;
public function linea() {
if ($this->linea == null) {
if ($this->tipo == 1) {
$this->linea = (int) \substr($this->descripcion, -2);
}
}
return $this->linea;
}
}
?>

View File

@ -0,0 +1,42 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Proyecto\ProyectoAgente;
/**
* @property int $id
* @property Agente $agente
* @property Unidad $unidad
*/
class UnidadBloqueada extends Model
{
public function agente()
{
return $this->belongsTo(ProyectoAgente::class, 'agente')->findOne();
}
public function unidad()
{
return $this->belongsTo(Unidad::class, 'unidad')->findOne();
}
public function estados()
{
return $this->hasMany(EstadoUnidadBloqueada::class, 'unidad')->orderByAsc('fecha')->findMany();
}
public function estado()
{
return $this->hasMany(EstadoUnidadBloqueada::class, 'unidad')->orderByDesc('fecha')->findOne();
}
public function new(\DateTime $fecha)
{
parent::save();
$tipo = model(TipoEstadoUnidadBloqueada::class)->where('descripcion', 'bloqueada')->findOne();
$data = [
'unidad' => $this->id,
'fecha' => $fecha->format('Y-m-d'),
'tipo' => $tipo->id
];
$estado = model(EstadoUnidadBloqueada::class)->create($data);
$estado->save();
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Cierre $cierre
* @property Unidad $unidad
* @property int $principal
*/
class UnidadCierre extends Model
{
public function cierre()
{
return $this->belongsTo(Cierre::class, 'cierre')->findOne();
}
public function unidad()
{
return $this->belongsTo(Unidad::class, 'unidad')->findOne();
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
/**
* @property int $id
* @property Cierre $cierre
* @property TipoValorCierre $tipo
* @property float $valor
*/
class ValorCierre extends Model
{
public function cierre()
{
return $this->belongsTo(Cierre::class, 'cierre')->findOne();
}
public function tipo()
{
return $this->belongsTo(TipoValorCierre::class, 'tipo')->findOne();
}
}

515
src/old/Venta/Venta.php Normal file
View File

@ -0,0 +1,515 @@
<?php
namespace Incoviba\old\Venta;
use Incoviba\Common\Alias\OldModel as Model;
use Carbon\Carbon;
//use Incoviba\old\Proyecto\Agente;
use Incoviba\old\Proyecto\ProyectoAgente;
/**
*
* @property int id
* @property Propietario propietario
* @property Propiedad propiedad
* @property Pie pie
* @property BonoPie bono_pie
* @property Credito credito
* @property Escritura escritura
* @property Subsidio subsidio
* @property date escriturado
* @property Entrega entrega
* @property date entregado
* @property date fecha
* @property float valor_uf
* @property int estado
* @property date fecha_ingreso
* @property int avalchile
* @property ProyectoAgente agente
* @property float uf
* @property boolean relacionado
* @property Promocion promocion
* @property Pago resciliacion
*
*/
class Venta extends Model
{
protected $saldo;
protected $uf;
protected $anticipo;
protected $pagado;
protected $comision;
protected $valor_neto;
protected $promociones;
protected $valor_corredora;
public function propietario()
{
return $this->belongs_to(Propietario::class, 'propietario', 'rut')->findOne();
}
public function propiedad()
{
return $this->belongs_to(Propiedad::class, 'propiedad')->findOne();
}
public function bonoPie()
{
$bono = $this->belongs_to(BonoPie::class, 'bono_pie');
if ($bono) {
return $bono->findOne();
}
return null;
}
public function pie()
{
$pie = $this->belongs_to(Pie::class, 'pie');
if ($pie) {
return $pie->findOne();
}
return null;
}
public function entrega()
{
if ($this->entrega != '0') {
return $this->belongs_to(Entrega::class, 'entrega')->findOne();
}
return null;
}
public function fecha()
{
return Carbon::parse($this->fecha, new \DateTimeZone(config('app.timezone')));
}
public function proyecto()
{
return $this->propiedad()->unidad()->proyecto();
}
public function unidad()
{
return $this->propiedad()->unidad();
}
public function agente()
{
$agente = $this->belongs_to(ProyectoAgente::class, 'agente');
if ($agente) {
return $agente->findOne();
}
return null;
}
public function comision()
{
if (!isset($this->comision)) {
$pa = $this->agente();
if ($pa and $pa->agente()->tipo == 19) {
$this->comision = $pa->comision / 100;
} else {
$this->comision = 0;
}
}
return $this->comision;
}
public function valorComision()
{
$bono_pie = $this->bonoPie();
if ($this->bono_pie != 0) {
$bono_pie = $bono_pie->pago()->valor('ufs');
} else {
$bono_pie = 0;
}
return ($this->valor_uf - $bono_pie) * $this->comision();
}
protected $superficie_departamentos;
public function superficie() {
if ($this->superficie_departamentos == null) {
$this->superficie_departamentos = array_reduce($this->propiedad()->departamentos(), function($sum, $item) {
return $sum + $item->m2();
});
}
return $this->superficie_departamentos;
}
protected $valor_departamentos;
public function valorDepartamentos() {
if ($this->valor_departamentos == null) {
$fecha = $this->fecha();
$this->valor_departamentos = array_reduce($this->propiedad()->departamentos(), function($sum, $item) use ($fecha) {
return $sum + $item->precio($fecha)->valor;
});
}
return $this->valor_departamentos;
}
protected $valor_unidades;
public function valorUnidades() {
if ($this->valor_unidades == null) {
$fecha = $this->fecha();
$this->valor_unidades = array_reduce($this->propiedad()->unidades(), function($sum, $item) use ($fecha) {
return $sum + $item->unidad()->precio($fecha)->valor;
});
}
return $this->valor_unidades;
}
public function valorEstacionamientos()
{
$estacionamientos = $this->propiedad()->estacionamientos();
$sum = 0;
foreach ($estacionamientos as $estacionamiento) {
$sum += $estacionamiento->precio($this->fecha())->valor;
}
return $sum;
}
public function valorBodegas()
{
$bodegas = $this->propiedad()->bodegas();
$sum = 0;
foreach ($bodegas as $bodega) {
$sum += $bodega->precio($this->fecha())->valor;
}
return $sum;
}
public function valorEstacionamientosYBodegas()
{
return $this->valorEstacionamientos() + $this->valorBodegas();
}
public function valorCorredora()
{
if ($this->valor_corredora == null) {
$bono_pie = $this->bonoPie();
if ($this->bono_pie != 0) {
$bono_pie = $bono_pie->pago()->valor('ufs');
} else {
$bono_pie = 0;
}
$promos = 0;
$ps = $this->promociones();
if (count($ps) > 0) {
foreach ($ps as $promo) {
$promos += $promo->valor;
}
}
$this->valor_corredora = $this->valor_uf - $bono_pie - $promos;
}
return $this->valor_corredora;
}
public function valorFinal()
{
if (!isset($this->valor_neto)) {
$comision = $this->valorComision();
$bono_pie = $this->bonoPie();
if ($this->bono_pie != 0) {
$bono_pie = $bono_pie->pago()->valor('ufs');
} else {
$bono_pie = 0;
}
$ests = $this->valorEstacionamientos();
$bods = $this->valorBodegas();
$promos = 0;
$ps = $this->promociones();
if (count($ps) > 0) {
foreach ($ps as $promo) {
$promos += $promo->valor;
}
}
$this->valor_neto = $this->valor_uf - $bono_pie - $comision - $ests - $bods - $promos;
}
return $this->valor_neto;
}
public function uf_m2()
{
$m2 = array_reduce($this->propiedad()->departamentos(), function($sum, $item) {
return $sum + $item->m2();
});
return $this->valorFinal() / $m2;
}
public function escritura()
{
$escritura = $this->belongs_to(Escritura::class, 'escritura');
if ($escritura) {
return $escritura->findOne();
}
return null;
}
public function credito()
{
$credito = $this->belongs_to(Credito::class, 'credito');
if ($credito) {
return $credito->findOne();
}
return null;
}
public function comentarios()
{
return $this->has_many(Comentario::class, 'venta')->findMany();
}
public function subsidio()
{
$subsidio = $this->belongs_to(Subsidio::class, 'subsidio');
if ($subsidio) {
return $subsidio->findOne();
}
return null;
}
public function resciliacion()
{
$res = $this->belongs_to(Pago::class, 'resciliacion');
if ($res) {
return $res->findOne();
}
return null;
}
public function postventas()
{
$postventas = $this->has_many(\Incoviba\nuevo\Venta\Postventa::class, 'venta_id');
if ($postventas) {
return $postventas->findMany();
}
return null;
}
public function promociones()
{
if ($this->promociones == null) {
$pvs = model(PromocionVenta::class)->where('venta', $this->id)->findMany();
$this->promociones = $pvs;
}
return $this->promociones;
}
public function devolucion()
{
$devolucion = $this->belongsTo(Pago::class, 'devolucion');
if ($devolucion) {
return $devolucion->findOne();
}
return null;
}
public function anticipo($tipo = 'ufs')
{
if (!isset($this->anticipo[$tipo])) {
$anticipo = 0;
if ($this->pie != 0) {
if ($tipo == 'ufs') {
$anticipo += $this->pieReajustado($tipo);
} else {
$anticipo += $this->pie()->valorPagado($tipo);
}
if ($this->pie()->reajuste != 0) {
$anticipo += $this->pie()->reajuste()->valor($tipo);
}
}
if ($this->escritura != 0) {
$anticipo += $this->escritura()->pago()->valor($tipo);
}
if ($this->saldo('ufs') > 0) {
$anticipo -= $this->saldo($tipo);
}
$this->anticipo[$tipo] = $anticipo;
}
return $this->anticipo[$tipo];
}
public function saldo($tipo = 'ufs')
{
if (!isset($this->saldo[$tipo])) {
if ($tipo == 'pesos') {
$this->saldo[$tipo] = $this->saldo() * $this->uf();
return $this->saldo[$tipo];
}
$saldo = $this->valor($tipo);
if ($this->bono_pie != 0) {
$saldo -= $this->bonoPie()->pago()->valor($tipo);
}
if ($this->pie != 0) {
$saldo -= $this->pie()->valorPagado($tipo);
if ($this->pie()->reajuste != 0) {
$saldo -= $this->pie()->reajuste()->valor($tipo);
}
}
if ($this->escritura != 0) {
$saldo -= $this->escritura()->pago()->valor($tipo);
}
if ($this->subsidio != 0) {
$saldo -= $this->subsidio()->total($tipo);
}
if ($this->credito != 0) {
$saldo -= $this->credito()->pago()->valor($tipo);
}
if ($this->devolucion) {
$saldo += $this->devolucion()->valor($tipo);
}
if ($this->resciliacion) {
$saldo += $this->resciliacion()->valor($tipo);
}
$this->saldo[$tipo] = -$saldo;
}
return $this->saldo[$tipo];
}
public function valor($tipo = 'ufs')
{
if ($tipo == 'ufs') {
return $this->valor_uf;
}
return $this->valor_uf * $this->uf();
}
protected $valores;
public function valorPagado($tipo = 'ufs')
{
if ($this->valores == null or !isset($this->valores->pagado->ufs)) {
$valores = [];
if (isset($this->valores)) {
$valores = (array) $valores;
}
$valores['pagado'] = (object) ['ufs' => 0, 'pesos' => 0];
if ($this->pie()) {
$valores['pagado']->ufs = $this->pie()->valorPagado();
$valores['pagado']->pesos = $this->pie()->valorPagado('pesos');
}
$this->valores = (object) $valores;
}
return $this->valores->pagado->{$tipo};
}
public function valorAbonado($tipo = 'ufs')
{
if ($this->valores == null or !isset($this->valores->abonado->{$tipo})) {
$valores = [];
if (isset($this->valores)) {
$valores = (array) $valores;
}
$valores['abonado'] = (object) ['ufs' => 0, 'pesos' => 0];
if ($this->pie()) {
$valores['abonado']->ufs = $this->pie()->valorAbonado();
$valores['abonado']->pesos = $this->pie()->valorAbonado('pesos');
}
$this->valores = (object) $valores;
}
return $this->valores->abonado->{$tipo};
}
public function pagado($tipo = 'ufs')
{
if (!isset($this->pagado[$tipo])) {
if (abs($this->saldo()) / $this->valor() > 0.01 or $tipo == 'pesos') {
$total = 0;
$total += $this->anticipo($tipo);
if ($this->subsidio != 0) {
$total += $this->subsidio()->total($tipo);
}
if ($this->credito != 0) {
$total += $this->credito()->pago()->valor($tipo);
}
if ($this->devolucion) {
$total -= $this->devolucion()->valor($tipo);
}
if ($this->resciliacion) {
$total -= $this->resciliacion()->valor($tipo);
}
$this->pagado[$tipo] = $total;
} else {
$this->pagado[$tipo] = $this->valor($tipo);
}
}
return $this->pagado[$tipo];
}
public function pieReajustado($tipo = 'ufs')
{
if (abs($this->saldo()) / $this->valor() > 0.01) {
return $this->pie()->valorPagado($tipo);
}
$valor = $this->pie()->valorPagado($tipo) - $this->saldo($tipo);
return $valor;
}
public function uf()
{
if ($this->uf == null) {
$f = $this->fecha();
$uf = uf($f);
if ($uf == null) {
return 1;
}
$this->uf = $uf->uf->value;
}
return $this->uf;
}
public function pagos($estado = 0)
{
$results = [];
if ($this->pie != 0) {
$results = array_merge($results, $this->pie()->pagos($estado));
}
if ($this->escritura != 0 and $this->escritura()->pago() and $this->escritura()->pago()->estado()->estado == $estado) {
$results []= $this->escritura()->pago();
}
if ($this->credito != 0 and $this->credito()->pago()->estado()->estado == $estado) {
$results []= $this->credito()->pago();
}
if ($this->subsidio != 0 and $this->subsidio()->pago()->estado()->estado == $estado) {
$results []= $this->subsidio()->pago();
}
usort($results, function($a, $b) {
return $a->estado()->fecha()->diffInDays($b->estado()->fecha(), false);
});
return $results;
}
public function new()
{
parent::save();
$tipo = model(TipoEstadoVenta::class)->where('descripcion', 'vigente')->findOne();
$data = [
'venta' => $this->id,
'estado' => $tipo->id,
'fecha' => $this->fecha
];
$estado = model(EstadoVenta::class)->create($data);
$estado->save();
}
public function estados()
{
return $this->hasMany(EstadoVenta::class, 'venta')->findMany();
}
public function estado($estado = null)
{
if ($estado == null) {
return model(EstadoVenta::class)
->select('estado_venta.*')
->rawJoin('JOIN (SELECT venta, MAX(id) AS id FROM estado_venta GROUP BY venta)', ['estado_venta.id', '=', 'e0.id'], 'e0')
->where('estado_venta.venta', $this->id)
->findOne();
}
return model(EstadoVenta::class)
->select('estado_venta.*')
->join('tipo_estado_venta', ['tipo_estado_venta.id', '=', 'estado_venta.estado'])
->where('estado_venta.venta', $this->id)
->where('tipo_estado_venta.descripcion', $estado)
->orderByDesc('estado_venta.fecha')
->findOne();
}
public function firmar(Carbon $fecha)
{
$estado = $this->estado();
if ($estado->tipo()->descripcion == 'firmado por inmobiliaria') {
return true;
}
$tipo = model(TipoEstadoVenta::class)->where('descripcion', 'firmado por inmobiliaria')->findOne();
$data = [
'venta' => $this->id,
'estado' => $tipo->id,
'fecha' => $fecha->format('Y-m-d')
];
$estado = model(EstadoVenta::class)->create($data)->save();
return true;
}
public function archivar(Carbon $fecha)
{
$estado = $this->estado();
if ($estado->estado()->tipo()->descripcion == 'archivado') {
return true;
}
$tipo = model(TipoEstadoVenta::class)->where('descripcion', 'archivado')->findOne();
$data = [
'venta' => $this->id,
'estado' => $tipo->id,
'fecha' => $fecha->format('Y-m-d')
];
$estado = model(EstadoVenta::class)->create($data)->save();
return true;
}
}
?>