<?php

namespace App\Danoral\Cobranzas\Cobros;

use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Relations\HasMany;

use App\Danoral\ModelBase;
use App\Danoral\Entidades\Entidad;
use App\Danoral\Cuotas\CuotaView;
use App\Danoral\Cuotas\CuotaCond;
use App\Danoral\Cobranzas\Cobros\TransDTCobro;
use App\Danoral\Cobranzas\Cobros\CobroTdtCFP;
use App\Danoral\Cobranzas\Cobros\CobroFormaPago;
use App\Danoral\Cuotas\Cuota;
use App\Danoral\Transacciones\TransDT;
use App\Danoral\U;



class Cobro extends ModelBase
{
    protected $tableName = 'cobros';
    protected $primaryKey = 'idCobro';
    public $incrementing = true;
    public $timestamps = false;

    protected $fillable = [
        'dateCobro',
        'typeCobro',
        'origenCobro',
        'idE',
        'estadoCobro',
        'errorCobro',
        'idEUser',
        'idCobrosLista',
        'nameEUser',
        'nameOrigenCobro',
        'nameTypeCobro',
    ];

    function __construct() {
        $this->table = parent::$SCHEMA .'.'. $this->tableName;
    }

    public static $DO_COBRO_CALCULAR_DEUDA  = 101;
    public static $DO_COBRO_PROCESAR        = 102;

    public $idNP;

    public $nameEUser       = '';
    public $nameOrigenCobro = '';
    public $nameTypeCobro   = '';
    
    public $CFP             = []; //CobroFormaPagos
    public $tdtCobros       = []; //Cuotas y cuentas
    public $cobrotDTCFP     = []; //tdtCobros <-> CFP (n-n)
    public $cobroDetalles   = []; //CobroDetalle

    protected $appends = array(
        'nameEUser',
        'nameOrigenCobro',
        'nameTypeCobro',
        'CFP',
        'tdtCobros',
        'cobrotDTCFP',
        'cobroDetalles',
    );

    public function getNameEUserAttribute()              { return $this->nameEUser; }
    public function getNameOrigenCobroAttribute()        { return $this->nameOrigenCobro; }
    public function getNameTypeCobroAttribute()          { return $this->nameTypeCobro; }

    public function getCFPAttribute()           { return $this->CFP; }
    public function getTdtCobrosAttribute()     { return $this->tdtCobros; }
    public function getCobrotDTCFPAttribute()   { return $this->cobrotDTCFP; }
    public function getCobroDetallesAttribute() { return $this->cobroDetalles; }

    public $entidades       = [];
    public $sum_tdt_VES     = 0;
    public $sum_tdt_USD     = 0;
    public $sum_montoCFP    = 0;

    public function CobroFormaPago(): HasMany {
        return $this->hasMany(CobroFormaPago::class, 'idCobro');
    }

    public function Entidad(){
        return $this->belongsToMany(Entidad::class);
    }

    static public function getCobros($cobrosView) {
        $cobros = [];

        $idCobros = $cobrosView->pluck('idCobro')->unique();

        $cobrosDTview = CobroDTView::whereIn('idCobro', $idCobros)
            ->orderBy('dateCobro', 'asc')
            ->orderBy('idCobro', 'asc')
            ->orderBy('anoDT', 'asc')
            ->orderBy('mesDT', 'asc')
            ->get();

        $CFPs = CobroFormaPago::whereIn('idCobro', $idCobros)
            ->orderBy('idCobro', 'asc')
            ->get();

        $CtDTCFPs = CobroTdtCFP::whereIn('idCobro', $idCobros)
            ->orderBy('idCobro', 'asc')
            ->get();

        foreach ($cobrosView as $cobrov) {
            $idCobro = $cobrov->idCobro;

            $cobro = new Cobro;
            $cobro->fill($cobrov->attributes);
            $cobro->idCobro             = $idCobro;
            $cobro->nameOrigenCobro     = $cobrov->nameOrigenCobro;
            $cobro->nameTypeCobro       = $cobrov->nameTypeCobro;
            $cobro->nameEUser           = $cobrov->nameE;

            $cobro->sum_tdt_VES         = 0;
            $cobro->sum_tdt_USD         = 0;
            $cobro->sum_montoCFP        = 0;

            $cobro->CFP                 = $CFPs->where('idCobro', $idCobro);
            $cobro->cobrotDTCFP         = $CtDTCFPs->where('idCobro', $idCobro);
            $cobrosDTview_cobro         = $cobrosDTview->whereIn('idCobro', $idCobro);

            $cobro->entidades           = $cobrosDTview->whereIn('idCobro', $idCobro)
                                            ->map(function($item) {
                                                return $item->codEdifCuota . ' - ' . $item->codAptoCuota;
                                            })
                                            ->unique();
                                           

            foreach ($cobrosDTview_cobro as $cDTv) {
                $montoDT = $cDTv->montoDT;

                $tdtCobro = new TransDTCobro;
                $tdtCobro->idCuota  = $cDTv->idCuota;
                $tdtCobro->idCobro  = $idCobro;
                $tdtCobro->idDT     = $cDTv->idDT_cc;
                $tdtCobro->codEdif  = $cDTv->codEdifCuota; //cambiar cor codEdifDT (actualizar el view!!!)
                $tdtCobro->codApto  = $cDTv->codAptoCuota; //cambiar cor codAptoDT
                $tdtCobro->ref      = '';
                

                $tdtCobro->cuota = new CuotaView;
                $tdtCobro->cuota->fill($cDTv->attributes);
                $tdtCobro->cuota->idE = $cDTv->idECuota;
                $tdtCobro->cuota->idTCobro = $cDTv->idT_cc;

                $tdtCobro->tDT = new TransDT;
                $tdtCobro->tDT->fill([
                    'ctaDT'         => $cDTv->ctaDT_cc,
                    'dhDT'          => $cDTv->dhDT_cc,
                    'montoDT'       => $cDTv->montoDT_cc,
                    'typeDT'        => $cDTv->typeDT_cc,
                    'anoDT'         => $cDTv->anoDT_cc,
                    'mesDT'         => $cDTv->mesDT_cc,
                    'idE'           => $cDTv->idEdtCuotaCobro,
                    'idT'           => null,
                    'idMoneda'      => $cDTv->idMoneda_cc,
                ]);
                $tdtCobro->tDT->idDT = $cDTv->idDT_cc;

                $cobro->tdtCobros[] = $tdtCobro;

                if($cDTv->idMoneda==1001){
                    $cobro->sum_tdt_VES += $montoDT;
                }else{
                    $cobro->sum_tdt_USD += $montoDT;
                }

                
            }

            foreach ($cobro->cobrotDTCFP as $ctDTCFP){
                $cobro->sum_montoCFP += $ctDTCFP->montoCFP;
            }

            $cobros[] = $cobro;
        }

        return $cobros;

    }

    public function deleteCobro() {
        DB::beginTransaction();
        try{  
            CobroTdtCFP::where('idCobro', $this->idCobro)->delete();
            CobroFormaPago::where('idCobro', $this->idCobro)->delete();
            $tdtCobro_idDT  = TransDTCobro::where('idCobro', $this->idCobro)->pluck('idDT')->unique();
            TransDTCobro::where('idCobro', $this->idCobro)->delete();
            TransDT::whereIn('idDT', $tdtCobro_idDT)->delete();

            DB::commit();

            return 1;

        }catch (\Exception $e) {
            DB::rollback();
            return [
                'message'   => 'ERROR: '. $e->getMessage(),
            ];
        }        
    }
    
    public function isPlanilla() {   
        if(!empty($this->CFP)){
            foreach($this->CFP as $cfp) {
                if(is_null($cfp->idPlanilla)) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }

    public function isCFP_empty() {
        return empty($this->CFP);
    }

    public function validarCargar($cobro){
        $u = new U;
        $u->isEcho = false;
        $u->log = '';
        $u->eLinea('... validarCargar():::........ INICIO');

        $cfp_c = collect();
        $this->CFP          = [];
        $this->tdtCobros    = [];

        //$this->idE          = isset($cobro['idE'])?$cobro['idE']:null;

        if(isset($cobro['idCobro'])){ $this->idCobro = $cobro['idCobro']; }
        $this->dateCobro        = empty($cobro['dateCobro'])?date("Y-m-d H:i:s"):$cobro['dateCobro'];
        $this->origenCobro      = $cobro['origenCobro'];
        $this->typeCobro        = $cobro['typeCobro'];
        $this->estadoCobro      = isset($cobro['estadoCobro'])?$cobro['estadoCobro']:0;
        if(isset($cobro['idCobrosLista'])) {
            $this->idCobrosLista    = $cobro['idCobrosLista'];
        }
        
        //itemsCobro
        if(count($cobro['itemsCobro'])==0){ //si esta vacio se cargan todas las cuotas
            $u->eLinea("itemsCobro vacios | " .$this->idE); 
            
            $cuotasCond = CuotaCond::getCuotasCond($this->idE);

            $u->eLinea("cuotasCond: " .count($cuotasCond)); 

            foreach($cuotasCond as $cc){
                foreach($cc->cuotas as $c){

                    $ic = [
                        "typeDT"    => 21,
                        "idCuota"   => $c->idCuota,
                    ];

                    $tdtCobro = new TransDTCobro;
                    $this->tdtCobros[] = $tdtCobro->newTransDT($ic);
                    $u->eLinea("cuota:  (".$tdtCobro->cuota->idCuota.") | ".$tdtCobro->cuota->mesDT."/".$tdtCobro->cuota->anoDT." | ".$tdtCobro->cuota->montoDT." | ".$tdtCobro->cuota->idMoneda);
                }
            }

        }else{
            foreach($cobro['itemsCobro'] as $ic){
                $tdtCobro = new TransDTCobro;
                $tdtCobro->newTransDT($ic);
                $tdtCobro->idNP = $this->idNP;

                $this->tdtCobros[] = $tdtCobro;

                $u->eLinea("cuota:  (".$tdtCobro->cuota->idCuota.") | ".$tdtCobro->cuota->mesDT."/".$tdtCobro->cuota->anoDT." | ".$tdtCobro->cuota->montoDT." | ".$tdtCobro->cuota->idMoneda);
            }
        }

        //itemsCFP
        foreach($cobro['itemsCFP'] as $p){
            $cfp = new CobroFormaPago;
            $cfp->dateCFP           = $p['date'];
            $cfp->typeCFP           = $p['type'];
            $cfp->montoCFP          = $p['monto'];
            $cfp->idMoneda          = $p['idMoneda'];
            $cfp->refCFP            = $p['ref'];
            $cfp->bancoCFP          = isset($p['idBanco'])?$p['idBanco']:(isset($p['banco'])?$p['banco']:null);
            $cfp->bancoOrigenCFP    = isset($p['bancoOrigen'])?$p['bancoOrigen']:null;
            $cfp->idPlanilla        = isset($p['idPlanilla'])?$p['idPlanilla']:null;
            $cfp->infoCFP           = json_encode([
                                            'cedula'  => isset($p['cedula'])?$p['cedula']:null
                                        ], JSON_UNESCAPED_UNICODE);
            
            $cfp->dateCFP_time      = strtotime($p['date']);

            $cfp_c->push($cfp);

            $u->eLinea("CFP:  (".$cfp->dateCFP.") | ".$cfp->bancoCFP."/".$cfp->refCFP." | ".$cfp->montoCFP." | ".$cfp->idMoneda);

        }
        $this->CFP = $cfp_c->sortBy('dateCFP_time')->values()->all();

        if(isset($cobro['cobroDetalles'])) {
            $this->cobroDetalles = $cobro['cobroDetalles'];
            $u->eLinea("cobroDetalles: OK");

        }
        
        return $u->logList; // solo para testeo

    }

    public function generarCobro(){
        $u = new U;
        $u->isEcho = false;
        $u->log = '';
        $u->eLinea('... generarCobro():::......... INICIO');

        //inicializacion
        $u->eLinea('inicializacion');
        //$this->idCobro = 1001; //revisar si es necesario
        $saldoCFP = 0;
        $idDT_temp  = 2000; //revisar si es necesario
        $cobroDetalles = []; //CobroDetalle

        $countCFP = count($this->CFP);
        $u->eLinea("countCFP: $countCFP");
        $iCFP = 0;


        //primer CFP
        if($countCFP > 0){
            $cfp = $this->CFP[$iCFP];

            $saldoCFP += $cfp->montoCFP;      
            $u->eLinea("pago (primero): $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");
        }
        $modoLineaCFP = 1;

        $saldoCFP_periodo = $saldoCFP;
        $saldoCuota = 0;
        $idMonedaCuota = 0;
        $modoLineaDT = 3; //modo 3: inicial
        $icPeriodoActual = '';
        foreach($this->tdtCobros as $tdtC){
            $cuota = $tdtC->cuota;
            $cuota->tcCobro_isPeriodoGracia = false;

            if($icPeriodoActual !== (($cuota->anoDT).($cuota->mesDT)) )
            { // nuevo grupo de periodo/referencia (itemCobro)
                if(! empty($cobroDetalles)) {
                    $u->eLinea("cobroDetalles no empty | count: ".count($this->cobroDetalles)." | ".count($cobroDetalles));
                    foreach($cobroDetalles as $cDT) { $this->cobroDetalles[] = $cDT; }
                    $cobroDetalles = [];
                    $saldoCFP_periodo = $saldoCFP;
                }else{ //se sale cuando no tiene fondos para el grupo y no valida los demas
                    if($modoLineaDT!=3) { break; }
                }
                $u->eLinea("<------ nuevo grupo de periodo/referencia (itemCobro) | ". (($cuota->anoDT).($cuota->mesDT)));
                $modoLineaDT = 1;
                $icPeriodoActual = (($cuota->anoDT).($cuota->mesDT));
                
            }

            $u->eLinea("cuota: (".$cuota->idCuota.") | ".$cuota->mesDT."/".$cuota->anoDT." | ".$cuota->montoDT." | ".$cuota->idMoneda);

            $montoCuota = floatval($cuota->montoDT);
            $saldoCuota = $montoCuota;
            $idMonedaCuota = $cuota->idMoneda;
            $u->eLinea("cuota => saldoCuota: $saldoCuota | montoCuota: $montoCuota");
            
            if($countCFP == 0) {
                $u->eLinea('no existen pagos (CFP)');

                $cDT = new CobroDetalle;
                $cDT->typeDT            = 21; //Recibo Cobrado
                $cDT->idCuota           = $cuota->idCuota;
                $cDT->idE               = $cuota->idE;
                $cDT->anoDT             = $cuota->anoDT;
                $cDT->mesDT             = $cuota->mesDT;
                $cDT->ref               = null;
                $cDT->montoItemCobro    = $cuota->montoDT;
                $cDT->indexCFP          = $iCFP;
                $cDT->fechaCFP          = $this->dateCobro;
                $cDT->montoTotalCFP     = 0;
                $cDT->tcCobro_idTC      = $cuota->tcCobro_idTC;
                $cDT->tcCobro_valor     = $cuota->tcCobro_valor;
                $cDT->tcCobro_date      = $cuota->tcCobro_date;
                $cDT->tcCobro_isPeriodoGracia = $cuota->tcCobro_isPeriodoGracia;
                $cDT->montoDT           = $saldoCuota;
                $cDT->idMonedaDT        = $cuota->idMoneda;
                $cDT->idCFP             = null;
                $cDT->montoCFP          = 0;
                $cDT->idMonedaCFP       = '';
                $cDT->modoLineaDT       = $modoLineaDT;
                $cDT->modoLineaCFP      = 0;
                
                $cobroDetalles[] = $cDT;
                $u->eLinea("CobroDetalle | montoDT: $cDT->montoDT | montoCFP: $cDT->montoCFP");

                $modoLineaDT = 0;

            }else{

                do{
                    $baseCuota = $saldoCuota;
                    $u->eLinea("saldo cuota => baseCuota: $baseCuota | saldoCuota: $saldoCuota");

                    //si las monedas son distintas
                    if($cfp->idMoneda != $cuota->idMoneda){
                        $u->eLinea("monedas distintas | cfp: $cfp->idMoneda | itemCobro: ". $cuota->idMoneda);

                        //calcula la tasa segun fecha correspondiente
                        $u->eLinea("TC => id: $cuota->tcEmision_idTC | valor: $cuota->tcEmision_valor | dateCFP: $cfp->dateCFP | saldoCuota: $saldoCuota");
                        $cuota->calcularTasa($cfp->dateCFP, $saldoCuota);
                        $u->eLinea("tc: $saldoCuota | ($cuota->tcCobro_date) $cuota->tcCobro_valor | $cuota->tcCobro_montoCuota ");
                        $baseCuota = round($cuota->tcCobro_montoCuota, 2);
                    }

                    $u->eLinea("despues moneda => saldoCuota: $saldoCuota | baseCuota: $baseCuota | saldoPago: $saldoCFP");

                    //SI alcanza el saldo para pagar la cuota
                    if(round($saldoCFP,2) >= round($baseCuota,2)) {
                        $u->eLinea("SI..... ($saldoCFP : $baseCuota) : SI alcanza el saldo para pagar la cuota");

                        $cDT = new CobroDetalle;
                        $cDT->typeDT            = 21; //Recibo Cobrado
                        $cDT->idCuota           = $cuota->idCuota;
                        $cDT->idE               = $cuota->idE;
                        $cDT->anoDT             = $cuota->anoDT;
                        $cDT->mesDT             = $cuota->mesDT;
                        $cDT->ref               = null;
                        $cDT->montoItemCobro    = $cuota->montoDT;
                        $cDT->indexCFP          = $iCFP;
                        $cDT->fechaCFP          = $cfp->dateCFP;
                        $cDT->montoTotalCFP     = $cfp->montoCFP;
                        $cDT->tcCobro_idTC      = $cuota->tcCobro_idTC;
                        $cDT->tcCobro_valor     = $cuota->tcCobro_valor;
                        $cDT->tcCobro_date      = $cuota->tcCobro_date;
                        $cDT->tcCobro_isPeriodoGracia = $cuota->tcCobro_isPeriodoGracia;
                        $cDT->montoDT           = $saldoCuota;
                        $cDT->idMonedaDT        = $cuota->idMoneda;
                        $cDT->idCFP             = $cfp->idCFP;
                        $cDT->montoCFP          = $baseCuota;
                        $cDT->idMonedaCFP       = $cfp->idMoneda;
                        $cDT->modoLineaDT       = $modoLineaDT;
                        $cDT->modoLineaCFP      = $modoLineaCFP;
                        
                        $cobroDetalles[] = $cDT;
                        $u->eLinea("CobroDetalle | montoDT: $cDT->montoDT | montoCFP: $cDT->montoCFP");

                        $saldoCFP = round($saldoCFP - $baseCuota, 2);
                        $saldoCuota = 0;
                        $modoLineaDT = 0;
                        $modoLineaCFP = 0;

                        break;
                    //NO alcanza el saldo para pagar la cuota
                    }else{
                        $u->eLinea("NO..... ($saldoCFP : $baseCuota) : NO alcanza el saldo para pagar la cuota");


                        // Validar si existen mas pagos y si alcanza para pagar la cuota
                        $saldoCFP_validar = $saldoCFP;
                        $iCFP_validar = $iCFP;
                        $isAlcanzaCFP = false;
                        while(++$iCFP_validar < $countCFP) {
                            $u->eLinea("..: existe otro nuevo pago");
                            $cfp_validar = $this->CFP[$iCFP_validar];
                            $saldoCFP_validar += $cfp_validar->montoCFP;

                            $u->eLinea("Validar si alcanza ( $saldoCFP_validar >= $baseCuota )");
                            if($isAlcanzaCFP = ($saldoCFP_validar >= $baseCuota)){ 
                                $u->eLinea("..: SI alcanzan la suma de los pagos CFP para pagar la cuota");

                                //Generar nuevo item con el resto del saldo CFP para dejarlo en CERO
                                $u->eLinea("..: saldoCFP: $saldoCFP | tcCobro_valor: $cuota->tcCobro_valor");
        
                                if(isset($cuota->tcCobro_valor)){
                                    $nuevaCuota = $saldoCFP / $cuota->tcCobro_valor;
                                }else{
                                    $nuevaCuota = $saldoCFP;
                                }
                                $saldoCuota -= $nuevaCuota;
                                $baseCuota = $saldoCFP;
        
                                $u->eLinea("nuevaCuota:  | ");
                                $u->eLinea("             | nuevaCuota   : $nuevaCuota | $idMonedaCuota");
                                $u->eLinea("             | baseCuota    : $baseCuota");
                                $u->eLinea("             | saldoCuota   : $saldoCuota");
        
                                $cDT = new CobroDetalle;
                                $cDT->typeDT            = 21; //Recibo Cobrado
                                $cDT->idCuota           = $cuota->idCuota;
                                $cDT->idE               = $cuota->idE;
                                $cDT->anoDT             = $cuota->anoDT;
                                $cDT->mesDT             = $cuota->mesDT;
                                $cDT->ref               = null;
                                $cDT->montoItemCobro    = $cuota->montoDT;
                                $cDT->indexCFP          = $iCFP;
                                $cDT->fechaCFP          = $cfp->dateCFP;
                                $cDT->montoTotalCFP     = $cfp->montoCFP;
                                $cDT->tcCobro_idTC      = $cuota->tcCobro_idTC;
                                $cDT->tcCobro_valor     = $cuota->tcCobro_valor;
                                $cDT->tcCobro_date      = $cuota->tcCobro_date;
                                $cDT->tcCobro_isPeriodoGracia = $cuota->tcCobro_isPeriodoGracia;
                                $cDT->montoDT           = round($nuevaCuota, 2);
                                $cDT->idMonedaDT        = $cuota->idMoneda;
                                $cDT->idCFP             = $cfp->idCFP;
                                $cDT->montoCFP          = $saldoCFP;
                                $cDT->idMonedaCFP       = $cfp->idMoneda;
                                $cDT->modoLineaDT       = $modoLineaDT;
                                $cDT->modoLineaCFP      = $modoLineaCFP;
            
                                $cobroDetalles[] = $cDT;
                                $u->eLinea("CobroDetalle montoDT: $cDT->montoDT | montoCFP: $cDT->montoCFP");
                                $saldoCFP = 0;
                                $modoLineaDT = 0;
                                $modoLineaCFP = 0;

                                $u->eLinea("..: saldoCFP es CERO : pedir nuevo pago");

                                if(++$iCFP < $countCFP){
                                    $cfp = $this->CFP[$iCFP];
                                    $saldoCFP += $cfp->montoCFP;
                                    $u->eLinea("nuevo pago: $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");
                                    $modoLineaCFP = 1;
                                }                   
                                break;
                            }
                        }

                        if(!$isAlcanzaCFP){
                            $u->eLinea("..: NO alcanzan la suma de los pagos CFP para pagar la cuota");
                            $u->eLinea("(break while):saldoCuota: $saldoCuota > 0 | saldoCFP: $saldoCFP");
                            $cobroDetalles = [];
                            break;
                        }
                    }

                    $u->eLinea("(while):saldoCuota: $saldoCuota > 0 | saldoCFP: $saldoCFP");

                //mientras los pagos no alcancen para pagar la cuota
                } while($saldoCuota > 0.004);

            }

            $pagado = ($saldoCuota <= 0.004);
            $u->eLinea("<------ fin Cuota: | saldoCuota: $saldoCuota | saldoCFP: $saldoCFP | ". ($pagado?"SI":"NO") ." Pagado");
            $u->eLinea("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+");

        }
        $u->eLinea("itemsCobros: | FIN");
        $u->eLinea("             | saldoCuota   : $saldoCuota | $idMonedaCuota");
        $u->eLinea("             | saldoCFP     : $saldoCFP");
        $u->eLinea("             | saldoPeriodo : $saldoCFP_periodo");

        if(! empty($cobroDetalles)) {
            $u->eLinea("cobroDetalles no empty | count: ".count($this->cobroDetalles)." | ".count($cobroDetalles));
            foreach($cobroDetalles as $cDT) { $this->cobroDetalles[] = $cDT; }
            $cobroDetalles = [];
            $saldoCFP_periodo = $saldoCFP;
        }


        //Abono
        if($saldoCFP_periodo > 0.004){
            $u->eLinea("<------ Abono " . date("d-m-Y", strtotime($cfp->dateCFP)));

            $cDT = new CobroDetalle;
            $cDT->typeDT            = 29; //Abono
            $cDT->idCuota           = null;
            $cDT->idE               = $this->idE;
            $cDT->anoDT             = null;
            $cDT->mesDT             = null;
            $cDT->ref               = $cfp->dateCFP;
            $cDT->montoItemCobro    = $saldoCFP_periodo;
            $cDT->indexCFP          = $iCFP;
            $cDT->fechaCFP          = $cfp->dateCFP;
            $cDT->montoTotalCFP     = $cfp->montoCFP;
            $cDT->tcCobro_idTC      = null;
            $cDT->tcCobro_valor     = null;
            $cDT->tcCobro_date      = null;
            $cDT->tcCobro_isPeriodoGracia = null;
            $cDT->idCFP             = $cfp->idCFP;
            $cDT->montoDT           = $saldoCFP_periodo;
            $cDT->montoCFP          = $saldoCFP_periodo;
            $cDT->idMonedaDT        = $cfp->idMoneda;
            $cDT->idMonedaCFP       = $cfp->idMoneda;
            $cDT->modoLineaDT       = 1;
            $cDT->modoLineaCFP      = $modoLineaCFP;

            $this->cobroDetalles[] = $cDT;
            $u->eLinea("CobroDetalle montoDT: $cDT->montoDT | montoCFP: $cDT->montoCFP");
        }

        $u->eLinea('--------------------------------------------------------------- FIN');

        //debug
        //return $u->logList;

        $res = [
            "cobroDetalles" => $this->cobroDetalles,
            "log"           => $u->logList,
        ];

        return $res;

        //return $this->cobroDetalles;

    }

    public function procesarCobro() {
        $u = new U;
        $u->isEcho = false;
        $u->log = '';
        $u->eLinea('... procesarCobro():::...');
        $u->eLinea('--------------------------------------------------------------- INICIO');

        DB::beginTransaction();
        try{    
            //cobro
            $cobro = new Cobro;
            $cobro->fill($this->attributes);
            $cobro->save();

            $idCobro = $cobro->idCobro;
            $u->eLinea("idCobro: $idCobro");
            
            $u->eLinea("CFPs ->");
            foreach($this->CFP as $cfp){

                $cfp->idCobro = $idCobro;
                $cfp->save();
                $u->eLinea("dateCFP: $cfp->dateCFP | idCFP: $cfp->idCFP | cobro: $idCobro");

            }

            $u->eLinea("tdtCobros ->");
            foreach($this->tdtCobros as $tdtCobro){
                $tdtCobro->idCobro = $idCobro;

                $tdtCobro->tDT->save();
                $tdtCobro->idDT = $tdtCobro->tDT->idDT;
                $tdtCobro->save();

                if(isset($tdtCobro->cuota)) {
                    Cuota::updateIdDTCuotaCobro($tdtCobro->cuota->idCuota, $tdtCobro->tDT->idDT);
                }
                
                $u->eLinea("tdtCobro: ". $tdtCobro);
                $u->eLinea("TransDT: ". $tdtCobro->tDT);
                $u->eLinea("cuota: ". $tdtCobro->cuota);
                
            }
 
        /*
            foreach($this->cobroDetalles as $cDT){

                $idCuota = $cDT['idCuota'];

                $u->eLinea("idCuota: $idCuota");

                //print_r($cDT);

                

                $iDT_cuota = new TransDT;
                $iDT_cuota->fill([
                    'ctaDT'         => 130,
                    'dhDT'          => TransDT::$dhH,
                    //'montoDT'       => $total_cuota_USD,
                    'typeDT'        => TransDT::$TYPE_CUOTA,
                    'anoDT'         => $cond->anoCond,
                    'mesDT'         => $cond->mesCond,
                    'idE'           => $a->idE,
                    'idT'           => $cond->idTCond,
                    'idMoneda'      => 1002 //USD
                ]);
                print_r($iDT_cuota->attributes);
                //$iDT_cuota->save();

                
                $cfpDT = TransDTCobroCFP::fill([
                    'idCobro'       => $this->idCobro,
                    'idDT'          => $iDT_cuota->idDT,
                    'idCFP'         =>
                    'idCuota'       =>
                    'montoCFP'      =>
                    'montoDT'       =>
                    'idMoneda'      =>
                    'idTC'          =>
                ]);
                $this->tdtCobrosCFP[] = $cfpDT;
                
                
            }
        */

            DB::commit();

        }catch (\Exception $e) {
            DB::rollback();
            $u->eLinea('--------------------------------------------------------------- ERROR');
            $u->eLinea($e->getMessage());

            return response()->json([
                'codResp'   => 99,
                'cobro'     => $this,
                'res'       => $u->logList,
                'message'   => [$e->getMessage()],
            ], 200);   

        }


        $u->eLinea('--------------------------------------------------------------- END');
        return $u->logList;
    }

    public function calcularCobro_CuotasCond(){
        $res = [];
        $u = new U;
        $u->isEcho = false;
        $u->log = '';
        $u->eLinea('--------------------------------------------------------------- INICIO');

        $cuotasCond = CuotaCond::getCuotasCond($this->idE);

        //inicializacion
        $saldoCFP = 0;

        $sizeCFP = count($this->CFP);
        $u->eLinea("sizeCFP: $sizeCFP");
        $iCFP = 0;
        //primer CFP
        $cfp = $this->CFP[$iCFP];
        $cfp->idCobro = $this->idCobro;
        //$cfp->save();

        $saldoCFP += $cfp->montoCFP;
        $u->eLinea("pago: $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");

        array_push($res,[
            'linea' => 1,
            'c1' => "Pago " . date("d-m-Y", strtotime($cfp->dateCFP)),
            'c2' => "",
            'c3' => number_format($cfp->montoCFP, 2, ',', '.'),
            'c4' => "",
            'c5' => "",
            'c6' => ""
        ]);

        $saldoCFP_inicial = $saldoCFP;
        foreach($cuotasCond as $cc){
            $u->eLinea("----------cc: ". $cc->getPeriodo() ." | $cc->idCond | $cc->sumMontoCuota");
            $lineaSep = 2;
            $resCuota = [];

            foreach($cc->cuotas as $c){
                $u->eLinea("cuota: $c->idMoneda | $c->montoDT");

                $symbolMoneda = $c->idMoneda==1002?"$":"";

                $montoCuota = floatval($c->montoDT);

                $saldoCuota = $montoCuota;
                do{
                    $baseCuota = $saldoCuota;
                    //si las monedas son distintas
                    $isMonedaDistinta = false;
                    if($cfp->idMoneda != $c->idMoneda){
                        $u->eLinea("monedas distintas | cfp: $cfp->idMoneda | c: $c->idMoneda");
                        $isMonedaDistinta = true;
                        //calcula la tasa segun fecha correspondiente
                        $c->calcularTasa($cfp->dateCFP, $saldoCuota);
                        $u->eLinea("tc: $saldoCuota | ($c->tcCobro_date) $c->tcCobro_valor | $c->tcCobro_montoCuota ");
                        $baseCuota = $c->tcCobro_montoCuota;
                    }
                    $u->eLinea("saldoCuota: $saldoCuota | baseCuota: $baseCuota | saldoPago: $saldoCFP");

                    //SI alcanza el saldo para pagar la cuota
                    if($saldoCFP >= $baseCuota){
                        $u->eLinea("..... ($saldoCFP : $baseCuota) : SI alcanza el saldo para pagar la cuota");

                        array_push($resCuota,[
                            'linea' => $lineaSep,
                            'c1' => $isMonedaDistinta?number_format($c->tcCobro_valor, 2, ',', '.')."(".date("d-m-Y", strtotime($c->tcCobro_date)).")":"",
                            'c2' => $isMonedaDistinta?number_format($saldoCuota, 2, ',', '.') . $symbolMoneda:"",
                            'c3' => "",
                            'c4' => number_format($baseCuota, 2, ',', '.'),
                            'c5' => $cc->getPeriodo(),
                            'c6' => $isMonedaDistinta?number_format($montoCuota, 2, ',', '.') . $symbolMoneda:"",
                        ]);
                        $tDT = new TransDT;
                        $tDT->ctaDT = 130;
                        $tDT->dhDT = TransDT::$dhH;
                        $tDT->montoDT = $montoCuota;
                        $tDT->typeDT = 21;
                        $tDT->anoDT = $cc->ano;
                        $tDT->mesDT = $cc->mes;
                        $tDT->idE = $cc->idE;
                        $tDT->idMoneda = $c->idMoneda;
                        //$tDT->save();

                        $cfpDT = new TransDTCobroCFP;
                        $cfpDT->idDT = $tDT->idDT;
                        $cfpDT->idCobro = $this->idCobro;
                        //$cfpDT->save();




                        $lineaSep = 0;

                        $saldoCFP -= $baseCuota;
                        $saldoCuota = 0;

                        break;
                    //NO alcanza el saldo para pagar la cuota
                    }else{
                        $u->eLinea("..... ($saldoCFP : $baseCuota) : NO alcanza el saldo para pagar la cuota");

                        if($saldoCFP>0.004){
                            $u->eLinea("..: saldoCFP mayor a CERO: $saldoCFP | tcCobro_valor: $c->tcCobro_valor");

                            if(isset($c->tcCobro_valor)){
                                $nuevaCuota = $saldoCFP / $c->tcCobro_valor;
                                $cambioDes = number_format($c->tcCobro_valor, 2, ',', '.')."(".date("d-m-Y", strtotime($c->tcCobro_date)).")";
                            }else{
                                $nuevaCuota = $saldoCFP;
                                $cambioDes = '';
                            }
                            $saldoCuota -= $nuevaCuota;
                            $baseCuota = $saldoCFP;

                            array_push($resCuota,[
                                'linea' => $lineaSep,
                                'c1' => $cambioDes,
                                'c2' => number_format($nuevaCuota, 2, ',', '.') . $symbolMoneda,
                                'c3' => "",
                                'c4' => number_format($saldoCFP, 2, ',', '.'),
                                'c5' => $cc->getPeriodo(),
                                'c6' => number_format($montoCuota, 2, ',', '.') . $symbolMoneda,
                            ]);
                            $lineaSep = 0;

                            $u->eLinea("..: nuevaCuota: $nuevaCuota | baseCuota: $baseCuota | saldoCuota: $saldoCuota");
                            $saldoCFP = 0;
                        }

                        $u->eLinea("..: saldoCFP es CERO : pedir nuevo pago");

                        if(++$iCFP < $sizeCFP){
                            $cfp = $this->CFP[$iCFP];
                            $saldoCFP += $cfp->montoCFP;
                            $u->eLinea("pago: $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");
                            array_push($resCuota,[
                                'linea' => 1,
                                'c1' => "Pago " . date("d-m-Y", strtotime($cfp->dateCFP)),
                                'c2' => "",
                                'c3' => number_format($cfp->montoCFP, 2, ',', '.'),
                                'c4' => "",
                                'c5' => "",
                                'c6' => ""
                            ]);

                        }else{
                            $u->eLinea("..: no se encontro nuevo pago");
                            break;
                        }

                    }

                    $u->eLinea("(while):saldoCuota: $saldoCuota > 0 | saldoCFP: $saldoCFP");

                //mientras los pagos no alcancen para pagar la cuota
                } while($saldoCuota > 0.004);
            }
            $pagado = ($saldoCuota<=0);
            $u->eLinea("cobroCondo: ". $cc->getPeriodo() ." | saldoCuota: $saldoCuota | saldoCFP: $saldoCFP | ". ($pagado?"SI":"NO") ." Pagado | FIN");
            $cc->isPagado = $pagado;

            if($pagado){
                $saldoCFP_inicial = $saldoCFP;
                $res = array_merge($res, $resCuota);
            }

        }
        if($saldoCFP_inicial > 0.004){
            array_push($res,[
                'linea' => 2,
                'c1' => "",
                'c2' => "",
                'c3' => "",
                'c4' => number_format($saldoCFP_inicial, 2, ',', '.'),
                'c5' => "Abono",
                'c6' => date("d-m-Y", strtotime($cfp->dateCFP)),
            ]);

        }

        $estadoPendientes = 0;
        foreach($cuotasCond as $cc){

            if($cc->isPagado){continue;}

            if($estadoPendientes == 0){
                array_push($res,[
                    'linea' => 1,
                    'c1' => "PENDIENTES POR PAGAR",
                    'c2' => "",
                    'c3' => "",
                    'c4' => "",
                    'c5' => "",
                    'c6' => "",
                ]);
                $estadoPendientes = 1;
            }

            $lineaSep = 2;
            $resCuota = [];
            foreach($cc->cuotas as $c){

                $u->eLinea("cuota: $c->idMoneda | $c->montoDT");

                $montoCuota = floatval($c->montoDT);
                $symbolMoneda = $c->idMoneda==1002?"$":"";

                array_push($resCuota,[
                    'linea' => $lineaSep,
                    'c1' => "",
                    'c2' => "",
                    'c3' => "",
                    'c4' => "",
                    'c5' => $cc->getPeriodo(),
                    'c6' => number_format($montoCuota, 2, ',', '.') . $symbolMoneda,
                ]);
                $lineaSep = 0;

            }
            $res = array_merge($res, $resCuota);

        }

        $u->eLinea('--------------------------------------------------------------- FIN');

        return $res;
    }

    static public function generarCobrosTdtCFP(){

        //$CFPs = CobroFormaPago::orderBy('idCobro', 'asc')->orderBy('dateCFP', 'asc')->get();

        //CobrosDTViews
        $cobrosTDTv = CobroDTView
            ::Where('codEdifCuota', '4255')
            //::Where('idCobro', 100100260000000124)
            ->orderBy('idCobro', 'asc')
            ->orderBy('anoDT', 'asc')
            ->orderBy('mesDT', 'asc')
            ->orderBy('idMoneda', 'asc')
            ->get();

        $idCobros = $cobrosTDTv->pluck('idCobro')->unique();

        $CFPs = CobroFormaPago::whereIn('idCobro', $idCobros)
            ->orderBy('dateCFP', 'asc')
            ->get();    

        $cobro = new Cobro;
        $i_cobros = 0;
        $i_tdt = 0;
        $i_cfp = 0;
        foreach ($idCobros as $idCobro) {

            $cobrosDTview_cobro = $cobrosTDTv->whereIn('idCobro', $idCobro);

            $isfirst = true;
            foreach ($cobrosDTview_cobro as $cTDTv) {

                if($isfirst){        
                    $cobro = new Cobro;
                    $cobro->fill($cTDTv->attributes);
                    $cobro->idCobro = $idCobro;

                    echo PHP_EOL;
                    echo ++$i_cobros .' | '. "$idCobro | $cobro->dateCobro". PHP_EOL;

                    $CFPs_cobro = $CFPs->where('idCobro', $idCobro);

                    echo 'CFP --------------------------'. PHP_EOL;
                    foreach($CFPs_cobro as $cfp) {
                        echo '     '. ++$i_cfp ." $cfp->idCFP | $cfp->dateCFP | $cfp->montoCFP | p/$cfp->idPlanilla". PHP_EOL;
                        $cobro->CFP[] = $cfp;
                    }
                    echo 'tdt --------------------------'. PHP_EOL;
                    $cobro->sum_tdt_VES = 0;
                    $cobro->sum_tdt_USD = 0;
                    
                    $isfirst = false;
                }
                $montoDT = $cTDTv->montoDT;

                $tdtCobro = new TransDTCobro;
                $tdtCobro->idCuota = $cTDTv->idCuota;
                $tdtCobro->idCobro = $idCobro;
                $tdtCobro->idDT = $cTDTv->idDT_cc;

                $tdtCobro->cuota = new CuotaView;
                $tdtCobro->cuota->fill($cTDTv->attributes);
                $tdtCobro->cuota->idE = $cTDTv->idECuota;
                $tdtCobro->cuota->idTCobro = $cTDTv->idT_cc;

                $tdtCobro->tDT = new TransDT;
                $tdtCobro->tDT->fill([
                    'ctaDT'         => $cTDTv->ctaDT_cc,
                    'dhDT'          => $cTDTv->dhDT_cc,
                    'montoDT'       => $cTDTv->montoDT_cc,
                    'typeDT'        => $cTDTv->typeDT_cc,
                    'anoDT'         => $cTDTv->anoDT_cc,
                    'mesDT'         => $cTDTv->mesDT_cc,
                    'idE'           => $cTDTv->idEdtCuotaCobro,
                    'idT'           => null,
                    'idMoneda'      => $cTDTv->idMoneda_cc,
                ]);
                $tdtCobro->tDT->idDT = $cTDTv->idDT_cc;
                
                $cobro->tdtCobros[] = $tdtCobro;

                if($cTDTv->idMoneda==1001){
                    $cobro->sum_tdt_VES += $montoDT;
                }else{
                    $cobro->sum_tdt_USD += $montoDT;
                }

                echo '    '. ++$i_tdt .' | ';
                echo "$cTDTv->codEdifCuota | ".trim($cTDTv->codAptoCuota)." ($cTDTv->mesDT/$cTDTv->anoDT) : "
                    .number_format($montoDT, 2, ',', '.') 
                    .($cTDTv->idMoneda==1001?' Bs | ':' $ | ')
                    .number_format($cobro->sum_tdt_VES, 2, ',', '.') .' Bs | '
                    .number_format($cobro->sum_tdt_USD, 2, ',', '.') .' $ '
                    .PHP_EOL;

            }
            echo 'cobros_tdt_cfp ---------------'. PHP_EOL;
            $cobro->makeCobroTdtCFP();

        }
        echo PHP_EOL;
        echo "FIN -> cobros: $i_cobros | tdt: $i_tdt | cfp: $i_cfp" . PHP_EOL;

    }

    private function makeCobroTdtCFP() {
        // genero el cobro con toda la informacion reconstruida en $cobro
        $res = $this->generarCobro();

        $this->cobrotDTCFP = [];

        $i_cobros_tdt_cfp = 0;
        foreach($res['cobroDetalles'] as $cDT){
            echo '['. ++$i_cobros_tdt_cfp .']'. PHP_EOL;

            $ctDTCFP = new CobroTdtCFP();
            $ctDTCFP->idCobro = $this->idCobro;

            switch($cDT->typeDT) {
                case 21: //cuota
                    $found_key = array_search($cDT->idCuota, array_column($this->tdtCobros, 'idCuota'));
                     
                    $ctDTCFP->idCuota = $this->tdtCobros[$found_key]['idCuota'];
                    $ctDTCFP->idDT = $this->tdtCobros[$found_key]->tDT->idDT;
                 
                    break;

                case 29: //abono
                    echo "ABONO". PHP_EOL;
                    break;

                default:
                    echo "OTROS". PHP_EOL;
            }
            
            $ctDTCFP->idCFP         = $cDT->idCFP;
            $ctDTCFP->montoCFP      = $cDT->montoCFP;
            //$ctDTCFP->idMonedaCFP   = $cDT->idMonedaCFP;
            $ctDTCFP->montoDT       = $cDT->montoDT;
            $ctDTCFP->idMonedaDT    = $cDT->idMonedaDT;
            $ctDTCFP->idTC          = $cDT->tcCobro_idTC;

            $this->cobrotDTCFP[] = $ctDTCFP;

            echo "    idCobro: $ctDTCFP->idCobro ". PHP_EOL ;
            echo "       idDT: $ctDTCFP->idDT". PHP_EOL;
            echo "      idCFP: $ctDTCFP->idCFP " . PHP_EOL;
            echo "    idCuota: $ctDTCFP->idCuota". PHP_EOL;
            echo "   montoCFP: ". number_format($ctDTCFP->montoCFP, 2, ',', '.').($cDT->idMonedaCFP==1001?' Bs':' $'). PHP_EOL;
            echo "    montoDT: ". number_format($ctDTCFP->montoDT, 2, ',', '.').($ctDTCFP->idMonedaDT==1001?' Bs':' $'). PHP_EOL;
            echo "       idTC: $ctDTCFP->idTC". PHP_EOL;

            DB::beginTransaction();
            try{
                $ctDTCFP->save();
                echo '(save) idCobroCFP: ' . $ctDTCFP->idCobroCFP . PHP_EOL;

                DB::commit();

            }catch (\Exception $e) {
                DB::rollback();

                echo '+++++++++++++++++++++++++++++++++++++++++++++++  rollback'.PHP_EOL ;

                print_r($cDT);

                var_dump($e->getMessage());

                echo json_encode($this, JSON_PRETTY_PRINT);
                
                exit(0);
            }

            //print_r($cDT);
        }

    } 

    public function generarTransCobro(){
    }

    /*
    public function generarCobro_old(){
        $u = new U;
        $u->isEcho = true;
        $u->log = '';
        $u->eLinea('... generarCobro():::...');
        $u->eLinea('--------------------------------------------------------------- INICIO');

        $cuotasCond = CuotaCond::getCuotasCond($this->idE);

        //inicializacion
        $u->eLinea('inicializacion');
        $this->idCobro = 1001;
        $saldoCFP = 0;
        $idDT_temp  = 2000;
        $this->tdtCobros = [];
        $this->tdtCobrosCFP = [];

        $countCFP = count($this->CFP);
        $u->eLinea("countCFP: $countCFP");
        $iCFP = 0;
        //primer CFP
        $cfp = $this->CFP[$iCFP];

        $saldoCFP += $cfp->montoCFP;
        $u->eLinea("pago (primero): $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");

        $saldoCFP_inicial = $saldoCFP;
        foreach($cuotasCond as $cc){
            $u->eLinea("----------cc: ". $cc->getPeriodo() ." | $cc->idCond | $cc->sumMontoCuota");
            $tdtCobrosCFP = [];
            $tdtCobros = [];

            foreach($cc->cuotas as $c){
                $u->eLinea("cuota: $c->idMoneda | $c->montoDT");

                $montoCuota = floatval($c->montoDT);
                $saldoCuota = $montoCuota;

                $tDT = new TransDT;
                $tDT->idDT = ++$idDT_temp;
                $tDT->ctaDT = 130;
                $tDT->dhDT = TransDT::$dhH;
                $tDT->montoDT = $montoCuota;
                $tDT->typeDT = 21;
                $tDT->anoDT = $cc->ano;
                $tDT->mesDT = $cc->mes;
                $tDT->idE = $cc->idE;
                $tDT->idMoneda = $c->idMoneda;
                $tdtCobros[] = $tDT;
                $u->eLinea("TransDT nuevo: $idDT_temp");

                do{
                    $baseCuota = $saldoCuota;
                    //si las monedas son distintas
                    if($cfp->idMoneda != $c->idMoneda){
                        $u->eLinea("monedas distintas | cfp: $cfp->idMoneda | c: $c->idMoneda");
                        //calcula la tasa segun fecha correspondiente
                        $c->calcularTasa($cfp->dateCFP, $saldoCuota);
                        $u->eLinea("tc: $saldoCuota | ($c->tcCobro_date) $c->tcCobro_valor | $c->tcCobro_montoCuota ");
                        $baseCuota = $c->tcCobro_montoCuota;
                    }
                    $u->eLinea("saldoCuota: $saldoCuota | baseCuota: $baseCuota | saldoPago: $saldoCFP");

                    //SI alcanza el saldo para pagar la cuota
                    if($saldoCFP >= $baseCuota){
                        $u->eLinea("..... ($saldoCFP : $baseCuota) : SI alcanza el saldo para pagar la cuota");

                        $cfpDT = new TransDTCobroCFP;
                        $cfpDT->idDT = $idDT_temp;
                        $cfpDT->idCFP = $cfp->idCFP;
                        $cfpDT->montoCFP = $baseCuota;
                        $cfpDT->montoDT = $saldoCuota;
                        $cfpDT->idTC = $c->idTC;
                        $cfpDT->idCuota = $c->idCuota;
                        $this->tdtCobrosCFP[] = $cfpDT;
                        $u->eLinea("TransDTCobroCFP nuevo: $idDT_temp : $cfp->idCFP");

                        $saldoCFP -= $baseCuota;
                        $saldoCuota = 0;

                        break;
                    //NO alcanza el saldo para pagar la cuota
                    }else{
                        $u->eLinea("..... ($saldoCFP : $baseCuota) : NO alcanza el saldo para pagar la cuota");

                        if($saldoCFP>0.004){
                            $u->eLinea("..: saldoCFP mayor a CERO: $saldoCFP | tcCobro_valor: $c->tcCobro_valor");

                            if(isset($c->tcCobro_valor)){
                                $nuevaCuota = $saldoCFP / $c->tcCobro_valor;
                            }else{
                                $nuevaCuota = $saldoCFP;
                            }
                            $saldoCuota -= $nuevaCuota;
                            $baseCuota = $saldoCFP;

                            $cfpDT = new TransDTCobroCFP;
                            $cfpDT->idDT = $idDT_temp;
                            $cfpDT->idCFP = $cfp->idCFP;
                            $cfpDT->montoCFP = $saldoCFP;
                            $cfpDT->montoDT = $nuevaCuota;
                            $cfpDT->idTC = $c->idTC;
                            $cfpDT->idCuota = $c->idCuota;
                            $tdtCobrosCFP[] = $cfpDT;
                            $u->eLinea("TransDTCobroCFP nuevo: $idDT_temp - $cfp->idCFP");

                            $u->eLinea("..: nuevaCuota: $nuevaCuota | baseCuota: $baseCuota | saldoCuota: $saldoCuota");
                            $saldoCFP = 0;
                        }

                        $u->eLinea("..: saldoCFP es CERO : pedir nuevo pago");

                        if(++$iCFP < $countCFP){
                            $cfp = $this->CFP[$iCFP];
                            $saldoCFP += $cfp->montoCFP;
                            $u->eLinea("pago: $cfp->dateCFP | $cfp->idMoneda | $cfp->montoCFP");
                        }else{
                            $u->eLinea("..: no se encontro nuevo pago");
                            break;
                        }
                    }

                    $u->eLinea("(while):saldoCuota: $saldoCuota > 0 | saldoCFP: $saldoCFP");

                //mientras los pagos no alcancen para pagar la cuota
                } while($saldoCuota > 0.004);
            }
            $pagado = ($saldoCuota<=0);
            $u->eLinea("cobroCondo: ". $cc->getPeriodo() ." | saldoCuota: $saldoCuota | saldoCFP: $saldoCFP | ". ($pagado?"SI":"NO") ." Pagado | FIN");
            $cc->isPagado = $pagado;

            if($pagado){
                $saldoCFP_inicial = $saldoCFP;
                $u->eLinea("tdtCobros    : " . count($tdtCobros));
                $u->eLinea("tdtCobrosCFP : " . count($tdtCobrosCFP));

                $this->tdtCobros    = array_merge($this->tdtCobros,     $tdtCobros);
                $this->tdtCobrosCFP = array_merge($this->tdtCobrosCFP,  $tdtCobrosCFP);
            }
        }

        //Abono
        if($saldoCFP_inicial > 0.004){
            $u->eLinea("Abono " . date("d-m-Y", strtotime($cfp->dateCFP)));

            $tDT = new TransDT;
            $tDT->idDT = ++$idDT_temp;
            $tDT->ctaDT = 131.60;
            $tDT->dhDT = TransDT::$dhH;
            $tDT->montoDT = $saldoCFP_inicial;
            $tDT->typeDT = 29;
            $tDT->anoDT = $cc->ano;
            $tDT->mesDT = $cc->mes;
            $tDT->idE = $cc->idE;
            $tDT->idMoneda = $cfp->idMoneda;
            $this->tdtCobros[] = $tDT;
            $u->eLinea("TransDT nuevo: $idDT_temp");

            $cfpDT = new TransDTCobroCFP;
            $cfpDT->idDT = $idDT_temp;
            $cfpDT->idCFP = $cfp->idCFP;
            $cfpDT->montoCFP = $saldoCFP_inicial;
            $cfpDT->montoDT = $saldoCFP_inicial;
            $cfpDT->idTC = null;
            $cfpDT->idCuota = null;
            $this->tdtCobrosCFP[] = $cfpDT;
            $u->eLinea("TransDTCobroCFP nuevo: $idDT_temp - $cfp->idCFP");
        }

        $u->eLinea('--------------------------------------------------------------- FIN');

        return $this->tdtCobrosCFP;

    }
    */
    /*
    public function calcularCobro_deprecated(){
        $u = new U;
        $u->log = '';

        $cuotasView = CuotaView::getCuotasViewPendientes_entidad($this->idE);

        $cv_size = count($cuotasView);
        $u->eLinea("cuotas size : " . $cv_size . " | idE: " . $this->idE);
        $u->eLinea('-------------------------------------------------------------------cuotasview');

        $trans = [];

        //inicializacion pagos
        $i_p = 0;
        $saldoPago = 0;
        $p_size = count($this->CFP);

        //primer pago
        $fechaIngreso = $this->CFP[$i_p]->dateCFP;
        $montoPago =    $this->CFP[$i_p]->montoCFP;
        $monedaPago =   $this->CFP[$i_p]->idMoneda;
        $u->eLinea("pago..: " . $fechaIngreso . " - " . $montoPago . " : " . $monedaPago);
        $u->eLinea('-------------------------------------------------------------------pago');
        $saldoPago += $montoPago;
        $transPago = [
            'descripcion'   => "pago ($fechaIngreso)",
            'monto'         => number_format($montoPago, 2, ',', '.'),
            'saldo'         => number_format($saldoPago, 2, ',', '.')
        ];
        array_push($trans, $transPago);

        //cuotas
        $i_cv = 0;
        $i_cv_cond = 0;
        $montoCuotaBaseCond = 0;
        $cuotas = [];
        $recibos = [];
        while($i_cv < $cv_size){ //mientras no sea el ultimo elemento cuota
            $cv = $cuotasView[$i_cv];
            $idCond = $cv->idCond;
            $montoCuota = floatval($cv->montoDT);

            $u->eLinea(
                ":     : ".
                $i_cv . "... " .
                $cv->anoDT ."-". U::getMesTxt($cv->mesDT) .
                " | cond: " . $idCond .
                " [". $cv->idMoneda ."] " . $montoCuota ." ". $cv->getSymboloMoneda()
            ,false);

            //monto saldo pendiente de la cuota
            $montoCuotaSaldo = $montoCuota;
            do{//mientras los pagos no alcancen para pagar la cuota

                //calcula la tasa segun fecha correspondiente
                $cv->calcularTasa($fechaIngreso, $montoCuotaSaldo);

                if(!is_null($cv->tcDate)){
                    $u->eLinea(" | [(". date("d-m-Y",strtotime($cv->tcDate)) .")@". $cv->tcValor ."] | ". $cv->montoCuotaBase ." VES | ". (($cv->isPeriodoGracia)?"(pg)":""));
                }

                $u->eLinea('montoCuotaSaldo: '. $montoCuotaSaldo .' | montoCuota: '. $montoCuota);

                //no alcanza el saldo para pagar la cuota
                if($saldoPago < $cv->montoCuotaBase){
                    $u->eLinea('---. no alcanza para pagar | saldoPago: '. $saldoPago .' | montoCuotaBase: ' . $cv->montoCuotaBase);
                    //cuanto hay? $saldoPago

                    $descripcion = "saldo (". date("d-m-Y",strtotime($cv->tcDate)) .")";
                    switch($cv->idMoneda){
                        case 1001: //VES
                            $montoCuotaSaldo = $montoCuota - $saldoPago;
                            $u->eLinea('---.---. VES montoCuotaSaldo: '. $montoCuotaSaldo);
                            break;
                        case 1002: //U$D
                            $montoCuotaActual = ($saldoPago/$cv->tcValor);
                            $montoCuotaSaldo = $montoCuota - $montoCuotaActual;
                            $descripcion .= " [". number_format($montoCuotaActual, 2, ',', '.') ."]@". number_format($cv->tcValor, 2, ',', '.');
                            $u->eLinea('---.---. U$D montoCuotaSaldo: '. $montoCuotaSaldo);
                            $u->eLinea('---.---. U$D montoCuotaActual: '. $montoCuotaActual);
                            break;
                    }


                    //trans cuota
                    $t = [
                        'descriptcion'  => $descripcion,
                        'monto'         => number_format((-1)*$saldoPago, 2, ',', '.'),
                        'saldo'         => '0,00'
                    ];
                    array_push($trans, $t);
                    $saldoPago = 0;

                    //nuevo pago
                    if($p_size-1 < ++$i_p){ break; }

                    $fechaIngreso = $this->CFP[$i_p]->dateCFP;
                    $montoPago =    $this->CFP[$i_p]->montoCFP;
                    $monedaPago =   $this->CFP[$i_p]->idMoneda;

                    $u->eLinea("pago..: " . $fechaIngreso . " | " . $montoPago . " | " . $monedaPago);
                    $u->eLinea('-------------------------------------------------------------------pago');
                    $saldoPago += $montoPago;

                    $transPago = [
                        'descripcion'   => "pago ($fechaIngreso)",
                        'monto'         => number_format($montoPago, 2, ',', '.'),
                        'saldo'         => number_format($saldoPago, 2, ',', '.')
                    ];
                    array_push($trans, $transPago);


                //si alcanza el saldo para pagar la cuota
                }else{
                    $montoCuotaSaldo = 0;
                }
                $u->eLinea('---. (while) montoCuotaSaldo: '. $montoCuotaSaldo .' | '. ($montoCuotaSaldo > 0.001));

            } while($montoCuotaSaldo > 0.001);



            if($saldoPago < $cv->montoCuotaBase){
                $u->eLinea(" | SALDO INSUFICIENTE : $saldoPago ");
                $i_cv = $i_cv_cond;
                $montoCuotaBaseCond = 0;
                break;

            }else{
                $saldoPago -= $cv->montoCuotaBase;

                $t = [
                    'descriptcion'  => '',
                    'monto'         => number_format((-1)*$cv->montoCuotaBase, 2, ',', '.'),
                    'saldo'         => number_format($saldoPago, 2, ',', '.'),
                ];
                array_push($trans, $t);

                $u->eLinea(" | PAGADO | SALDO : $saldoPago ");
            }

            $c = [
                'moneda'    => $cv->idMoneda,
                'monto'     => number_format($montoCuota, 2, ',', '.'),
                'montoBase' => number_format($cv->montoCuotaBase, 2, ',', '.'),
                'trans'     => $trans,
            ];
            array_push($cuotas, $c);

            $isCondEnd = false;
            //no es ultimo elemento
            if($i_cv < $cv_size-1){
                if($idCond != $cuotasView[$i_cv+1]->idCond || is_null($idCond)){
                    $isCondEnd = true;
                }
            //ultimo elemto
            }else{
                $isCondEnd = true;
            }
            if($isCondEnd){
                $u->eLinea('---------------------------------------------------------------cond');
                if(!is_null($cv->dateValorTC)){
                    $u->eLinea('fecha | emision: '. date("d-m-Y",strtotime($cv->dateValorTC)) .
                                    ' | vencimiento: '. date("d-m-Y",strtotime($cv->dateVenTasa)) .
                                    ' | [deposito: '. date("d-m-Y",strtotime($this->CFP[$i_p]->dateCFP)).']'
                                );
                }
                //$u->eLinea('     m.base: '. $montoCuotaBaseCond);

                $r = [
                    'periodo'   => $cv->anoDT ."-". U::getMesTxt($cv->mesDT),
                    'monto'     => $montoCuotaBaseCond,
                    'cuotas'    => $cuotas,
                ];
                array_push($recibos, $r);

                $u->eLinea('---------------------------------------------------------------cond:end');
                $montoCuotaBaseCond = 0;
                $cuotas = [];
                $i_cv_cond = $i_cv+1;
            }
            $trans = [];
            $i_cv++;
        }

        
        //if($saldoPago > 30000){
        //    $u->eLinea("60 SALDO AJUSTE APTO ($fechaIngreso)  $saldoPago | $monedaPago");
        //}
        

        $resCobro = [
            'idE'       => $this->idE,
            'recibos'   => $recibos,
        ];

        $u->eLinea("--- FIN" );

        //return;
        return $resCobro;
        //return $u->log;

    }
    */



}
