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