Files
modelos/src/old/Venta/Pie.php
2020-01-07 12:25:52 -03:00

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;
}
}
}
?>