226 lines
5.1 KiB
PHP
226 lines
5.1 KiB
PHP
<?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 = $this->container->get('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;
|
|
}
|
|
}
|
|
}
|
|
?>
|