This commit is contained in:
2021-12-25 23:17:15 -03:00
parent bbee033a8a
commit 3580738273
23 changed files with 755 additions and 81 deletions

14
src/Admin/Config.php Normal file
View File

@ -0,0 +1,14 @@
<?php
namespace Incoviba\Admin;
use Incoviba\API\Common\Alias\Model;
/**
* @property int $id
* @property string $name
* @property string $value
*/
class Config extends Model {
public static $_table = 'configurations';
protected static $fields = ['name', 'value'];
}

48
src/Auth/Login.php Normal file
View File

@ -0,0 +1,48 @@
<?php
namespace Incoviba\Auth;
use Carbon\Carbon;
use DateTime;
use Incoviba\API\Common\Alias\Model;
use Incoviba\Admin\Config;
/**
* @property int $id
* @property int $user_id
* @property DateTime $time
* @property string $selector
* @property string $token
* @property int $status
*
*/
class Login extends Model {
public static $_table = 'logins';
protected static $fields = ['user_id', 'time', 'selector', 'token', 'status'];
protected $user;
public function user() {
if ($this->user === null) {
$this->user = $this->childOf(User::class, [Model::SELF_KEY => 'user_id']);
}
return $this->user;
}
public function time(DateTime $time = null) {
if ($time === null) {
return Carbon::parse($this->time);
}
$this->time = $time->format('Y-m-d H:m:s');
return null;
}
public function isValid() {
if ($this->status == 0) {
return false;
}
$expiration = $this->factory->find(Config::class)->where([['name', 'cookie_expiration_time']])->one();
if ($this->time()->diffInSeconds() > $expiration->value) {
$this->status = 0;
$this->save();
return false;
}
return true;
}
}

79
src/Auth/User.php Normal file
View File

@ -0,0 +1,79 @@
<?php
namespace Incoviba\Auth;
use Carbon\Carbon;
use Incoviba\Admin\Config;
use Incoviba\API\Common\Alias\Model;
/**
* @property int $id
* @property string $name
* @property string $password
* @property int $enabled
*/
class User extends Model {
public static $_table = 'users';
protected $logins;
public function logins() {
if ($this->logins === null) {
$this->logins = $this->parentOf(Login::class, [Model::CHILD_KEY => 'user_id']);
}
return $this->logins;
}
protected $login;
public function login() {
if ($this->login === null) {
$this->login = $this->factory->find(Login::class)
->where([['user_id', $this->id]])
->order([['column' => 'time', 'direction' => 'desc']])
->one(1);
}
return $this->login;
}
public function isIn(): bool {
return $this->login()->isValid();
}
public function validate($password): bool {
return password_verify($password, $this->password);
}
public function validLogins(): bool|array {
return $this->factory->find(Login::class)->where([['user_id', $this->id], ['status', 1]])->many();
}
public function logout() {
$logins = $this->validLogins();
if ($logins === false) {
return true;
}
$bool = true;
foreach ($logins as $login) {
$login->status = 0;
$bool &= $login->save();
}
return $bool;
}
public function setToken($selector, $token) {
$this->logout();
$expiration = $this->factory->find(Config::class)->where([['name', 'cookie_expiration_time']])->one();
$data = [
'user_id' => $this->id,
'time' => Carbon::now()->format('Y-m-d H:i:s '),
'selector' => $selector,
'token' => $token,
'status' => 1
];
$output = [
'input' => $data,
'login' => null,
'logged_in' => false
];
$login = Login::add($this->factory, $data);
$output['login'] = $login;
if ($login !== false and $login->is_new()) {
$output['logged_in'] = $login->save();
$output['expires'] = $login->time()->addSeconds($expiration->value)->timestamp;
}
return $output;
}
}

View File

@ -1,9 +1,12 @@
<?php
namespace Incoviba\Proyecto;
use Carbon\Carbon;
use Incoviba\API\Common\Alias\Model;
use Incoviba\Common\Direccion;
use Incoviba\Inmobiliaria\Inmobiliaria;
use Incoviba\Venta\Cuota;
use Incoviba\Venta\Cierre;
/**
* @property int $id
@ -19,22 +22,158 @@ use Incoviba\Inmobiliaria\Inmobiliaria;
* @property int $subterraneos;
*/
class Proyecto extends Model {
public static $_table = 'proyecto';
protected static $fields = ['inmobiliaria', 'descripcion', 'direccion', 'superficie_terreno', 'valor_terreno',
'corredor', 'superficie_sobre_terreno', 'superficie_bajo_terreno', 'pisos', 'subterraneos'];
public static $_table = 'proyecto';
protected static $fields = ['inmobiliaria', 'descripcion', 'direccion', 'superficie_terreno', 'valor_terreno',
'corredor', 'superficie_sobre_terreno', 'superficie_bajo_terreno', 'pisos', 'subterraneos'];
protected $direccion_o;
public function direccion() {
if ($this->direccion_o === null) {
$this->direccion_o = $this->childOf(Direccion::class, [Model::SELF_KEY => 'direccion']);
protected $direccion_o;
public function direccion() {
if ($this->direccion_o === null) {
$this->direccion_o = $this->childOf(Direccion::class, [Model::SELF_KEY => 'direccion']);
}
return $this->direccion_o;
}
return $this->direccion_o;
}
protected $inmobiliaria_o;
public function inmobiliaria() {
if ($this->inmobiliaria_o === null) {
$this->inmobiliaria_o = $this->childOf(Inmobiliaria::class, [Model::SELF_KEY => 'inmobiliaria', Model::PARENT_KEY => 'rut']);
protected $inmobiliaria_o;
public function inmobiliaria() {
if ($this->inmobiliaria_o === null) {
$this->inmobiliaria_o = $this->childOf(Inmobiliaria::class, [Model::SELF_KEY => 'inmobiliaria', Model::PARENT_KEY => 'rut']);
}
return $this->inmobiliaria_o;
}
protected $cuotas;
protected function buildCuotas() {
return $this->factory->find(Cuota::class)
->join([
['venta', 'venta.pie', 'cuota.pie'],
['JOIN (SELECT e1.* FROM estado_venta e1 JOIN (SELECT MAX(id) AS id, venta FROM estado_venta GROUP BY venta) e0 ON e0.id = e1.id)', 'ev.venta', 'venta.id', 'alias' => 'ev', 'type' => 'raw'],
['tipo_estado_venta', 'tev.id', 'ev.estado', 'alias' => 'tev'],
['propiedad', 'propiedad.id', 'venta.propiedad'],
['propiedad_unidad', 'pu.propiedad', 'propiedad.id', 'alias' => 'pu'],
['unidad', 'unidad.id', 'pu.unidad'],
['proyecto_tipo_unidad', 'ptu.id', 'unidad.pt', 'alias' => 'ptu'],
['proyecto', 'proyecto.id', 'ptu.proyecto'],
['pago', 'pago.id', 'cuota.pago'],
['JOIN (SELECT e1.* FROM estado_pago e1 JOIN (SELECT MAX(id) AS id, pago FROM estado_pago GROUP BY pago) e0 ON e0.id = e1.id)', 'ep.pago', 'pago.id', 'alias' => 'ep', 'type' => 'raw'],
['tipo_estado_pago', 'tep.id', 'ep.estado', 'alias' => 'tep']
])
->where([
['proyecto.id', $this->id],
['tev.activa', 1],
['tep.active', 1]
]);
}
public function cuotas() {
if ($this->cuotas === null or !isset($this->cuotas->total)) {
$cuotas = [];
if ($this->cuotas !== null) {
$cuotas = (array) $this->cuotas;
}
$cuotas['total'] = $this->$this->buildCuotas()->many();
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->total;
}
public function cuotasHoy() {
if ($this->cuotas === null or !isset($this->cuotas->hoy)) {
$cuotas = [];
if ($this->cuotas !== null) {
$cuotas = (array) $this->cuotas;
}
$f = Carbon::today();
$cuotas['hoy'] = $this->buildCuotas()
->where([
['pago.fecha', $f->format('Y-m-d')]
])
->many();
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->hoy;
}
public function cuotasPendientes() {
if (!isset($this->cuotas) or !isset($this->cuotas->mes)) {
$cuotas = [];
if (isset($this->cuotas)) {
$cuotas = (array) $this->cuotas;
}
$f = Carbon::today();
$cuotas['pendientes'] = $this->buildCuotas()
->where([
['ep.estado', 1, '<'],
['ep.estado', 0, '>=']
])
->many();
$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();
error_log(var_export($this->buildCuotas(), true));
$cuotas['mes'] = $this->buildCuotas()
->where([
['pago.fecha', $f->format('Y-m-d'), 'operator' => '>'],
['pago.fecha', $f->copy()->addMonth(1)->format('Y-m-d'), '<=']
])
->many();
$this->cuotas = (object) $cuotas;
}
return $this->cuotas->mes;
}
protected $cierres;
public function cierres(int $vigentes = 0)
{
if (!isset($this->cierres[$vigentes]) or $this->cierres[$vigentes] == null) {
$orm = $this->factory->find(Cierre::class)
->select([['cierre', '*']])
->join([
['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', 'alias' => 'ec', 'type' => 'raw'],
['tipo_estado_cierre', 'tipo_estado_cierre.id', 'ec.tipo'],
['proyecto', 'proyecto.id', 'cierre.proyecto'],
['unidad_cierre', 'unidad_cierre.cierre', 'cierre.id'],
['unidad', 'unidad.id', 'unidad_cierre.unidad']
])
->where([
['proyecto.id', $this->id],
['unidad_cierre.principal', 1]
])
->order([
'proyecto.descripcion',
'tipo_estado_cierre.vigente',
'cierre.fecha',
'LPAD(unidad.descripcion, 4, "0")'
])
->group(['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],
['tipo_estado_cierre.descripcion', 'promesado', 'type' => 'not like']
]);
break;
case (Cierre::VIGENTES + 2):
$orm = $orm->where([
['tipo_estado_cierre.vigente', 1],
['tipo_estado_cierre.descripcion', 'promesado', 'type' => 'like']
]);
break;
};
error_log(var_export($orm, true));
$this->cierres[$vigentes] = $orm->many();
}
return $this->cierres[$vigentes];
}
return $this->inmobiliaria_o;
}
}

25
src/Venta/Cierre.php Normal file
View File

@ -0,0 +1,25 @@
<?php
namespace Incoviba\Venta;
use Carbon\Carbon;
use Incoviba\API\Common\Alias\Model;
class Cierre extends Model {
public static $_table = 'cierre';
const VIGENTES = 1;
const NO_VIGENTES = -1;
public function fecha(\DateTimeInterface $fecha = null)
{
if ($fecha == null) {
return Carbon::parse($this->fecha);
}
$this->fecha = $fecha->format('Y-m-d');
}
public function periodo() {
$today = Carbon::today();
$dif = $today->diffInDays($this->fecha());
return $dif;
}
}

33
src/Venta/Cuota.php Normal file
View File

@ -0,0 +1,33 @@
<?php
namespace Incoviba\Venta;
use DateTimeInterface;
use Incoviba\API\Common\Alias\Model;
use Incoviba\Common\Banco;
/**
* @property int $id
* @property Pie $pie
* @property DateTimeInterface $fecha
* @property float $valor_$
* @property bool $estado
* @property Banco $banco
* @property DateTimeInterface $fecha_pago
* @property bool $abonado
* @property DateTimeInterface $fecha_abono
* @property float $uf
* @property Pago $pago
* @property int $numero
*/
class Cuota extends Model {
public static $_table = 'cuota';
protected static $fields = ['pie', 'fecha', 'valor_$', 'estado', 'banco', 'fecha_pago', 'abonado', 'fecha_abono', 'uf', 'pago', 'numero'];
protected $pago_o;
public function pago() {
if ($this->pago_o === null) {
$this->pago_o = $this->childOf(Pago::class, [Model::SELF_KEY => 'pago']);
}
return $this->pago_o;
}
}

View File

@ -1,6 +1,38 @@
<?php
namespace Incoviba\Venta;
use Carbon\Carbon;
use DateTimeInterface;
use Incoviba\API\Common\Alias\Model;
use Incoviba\Common\Banco;
class Pago extends Model {}
/**
* @property int $id
* @property float $valor
* @property Banco $banco
* @property TipoPago $tipo
* @property string $identificador
* @property DateTimeInterface $fecha
* @property float $uf
* @property string $pagador
* @property Pago $asociado
*/
class Pago extends Model {
public static $_table = 'pago';
protected static $fields = ['valor', 'banco', 'tipo', 'identificador', 'fecha', 'uf', 'pagador', 'asociado'];
protected $tipo_o;
public function tipo() {
if ($this->tipo_o === null) {
$this->tipo_o = $this->childOf(TipoPago::class, [Model::SELF_KEY => 'tipo']);
}
return $this->tipo_o;
}
public function fecha(DateTimeInterface $fecha = null) {
if ($fecha === null) {
return Carbon::parse($this->fecha);
}
$this->fecha = $fecha->format('Y-m-d');
}
}

12
src/Venta/TipoPago.php Normal file
View File

@ -0,0 +1,12 @@
<?php
namespace Incoviba\Venta;
use Incoviba\API\Common\Alias\Model;
/**
* @property int $id
* @property string $descripcion
*/
class TipoPago extends Model {
public static $_table = 'tipo_pago';
}