<?php

namespace Predial\Http\Controllers;

use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use PDF;

use Predial\Area;
use Predial\Avaluo;
use Predial\ConceptoPredial;
use Predial\CuentaBancaria;
use Predial\DetalleFacturaPredial;
use Predial\DetallePagoPredial;
use Predial\DestinoEconomico;
use Predial\Formulador;
use Predial\FacturaPredial;
use Predial\InteresDescuento;
use Predial\Http\Controllers\ExtractoController;
use Predial\Http\Controllers\ExcensionesController;
use Predial\Http\Controllers\LiquidadorInteresesController;
use Predial\Http\Controllers\PaqueteController;
use Predial\Http\Controllers\PagoPredialController;
use Predial\Mes;
use Predial\ParametrizacionAnio;
use Propial\PropietarioPredio;
use Predial\ParametrosBasicos;
use Predial\Predio;
use Predial\Tarifa;
use Predial\Tercero;
use Predial\Vencimiento;
use Predial\Propietario;

class FacturaPredialController extends Controller{

    public $path = "factura.";

    public function index($id_unico){
        if(!empty(session()->get('usuario'))){
            $id    = decrypt($id_unico);
            $anno  = DB::table("gr_ultimo_ano_pago")
                        ->where('predio', '=', $id)
                        ->max('anno');
            $yyyy = date("Y");

            if($anno == $yyyy){
                flash()->overlay("El predio esta a paz y salvo", "Información");

                return back();
            }else{
                $param = ParametrizacionAnio::find(session()->get('anno'));
                $valParamA= $param->id_unico;
                $facturaUl  = DB::table('gr_factura_predial')
                ->select('parametrizacionanno')                               
                ->orderBy('id_unico', 'desc')
                ->take(1)
                ->first();
                $valParamU= $facturaUl->parametrizacionanno;
            if ($valParamA<$valParamU) {
                $valAnnoPa= $param->anno;
                $annoPu  = DB::table('gf_parametrizacion_anno')
                ->select('anno')                               
                ->Where('id_unico', '=', $valParamU)
                ->first();
                $valAnnoPU= $annoPu->anno;
                flash()->overlay("No se pueden generar facturas con parametrización año anterior ($valAnnoPa) a la ya creada ($valAnnoPU).", "Información");
                return back();
            }else{ 
                if(!empty($anno)){

                    $annos = DB::table('gr_avaluo as ava')
                               ->select('ava.*')
                               ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                               ->Where('ava.predio', '=', $id)
                               ->Where('ava.anno', '>', $anno)
                               ->orderBy('ava.anno', 'desc')
                               ->distinct()
                               ->get();
                }else{
                    $annos = DB::table('gr_avaluo as ava')
                               ->select('ava.*')
                               ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                               ->Where('ava.predio', '=', $id)
                               ->Where('ava.anno', '>=', date('Y'))
                               ->orderBy('ava.anno', 'desc')
                               ->distinct()
                               ->get();
                }

                return view('factura.vistafactura', compact('annos', 'id_unico'));
             }
            }
        }else{
            return redirect("CerrarSesion");
        }
    }

    public function Generar(Request $request){
        if(!empty(session()->get('usuario'))){
            $id      = decrypt($request->predio);
            $date    = Carbon::now();
            $fecha   = $date->format('Y-m-d');
            $fecha_v = $date->lastOfMonth();
            $fecha_v = $fecha_v->format('Y-m-d');

            $param = ParametrizacionAnio::find(session()->get('anno'));

            $maxid  = DB::table('gr_factura_predial')->max('id_unico');
            $xxxn   = DB::table('gr_factura_predial')->where('id_unico', '=', $maxid)->first();
            $nomb   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'nombrebancopredial')->first();
            $ncta   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'numeroCtapredial')->first();
            $numero = FacturaPredialController::getNumberParam(session()->get('anno'));

            if($request->optValPago == 1){
                $avaluos = DB::table('gr_avaluo as ava')
                   ->select('ava.*')
                   ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                   ->Where('ava.anno', '=', $request->sltAnnoPagar)
                   ->Where('ava.predio', '=', $id)
                   ->orderBy('ava.anno', 'asc')
                   ->distinct()
                   ->get();
            }else{
                $anno  = DB::table("gr_ultimo_ano_pago")
                    ->where('predio', '=', $id)
                    ->max('anno');

                if(empty($anno)){
                        $avaluos = DB::table('gr_avaluo as ava')
                           ->select('ava.*')
                           ->Where('ava.anno', '<=', $request->sltAnnoPagar)
                           ->Where('ava.predio', '=', $id)
                           ->orderBy('ava.anno', 'asc')
                           ->distinct()
                           ->get();
                }else{
                    if(($request->optValPago == 2) && ($request->sltAnnoPagar == date('Y'))){
                        $avaluos = DB::table('gr_avaluo as ava')
                            ->select('ava.*')
                            ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                            ->Where('ava.predio', '=', $id)
                            ->Where('ava.anno', '>', $anno)
                            ->orderBy('ava.anno', 'asc')
                            ->distinct()
                            ->get();
                    }else{
                        $avaluos = DB::table('gr_avaluo as ava')
                            ->select('ava.*')
                            ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                            ->Where('ava.predio', '=', $id)
                            ->Where('ava.anno', '<=', $request->sltAnnoPagar)
                            ->Where('ava.anno', '>', $anno)
                            ->orderBy('ava.anno', 'asc')
                            ->distinct()
                            ->get();
                    }
                }
            }

            $factura = FacturaPredialController::guardarCabezaFactura($numero, $fecha_v, $fecha, $id);
            $predio  = Predio::find($id);
            $destino = DestinoEconomico::find($predio->destino_economico);
            $area    = Area::where('predio', $id)
                            ->where('tipoarea', 1)
                            ->orderBy('anio', 'desc')
                            ->first();

            $compania = DB::table('gf_tercero as ter')
                            ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                      DB::raw('UPPER(ti.nombre) as tipodoc'),
                                      DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                      'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                              )
                            ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                            ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                            ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                            ->where('ter.id_unico', '=', session()->get('compania'))
                            ->first();
            $data  = DB::table('gr_factura_predial')
                        ->select(
                            'id_unico', 'numero', DB::raw('DATE_FORMAT(fechafactura, "%d/%m/%Y") as fechafactura'),
                            DB::raw('DATE_FORMAT(fechavencimiento, "%d/%m/%Y") as fechavencimiento'), 'descripcion',
                            DB::raw('DATE_FORMAT(fechacambioestado, "%d/%m/%Y") as fechacambioestado'), 'predio',
                            'estadofactura', 'responsable', 'nreferencia'
                        )
                        ->where('id_unico', '=', $factura)
                        ->first();

             $codigo  = DB::table('gs_codigo_barras')
                     ->select('codigobarras')                               
                     ->where('codigobarras', '=', 7709998105430)
                     ->first(); 
                        

            $ff      = explode("/", $data->fechavencimiento);
            $fecha_b = Carbon::createFromDate($ff[2], $ff[1], $ff[0]);
            $fechart = $fecha_b->format("Ymd");

            #Propietario y coopropietario
            $data_pre = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 0)->first();
            $data_pr1 = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 1)->where('orden', '=', 002)->first();

            if(!empty($data_pre->tercero))
                $data_pro = Propietario::find($data_pre->tercero);
            else
                $data_pro = "";
            #Datos coopropietario
            if(!empty($data_pr1->tercero)){
                $data_pro1 = Propietario::find($data_pr1->tercero);
            }else{
                $data_pr1 = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 1)->where('orden', '=', 003)->first();
                
                     if(!empty($data_pr1->tercero)){
                         $data_pro1 = Propietario::find($data_pr1->tercero);
                     }else{
                         $data_pro1 = "";
                     }
            }

            FacturaPredialController::guardarDetalleFactura($factura, $id, $avaluos);
            $factura_anterior = FacturaPredial::obtner_factura_anterior($id);
            $data_detalle     = DetalleFacturaPredial::obtnerDetalles($factura);
            $total_factura    = DetalleFacturaPredial::obtnerValorTotal($factura);

            $xcount =   DetalleFacturaPredial::where('factura', '=', $factura)->count();
            $xc     =   ($xcount - 1) / 8;
            $xc = count(DetalleFacturaPredial::DescripcionDetalleAvaluo($factura));

            $data_detalles = "";
            $data_details  = "";
            if($xc <= 6){
                $texto            = "";
                $data_detalles    = DetalleFacturaPredial::DescripcionDetalleAvaluo($factura);
            }else{
                $texto            = "Años Anteriores";
                $data_details     = DetalleFacturaPredial::AcumuladoAnteriores($factura);
            }

            $vista = "pdf.factura";
            
            $view  = \View::make($vista, compact(
                    [
                        'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                        'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'nomb', 'ncta',
                        'data_details', 'codigo'
                    ]
                )
            )->render();
            $pdf   = \App::make('dompdf.wrapper');
            $pdf->setPaper("legal", "portrait");
            $pdf->loadHTML($view);
            return $pdf->stream("factura_predial.pdf");
            // return view($vista,
            //     compact(
            //         [
            //             'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
            //             'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'data_details'
            //         ]
            //     )
            // );
        }else{
            return redirect("CerrarSesion");
        }
    }

    public static function guardarCabezaFactura($numero, $fecha_v, $fecha, $predio){
        $dd = DB::table('gr_factura_predial')
                    ->select('nreferencia')
                    ->orderBy('id_unico', 'desc')
                    ->first();
        $param                  = ParametrizacionAnio::find(session()->get('anno'));
        $new                    = new FacturaPredial();
        $numero_referencia      = FacturaPredialController::numero_referencia($numero, $fecha, $dd->nreferencia);
        $new->numero            = $numero;
        $new->fechafactura      = $fecha;
        $new->fechavencimiento  = $fecha_v;
        $new->fechacambioestado = $fecha;
        $new->predio            = $predio;
        $new->estadofactura     = 4;
        $new->nreferencia       = $numero_referencia;
        $new->responsable       = session()->get('usuario_tercero');
        $new->parametrizacionanno = $param->id_unico;
        $new->save();

        $factura = DB::table('gr_factura_predial')->max('id_unico');

        return $factura;
    }

    public static function guardarCabezaFacturaSpecial($numero, $fecha_v, $fecha, $predio){
        $dd = DB::table('gr_factura_predial')
                    ->select('nreferencia')
                    ->orderBy('id_unico', 'desc')
                    ->first();
        $param                  = ParametrizacionAnio::find(session()->get('anno'));
        $new                    = new FacturaPredial();
        $numero_referencia      = FacturaPredialController::numero_referencia($numero, $fecha, $dd->nreferencia);
        $new->numero            = $numero;
        $new->fechafactura      = $fecha;
        $new->fechavencimiento  = $fecha_v;
        $new->fechacambioestado = $fecha;
        $new->predio            = $predio;
        $new->estadofactura     = 4;
        $new->nreferencia       = $numero_referencia;
        $new->xespecial         = 1;
        $new->responsable       = session()->get('usuario_tercero');
        $new->parametrizacionanno = $param->id_unico;
        $new->save();

        $factura = DB::table('gr_factura_predial')->max('id_unico');

        return $factura;
    }

    public static function numero_referencia($numero, $fecha, $dd){
        if(empty($dd)){
            $x = "100001";
        }else{
            $x = substr($dd, 0, 6);
            $x = $x + 1;
        }

        $f = explode("-", $fecha);
        $f = "$f[0]$f[1]";
        $x = $x.$numero.$f."1";
        return $x;
    }

    public static function guardarDetalleFactura($factura, $predio, $avaluos){
        try {

            $Liquidador = new LiquidadorInteresesController();

            $data    = FacturaPredial::find($factura);
            $ff      = explode("-", $data->fechavencimiento);
            $ffx     = explode("-", $data->fechafactura);
            $fecha   = Carbon::createFromDate($ff[0], $ff[1], $ff[2]);
            $fechax  = Carbon::createFromDate($ffx[0], $ffx[1], $ffx[2]);
            $mes     = Mes::where('numero', '=', $fecha->format('m'))->first();
            $impuestoPorAnno = [];
            $CorporacionPorAnno = [];

            foreach ($avaluos as $value) {
                #Parametros de vencimiento
                $venc   = DB::table('gr_vencimiento as ven')
                                ->where('ven.anno', '=', $value->anno)
                                ->where('tipo', '=', 1)
                                ->first();
                $vend   = DB::table('gr_vencimiento as ven')
                                ->leftJoin('gf_mes as mes', 'ven.mes', '=', 'mes.id_unico')
                                ->where('ven.anno', '=', $value->anno)
                                ->where('tipo', '=', 2)
                                ->where('mes.numero', '=', date("m"))
                                ->first();
                $id_ava = $value->id_unico; #Id del avaluo
                $tarifa = Tarifa::where('id_unico', '=', $value->tarifa)->first();#Datos de la tarifa
                $v_tar  = $tarifa->valor;#Valor de la tarifa relacionada al avaluo

                $data_des = InteresDescuento::where('tipo', '=', 2)->where('anio', '=', $value->anno)->first();

                if($tarifa->tipobaserango == 1){
                    $baseR = $value->valor;
                }

                if($tarifa->tipobasecalculo == 10){
                    $baseC = $value->valor;
                }
                $corporacion = 0;
                $dataCto  = ConceptoPredial::where('anno', '=', $value->anno)->get();
                $impuesto = 0;
                $descuento = 0;
                
                #--------------------------------------------------------------------#
                #Validar el 25% / 50%
                $impuestoAnterior = NULL;
                $corporacionAnterior  = NULL;
                $annoAnterior = $value->anno -1;                            
                $porMax = 25;
                if($value->anno >= 2026){
                    //Buscar Avaluo Año Pasado 
                    $avan   = DB::table('gr_avaluo as a')
                            ->where('a.anno', '=', $annoAnterior)
                            ->where('a.predio', '=', $predio)
                            ->first();
                    if ($avan) {    
                        $vpor = (ROUND($value->valor *100 /$avan->valor,0)-100); 
                        if($vpor > 3 ){
                            $porMax = 50;
                        }
                    }
                }
                //Buscar si hay pago del año pasado 
                $ids = DB::table('gr_factura_predial as fp')
                ->join('gr_detalle_factura_predial as df', 'df.factura', '=', 'fp.id_unico')
                ->join('gr_detalle_pago_predial as dpp', 'df.id_unico', '=', 'dpp.detallefactura')
                ->join('gr_avaluo as a', 'df.avaluo', '=', 'a.id_unico')
                ->where('fp.predio',$predio)
                ->where('a.anno', $annoAnterior)
                ->selectRaw('GROUP_CONCAT(DISTINCT fp.id_unico) as facturas')
                ->value('facturas');
                if (!empty($ids)) {
                    $arrayIds = !empty($ids) ? explode(',', $ids) : [];
                    $facturasAn = DB::table('gr_factura_predial as fp')
                        ->join('gr_detalle_factura_predial as df', 'df.factura', '=', 'fp.id_unico')
                        ->join('gr_concepto_predial as cp', 'df.concepto', '=', 'cp.id_unico')
                        ->join('gr_avaluo as a', 'df.avaluo', '=', 'a.id_unico')
                        ->whereIn('fp.id_unico', $arrayIds)
                        ->where('a.anno', $annoAnterior)
                        ->groupBy('fp.id_unico')
                        ->select(
                            'fp.id_unico',
                            DB::raw('SUM(CASE WHEN cp.id_concepto = 1 THEN df.valor ELSE 0 END) AS IMPUESTO'),
                            DB::raw('SUM(CASE WHEN cp.id_concepto = 3 THEN df.valor ELSE 0 END) AS CORPORACION')
                        )
                        ->havingRaw('
                            SUM(CASE WHEN cp.id_concepto = 1 THEN df.valor ELSE 0 END) > 0
                            OR
                            SUM(CASE WHEN cp.id_concepto = 3 THEN df.valor ELSE 0 END) > 0
                        ')
                        ->get();
                    if ($facturasAn->isNotEmpty()) {
                        if ($facturasAn->first()->IMPUESTO > 0) {
                            $impuestoPorAnno[$annoAnterior] = $facturasAn->first()->IMPUESTO ?? 0;

                        }
                        if ($facturasAn->first()->CORPORACION > 0) {
                            $CorporacionPorAnno[$annoAnterior] = $facturasAn->first()->CORPORACION ?? 0;

                        }
                    }
                }


                $data2 = DB::table('gr_avaluo as gav')
                    ->leftJoin('gr_tarifa as tar', 'gav.tarifa', '=', 'tar.id_unico')
                    ->where('gav.predio', '=', $predio)
                    ->where('gav.anno', '=', $annoAnterior)
                    ->groupBy('gav.anno')
                    ->select(
                        'gav.anno as anno', 'gav.valor as avaluo', 'tar.valor as tarifa',
                        'tar.tipobaseambiental', 'tar.porcentajeimpuestoambiental',
                        'tar.porcentajesobretasa', 'gav.id_unico as ida'
                    )
                    ->first();
                
                if (!empty($impuestoPorAnno[$annoAnterior]) && $impuestoPorAnno[$annoAnterior] != 0) {
                    $impuestoAnterior = $impuestoPorAnno[$annoAnterior];
                } else {                                
                    if(!empty($data2->avaluo)){
                        $impuestoAnterior = ($data2->avaluo * $data2->tarifa) / 1000;
                    }
                }
                if (!empty($CorporacionPorAnno[$annoAnterior]) && $CorporacionPorAnno[$annoAnterior] != 0) {
                    $corporacionAnterior = $CorporacionPorAnno[$annoAnterior];
                } else {                                
                    if(!empty($data2->avaluo)){
                        if($data2->tipobaseambiental == 6){
                            $base2 = $data2->avaluo;
                            $por2  = 1000;
                        }else
                        if($data2->tipobaseambiental == 7){
                            $base2 = $impuestoAnterior  ;
                            $por2  = 100;
                        }
                        $corporacionAnterior  = ($base2 * $data2->porcentajeimpuestoambiental) / $por2;
                    }
                }

                foreach ($dataCto as $row) {
                    $valor = 0;
                    switch ($row->id_concepto) {
                        case 1:
                            #Calculo de impuesto predial
                            $valor       = ($baseC * $v_tar) / 1000;
                            $impuesto    = $valor;
                            if($row->anno >='2025'){
                                if($impuestoAnterior !== null &&  $impuestoAnterior !=0){
                                    $valordif = ($impuestoAnterior * $porMax)/100;
                                    $valorMaximo = $impuestoAnterior + $valordif;
                                    if($impuesto >$valorMaximo){
                                        $impuesto =$valorMaximo;    
                                        $valor   = $impuesto;
                                        $impuestoPorAnno[$value->anno] = $impuesto;
                                    }                                
                                }
                            }
                            break;
                        case 3:
                            $base = 0; $por = 0;
                            if($tarifa->tipobaseambiental == 6){
                                $base = $value->valor;
                                $por  = 1000;
                            }else
                            if($tarifa->tipobaseambiental == 7){
                                $base = $impuesto;
                                $por  = 100;
                            }
                            #Calculo de corporación regional o sobretasa ambiental
                            if(!empty($tarifa->porcentajeimpuestoambiental)){
                                $valor       = ($base * $tarifa->porcentajeimpuestoambiental) / $por;
                                $corporacion = $valor;
                            }else{
                                $valor = 0;
                            }
                            #Validar el 25%
                            if($row->anno >='2025'){
                                if($corporacionAnterior !== null &&  $corporacionAnterior !=0){
                                    $valorMaximoCorp    = $corporacionAnterior *2;
                                    if($corporacion >$valorMaximoCorp){
                                        $corporacion =$valorMaximoCorp;    
                                        $valor = $corporacion;
                                        $CorporacionPorAnno[$value->anno] = $corporacion;
                                    }                                
                                }
                            }


                            break;
                        case 4:
                        #* Intereses
                            $xvn = Carbon::createFromDate($value->anno, 01, 01);
                            $xvn = $xvn->lastOfMonth();
                            $xven = $xvn->format("Y-m-d");
                            $impuesto2   = $impuesto;
                            $impuesto2    = FacturaPredialController::ValidarValorAbono($impuesto2, $predio, 1, $value->anno);
                            $impuesto2    = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, 1, $impuesto2);
                            if($value->anno == date('Y')){
                                $ffd     = explode("-", $venc->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                if(date('m') > $fechaVV->format('m') ){
                                    $valor = $Liquidador->liquidar_intereses($impuesto2, $xven, $data->fechavencimiento, $data->fechafactura);
                                    if($valor < 0){
                                        $valor = 0;
                                    }
                                } else {$valor = 0;}
                            } else { 
                                #Calculo de Intereses de mora
                                $valor = $Liquidador->liquidar_intereses($impuesto2, $xven, $data->fechavencimiento, $data->fechafactura);
                                if($valor < 0){
                                    $valor = 0;
                                }
                            }
                            if($data->fechafactura > $xven){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 5:
                            #Calculo de descuento
                            if(!empty($vend)){
                                $ffd     = explode("-", $vend->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                $valor = 0;
                                if($fechax->format('Y') == $fechaVV->format('Y')){#Si años son iguales

                                    $vid = DB::table('gr_interes_descuento as ids')
                                       ->select('ids.valor as valor')
                                       ->leftJoin('gf_mes as mes', 'mes.id_unico', '=', 'ids.mes')
                                       ->Where('ids.anio', '=', $value->anno)
                                       ->Where('mes.numero', '=', $fechaVV->format('m'))
                                       ->Where('ids.tipo', '=', '2')
                                       ->first();
                                    if(!empty($vid->valor)){
                                        $valor       = ($impuesto * $vid->valor) / 100;
                                    }
                                }
                            }else{
                                $valor = 0;
                            }
                            $descuento = $valor * -1;
                            $valor     = $descuento;
                            break;
                        case 6:
                            #Calculo de papalerio o otros
                            $valor       = $row->formula;
                            break;
                        case 7:
                            if(!empty($tarifa->porcentajesobretasa)){
                                #Calculo de sobretasa bomberil
                                $valor       = ($impuesto * $tarifa->porcentajesobretasa) / 100;
                            }else{
                                $valor       = 0;
                            }
                            break;
                        case 8:
                            $xvn  = Carbon::createFromDate($value->anno, 01, 01);
                            $xvn  = $xvn->lastOfMonth();
                            $xved = $xvn->format("Y-m-d");
                            $corporacion2   = $corporacion;
                            $corporacion2    = FacturaPredialController::ValidarValorAbono($corporacion2, $predio, 3, $value->anno);
                            $corporacion2    = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, 3, $corporacion2);
                            #Calculo de Intereses corporación
                            if($value->anno == date('Y')){
                                $ffd     = explode("-", $venc->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                if(date('m') > $fechaVV->format('m') ){
                                    $valor       = $Liquidador->liquidar_intereses($corporacion2, $xved ,$data->fechavencimiento, $data->fechafactura);
                                    if($valor < 0){
                                        $valor = 0;
                                    }
                                } else {$valor = 0;}
                            } else { 
                                #Calculo de Intereses de mora
                                $valor       = $Liquidador->liquidar_intereses($corporacion2, $xved ,$data->fechavencimiento, $data->fechafactura);
                                if($valor < 0){
                                    $valor = 0;
                                }
                            }                           
                            

                            if($data->fechafactura > $xved){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 9:
                            if($value->anno<='2018'){
                                $dd = DB::table('gr_debido_valor')
                                    ->select('valor')
                                    ->where('predio', '=', $predio)
                                    ->where('pagado', '!=', 1) 
                                    ->first();
                                if(!empty($dd->valor)){
                                    $valor = $dd->valor;
                                }else{
                                    $valor = 0;
                                }
                            } else {
                                $valor = 0;
                            }

                            break;
                    }

                    if(empty($venc)){
                        $fev  = Carbon::createFromDate($value->anno, 01, 01);
                        $fev  = $fev->lastOfMonth();
                    }else{
                        $ff_ft = explode("-", $venc->fecha);
                        $fev   = Carbon::createFromDate($ff_ft[0], $ff_ft[1], $ff_ft[2]);
                    }

                    $ddias   = $fechax->diffInDays($fev);
                    
                     #* Otros descuentos *#
                    $fechaa = date("Y-m-d");
                    $od  = DB::table('gr_otros_descuentos as o')
                    ->select('o.porcentaje as vp')
                    ->where('o.concepto', '=', $row->id_concepto)
                    ->whereRaw("'$fechaa' BETWEEN o.fecha_inicial AND o.fecha_final")
                    ->whereRaw("'$value->anno' BETWEEN o.vigencia_inicial AND o.vigencia_final")
                    ->first();
                    if(!empty($od->vp)){
                        $valor -= ($valor* $od->vp)/100;
                    }
                    if($row->id_concepto==5){} elseif($row->id_concepto==4 and $valor ==0){} elseif($row->id_concepto==8 and $valor ==0){}elseif($row->id_concepto==6) {} else {
                        $valor   = FacturaPredialController::ValidarValorAbono($valor, $predio, $row->id_concepto, $value->anno);
                        $valor   = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, $row->id_concepto, $valor);
                    }
                    $valor = round($valor,0);
                    $detalle = new DetalleFacturaPredial();
                    $detalle->valor    = $valor;
                    $detalle->factura  = $factura;
                    $detalle->concepto = $row->id_unico; #Concepto de impuesto
                    $detalle->avaluo   = $id_ava;
                    $detalle->dias     = $ddias;
                    $detalle->save();
                }
            }


        } catch (Exception $e) {
            return "Fatal error".$e;
        }
    }

    public static function guardarDetalleFacturaEspecial($factura, $predio, $avaluos){
        try {

            $Liquidador = new LiquidadorInteresesController();

            $data    = FacturaPredial::find($factura);
            $ff      = explode("-", $data->fechavencimiento);
            $ffx     = explode("-", $data->fechafactura);
            $fecha   = Carbon::createFromDate($ff[0], $ff[1], $ff[2]);
            $fechax  = Carbon::createFromDate($ffx[0], $ffx[1], $ffx[2]);
            $mes     = Mes::where('numero', '=', $fecha->format('m'))->first();

            $mxavaluo = Avaluo::where('predio', '=', $predio)->orderBy('anno', 'desc')->first();
            $xxtar    = Tarifa::where('id_unico', '=', $mxavaluo->tarifa)->first();
            foreach ($avaluos as $value) {
                #Parametros de vencimiento
                $venc   = DB::table('gr_vencimiento as ven')
                                ->where('ven.anno', '=', $value->anno)
                                ->where('tipo', '=', 1)
                                ->first();
                $vend   = DB::table('gr_vencimiento as ven')
                                ->leftJoin('gf_mes as mes', 'ven.mes', '=', 'mes.id_unico')
                                ->where('ven.anno', '=', $value->anno)
                                ->where('tipo', '=', 2)
                                ->where('mes.numero', '=', date("m"))
                                ->first();
                $id_ava = $value->id_unico; #Id del avaluo
                $tarifa = Tarifa::where('id_unico', '=', $value->tarifa)->first();#Datos de la tarifa
                $v_tar  = $tarifa->valor;#Valor de la tarifa relacionada al avaluo

                $data_des = InteresDescuento::where('tipo', '=', 2)->where('anio', '=', $value->anno)->first();

                if($tarifa->tipobaserango == 1){
                    $baseR = $value->valor;
                }

                if($tarifa->tipobasecalculo == 10){
                    $baseC = $value->valor;
                }
                $corporación = 0;
                $dataCto  = ConceptoPredial::where('anno', '=', $value->anno)->get();
                $impuesto = 0;
                $descuento = 0;
                foreach ($dataCto as $row) {
                    $valor = 0;
                    switch ($row->id_concepto) {
                        case 1:
                            #Calculo de impuesto predial
                            $valor       = ($baseC * $v_tar) / 1000;
                            $impuesto    = $valor;
                            break;
                        case 3:
                            $base = 0; $por = 0;
                            if($xxtar->tipobaseambiental == 6){
                                $base = $value->valor;
                                $por  = 1000;
                            }else
                            if($xxtar->tipobaseambiental == 7){
                                $base = $impuesto;
                                $por  = 100;
                            }
                            #Calculo de corporación regional o sobretasa ambiental
                            if(!empty($tarifa->porcentajeimpuestoambiental)){
                                $valor       = ($base * $xxtar->porcentajeimpuestoambiental) / $por;
                                $corporacion = $valor;
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 4:
                            $xvn = Carbon::createFromDate($value->anno, 01, 01);
                            $xvn = $xvn->lastOfMonth();
                            $xven = $xvn->format("Y-m-d");


                            if($value->anno == date('Y')){
                                $ffd     = explode("-", $venc->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                if(date('m') > $fechaVV->format('m') ){
                                    $valor = $Liquidador->liquidar_intereses($impuesto, $xven, $data->fechavencimiento, $data->fechafactura);
                                    if($valor < 0){
                                        $valor = 0;
                                    }
                                } else {$valor = 0;}
                            } else { 
                                #Calculo de Intereses de mora
                                $valor = $Liquidador->liquidar_intereses($impuesto, $xven, $data->fechavencimiento, $data->fechafactura);
                                if($valor < 0){
                                    $valor = 0;
                                }
                            }
                            if($data->fechafactura > $xven){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 5:
                            #Calculo de descuento
                            if(!empty($vend)){
                                $ffd     = explode("-", $vend->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                if($fechax->format('Y') == $fechaVV->format('Y')){#Si años son iguales
                                    $vid = DB::table('gr_interes_descuento as ids')
                                       ->select('ids.valor as valor')
                                       ->leftJoin('gf_mes as mes', 'mes.id_unico', '=', 'ids.mes')
                                       ->Where('ids.anio', '=', $value->anno)
                                       ->Where('mes.numero', '=', $fechaVV->format('m'))
                                       ->Where('ids.tipo', '=', '2')
                                       ->first();
                                    if(!empty($vid->valor)){
                                        $impuesto = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, 1, $impuesto);
                                        $valor       = ($impuesto * $vid->valor) / 100;
                                    }
                                }else{
                                    $valor = 0;
                                }
                            }else{
                                $valor = 0;
                            }
                            $descuento = $valor * -1;
                            $valor = $descuento;
                            break;
                        case 6:
                            #Calculo de papalerio o otros
                            $valor       = $row->formula;
                            break;
                        case 7:
                            if(!empty($tarifa->porcentajesobretasa)){
                                #Calculo de sobretasa bomberil
                                $impuesto = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, 1, $impuesto);
                                $valor       = ($impuesto * $tarifa->porcentajesobretasa) / 100;
                            }else{
                                $valor       = 0;
                            }
                            break;
                        case 8:
                            $xvn  = Carbon::createFromDate($value->anno, 01, 01);
                            $xvn  = $xvn->lastOfMonth();
                            $xved = $xvn->format("Y-m-d");

                            #Calculo de Intereses corporación
                            if($value->anno == date('Y')){
                                $ffd     = explode("-", $venc->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                if(date('m') > $fechaVV->format('m') ){
                                    $valor       = $Liquidador->liquidar_intereses($corporacion, $xved ,$data->fechavencimiento, $data->fechafactura);
                                    if($valor < 0){
                                        $valor = 0;
                                    }
                                } else {$valor = 0;}
                            } else { 
                                #Calculo de Intereses de mora
                                $valor       = $Liquidador->liquidar_intereses($corporacion, $xved ,$data->fechavencimiento, $data->fechafactura);
                                if($valor < 0){
                                    $valor = 0;
                                }
                            }                           
                            

                            if($data->fechafactura > $xved){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 9:
                            if($value->anno<='2018'){
                                $dd = DB::table('gr_debido_valor')
                                    ->select('valor')
                                    ->where('predio', '=', $predio)
                                    ->first();
                                if(count($dd) > 0){
                                    $valor = $dd->valor;
                                }else{
                                    $valor = 0;
                                }
                            } else {
                                $valor = 0;
                            }

                            break;
                    }

                    if(empty($venc)){
                        $fev  = Carbon::createFromDate($value->anno, 01, 01);
                        $fev  = $fev->lastOfMonth();
                    }else{
                        $ff_ft = explode("-", $venc->fecha);
                        $fev   = Carbon::createFromDate($ff_ft[0], $ff_ft[1], $ff_ft[2]);
                    }

                    $ddias   = $fechax->diffInDays($fev);

                    
                     #* Otros descuentos *#
                    $fechaa = date("Y-m-d");
                    $od  = DB::table('gr_otros_descuentos as o')
                    ->select('o.porcentaje as vp')
                    ->where('o.concepto', '=', $row->id_concepto)
                    ->whereRaw("'$fechaa' BETWEEN o.fecha_inicial AND o.fecha_final")
                    ->whereRaw("'$value->anno' BETWEEN o.vigencia_inicial AND o.vigencia_final")
                    ->first();
                    if(!empty($od->vp)){
                        $valor -= ($valor* $od->vp)/100;
                    }
                    
                    $valor = FacturaPredialController::ValidarValorAbono($valor, $predio, $row->id_concepto, $value->anno);
                    $valor = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, $row->id_concepto, $valor);
                    
                    $detalle = new DetalleFacturaPredial();
                    $detalle->valor    = $valor;
                    $detalle->factura  = $factura;
                    $detalle->concepto = $row->id_unico; #Concepto de impuesto
                    $detalle->avaluo   = $id_ava;
                    $detalle->dias     = $ddias;
                    $detalle->save();
                }
            }


        } catch (Exception $e) {
            return "Fatal error".$e;
        }
    }

    public static function pagoFacturado($id_unico){
        $id     = decrypt($id_unico);
        $predio = Predio::find($id);

        $id    = decrypt($id_unico);
        $anno  = DB::table("gr_ultimo_ano_pago")
                    ->where('predio', '=', $id)
                    ->max('anno');
        $yyyy = date("Y");

        if($anno == $yyyy){
            flash()->overlay("El predio esta a paz y salvo", "Información");

            return back();
        }else{
            if(count($anno) > 0){

                $annos = DB::table('gr_avaluo as ava')
                           ->select('ava.*')
                           ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                           ->Where('ava.predio', '=', $id)
                           ->Where('ava.anno', '>', $anno)
                           ->orderBy('ava.anno', 'desc')
                           ->distinct()
                           ->get();
            }else{
                $annos = DB::table('gr_avaluo as ava')
                           ->select('ava.*')
                           ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                           ->Where('ava.predio', '=', $id)
                           ->Where('ava.anno', '>=', date('Y'))
                           ->orderBy('ava.anno', 'desc')
                           ->distinct()
                           ->get();
            }

            return view('factura.facturaRecaudada', compact('annos', 'id_unico'));
        }
    }

    public function historico($id){
        try {
            $id_pre = decrypt($id);
            $predio = Predio::find($id_pre);
            $data   = DB::table('gr_pago_predial as pag')
                        ->select('ava.anno','fat.numero', DB::raw('DATE_FORMAT(pag.fechapago, "%d/%m/%Y") as fecha'),
                            DB::raw('concat_ws(" ",
                                cta.numerocuenta,
                                if(
                                    concat_ws(" ", ter.nombreuno, ter.nombredos, ter.apellidouno, ter.apellidodos) = " ",
                                    ter.razonsocial,
                                    concat_ws(" ", ter.nombreuno, ter.nombredos, ter.apellidouno, ter.apellidodos)
                                )) as banco'),
                            DB::raw('SUM(dtp.valor) as total'),
                            'fat.id_unico as factura',
                            'pag.tipopago as tipo',
                            'pag.id_unico as pago'
                        )
                        ->leftJoin('gr_detalle_pago_predial as dtp', 'dtp.pago', '=', 'pag.id_unico')
                        ->leftJoin('gr_detalle_factura_predial as dtf', 'dtp.detallefactura', '=', 'dtf.id_unico')
                        ->leftJoin('gr_factura_predial as fat', 'dtf.factura', '=', 'fat.id_unico')
                        ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                        ->leftJoin('gf_cuenta_bancaria as cta', 'pag.banco', '=', 'cta.id_unico')
                        ->leftJoin('gf_tercero as ter', 'cta.banco', '=', 'ter.id_unico')
                        ->where('fat.predio', '=', $id_pre)
                        ->groupBy('ava.anno')
                        ->groupBy('pag.id_unico')
                        ->orderBy('ava.anno', 'desc')
                        ->get();
            return view('pago.pagos', compact(['predio', 'data']));
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public function generapagofactura(Request $request){
        try {
            $id      = decrypt($request->predio);
            $date    = Carbon::now();
            $fecha   = $date->format('Y-m-d');
            $fecha_v = $date->lastOfMonth();
            $fecha_v = $fecha_v->format('Y-m-d');

            if(!empty(session()->get('usuario_tercero')) && !empty(session()->get('compania'))){

                $param = ParametrizacionAnio::find(session()->get('anno'));

                $maxid  = DB::table('gr_factura_predial')->max('id_unico');
                $xxxn   = DB::table('gr_factura_predial')->where('id_unico', '=', $maxid)->first();
                $nomb   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'nombrebancopredial')->first();
                $ncta   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'numeroCtapredial')->first();
                $numero = FacturaPredialController::getNumberParam(session()->get('anno'));

                if($request->optValPago == 1){
                    $avaluos = DB::table('gr_avaluo as ava')
                       ->select('ava.*')
                       ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                       ->Where('ava.anno', '=', $request->sltAnnoPagar)
                       ->Where('ava.predio', '=', $id)
                       ->orderBy('ava.anno', 'asc')
                       ->distinct()
                       ->get();
                }else{
                    $anno  = DB::table("gr_ultimo_ano_pago")
                        ->where('predio', '=', $id)
                        ->max('anno');

                    if(empty($anno)){
                        $avaluos = DB::table('gr_avaluo as ava')
                           ->select('ava.*')
                           ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                           ->Where('ava.id_unico', '=', $request->sltAnnoPagar)
                           ->orderBy('ava.anno', 'asc')
                           ->distinct()
                           ->get();
                    }else{
                        if(($request->optValPago == 2) && ($request->sltAnnoPagar == date('Y'))){
                            $avaluos = DB::table('gr_avaluo as ava')
                                ->select('ava.*')
                                ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                                ->Where('ava.predio', '=', $id)
                                ->Where('ava.anno', '>', $anno)
                                ->orderBy('ava.anno', 'asc')
                                ->distinct()
                                ->get();
                        }else{
                            $avaluos = DB::table('gr_avaluo as ava')
                                ->select('ava.*')
                                ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                                ->Where('ava.predio', '=', $id)
                                ->Where('ava.anno', '<=', $request->sltAnnoPagar)
                                ->Where('ava.anno', '>', $anno)
                                ->orderBy('ava.anno', 'asc')
                                ->distinct()
                                ->get();
                        }
                    }
                }

                $factura = FacturaPredialController::guardarCabezaFactura($numero, $fecha_v, $fecha, $id);
                $predio  = Predio::find($id);
                $destino = DestinoEconomico::find($predio->destino_economico);
                $area    = Area::where('predio', $id)
                                ->where('tipoarea', 1)
                                ->orderBy('anio', 'desc')
                                ->first();

                $compania = DB::table('gf_tercero as ter')
                                ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                          DB::raw('UPPER(ti.nombre) as tipodoc'),
                                          DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                          'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                                  )
                                ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                                ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                                ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                                ->where('ter.id_unico', '=', session()->get('compania'))
                                ->first();
                $data  = DB::table('gr_factura_predial')
                            ->select(
                                'id_unico', 'numero', DB::raw('DATE_FORMAT(fechafactura, "%d/%m/%Y") as fechafactura'),
                                DB::raw('DATE_FORMAT(fechavencimiento, "%d/%m/%Y") as fechavencimiento'), 'descripcion',
                                DB::raw('DATE_FORMAT(fechacambioestado, "%d/%m/%Y") as fechacambioestado'), 'predio',
                                'estadofactura', 'responsable','nreferencia'
                            )
                            ->where('id_unico', '=', $factura)
                            ->first();


                $codigo  = DB::table('gs_codigo_barras')
                         ->select('codigobarras')                               
                         ->where('codigobarras', '=', 7709998105430)
                         ->first(); 

                $ff      = explode("/", $data->fechavencimiento);
                $fecha_b = Carbon::createFromDate($ff[2], $ff[1], $ff[0]);
                $fechart = $fecha_b->format("Ymd");

                #Propietario y coopropietario
                $data_pre = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 0)->first();
                $data_pr1 = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 1)->first();

                if(!empty($data_pre->tercero))
                    $data_pro = Propietario::find($data_pre->tercero);
                else
                    $data_pro = "";
                #Datos coopropietario
                if(!empty($data_pr1->tercero)){
                    $data_pro1 = Propietario::find($data_pr1->tercero);
                }else{
                    $data_pro1 = "";
                }

                FacturaPredialController::guardarDetalleFactura($factura, $id, $avaluos);
                $factura_anterior = FacturaPredial::obtner_factura_anterior($id);
                $data_detalle     = DetalleFacturaPredial::obtnerDetalles($factura);
                $total_factura    = DetalleFacturaPredial::obtnerValorTotal($factura);

                $data_detalles = "";
                $data_details  = "";
                $xcount =   DetalleFacturaPredial::where('factura', '=', $factura)->count();
                $xc     =   ($xcount - 1) / 8;
                $xc = count(DetalleFacturaPredial::DescripcionDetalleAvaluo($factura));
                if($xc <= 6){
                    $texto            = "";
                    $data_detalles    = DetalleFacturaPredial::DescripcionDetalleAvaluo($factura);
                }else{
                    $texto            = "Años Anteriores";
                    $data_details     = DetalleFacturaPredial::AcumuladoAnteriores($factura);
                }

                $banco            = ParametrosBasicos::where('nombre', '=', 'banco_pago_predial')->first();
                $cbanco            = CuentaBancaria::where('numerocuenta', '=', $banco->valor)->first();
                #Guardamos paquete
                $paquete = PaqueteController::guardar_paquete($data->fechafactura, $cbanco->id_unico, 0, 1, 0);
                $pago    = PagoPredialController::guardar_Pago($data->fechafactura, $cbanco->id_unico, $paquete, 1, $factura);

                $vista = "pdf.factura";
                $view  = \View::make($vista, compact(
                        [
                            'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                            'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'nomb', 'ncta',
                            'data_details', 'codigo'
                        ]
                    )
                )->render();
                $pdf   = \App::make('dompdf.wrapper');
                $pdf->setPaper("legal", "portrait");
                $pdf->loadHTML($view);
                return $pdf->stream("factura_predial.pdf");
                // return view($vista,
                //     compact(
                //         [
                //             'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                //             'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart'
                //         ]
                //     )
                // );
            }else{
                return redirect("CerrarSesion");
            }
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public function savePaySpecial(Request $request){
        try {
            $id      = decrypt($request->txtidpredio);
            $date    = Carbon::now();
            $fecha   = $date->format('Y-m-d');
            $fecha_v = $date->lastOfMonth();
            $fecha_v = $fecha_v->format('Y-m-d');

            if(!empty(session()->get('usuario_tercero')) && !empty(session()->get('compania'))){

                $param = ParametrizacionAnio::find(session()->get('anno'));

                $maxid  = DB::table('gr_factura_predial')->max('id_unico');
                $xxxn   = DB::table('gr_factura_predial')->where('id_unico', '=', $maxid)->first();
                $nomb   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'nombrebancopredial')->first();
                $ncta   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'numeroCtapredial')->first();
                $numero = FacturaPredialController::getNumberParam(session()->get('anno'));

                if($request->optValPago == 2){
                    $anno  = DB::table("gr_ultimo_ano_pago")
                        ->where('predio', '=', $id)
                        ->max('anno');
                    if(empty($anno)){
                        $avaluos = DB::table('gr_avaluo as ava')
                           ->select('ava.*')
                           ->Where('ava.anno', '=', $request->txtAnno)
                           ->Where('ava.predio', '=', $id)
                           ->orderBy('ava.anno', 'asc')
                           ->distinct()
                           ->get();
                    }else{
                        if(($request->optValPago == 2) && ($request->txtAnno == date('Y'))){
                            $avaluos = DB::table('gr_avaluo as ava')
                               ->select('ava.*')
                               ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                               ->Where('ava.predio', '=', $id)
                               ->Where('ava.anno', '>', $anno)
                               ->orderBy('ava.anno', 'asc')
                               ->distinct()
                               ->get();
                        }else{
                            $avaluos = DB::table('gr_avaluo as ava')
                               ->select('ava.*')
                               ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                               ->Where('ava.predio', '=', $id)
                               ->Where('ava.anno', '<=', $request->txtAnno)
                               ->Where('ava.anno', '>', $anno)
                               ->orderBy('ava.anno', 'asc')
                               ->distinct()
                               ->get();
                        }
                    }
                }else{
                    $avaluos = DB::table('gr_avaluo as ava')
                       ->select('ava.*')
                       ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                       ->Where('ava.predio', '=', $id)
                       ->Where('ava.anno', '=', $request->txtAnno)
                       ->orderBy('ava.anno', 'asc')
                       ->distinct()
                       ->get();
                }

                $factura = FacturaPredialController::guardarCabezaFacturaSpecial($numero, $fecha_v, $fecha, $id);
                $predio  = Predio::find($id);
                $destino = DestinoEconomico::find($predio->destino_economico);
                $area    = Area::where('predio', $id)
                                ->where('tipoarea', 1)
                                ->first();

                $compania = DB::table('gf_tercero as ter')
                                ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                          DB::raw('UPPER(ti.nombre) as tipodoc'),
                                          DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                          'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                                  )
                                ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                                ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                                ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                                ->where('ter.id_unico', '=', session()->get('compania'))
                                ->first();
                $data  = DB::table('gr_factura_predial')
                            ->select(
                                'id_unico', 'numero', DB::raw('DATE_FORMAT(fechafactura, "%d/%m/%Y") as fechafactura'),
                                DB::raw('DATE_FORMAT(fechavencimiento, "%d/%m/%Y") as fechavencimiento'), 'descripcion',
                                DB::raw('DATE_FORMAT(fechacambioestado, "%d/%m/%Y") as fechacambioestado'), 'predio',
                                'estadofactura', 'responsable', 'nreferencia'
                            )
                            ->where('id_unico', '=', $factura)
                            ->first();

                 $codigo  = DB::table('gs_codigo_barras')
                         ->select('codigobarras')                               
                         ->where('codigobarras', '=', 7709998105430)
                         ->first();             

                $ff      = explode("/", $data->fechafactura);
                $fecha_b = Carbon::createFromDate($ff[2], $ff[1], $ff[0]);
                $fechart = $fecha_b->format("Ymd");

                #Propietario y coopropietario
                $data_pre = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 0)->first();
                $data_pr1 = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 1)->first();

                if(!empty($data_pre->tercero))
                    $data_pro = Propietario::find($data_pre->tercero);
                else
                    $data_pro = "";
                #Datos coopropietario
                if(!empty($data_pr1->tercero)){
                    $data_pro1 = Propietario::find($data_pr1->tercero);
                }else{
                    $data_pro1 = "";
                }

                FacturaPredialController::guardarDetalleFactura($factura, $id, $avaluos);
                $factura_anterior = FacturaPredial::obtner_factura_anterior($id);
                $data_detalle     = DetalleFacturaPredial::obtnerDetalles($factura);
                $total_factura    = DetalleFacturaPredial::obtnerValorTotal($factura);

                $data_detalles = "";
                $data_details  = "";
                $xcount =   DetalleFacturaPredial::where('factura', '=', $factura)->count();
                $xc     =   ($xcount - 1) / 8;
                $xc = count(DetalleFacturaPredial::DescripcionDetalleAvaluo($factura));

                if($xc <= 6){
                    $data_detalles    = DetalleFacturaPredial::DescripcionDetalleAvaluo($factura);
                }else{
                    $data_details     = DetalleFacturaPredial::AcumuladoAnteriores($factura);
                }

                $vista = "pdf.factura";
                $view  = \View::make($vista, compact(
                        [
                            'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                            'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'nomb', 'ncta',
                            'data_details', 'codigo'
                        ]
                    )
                )->render();
                $pdf   = \App::make('dompdf.wrapper');
                $pdf->setPaper("legal", "portrait");
                $pdf->loadHTML($view);
                return $pdf->stream("factura_predial.pdf");
                // return view($vista,
                //     compact(
                //         [
                //             'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                //             'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart'
                //         ]
                //     )
                // );
            }else{
                return redirect("CerrarSesion");
            }
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public static function generarVistaFactura($factura, $id){
        $factura = decrypt($factura); $id = decrypt($id);
        $predio  = Predio::find($id);
        $destino = DestinoEconomico::find($predio->destino_economico);
        $param   = ParametrizacionAnio::find(session()->get('anno'));
        $area    = Area::where('predio', $id)
                        ->where('anio', $param->anno)
                        ->where('tipoarea', 1)
                        ->first();

        $nomb   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'nombrebancopredial')->first();
        $ncta   = DB::table('gs_parametros_basicos')->where('nombre', '=', 'numeroCtapredial')->first();

        $compania = DB::table('gf_tercero as ter')
                        ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                  DB::raw('UPPER(ti.nombre) as tipodoc'),
                                  DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                  'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                          )
                        ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                        ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                        ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                        ->where('ter.id_unico', '=', session()->get('compania'))
                        ->first();
        $data  = DB::table('gr_factura_predial')
                    ->select(
                        'id_unico', 'numero', DB::raw('DATE_FORMAT(fechafactura, "%d/%m/%Y") as fechafactura'),
                        DB::raw('DATE_FORMAT(fechavencimiento, "%d/%m/%Y") as fechavencimiento'), 'descripcion',
                        DB::raw('DATE_FORMAT(fechacambioestado, "%d/%m/%Y") as fechacambioestado'), 'predio',
                        'estadofactura', 'responsable', 'nreferencia'
                    )
                    ->where('id_unico', '=', $factura)
                    ->first();

        $codigo  = DB::table('gs_codigo_barras')
                 ->select('codigobarras')                               
                 ->where('codigobarras', '=', 7709998105430)
                 ->first();            

        $ff      = explode("/", $data->fechavencimiento);
        $fecha_b = Carbon::createFromDate($ff[2], $ff[1], $ff[0]);
        $fechart = $fecha_b->format("Ymd");

        #Propietario y coopropietario
        $data_pre = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 0)->first();
        $data_pr1 = DB::table('gp_tercero_predio')->where('predio', '=', $id)->where('propietario', '=', 1)->first();

        if(!empty($data_pre->tercero))
            $data_pro = Propietario::find($data_pre->tercero);
        else
            $data_pro = "";
        #Datos coopropietario
        if(!empty($data_pr1->tercero)){
            $data_pro1 = Propietario::find($data_pr1->tercero);
        }else{
            $data_pro1 = "";
        }

        $factura_anterior = FacturaPredial::obtner_factura_anterior($id);
        $data_detalle     = DetalleFacturaPredial::obtnerDetalles($factura);
        $total_factura    = DetalleFacturaPredial::obtnerValorTotal($factura);

        $data_detalles = "";
        $data_details  = "";
        $xcount =   DetalleFacturaPredial::where('factura', '=', $factura)->count();
        $xc     =   ($xcount - 1) / 8;

        if($xc <= 6){
            $data_detalles    = DetalleFacturaPredial::DescripcionDetalleAvaluo($factura);
        }else{
            $data_details     = DetalleFacturaPredial::AcumuladoAnteriores($factura);
        }

        $vista = "pdf.factura";
        $view  = \View::make($vista, compact(
                [
                    'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
                    'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'nomb', 'ncta',
                    'data_details', 'codigo'
                ]
            )
        )->render();
        $pdf   = \App::make('dompdf.wrapper');
        $pdf->setPaper("legal", "portrait");
        $pdf->setOptions(['isRemoteEnabled' => true]);
        $pdf->loadHTML($view);
        return $pdf->stream("factura_predial.pdf");
        // return view($vista,
        //     compact(
        //         [
        //             'data', 'compania', 'predio', 'data_pro', 'data_pro1', 'area', 'param', 'data_detalle',
        //             'total_factura', 'destino', 'factura_anterior', 'data_detalles', 'fechart', 'nomb', 'ncta',
        //             'data_details', 'codigo'
        //         ]
        //     )
        // );
    }

    public function vistaPrescrito($predio){
        $id_p    = decrypt($predio);
        $avaluos = Avaluo::where("predio", "=", $id_p)->orderBy("anno", "desc")->get();
        return view('prescripcion.index', compact('predio', 'avaluos'));
    }

    public static function procesarPrescripcion(Request $request){
        $predio = decrypt($request->predio);
        $xanno  = $request->sltAnnoPagar;
        $xanoi  = date("Y") - 6;
        $xaaa   = ExtractoController::obtnerultimoannopago($predio);
        if(empty($xaaa)){
            $xmina  = DB::table('gr_avaluo')->where('predio', '=', $predio)->min('anno');
        }else{
            $xmina  = $xaaa;
        }
        if($xanno <= $xanoi){
            $avaluos = DB::table('gr_avaluo as ava')
               ->select('ava.*')
               ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
               ->Where('ava.predio', '=', $predio)
               ->where('ava.anno', '<=', $xanno)
               ->where('ava.anno', '>', $xmina)
               ->orderBy('ava.anno', 'asc') 
               ->distinct()
               ->get();
            $compania = DB::table('gf_tercero as ter')
                        ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                  DB::raw('UPPER(ti.nombre) as tipodoc'),
                                  DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                  'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                          )
                        ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                        ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                        ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                        ->where('ter.id_unico', '=', session()->get('compania'))
                        ->first();

            $factura = FacturaPredialController::saveData($predio, $avaluos);
            $data    = FacturaPredial::find($factura);
            $xres    = FacturaPredialController::saveCert($predio, 3);

            $banco   = ParametrosBasicos::where('nombre', '=', 'banco_prescrito')->first();
            $cbanco  = CuentaBancaria::where('numerocuenta', '=', $banco->valor)->first();

            $pago    = PagoPredialController::guardarPago($data->fechafactura, $cbanco->id_unico, NULL, 6, $factura);
            return FacturaPredialController::generarVistaPrescrito($predio, $factura, $xres, $xmina, $xanno, $compania);
        }else{
            flash()->overlay("No se puede prescribir en este periodo", "Información");
            return back();
        }
    }

    public static function saveData($id_predio, $avaluos){
        $date    = Carbon::now();
        $fecha   = $date->format('Y-m-d');
        $fecha_v = $date->lastOfMonth();
        $fecha_v = $fecha_v->format('Y-m-d');

        $param = ParametrizacionAnio::find(session()->get('anno'));

        $maxid  = DB::table('gr_factura_predial')->max('id_unico');
        $xxxn   = DB::table('gr_factura_predial')->where('id_unico', '=', $maxid)->first();
        $numero = FacturaPredialController::getNumberParam(session()->get('anno'));

        $predio  = Predio::find($id_predio);
        $factura = FacturaPredialController::guardarCabezaFactura($numero, $fecha_v, $fecha, $id_predio);
        FacturaPredialController::guardarDetalleFactura($factura, $id_predio, $avaluos);
        return $factura;
    }

    public static function savePayI($factura){
        $banco   = ParametrosBasicos::where('nombre', '=', 'banco_prescrito')->first();
        $cbanco  = CuentaBancaria::where('numerocuenta', '=', $banco->valor)->first();

        $data  = DB::table('gr_factura_predial')
                    ->select(
                        'id_unico', 'numero', DB::raw('DATE_FORMAT(fechafactura, "%d/%m/%Y") as fechafactura'),
                        DB::raw('DATE_FORMAT(fechavencimiento, "%d/%m/%Y") as fechavencimiento'), 'descripcion',
                        DB::raw('DATE_FORMAT(fechacambioestado, "%d/%m/%Y") as fechacambioestado'), 'predio',
                        'estadofactura', 'responsable', 'nreferencia'
                    )
                    ->where('id_unico', '=', $factura)
                    ->first();

        $pago    = PagoPredialController::guardar_Pago($data->fechafactura, $cbanco->id_unico, NULL, 6, $factura);
        return $pago;
    }

    public static function saveCert($predio, $tipo)
    {
        $xxx = FacturaPredialController::buscarmaximotipo($tipo);
        if (empty($xxx)) {
            $anno = ParametrizacionAnio::find(session()->get('anno'));
            $x    = $anno->anno . "0000001";
        } else {
            $anno = ParametrizacionAnio::find(session()->get('anno'));
            $ultimoConsecutivo  = substr($xxx, 0, 4);
            $annoSubstring = substr($anno->anno, 0, 4);
            if ($annoSubstring == $ultimoConsecutivo) {
                $x    = $xxx + 1;
            } else {
                $x = $anno->anno . "0000001";
            }
        }
        $solicita = session()->get('nom_tercero');

        DB::table('gr_consecutivo_cert')->insert(
            ["consecutivo" => $x, "predio" => $predio, "nombre" => $solicita, "tipo" => $tipo]
        );

        return $x;
    }

    public static function buscarmaximotipo($tipo){
        $data = DB::table('gr_consecutivo_cert')
                ->where('tipo', '=', $tipo)
                ->max('consecutivo');
        return $data;
    }

    public static function DataFacturaP($factura){
        $data = DB::table('gr_detalle_factura_predial as dtf')
                ->select(
                    'ava.anno',
                    'ava.valor as avaluo',
                    'tar.valor as tarifa',
                    DB::raw('(sum(if(cpr.id_concepto = 1, dtf.valor, 0))) as impuesto'),
                    DB::raw('(sum(if(cpr.id_concepto = 4, dtf.valor, 0))) as mora'),
                    DB::raw('(sum(if(cpr.id_concepto = 3, dtf.valor, 0))) as corp'),
                    DB::raw('(sum(if(cpr.id_concepto = 8, dtf.valor, 0))) as intc'),
                    DB::raw('(sum(if(cpr.id_concepto = 7, dtf.valor, 0))) as sobr'),
                    DB::raw('(sum(if(cpr.id_concepto = 5, dtf.valor, 0))) as dest'),
                    DB::raw('(sum(if(cpr.id_concepto = 6, dtf.valor, 0))) as pape'),
                    DB::raw('(sum(if(cpr.id_concepto = 9, dtf.valor, 0))) as cobr')
                )
                ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                ->leftJoin('gr_concepto_predial as cpr', 'dtf.concepto', '=', 'cpr.id_unico')
                ->leftJoin('gr_concepto as cpt', 'cpr.id_concepto', '=', 'cpt.id_unico')
                ->leftJoin('gr_tarifa as tar', 'ava.tarifa', '=', 'tar.id_unico')
                ->where('dtf.factura', '=', $factura)
                ->groupBy('ava.anno')
                ->get();
        return $data;
    }

    public static function generarVistaPrescrito($predio, $factura, $nres, $xanov, $xanof, $compania){
        $data_pre = Predio::find($predio);
        $data_tpr = DB::table('gp_tercero_predio')->where('predio', '=', $predio)->where('propietario', '=', 0)->first();
        $data_ter = Propietario::find($data_tpr->tercero);
        $tipo_i   = DB::table('gf_tipo_identificacion')->select('nombre')->where('id_unico', '=', $data_ter->tipoidentificacion)->first();
        $ultimo   = DB::table("gr_ultimo_ano_pago")
                    ->where('predio', '=', $predio)
                    ->max('anno');
        $detalles = FacturaPredialController::DataFacturaP($factura);
        $total    = FacturaPredialController::SumarFactura($factura);
        $anosDebe = FacturaPredialController::vigenciasDeuda($factura);
        $area     = Area::where('predio', '=', $predio)->where('anio', '=', date("Y"))->first();
        $avaluos  = FacturaPredialController::obtnerAvaluosVigencia($xanof + 1, date("Y"), $predio);
        $firmas   = FacturaPredialController::obtnerFirmaDocumento("Prescripción");
        $vista = "pdf.prescrito";
        $view  = \View::make($vista, compact('nres', 'data_pre', 'data_ter', 'data_pre', 'tipo_i', 'ultimo', 'detalles', 'xanov', 'total', 'anosDebe', 'area', 'xanof', 'compania', 'avaluos', 'firmas'))->render();
        $pdf   = \App::make('dompdf.wrapper');
        $pdf->loadHTML($view);
        return $pdf->stream("Resolucion$nres.pdf");
    }

    public static function SumarFactura($factura){
        $xxx  = 0;
        $data = DB::table('gr_detalle_factura_predial as dtf')
                ->select(
                    'dtf.valor as valor',
                    DB::raw('(sum(if(cpr.id_concepto = 1, dtf.valor, 0))) as impuesto'),
                    DB::raw('(sum(if(cpr.id_concepto = 4, dtf.valor, 0))) as mora'),
                    DB::raw('(sum(if(cpr.id_concepto = 3, dtf.valor, 0))) as corporacion_regional'),
                    DB::raw('(sum(if(cpr.id_concepto = 7, dtf.valor, 0))) as sobretasa'),
                    DB::raw('(sum(if(cpr.id_concepto = 5, dtf.valor, 0))) as descuento'),
                    DB::raw('(sum(if(cpr.id_concepto = 6, dtf.valor, 0))) as papeleria'),
                    DB::raw('(sum(if(cpr.id_concepto = 9, dtf.valor, 0))) as cobrar_debido'),
                    DB::raw('(sum(if(cpr.id_concepto = 8, dtf.valor, 0))) as interes_corporacion')
                )
                ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                ->leftJoin('gr_concepto_predial as cpr', 'dtf.concepto', '=', 'cpr.id_unico')
                ->leftJoin('gr_concepto as cpt', 'cpr.id_concepto', '=', 'cpt.id_unico')
                ->where('dtf.factura', '=', $factura)
                ->groupBy('ava.anno')
                ->get();
        foreach ($data as $value) {
            $xxx += $value->impuesto + $value->mora + $value->corporacion_regional + $value->sobretasa + $value->descuento + $value->papeleria + $value->cobrar_debido + $value->interes_corporacion;
        }
        return $xxx;
    }

    /**
     * vigtenciasDeuda
     * Función para buscar las vigencias que debe el predio
     * @author Alexander Numpaque
     * @package Predial
     * @param $factura (int) Id de la factura
     * @return $str (String) String con los años debidos separados por coma
    */
    public static function vigenciasDeuda($factura){
        $str = "";
        $data = DB::table('gr_detalle_factura_predial as dtf')
                ->select('ava.anno')
                ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                ->where('dtf.factura', '=', $factura)
                ->groupBy('ava.anno')
                ->get();
        foreach ($data as $value) {
            $str .= $value->anno.", ";
        }
        $str = substr($str, 0, strlen($str) - 2);
        return $str;
    }

    /**
     * redondear100
     * @author Alexander Numpaque
     * @package Predial
     * @param $valor (int|double) Valor a redondear
     * @return $valor (int|double) Valor redondeado
    */
    public static function redondear100($valor){
        if(is_float($valor) == true){
            $pe  = intval($valor);
            $dec = substr($pe, -2);
            if ($dec >= 50) {
                $valor = ceil($pe / 100) * 100;
            }else {
                $valor = floor($pe / 100) * 100;//$dec > 50
            }
        }else{ //is_float($ret) == true
            $pe  = intval($valor);
            $dec = substr($valor, -2);
            if ($dec >= 50) {
                $valor = ceil($pe / 100) * 100;
            }else {
                $valor = floor($pe / 100) * 100;//$dec > 50
            }
        }
        return $valor;
    }

    /**
     * bucarAbonos
     * Función o metodo para buscar abonos en le predio
     * @author Alexander Numpaque
     * @package Predial
     * @param $predio (int) Id del predio
     * @return $data (Collection|array) Array con los valores devueltos por la consulta
    */
    public static function buscarAbonos($predio){
        $data = DB::table('gr_pago_predial as pag')
                ->select('dtp.id_unico as id_dtp','dtp.valor as valor', 'con.id_unico as id_con', 'ava.anno as anno')
                ->leftJoin('gr_detalle_pago_predial  as dtp', 'dtp.pago', '=', 'pag.id_unico')
                ->leftJoin('gr_detalle_factura_predial as dtf', 'dtp.detallefactura', '=', 'dtf.id_unico')
                ->leftJoin('gr_factura_predial as fat', 'dtf.factura', '=', 'fat.id_unico')
                ->leftJoin('gr_concepto_predial as cpr', 'dtf.concepto', '=', 'cpr.id_unico')
                ->leftJoin('gr_concepto as con', 'cpr.id_concepto', '=', 'con.id_unico')
                ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                ->whereIn('pag.tipopago', ['4','2'])
                ->where('fat.predio', '=', $predio)
                ->orderBy('anno', 'asc')
                ->first();
        return $data;
    }

    /**
     * buscarAbonosConcepto
     * Función para buscar por el predio si en un concepto especifico y un avaluo existe pago abonado
     * @author Alexander Numpaque
     * @param $predio (int) Id del predio
     * @param $concepto (int) Id del concepto
     * @param $anno (String) avaluo en año
     * @return $data (Collection|array) Array con los valores obtenidos en la consulta
     */
    public static function buscarAbonosConcepto($predio, $concepto, $anno){
        $abono = 0;
        $data  = DB::table('gr_pago_predial as pag')
                ->select('dtp.id_unico as id_dtp','dtp.valor as valor', 'con.id_unico as id_con', 'ava.anno as anno')
                ->leftJoin('gr_detalle_pago_predial  as dtp', 'dtp.pago', '=', 'pag.id_unico')
                ->leftJoin('gr_detalle_factura_predial as dtf', 'dtp.detallefactura', '=', 'dtf.id_unico')
                ->leftJoin('gr_factura_predial as fat', 'dtf.factura', '=', 'fat.id_unico')
                ->leftJoin('gr_concepto_predial as cpr', 'dtf.concepto', '=', 'cpr.id_unico')
                ->leftJoin('gr_concepto as con', 'cpr.id_concepto', '=', 'con.id_unico')
                ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                ->where('fat.predio', '=', $predio)
                ->where('con.id_unico', '=', $concepto)
                ->where('ava.anno', '=', $anno)
                ->get();
        if(count($data) > 0){
            foreach ($data as $row) {
                $abono += $row->valor;
            }
        }
        return $abono;
    }
    /**
     * Función para validar si el concepto tiene abono
     * ValidarValorAbono
     * @author Alexander Numpaque
     * @package Predial
     * @param $valor (int|double) Valor del concepto
     * @param $predio (int) id del predio
     * @param $concepto (int) id del  concepto
     * @param $anno     (String) Año
     * @return $valor (int|double) Valor restado si se encontro abono
     * */
    public static function  ValidarValorAbono($valor, $predio, $concepto, $anno){
        $abono = FacturaPredialController::buscarAbonosConcepto($predio, $concepto, $anno);
        if(!empty($abono)){
            $valor = (float) $valor - $abono;
        }else{
            $valor = $valor;
        }
        return $valor;
    }

    /**
     * obtnerAvaluosVigencia
     * Metodo para obtener los avaluos desde un año inicial a un año final respecto a un predio
     * @param int $xanoi Año inicial
     * @param int $xanof Año final
     * @param int $predio Id del predio
     * @return Collection|array $data Datos obtenidos de la consulta
     */
    public static function obtnerAvaluosVigencia($xanoi, $xanof, $predio){
        try{
            $data = DB::table('gr_avaluo as ava')
                ->select(
                    'ava.anno', 'ava.valor', 'tar.valor as tarifa',
                    'tar.tipobaseambiental', 'tar.porcentajeimpuestoambiental',
                    'tar.porcentajesobretasa', 'ava.valor as avaluo'
                )
                ->leftJoin('gr_tarifa as tar', 'ava.tarifa', '=', 'tar.id_unico')
                ->Where('ava.predio', '=', $predio)
                ->whereBetween('ava.anno',[$xanoi, $xanof])
                ->orderBy('ava.anno', 'asc')
                ->distinct()
                ->get();
            return $data;
        }catch(Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * obtnerFirmaDocumento
     * Metodo para obtener las firmas por nombre de documento
     * @param String $nombreTipo  Nombre de tipo documento
     * @return Collection|array $data Valores obtenidos por la consulta
     */
    public static function obtnerFirmaDocumento($nombreTipo){
        try {
            $data = DB::table('gf_tipo_documento as tpd')
                    ->select(
                        DB::raw('IF(
                                CONCAT_WS(
                                    " ",
                                    ter.nombreuno,
                                    ter.nombredos,
                                    ter.apellidouno,
                                    ter.apellidodos
                                ) = "",
                                ter.razonsocial,
                                CONCAT_WS(
                                    " ",
                                    ter.nombreuno,
                                    ter.nombredos,
                                    ter.apellidouno,
                                    ter.apellidodos
                                )
                            ) as firma'),
                        'tpr.nombre as tipo_res'
                    )
                    ->leftJoin('gf_responsable_documento as rpd', 'rpd.tipodocumento', '=', 'tpd.id_unico')
                    ->leftJoin('gf_tercero as ter', 'rpd.tercero', '=', 'ter.id_unico')
                    ->leftJoin('gf_tipo_responsable as tpr', 'rpd.tiporesponsable', '=', 'tpr.id_unico')
                    ->where('tpd.nombre', '=', $nombreTipo)
                    ->first();
            return $data;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * obtenerAnosDebe
     * Metodo para validar y consultar los años debidos por el predio
     * @param int $predio Id del predio
     * @return Collection|Array $data Datos obtenidos por la consulta
     */
    public static function obtenerAnosDebe(Request $request){
        $predio = decrypt($request->predio);
        $ultimo = ExtractoController::obtnerultimoannopago($predio);
        if(empty($ultimo)){
            $annos = DB::table('gr_avaluo as ava')
                           ->select('ava.anno')
                           ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                           ->Where('ava.predio', '=', $predio)
                           ->Where('ava.anno', '>=', date('Y'))
                           ->orderBy('ava.anno', 'desc')
                           ->distinct()
                           ->get();
        }else{
            $annos = DB::table('gr_avaluo as ava')
                           ->select('ava.anno')
                           ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
                           ->Where('ava.predio', '=', $predio)
                           ->Where('ava.anno', '>', $ultimo)
                           ->orderBy('ava.anno', 'desc')
                           ->distinct()
                           ->get();
        }
        return $annos;
    }

    /**
     * obtnerAnoFnFacD
     * Obtener año final de la factura
     * @author Alexander Numpaque
     * @package Predial
     * @param int $factura id de la factua
     * @return string $data->anno Año de la factura
     */
    public static function obtnerAnoFnFacD($factura){
        $data = DB::table('gr_detalle_factura_predial as dtf')
                    ->leftJoin('gr_avaluo as ava', 'dtf.avaluo', '=', 'ava.id_unico')
                    ->where('dtf.factura', '=', $factura)
                    ->orderBy('ava.anno', 'desc')
                    ->first();
        return $data->anno;
    }

    /**
     * obtenerNumeroResolucion
     * Metodo para obtener el número de la resolución del predio
     * @author Alexander Numpaque
     * @package Predial
     * @param int $predio Id del predio
     * @param int $tipo  Id de tipo de resolusión
     * @return int $data->consecutivo Número de resolución
     */
    public static function obtenerNumeroResolucion($predio, $tipo){
        $data = DB::table('gr_consecutivo_cert')
                    ->where('predio','=',$predio)
                    ->where('tipo', '=', $tipo)
                    ->first();
        return $data->consecutivo;
    }

    /**
     * getNumberParam
     * Metodo para obtener el numero consecutivo de factura predial por numero
     * @author Alexander Numpaque
     * @package Predial
     * @param int $param Id parametrizacion anno
     * @return int $number numero de la factura
     */
    public static function getNumberParam($param){
        try {
            $data   = DB::table('gr_factura_predial')->where('parametrizacionanno', '=', $param)->max('numero');
            $number = FacturaPredialController::validateNumber($data, $param);
            return $number;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * getAnnoParam
     * Metodo para obtener el año de la parametrización
     * @author Alexander Numpaque
     * @package Predial
     * @param int $param Id de parametrización año
     * @return String $data->anno Año de parametrización
     */
    public static function getAnnoParam($param){
        try {
            $data = DB::table('gf_parametrizacion_anno')->select('anno')->where('id_unico', '=', $param)->first();
            return $data->anno;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * validateNumber
     * Metodo para obtener el número de factura respecto a la parametrización, y
     * validar que no este vacio para iniciar el contador en 1 o tan solo sumerle uno
     * para generar el número de la factura
     * @author Alexander Numpaque
     * @package Predial
     * @param String $number último número obtenido de la base de datos
     * @param int $param Id de la parametrización año
     * @return String $number Número de factura
     */
    public static function validateNumber($number, $param){
        try {
            $anno = FacturaPredialController::getAnnoParam($param);
            if(empty($number)){
                $number = $anno."000001";
            }else{
                $number = $number + 1;
            }
            return $number;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public function detalladoPago(){
        return view('informesPredial.detalladoPago');
    }

    public function InfDetalladoPago(Request $request){
        $anno = session()->get('anno');
        $vige = ParametrizacionAnio::find($anno);
        $id_f = ($request->sltFactura);
        
        $compania = DB::table('gf_tercero as ter')
                            ->select( DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                                      DB::raw('UPPER(ti.nombre) as tipodoc'),
                                      DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                                      'dir.direccion', 'tel.valor as telefono','ter.ruta_logo as logo'
                              )
                            ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                            ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                            ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                            ->where('ter.id_unico', '=', session()->get('compania'))
                            ->first();

        $xpr =   DB::table('gr_factura_predial as f')
            ->where('f.id_unico', $id_f)
            ->select('f.predio as predio', 'f.numero as numerof', 'f.id_unico as idf')
            ->first();

        $datap = Predio::find($xpr->predio);

        $view  = \View::make('informesPredial.infDetalladoP', compact(['compania', 'datap', 'xpr']))->render();

        $pdf   = \App::make('dompdf.wrapper');
        
        $pdf->loadHTML($view);
        return $pdf->stream("DetalladoPago.pdf");

    }
}

