2019-12-23 18:01:23 -03:00
< ? 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 ) {
2020-01-07 12:25:52 -03:00
$uf = $this -> container -> get ( 'uf' )( $this -> fecha );
2019-12-23 18:01:23 -03:00
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 ;
}
}
}
?>