belongsTo(Proyecto::class, 'proyecto')->findOne(); } public function moneda() { return $this->belongsTo(TipoMonedaPagare::class, 'moneda')->findOne(); } public function renovaciones() { return $this->hasMany(RenovacionPagare::class, 'pagare')->findMany(); } public function fecha(\DateTime $fecha = null) { if ($fecha == null) { return Carbon::parse($this->fecha, config('app.timezone')); } $this->fecha = $fecha->format('Y-m-d'); } public function fechaBanco(\DateTime $fecha = null) { if ($fecha == null) { return Carbon::parse($this->fecha_banco, config('app.timezone')); } $this->fecha_banco = $fecha->format('Y-m-d'); } public function vencimiento() { return $this->fechaBanco()->addDays($this->duracion); } public function uf() { if ($this->uf == 0 and $this->fecha != '0000-00-00') { $uf = uf($this->fecha()); if ($uf->total > 0) { $this->uf = $uf->uf->value; $this->save(); } } return $this->uf; } protected $valores; public function valor($tipo = 'ufs') { if ($this->valores == null) { $valores = []; switch (strtolower($this->moneda()->descripcion)) { case 'uf': $valores = (object) ['uf' => $this->capital, 'pesos' => $this->capital * $this->uf()]; break; case 'pesos': $valores = (object) ['uf' => $this->capital / $this->uf(), 'pesos' => $this->capital]; break; } $this->valores = $valores; } switch (strtolower($tipo)) { case 'uf': case 'ufs': return $this->valores->uf; case 'peso': case 'pesos': case '$': return $this->valores->pesos; } } public function abonado($tipo = 'ufs') { if ($tipo == 'ufs') { if ($this->uf() > 0) { return $this->abonado / $this->uf(); } return 0; } return $this->abonado; } public function edit(array $data) { foreach ($data as $column => $value) { if (isset($this->$column) and $this->$column != $value) { $this->$column = $value; } } $this->save(); } protected $intereses; public function intereses($tipo = 'ufs') { if ($this->intereses == null) { $this->intereses = (object) ['uf' => 0, 'pesos' => 0]; if ($this->renovaciones()) { $arr = $this->renovaciones(); $this->intereses->uf = array_reduce($arr, function($accum, $item) { return $accum + $item->intereses(); }); $this->intereses->pesos = array_reduce($arr, function($accum, $item) { return $accum + $item->intereses('pesos'); }); } } switch (strtolower($tipo)) { case 'uf': case 'ufs': return $this->intereses->uf; case 'peso': case 'pesos': case '$': return $this->intereses->pesos; } if ($fecha == null) { $fecha = $this->vencimiento(); } $dif = $fecha->diffInDays($this->fecha()); $duracion = ($dif > $this->duracion) ? $this->duracion : $dif; return $this->valor() * ($this->tasa / 365 * $duracion) / 100; } public function estado_pago() { if ($this->estado_pago == 0) { return false; } return $this->belongsTo(AvanceConstruccion::class, 'estado_pago', 'numero')->findOne(); } }