<?php

namespace App\Danoral\Cuotas;

use App\Danoral\ModelBase;
use App\Danoral\Dolarizacion\TasaCambio;
use App\Danoral\Cuotas\Cuota;
use App\Danoral\Transacciones\TransDT;
use App\Danoral\Transacciones\TransDTCambio;
use App\Danoral\U;

class CuotaView extends ModelBase
{
    protected $tableName = 'cuotas_view';
    protected $primaryKey = 'idCuota';
    public $incrementing = false;
    public $timestamps = false;

    protected $fillable = [
        'idE',
        'idCond',
        'idCuota',
        'typeCuota',
        'montoOrigen',
        'idDTCuota',
        'idDTCuotaCobro',
        'idTCobro',
        'idECond',
        'anoCond',
        'mesCond',
        'refCond',  
        'typeEmisionCond',
        'idT',
        'dhDT',
        'anoDT',
        'mesDT',
        'ctaDT',
        'typeDT',
        'montoDT',
        'idMoneda',
        'tcEmision_idTC',
        'tcEmision_dateVen',
        'tcEmision_valor',
        'tcEmision_date',
        'idNP'
    ];

    
    protected $appends = array(
        'tcCobro_isPeriodoGracia',
        'tcCobro_idTC',
        'tcCobro_valor',
        'tcCobro_date',
        'tcCobro_montoCuota',
        'tcCobro_idMoneda',
    );
    
    public static $MONEDA_BASE = 1001; //VES Bs.
    
    public $tcCobro_isPeriodoGracia;
    public $tcCobro_idTC;
    public $tcCobro_valor;
    public $tcCobro_date;
    public $tcCobro_montoCuota;
    public $tcCobro_idMoneda;
    
    public $trans;
    
    public function getTcCobroIsPeriodoGraciaAttribute()   { return $this->tcCobro_isPeriodoGracia; }
    public function getTcCobroIdTCAttribute()              { return $this->tcCobro_idTC; }
    public function getTcCobroMontoCuotaAttribute()        { return $this->tcCobro_montoCuota; }
    public function getTcCobroValorAttribute()             { return $this->tcCobro_valor; }
    public function getTcCobroDateAttribute()              { return $this->tcCobro_date; }
    public function getTcCobroIdMonedaAttribute()          { return $this->tcCobro_idMoneda; }
    
    function __construct($anoSchema = null) {
        if(is_null($anoSchema)){
            $this->table = parent::$SCHEMA .'.'. $this->tableName;
        }else{
            parent::getSchema_ano($anoSchema);
        }
    }

    public function getSymboloMoneda(){
        return $this->idMoneda==1001?'Bs':'$';
    }


    public static function getCuotasView_entidad($idE){
        return CuotaView::where([
            ['cuotas_view.idE', $idE],
        ])
        ->orderBy('cuotas_view.idE', 'asc')
        ->orderBy('cuotas_view.anoDT', 'asc')
        ->orderBy('cuotas_view.mesDT', 'asc')
        ->orderBy('cuotas_view.idMoneda', 'asc')
        ->get();
    }

    public static function getCuotasViewPendientes_entidad($idE){
        return CuotaView::where([
            ['cuotas_view.idE', $idE],
            ['cuotas_view.idDTCuotaCobro', null]
        ])
        ->orderBy('cuotas_view.idE', 'asc')
        ->orderBy('cuotas_view.anoDT', 'asc')
        ->orderBy('cuotas_view.mesDT', 'asc')
        ->orderBy('cuotas_view.idMoneda', 'asc')
        ->get();
    }

    public static function getCuotasView_cond($idCond){
        return CuotaView::where([
            ['cuotas_view.idCond', $idCond],
        ])
        ->orderBy('cuotas_view.idE', 'asc')        
        ->orderBy('cuotas_view.anoDT', 'asc')
        ->orderBy('cuotas_view.mesDT', 'asc')
        ->orderBy('cuotas_view.idMoneda', 'asc')
        ->get();
    }

    public function getCuotasView_trans($idT){
        return $this::where([
            ['cuotas_view.idT', $idT],
        ])
        ->orderBy('cuotas_view.idE', 'asc')       
        ->orderBy('cuotas_view.anoDT', 'asc')
        ->orderBy('cuotas_view.mesDT', 'asc')
        ->orderBy('cuotas_view.idMoneda', 'asc')
        ->get();
    }

    public static function getCuotasView_NotiPago($idNP){
        return CuotaView::where([
            ['cuotas_view.idNP', $idNP],
        ])
        ->orderBy('cuotas_view.idE', 'asc')        
        ->orderBy('cuotas_view.anoDT', 'asc')
        ->orderBy('cuotas_view.mesDT', 'asc')
        ->orderBy('cuotas_view.idMoneda', 'asc')
        ->get();
    }

    public function calcularTasa($date, $montoCuota = 0){
        $u = new U;
        $u->isEcho = false;
        $u->log = '';
        $u->eLinea('... calcularTasa():::...');
        $u->eLinea('------------------------------ INICIO');

        if(is_null($date) || $date == 'null'){
            $date = null;
        }else{
            $date = date("Y-m-d",strtotime($date));
        }

        $this->tcCobro_isPeriodoGracia = false;
        $this->tcCobro_valor = 0;
        $this->tcCobro_date = null;
        $this->tcCobro_montoCuota = 0;
        $this->tcCobro_idMoneda = 1001;
        $this->tcCobro_idTC = 0;

        $isSaldoCuota = false;
        if($montoCuota == 0){
            $montoCuota = floatval($this->montoDT);
        }else{
            $montoCuota = floatval($montoCuota);
            if(floatval($this->montoDT) != $montoCuota){
                $isSaldoCuota = true;
            }
        }

        switch($this->idMoneda){
            case self::$MONEDA_BASE: // VES Bs

                $this->tcCobro_montoCuota = $montoCuota;
                return $u->logList;;

            case 1002: // USD $
                $u->eLinea('moneda 1002: USD');

                //reconversion 2021.10
                $montoOrigen = $this->montoOrigen;
                $tcEmision_valor = $this->tcEmision_valor;
                if($this->anoDT <= 2021){
                    if($this->anoDT == 2021){
                        if($this->mesDT < 10){
                            $montoOrigen = round($montoOrigen/10000)/100;
                            $tcEmision_valor = round($tcEmision_valor/10000)/100;
                        }
                    }else{
                        $montoOrigen = round($montoOrigen/10000)/100;
                        $tcEmision_valor = round($tcEmision_valor/10000)/100;
                    }
                }

                //Fecha a evaluar NULL
                if(is_null($date)){
                    $this->tcCobro_montoCuota = $montoOrigen;

                //fecha a evaluar NO NULL    
                }else{
                    //fecha vencimiento NO NULL
                    if(!is_null($this->tcEmision_dateVen)){
                        //fecha a evaluar es menor a fecha vencimiento
                        if(strtotime($this->tcEmision_dateVen) >= strtotime($date)){
                            //la cuota esta en periodo de gracia
                            $u->eLinea('la cuota esta en periodo de gracia');
                            $this->tcCobro_isPeriodoGracia = true;
                            $this->tcCobro_valor = $tcEmision_valor;
                            $this->tcCobro_date = $this->tcEmision_date;
                            $this->tcCobro_montoCuota = $isSaldoCuota?($montoCuota*$this->tcCobro_valor):$montoOrigen;
                            $this->tcCobro_idTC = $this->tcEmision_idTC;
                        }
                    }

                    //no esta en periodo de gracia
                    if(!$this->tcCobro_isPeriodoGracia){
                        $u->eLinea('la cuota NO esta en periodo de gracia');
                        $u->eLinea("date: $date");
                        $tc = TasaCambio::getTasaFecha($date);
                        if(!is_null($tc)){
                            $u->eLinea("tc=> valorTC: $tc->valorTC | dateValorTC: $tc->dateValorTC");

                            //reconversion 2021.10
                            $valorTC = $tc->valorTC;
                            if(strtotime('2021-10-01') > strtotime($tc->dateValorTC)){
                                $valorTC = round($valorTC/10000)/100;
                            }

                            $this->tcCobro_idTC = $tc->idTC;
                            $this->tcCobro_valor = $valorTC;
                            $this->tcCobro_date = $tc->dateValorTC;
                            $this->tcCobro_montoCuota = round($montoCuota * $this->tcCobro_valor, 2);
                        }else{
                            $u->eLinea("tc=> NULL");
                        }
                    }
                }
                return $u->logList;;
        }
        return $u->logList;;
    }

    //**** ELIMINAR ***** */
    public static function cambioTCcuota(){
        $cuotasView = CuotaView::get();

        foreach($cuotasView as $i => $cv){
            if($cv->idMoneda == 1002){
                echo "$i - $cv->idCuota : $cv->idE ($cv->dateVenTasa) idTC: $cv->idTC" . PHP_EOL;

                $c = Cuota::find($cv->idCuota);
                $c->tcEmision_idTC = $cv->idTC;
                $c->tcEmision_dateVen = $cv->dateVenTasa;
                $c->save();
                echo 'OK SAVE'. PHP_EOL;
            }
        }

    }

    public function generarVinculo(){
        
        $i = 1;
        
        echo $i++ .': '.
            $this->idE      .' | '.
            $this->idCond   .' | '.
            $this->ctaDT    .' | '.
            $this->typeDT   .' | '.
            $this->anoDT    .' | '.
            $this->mesDT    .' | '.
            $this->idMoneda.
            ' ('.$this->montoDT.')'.PHP_EOL;
        
        $iDT_cuota = new TransDT;
        $iDT_cuota->fill([
            'ctaDT'         => 130,
            'dhDT'          => 0,
            'montoDT'       => $this->montoOrigen, //round($this->montoOrigen/10000)/100, 
            'typeDT'        => TransDT::$TYPE_VINCULO_CUOTA_BS,
            'anoDT'         => $this->anoDT,
            'mesDT'         => $this->mesDT,
            'idE'           => $this->idE,
            'idT'           => $this->idT,
            'idMoneda'      => 1001 //VES
        ]);
        $iDT_cuota->save();

        echo '  ---> idDT : ' . $iDT_cuota->idDT.' | '. $iDT_cuota->montoDT . PHP_EOL;

        $tDTCambio = new TransDTCambio;
        $tDTCambio->idDT_base   = $this->idDTCuota;
        $tDTCambio->idDT_quote  = $iDT_cuota->idDT;
        $tDTCambio->idTC        = $this->tcEmision_idTC;
        $tDTCambio->save();

        echo '  ---> idDTCambio : ' . $tDTCambio->idDTCambio . PHP_EOL;

        
    }



}
