Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php namespace App\Http\Controllers; // DEPENDENCIASS use Illuminate\Http\Request; ..

Decoded Output download

<?php 
 
namespace App\Http\Controllers; 
// DEPENDENCIASS 
use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Input; 
use PhpOffice\PhpSpreadsheet\Shared\Date; 
use Illuminate\Support\Facades\Mail; 
use Carbon\Carbon; 
use Excel; 
use Auth; 
use DB; 
use App\Models\Fondo_dependencia as FD; 
use Illuminate\Support\Facades\Storage; 
use Exception; 
use Illuminate\Support\Str; 
 
// IMPORTS 
use App\Imports\ExcelImport; 
use App\Imports\AnexoAdq; 
use App\Imports\AnexoObras; 
use App\Libraries\libUtilities; 
use App\Libraries\libUtilities as LU; 
 
// MODELOS 
use App\Models\Claves; 
use App\Models\Historial_cambios_fondo as hcf; 
use App\Models\Dependencias; 
use App\Models\Contratos_modo_basico as cmb; 
use App\Models\Anexo_gastos_diversos_operacion as AGDO; 
use App\Models\Fondo_dependencia; 
use App\Models\TipoClave; 
use App\Models\Estados_cuentas_mes as DECM; 
use App\Models\TipoUsuario; 
use Illuminate\Mail\Message; 
use Illuminate\Support\Facades\Redirect; 
use \App\Models\Usuarios as U; 
use \App\Models\Num_auditorias_de_usuario as NAU; 
use App\Models\Rfc_empresas_sondeo as RES; 
use App\Models\Rfc_empresas_concursantes as REC; 
use App\Models\Num_factura as NF; 
use App\Models\Polizas as P; 
use App\Models\Clave_ff_finanzas as CFFFINANZAS; 
use App\Models\Catalogo_numeros_auditoria as CNA; 
use App\Models\Documentos_fondo as DOCF; 
 
// MAILS 
use App\Mail\MailContratosModoBasico_E as ME; 
use PhpOffice\PhpSpreadsheet\Style\Conditional; 
 
// XML 
use App\Models\Cfdi_xml_comprobante; 
use App\Models\Cfdi_xml_emisor_cfdi; 
use App\Models\Cfdi_xml_receptor_cfdi; 
use App\Models\Cfdi_xml_concepto_cfdi; 
use App\Models\Cfdi_xml_nomina; 
use App\Models\Cfdi_xml_emisor_nomina; 
use App\Models\Cfdi_xml_receptor_nomina; 
use App\Models\Cfdi_xml_percepciones; 
use App\Models\Cfdi_xml_percepciones_nom; 
use App\Models\Cfdi_xml_deducciones; 
use App\Models\Cfdi_xml_deducciones_nom; 
use App\Models\Cfdi_xml_nom_otro_pago; 
use App\Models\Cfdi_xml_timbre_fiscal_digital; 
use Imtigger\LaravelJobStatus\JobStatus; 
use SimpleXMLIterator; 
 
 
class ltController extends Controller 
{ 
    /*************************************/ 
    /*            VARIABLES              */ 
    /*************************************/ 
    public $lista_contratos_modo_basico; 
    public $lista_rfc_empresas_sondeo_y_concursantes; 
    public $lista_num_factura; 
 
    /*************************************/ 
    /*             METODOS               */ 
    /*************************************/ 
 
    /*********************************************/ 
    /*             VISTA PRINCIPAL               */ 
    /*********************************************/ 
    // PETICIONES JSON PARA FUNCIONALIDAD 
    public function datosClavesFF(Request $r, $year) 
    { 
        $id_clave_ff = []; 
        $monto_utilizado = 0; 
        $monto_anexo_gd = 0; 
        $monto_cap1k = 0; 
        $monto_cap4k = 0; 
        $total_reintegro_tesofe = 0; 
 
        $q = Claves::Where('id_dependencia', Auth::user()->id_dependencia)->where('year', $year); 
        $x = Claves::Where('id_dependencia', Auth::user()->id_dependencia)->where('year', $year); 
 
        $data['resumen']['monto_recibido'] = ($q->count() == 0) ? 0.00 : $x->sum('monto_recibido'); 
 
        $fondos = $q->get(); 
 
        $listaGD = []; 
        foreach ($fondos as $i) { 
            $id_clave_ff[] = $i->id_ff; 
            $totalAnexoGD = self::totalAnexoGD($i); 
            $listaGD[$i->id_ff] = $totalAnexoGD; 
            $monto_anexo_gd += (float) $totalAnexoGD->total; 
            $monto_cap1k += (float) $i->cap1k; 
            $monto_cap4k += (float) $i->cap4k; 
            $total_reintegro_tesofe += (float) $i->reintegro_tesofe; 
        } 
 
        foreach ($id_clave_ff as $i) { 
            $monto_utilizado += cmb::where('id_ff', $i)->sum('montoPagadoConPart'); 
        } 
        $data['gastos_diversos'] = $listaGD; 
        $data['total_reintegro_tesofe'] = $total_reintegro_tesofe; 
 
        $data['resumen']['monto_utilizado'] = $monto_utilizado + $monto_anexo_gd + $monto_cap1k + $monto_cap4k + $total_reintegro_tesofe; 
        $data['resumen']['monto_restante'] = $data['resumen']['monto_recibido'] - $data['resumen']['monto_utilizado']; 
 
        $claves = DB::table('clave_ff as ff') 
            ->join('catalogo_numeros_auditoria as cna', 'ff.id_nauditoria', '=', 'cna.id') 
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id') 
            ->join('catalogo_claves_presupuestales as tcff', 'ff.clave_ff', '=', 'tcff.id') 
            ->join('dependencias as d', 'ff.id_dependencia', '=', 'd.id_dependencia') 
            ->join('estados as e', 'e.id', '=', 'd.id_estado') 
            ->join('municipios as m', 'm.id', '=', 'd.id_municipio') 
            ->leftJoin('anexo_cap_4k as ac4k', 'ac4k.id_clave_ff', '=', 'ff.id_ff') 
            ->where('ff.year', $year); 
        //paraEstatusAnexos 
        switch (Auth::user()->type) { 
                // 1 - ROOT 
                // 5 - Auditor 
            case 1: 
            case 5: 
                $data['cff'] = $claves 
                    ->select( 
                        'ff.id_ff as id_pp', 
                        'ff.clave_ff as pp', 
                        'tcff.nombre_clave as n_pp', 
                        'ff.monto_recibido as monto_recibido', 
                        DB::Raw('YEAR(ff.fecha) as fecha'), 
                        'ff.estatus as estatus', 
                        'ff.id_dependencia as id_d', 
                        'd.sDependencia as dependencia', 
                        'd.sSiglas as siglas', 
                        'ff.obras as obras', 
                        'ff.cap1k as capitulomil', 
                        'ff.cap4k as capitulo4mil', 
                        'ff.monto_nomina as monto_nomina', 
                        'ff.reintegro_tesofe as reintegro_tesofe', 
                        'cna.id as id_cna', 
                        'cna.numeroAuditoria as auditoria', 
                        'ca.auditoria as uaa', 
                        'ff.estatus_archivo', 
                        'ff.estatus_anexo_adq', 
                        'ff.estatus_anexo_obras', 
                        'ff.estatus_anexo_egresos', 
                        'ff.estatus_anexo_nomina', 
                        'ff.estatus_anexo_c4k', 
                        'ff.url_anexo_gd', 
                        'ac4k.total_pagado_fondo as ac4k_total_pagado_fondo', 
                        'ac4k.url_archivo as ac4k_url_archivo', 
                        'ac4k.id as ac4k_id', 
                        'd.id_estado', 
                        'd.id_municipio', 
                        'e.estado as sEstado', 
                        'm.municipio as sMunicipio', 
                        'cna.numeroAuditoria as sNumAuditoria', 
                    ) 
                    ->orderBy('fecha', 'DESC') 
                    ->get(); 
                break; 
                //  2 - Administrador de dependencia 
                //  4 - Ejecutor de dependencia 
            case 2: 
            case 4: 
            case 11: 
                $data['cff'] = $claves 
                    ->where('ff.id_dependencia', Auth::user()->id_dependencia) 
                    ->select( 
                        'ff.id_ff as id_pp', 
                        'ff.clave_ff as pp', 
                        'tcff.nombre_clave as n_pp', 
                        'ff.monto_recibido as monto_recibido', 
                        'ff.year as fecha', 
                        'ff.estatus as estatus', 
                        'ff.id_dependencia as id_d', 
                        'd.sDependencia as dependencia', 
                        'd.sSiglas as siglas', 
                        'ff.obras as obras', 
                        'ff.ramo as ramo', 
                        'ff.cap1k as capitulomil', 
                        'ff.cap4k as capitulo4mil', 
                        'ff.monto_nomina as monto_nomina', 
                        'ff.reintegro_tesofe as reintegro_tesofe', 
                        'cna.id as id_cna', 
                        'cna.numeroAuditoria as auditoria', 
                        'ca.auditoria as uaa', 
                        'ff.estatus_archivo', 
                        'ff.estatus_anexo_adq', 
                        'ff.estatus_anexo_obras', 
                        'ff.estatus_anexo_egresos', 
                        'ff.estatus_anexo_nomina', 
                        'ff.estatus_anexo_c4k', 
                        'ff.url_anexo_gd', 
                        'ac4k.total_pagado_fondo as ac4k_total_pagado_fondo', 
                        'ac4k.url_archivo as ac4k_url_archivo', 
                        'ac4k.id as ac4k_id', 
                        'd.id_estado', 
                        'd.id_municipio', 
                        'e.estado as sEstado', 
                        'm.municipio as sMunicipio', 
                        'cna.numeroAuditoria as sNumAuditoria', 
                    ) 
                    ->orderBy('fecha', 'DESC') 
                    ->get(); 
 
                $data['claveAnual'] = DB::table('clave_ff as ff') 
                    ->whereRaw('YEAR(fecha)=' . date('Y')) 
                    ->where('ff.id_dependencia', Auth::user()->id_dependencia) 
                    ->count(); 
                break; 
            case 3: 
                break; 
        } 
        return response()->json($data, 200); 
    } 
 
    public function indexDocumentos($idFondo = 0) 
    { 
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $idFondo)->first(); 
        if ($idFondo != 0 && $clave_ff->id_dependencia != Auth::user()->id_dependencia) { 
            return \Redirect::to('/api/conexion/vistaRdfs')->with('verificacion', ['No tiene autorizacin para entrar a esta seccin.']); 
        } 
        $editar = false; //editar el contenido y enviar a revisin 
        $enviarRevisionAuditores = false; //Envia la revisin de los auditores 
        $regresarDesdeRevisionEnlace = false; //Regresa el estatus de los documentos al ejecutor 
        $regresarDesdeRevisionAuditores = false; //Regresa el estatus de los documentos al ejecutor 
        switch (Auth::user()->type) { 
            case '1': //root 
                $regresarDesdeRevisionEnlace = true; 
                $regresarDesdeRevisionAuditores = true; 
                break; 
            case '3': //enlace estatal 
            case '7': //enlace municipal 
            case '10': //enlace rea ejecutora 
                if (Auth::user()->sub_type != 'ES') { 
                    $regresarDesdeRevisionEnlace = true; 
                    $enviarRevisionAuditores = true; 
                } 
                break; 
            case '5': //auditor 
                // case '6': //financiero 
                if (@config('tema.ms.auditor_btn_estatus_anexo_regresar')) { 
                    $regresarDesdeRevisionEnlace = true; 
                } 
                break; 
            case '4': //ejecutor 
                $editar = true; 
                break; 
        } 
        return view('asf_layout.indexDocumentos', compact(['idFondo', 'editar', 'regresarDesdeRevisionEnlace', 'regresarDesdeRevisionAuditores', 'enviarRevisionAuditores'])); 
    } 
 
    public function getDataDocumentos($idFondo = 0) 
    { 
        $datos['errores'] = []; 
        set_time_limit(0); 
        try { 
            $query = DB::table('clave_ff as cff') 
                ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'cff.clave_ff') 
                ->join('fondo_dependencia as fd', 'fd.id', '=', 'cff.id_fondo_dependencia') 
                ->leftjoin('catalogo_numeros_auditoria as cna', 'cna.id', '=', 'cff.id_nauditoria') 
                ->leftJoin('estados as es', 'es.id', '=', 'cff.id_estado') 
                ->leftJoin('municipios as mun', 'mun.id', '=', 'cff.id_municipio') 
                ->leftJoin('dependencias as dep', 'dep.id_dependencia', '=', 'cff.id_dependencia') 
                ->leftJoin('documentos_fondo as docf', 'docf.id_clave_ff', '=', 'cff.id_ff'); 
            switch (Auth::user()->type) { 
                case '1': //root 
                    break; 
                case '3': //enlace estatal 
                case '7': //enlace municipal 
                    // case '8': //finanzas estatal 
                    // case '9': //finanzas municipal 
                    $query->where(['es.id' => Auth::user()->id_estado, 'mun.id' => Auth::user()->id_municipio]); 
                    break; 
                case '4': //ejecutor 
                case '10': //enlace rea ejecutora 
                    if ($idFondo != 0) { 
                        $query->where('cff.id_ff',  $idFondo); 
                    } 
                    $query->where('cff.id_dependencia',  Auth::user()->id_dependencia); 
                    break; 
                case '5': //auditor 
                case '6': //financiero 
                    $lNAU = Auth::user()->u_nau; 
                    $aCNA = []; 
                    foreach ($lNAU as $knau => $nau) { 
                        $aCNA[] = $nau->id_num_auditoria; 
                    } 
                    $query->whereIn('cff.id_nauditoria',  $aCNA); 
                    break; 
                default: 
                    paraProgramacionPreventiva(); //para el desarrollo 
                    break; 
            } 
            $query->select( 
                //paraEstatusDocumentos 
                'docf.id', 
                'docf.actas_cabildo', 
                'docf.contratos_cuentas_bancarias', 
                'docf.edos_cuentas_01', 
                'docf.edos_cuentas_02', 
                'docf.edos_cuentas_03', 
                'docf.edos_cuentas_04', 
                'docf.edos_cuentas_05', 
                'docf.edos_cuentas_06', 
                'docf.edos_cuentas_07', 
                'docf.edos_cuentas_08', 
                'docf.edos_cuentas_09', 
                'docf.edos_cuentas_10', 
                'docf.edos_cuentas_11', 
                'docf.edos_cuentas_12', 
                'docf.formato_3', 
                'docf.formato_3A', 
                'docf.formato_3B', 
                'docf.formato_4', 
                'ccp.ramo as ramo', 
                'ccp.nombre_clave as fondo', 
                'cff.year as year', 
                'cna.numeroAuditoria as nAuditoria', 
                'cna.fecha_cierre', 
                'dep.sDependencia', 
                'es.estado', 
                'mun.municipio', 
                'docf.updated_at', 
                'cff.id_ff' 
            ); 
            $datos['docsFondo'] = $query->get(); 
            $hoy = Carbon::now()->startOfDay(); 
            $datos['fechaHoy'] = $hoy->format('Y-m-d H:i:s'); 
            $datos['listaEstatus'] = ['Sin cargar', 'Cargado sin enviar a revisin', 'Enviado ' . LU::t_tr('a_d', 'enlace', 's'), 'Enviado ' . LU::t_tr('a_d', 'asf', 'S'), 'Regresado ' . LU::t_tr('a_d', 'ejecutor', 's'), 'No aplica']; 
        } catch (\Throwable $th) { 
            $datos['errores'][] = 'Error al obtener datos de la tabla, comunquese con soporte tcnico. ' . $th->getMessage(); 
        } 
        return response()->json($datos); 
    } 
 
    public function cargarDocumentos(Request $r) 
    { 
        $data['errores'] = []; 
        set_time_limit(0); 
        DB::Begintransaction(); 
        try { 
            $url_doc_fondo = ''; 
            $url_doc_fondo_borrar = ''; 
            $extension = ''; 
            $nombreArchivo = ''; 
            $docsFondo = DOCF::findOrFail($r->idD); 
            $contieneArchivo = false; 
            switch ($r->tipoDocActual) { 
                case 'dAC': 
                    $extension = '.pdf'; 
                    $nombreArchivo = LU::t_tr('v', 'actas_cabildo', 's') . '_'; 
                    $docBD = 1; 
                    break; 
                case 'dCCB': 
                    $extension = '.pdf'; 
                    $nombreArchivo = 'Contratos_cuentas_'; 
                    $docBD = 2; 
                    break; 
                case 'dF3': 
                    $extension = '.xlsx'; 
                    $nombreArchivo = 'Formato_3_'; 
                    $docBD = 4; 
                    break; 
                case 'dF3A': 
                    $extension = '.xlsx'; 
                    $nombreArchivo = 'Formato_3A_'; 
                    $docBD = 5; 
                    break; 
                case 'dF3B': 
                    $extension = '.xlsx'; 
                    $nombreArchivo = 'Formato_3B_'; 
                    $docBD = 6; 
                    break; 
                case 'dF4': 
                    $extension = '.xlsx'; 
                    $nombreArchivo = 'Formato_4_'; 
                    $docBD = 7; 
                    break; 
            } 
            if ($r->has('url_fondo') && $r->url_fondo != null) { 
                try { 
                    $dataF = explode(',', $r->url_fondo); 
                    $b64Data = base64_decode($dataF[1]); 
                    $name = $nombreArchivo . $r->idF . "_" . date('Ymd_His') . $extension; 
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first(); 
                    $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/"; 
                    $url_doc_fondo = $path . $name; 
                    $contieneArchivo = true; 
                } catch (\Throwable $th) { 
                    $data['errores'][] = 'No se encontr el archivo, debe cargarlo.'; 
                } 
            } 
            if ($contieneArchivo) { 
                if ($url_doc_fondo) { 
                    $dirname = dirname(public_path() . $url_doc_fondo); 
                    if (!is_dir($dirname)) { 
                        mkdir($dirname, 0755, true); 
                    } 
                    $file = fopen(public_path() . $url_doc_fondo, 'wb'); 
                    fwrite($file, $b64Data); 
                    fclose($file); 
                } 
                if ($url_doc_fondo_borrar != null) { 
                    unlink(public_path() . $url_doc_fondo_borrar); 
                } 
                switch ($docBD) { 
                    case 1: 
                        $url_doc_fondo_borrar = ($docsFondo->url_actas_cabildo ? $docsFondo->url_actas_cabildo : null); 
                        $docsFondo->url_actas_cabildo = $url_doc_fondo; 
                        $docsFondo->hash_actas_cabildo = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->actas_cabildo = 1; 
                        $docsFondo->save(); 
                        break; 
                    case 2: 
                        $url_doc_fondo_borrar = (isset($docsFondo->url_contratos_cuentas_bancarias) ? $docsFondo->url_contratos_cuentas_bancarias : null); 
                        $docsFondo->url_contratos_cuentas_bancarias = $url_doc_fondo; 
                        $docsFondo->hash_contratos_cuentas_bancarias = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->contratos_cuentas_bancarias = 1; 
                        $docsFondo->save(); 
                        break; 
                    case 4: 
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3) ? $docsFondo->url_formato_3 : null); 
                        $docsFondo->url_formato_3 = $url_doc_fondo; 
                        $docsFondo->hash_formato_3 = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->formato_3 = 1; 
                        $docsFondo->save(); 
                        break; 
                    case 5: 
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3A) ? $docsFondo->url_formato_3A : null); 
                        $docsFondo->url_formato_3A = $url_doc_fondo; 
                        $docsFondo->hash_formato_3A = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->formato_3A = 1; 
                        $docsFondo->save(); 
                        break; 
                    case 6: 
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3B) ? $docsFondo->url_formato_3B : null); 
                        $docsFondo->url_formato_3B = $url_doc_fondo; 
                        $docsFondo->hash_formato_3B = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->formato_3B = 1; 
                        $docsFondo->save(); 
                        break; 
                    case 7: 
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_4) ? $docsFondo->url_formato_4 : null); 
                        $docsFondo->url_formato_4 = $url_doc_fondo; 
                        $docsFondo->hash_formato_4 = hash_file('sha256', public_path() . $url_doc_fondo); 
                        $docsFondo->formato_4 = 1; 
                        $docsFondo->save(); 
                        break; 
                } 
            } else { 
                $data['errores'][] = 'No se encontr el archivo, debe cargarlo.'; 
            } 
        } catch (\Throwable $th) { 
            $data['errores'][] = "No pudo guardarse el archivo, comunquese con soporte tcnico. " .  $th->getLine() . ', ' . $th->getMessage(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data, 200); 
    } 
 
    public function cargarDocumentosMes(Request $r) 
    { 
        $analizarXml = false; //quitarc Sirve para intercambiar entre versiones de lectura masiva de xml,  posteriormente quitar 
        $data['errores'] = []; 
        set_time_limit(0); 
        DB::Begintransaction(); 
        try { 
            $url_doc_fondo = null; 
            $url_doc_fondo_xml = null; 
            $hash_doc_fondo = null; 
            $hash_doc_fondo_xml = null; 
            $docsFondo = DOCF::findOrFail($r->idD); 
            $contieneArchivo = false; 
            $contieneArchivoXML = false; 
            if ($r->has('url_fondo') && $r->url_fondo != null) { 
                try { 
                    $dataF = explode(',', $r->url_fondo); 
                    $b64Data = base64_decode($dataF[1]); 
                    $name = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".pdf"; 
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first(); 
                    $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/"; 
                    $url_doc_fondo = $path . $name; 
                    $contieneArchivo = true; 
                } catch (\Throwable $th) { 
                    $data['errores'][] = 'No se encontr el archivo PDF, debe cargarlo.'; 
                } 
            } 
            if ($r->has('url_fondo_cfdi')) { 
                try { 
                    $datax = explode(',', $r->url_fondo_cfdi); 
                    $b64DataX = base64_decode($datax[1]); 
                    $nameD = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".xml"; 
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first(); 
                    $pathXML = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/"; 
                    $url_doc_fondo_xml = $pathXML . $nameD; 
                    $contieneArchivoXML = true; 
                } catch (\Throwable $th) { 
                    $data['errores'][] = 'No se encontr el archivo XML, debe cargarlo. ' . $th->getMessage(); 
                } 
            } 
            $estados_cuentas_mes = new DECM; 
            $estados_cuentas_mes->id_documentos_fondo = $docsFondo->id; 
            $estados_cuentas_mes->mes = $r->mes; 
            $estados_cuentas_mes->url_estados_cuentas_pdf = $url_doc_fondo; 
            $estados_cuentas_mes->url_estados_cuentas_xml = $url_doc_fondo_xml; 
            switch ($r->mes) { 
                case 'enero': 
                    $docsFondo->edos_cuentas_01 = 1; 
                    break; 
                case 'febrero': 
                    $docsFondo->edos_cuentas_02 = 1; 
                    break; 
                case 'marzo': 
                    $docsFondo->edos_cuentas_03 = 1; 
                    break; 
                case 'abril': 
                    $docsFondo->edos_cuentas_04 = 1; 
                    break; 
                case 'mayo': 
                    $docsFondo->edos_cuentas_05 = 1; 
                    break; 
                case 'junio': 
                    $docsFondo->edos_cuentas_06 = 1; 
                    break; 
                case 'julio': 
                    $docsFondo->edos_cuentas_07 = 1; 
                    break; 
                case 'agosto': 
                    $docsFondo->edos_cuentas_08 = 1; 
                    break; 
                case 'septiembre': 
                    $docsFondo->edos_cuentas_09 = 1; 
                    break; 
                case 'octubre': 
                    $docsFondo->edos_cuentas_10 = 1; 
                    break; 
                case 'noviembre': 
                    $docsFondo->edos_cuentas_11 = 1; 
                    break; 
                case 'diciembre': 
                    $docsFondo->edos_cuentas_12 = 1; 
                    break; 
            } 
            if ($contieneArchivo) { 
                if ($url_doc_fondo) { 
                    $dirname = dirname(public_path() . $url_doc_fondo); 
                    if (!is_dir($dirname)) { 
                        mkdir($dirname, 0755, true); 
                    } 
                    $file = fopen(public_path() . $url_doc_fondo, 'wb'); 
                    fwrite($file, $b64Data); 
                    fclose($file); 
                    $hash_doc_fondo = hash_file('sha256', public_path() . $url_doc_fondo); 
                    $estados_cuentas_mes->hash_estados_cuentas_pdf = $hash_doc_fondo; 
                } 
            } 
            if ($contieneArchivoXML) { 
                if ($url_doc_fondo_xml) { 
                    try { 
                        $dirname = dirname(public_path() . $url_doc_fondo_xml); 
                        if (!is_dir($dirname)) { 
                            mkdir($dirname, 0755, true); 
                        } 
                        $fileXML = fopen(public_path() . $url_doc_fondo_xml, 'wb'); 
                        fwrite($fileXML, $b64DataX); 
                        fclose($fileXML); 
                        if ($analizarXml) { 
                            $cfdi_reader = new SimpleXMLIterator(public_path() . $url_doc_fondo_xml, 0, TRUE); 
                            $ns = $cfdi_reader->getDocNamespaces(true); 
                            $nsNomina = null; 
                            foreach ($ns as $kllave => $valorNs) { 
                                if (Str::startsWith($kllave, "nomina")) { 
                                    $nsNomina = $kllave; 
                                } 
                            } 
                            if (!$nsNomina) { 
                                //Error: No se encontro el NameSpace "Nomina" 
                                $data['errores'][] = 'Error de validacion de xml. No se encuentra el NameSpace "nomina"'; 
                            } 
 
                            if ($cfdi_reader->getName() == 'comprobantes') { 
                                foreach ($cfdi_reader->children($ns['cfdi']) as $comprobante) { 
                                    self::lecturaComprobanteXML($comprobante, $ns, $nsNomina, $estados_cuentas_mes); 
                                } 
                            } else { 
                                self::lecturaComprobanteXML($cfdi_reader, $ns, $nsNomina, $estados_cuentas_mes); 
                            } 
                        } 
                    } catch (\Throwable $e) { 
                        $data['errores'][] = 'Error de validacion de xml. Comunquese con soporte tcnico. ' . $e->getLine() . '. ' . $e->getMessage(); 
                    } 
                } 
                $docsFondo->save(); 
                $hash_doc_fondo_xml = hash_file('sha256', public_path() . $url_doc_fondo_xml); 
                $estados_cuentas_mes->hash_estados_cuentas_xml = $hash_doc_fondo_xml; 
                $estados_cuentas_mes->save(); 
            } else { 
                $data['errores'][] = 'No se encontr el archivo XML, debe cargarlo.'; 
            } 
        } catch (\Throwable $th) { 
            $data['errores'][] = "No pudo guardarse el archivo, comunquese con soporte tcnico. " . $th->getMessage() . ' linea: ' . $th->getLine(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
            try { 
                if ($url_doc_fondo_xml) { 
                    unlink(public_path() . $url_doc_fondo_xml); 
                } 
                if ($url_doc_fondo) { 
                    unlink(public_path() . $url_doc_fondo); 
                } 
            } catch (\Throwable $th) { 
            } 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data); 
    } 
 
    public function lecturaComprobanteXML($cfdi_reader, $ns, $nsNomina, $estados_cuentas_mes) //A partir del nodo 'Comprobante' 
    { 
        $comp = new Cfdi_xml_comprobante(); 
        $comp->version_comprobante = strval($cfdi_reader->attributes()->Version); 
        $comp->serie = strval($cfdi_reader->attributes()->Serie); 
        $comp->folio = strval($cfdi_reader->attributes()->Folio); 
        $comp->fecha = date('Y-m-d', strtotime(strval($cfdi_reader->attributes()->Fecha))); 
        $comp->no_certificado = strval($cfdi_reader->attributes()->NoCertificado); 
        $comp->subtotal = strval($cfdi_reader->attributes()->SubTotal); 
        $comp->descuento = strval($cfdi_reader->attributes()->Descuento); 
        $comp->moneda = strval($cfdi_reader->attributes()->Moneda); 
        $comp->total = strval($cfdi_reader->attributes()->Total); 
        $comp->tipo_comprobante = strval($cfdi_reader->attributes()->TipoDeComprobante); 
        $comp->exportacion = strval($cfdi_reader->attributes()->Exportacion); 
        $comp->metodo_pago = strval($cfdi_reader->attributes()->MetodoPago); 
        $comp->lugar_expedicion = strval($cfdi_reader->attributes()->LugarExpedicion); 
        $comp->certificado = strval($cfdi_reader->attributes()->Certificado); 
        $comp->sello = strval($cfdi_reader->attributes()->Sello); 
        $estados_cuentas_mes->com()->save($comp); 
 
        foreach ($cfdi_reader->children($ns['cfdi']) as $complemento) { 
            switch ($complemento->getName()) { 
                case 'Emisor': 
                    $em = new Cfdi_xml_emisor_cfdi(); 
                    $em->rfc_em = strval($complemento->attributes()->Rfc); 
                    $em->nombre_em = strval($complemento->attributes()->Nombre); 
                    $em->regimen_fiscal_em = strval($complemento->attributes()->RegimenFiscal); 
                    $comp->emi()->save($em); 
                    break; 
                case 'Receptor': 
                    $rec = new Cfdi_xml_receptor_cfdi(); 
                    $rec->rfc_rec = strval($complemento->attributes()->Rfc); 
                    $rec->nombre_rec = strval($complemento->attributes()->Nombre); 
                    $rec->uso_cfdi = strval($complemento->attributes()->UsoCFDI); 
                    //$rec->domicilio_fiscal_rec = strval($complemento->attributes()->DomicilioFiscalReceptor); 
                    //$rec->regimen_fiscal_rec = strval($complemento->attributes()->RegimenFiscalReceptor); 
                    $comp->rec()->save($rec); 
                    break; 
                case 'Conceptos': 
                    $aConceptos = array(); 
                    foreach ($complemento->children($ns['cfdi']) as $concepto) { 
                        $concepto_cfdi = array( 
                            'clave_prod_serv' => strval($concepto->attributes()->ClaveProdServ), 
                            'cantidad' => strval($concepto->attributes()->Cantidad), 
                            'clave_unidad' => strval($concepto->attributes()->ClaveUnidad), 
                            'descripcion' => strval($concepto->attributes()->Descripcion), 
                            'valor_unitario' => strval($concepto->attributes()->ValorUnitario), 
                            'importe' => strval($concepto->attributes()->Importe), 
                            //'objeto_imp' => strval($concepto->attributes()->ObjetoImp), 
                            'descuento' => strval($concepto->attributes()->Descuento), 
                        ); 
                        $conc = new Cfdi_xml_concepto_cfdi($concepto_cfdi); 
                        $aConceptos[] = $conc; 
                    } 
                    $comp->conc()->saveMany($aConceptos); 
                    $aConceptos = null; 
                    break; 
                case 'Complemento': 
                    foreach ($complemento->children($ns[$nsNomina]) as $nom) { 
                        $nomina_nomina = array( 
                            'version' => strval($nom->attributes()->Version), 
                            'tipo_nomina' => strval($nom->attributes()->TipoNomina), 
                            'fecha_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaPago))), 
                            'fecha_inicial_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaInicialPago))), 
                            'fecha_final_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaFinalPago))), 
                            'dias_pagados' => strval($nom->attributes()->NumDiasPagados), 
                            'total_percepciones' => strval($nom->attributes()->TotalPercepciones), 
                            'total_deducciones' => strval($nom->attributes()->TotalDeducciones), 
                            'total_otros_pagos' => strval($nom->attributes()->TotalOtrosPagos), 
 
                        ); 
                        $nomina = new Cfdi_xml_nomina($nomina_nomina); 
                        $comp->nom()->save($nomina); 
                        foreach ($nom->children($ns[$nsNomina]) as $nomdet) { 
                            switch ($nomdet->getName()) { 
                                case 'Emisor': 
                                    $nomina_emisor = new Cfdi_xml_emisor_nomina(); 
                                    //$nomina_emisor->registro_patronal = strval($nomdet->attributes()->RfcPatronOrigen); 
                                    $nomina_emisor->rfc_patron_origen = strval($nomdet->attributes()->RegistroPatronal); 
                                    $nomina->emi_nom()->save($nomina_emisor); 
                                    break; 
                                case 'Receptor': 
                                    $nomina_receptor = new Cfdi_xml_receptor_nomina(); 
                                    $nomina_receptor->curp_receptor = strval($nomdet->attributes()->Curp); 
                                    $nomina_receptor->tipo_contrato = strval($nomdet->attributes()->TipoContrato); 
                                    $nomina_receptor->tipo_regimen = strval($nomdet->attributes()->TipoRegimen); 
                                    $nomina_receptor->num_empleado = strval($nomdet->attributes()->NumEmpleado); 
                                    $nomina_receptor->tipo_jornada = strval($nomdet->attributes()->TipoJornada); 
                                    $nomina_receptor->periodicidad_pago = strval($nomdet->attributes()->PeriodicidadPago); 
                                    $nomina_receptor->cuenta_bancaria = strval($nomdet->attributes()->CuentaBancaria); 
                                    $nomina_receptor->clave_ent_fed = strval($nomdet->attributes()->ClaveEntFed); 
                                    $nomina_receptor->nss = strval($nomdet->attributes()->NumSeguridadSocial); 
                                    $nomina_receptor->inicio_rel_laboral =  date('Y-m-d', strtotime(strval($nomdet->attributes()->FechaInicioRelLaboral))); 
                                    $nomina_receptor->antiguedad = strval($nomdet->attributes()->Antigedad); 
                                    $nomina_receptor->riesgo_puesto = strval($nomdet->attributes()->RiesgoPuesto); 
                                    $nomina_receptor->salario_diario_integrado = strval($nomdet->attributes()->SalarioDiarioIntegrado); 
                                    $nomina->rec_nom()->save($nomina_receptor); 
                                    break; 
                                case 'Percepciones': 
                                    $nomina_percepciones = new Cfdi_xml_percepciones_nom(); 
                                    $nomina_percepciones->total_sueldos = strval($nomdet->attributes()->TotalSueldos); 
                                    $nomina_percepciones->total_gravado = strval($nomdet->attributes()->TotalGravado); 
                                    $nomina_percepciones->total_exento = strval($nomdet->attributes()->TotalExento); 
                                    $nomina->perc()->save($nomina_percepciones); 
                                    $aPercepciones = array(); 
                                    foreach ($nomdet->children($ns[$nsNomina]) as $percepcion) { 
                                        $nomina_percepcion = array( 
                                            'tipo_p' => strval($percepcion->attributes()->TipoPercepcion), 
                                            'clave_p' => strval($percepcion->attributes()->Clave), 
                                            'concepto_p' => strval($percepcion->attributes()->Concepto), 
                                            'importe_gravado' => strval($percepcion->attributes()->ImporteGravado), 
                                            'importe_exento' => strval($percepcion->attributes()->ImporteExento), 
                                        ); 
                                        $oPercepcion = new Cfdi_xml_percepciones($nomina_percepcion); 
                                        $aPercepciones[] = $oPercepcion; 
                                    } 
                                    $nomina_percepciones->perc()->saveMany($aPercepciones); 
                                    $aPercepciones = null; 
                                    break; 
                                case 'Deducciones': 
                                    $nomina_deducciones = new Cfdi_xml_deducciones_nom(); 
                                    $nomina_deducciones->total_deducciones = strval($nomdet->attributes()->TotalOtrasDeducciones); 
                                    $nomina_deducciones->total_imp_retenidos = strval($nomdet->attributes()->TotalImpuestosRetenidos); 
                                    $nomina->ded()->save($nomina_deducciones); 
                                    $aDeducciones = array(); 
                                    foreach ($nomdet->children($ns[$nsNomina]) as $deducion) { 
                                        $nomina_deduccion = array( 
                                            'tipo_d' => strval($deducion->attributes()->TipoDeduccion), 
                                            'clave_d' => strval($deducion->attributes()->Clave), 
                                            'concepto_d' => strval($deducion->attributes()->Concepto), 
                                            'importe_d' => strval($deducion->attributes()->Importe), 
                                        ); 
                                        $oDeduccion = new Cfdi_xml_deducciones($nomina_deduccion); 
                                        $aDeducciones[] = $oDeduccion; 
                                    } 
                                    $nomina_deducciones->ded()->saveMany($aDeducciones); 
                                    $aDeducciones = null; 
                                    break; 
                                case 'OtrosPagos': 
                                    foreach ($nomdet->children($ns[$nsNomina]) as $otropago) { 
                                        $nomina_otropago = new Cfdi_xml_nom_otro_pago(); 
                                        $nomina_otropago->tipo_op = strval($otropago->attributes()->TipoOtroPago); 
                                        $nomina_otropago->clave_op = strval($otropago->attributes()->Clave); 
                                        $nomina_otropago->concepto_op = strval($otropago->attributes()->Concepto); 
                                        $nomina_otropago->importe_op = strval($otropago->attributes()->Importe); 
                                        foreach ($otropago->children($ns[$nsNomina]) as $subsidio) { 
                                            $nomina_otropago->subsidio_causado = strval($subsidio->attributes()->SubsidioCausado); 
                                        } 
                                        $nomina->op()->save($nomina_otropago); 
                                    } 
                                    break; 
                            } 
                        } 
                    } 
                    foreach ($complemento->children($ns['tfd']) as $tfd) { 
                        $tfd_data = new Cfdi_xml_timbre_fiscal_digital(); 
                        $tfd_data->version_tfd = strval($tfd->attributes()->Version); 
                        $tfd_data->uuid = strval($tfd->attributes()->UUID); 
                        $tfd_data->fecha_timbrado = date('Y-m-d', strtotime(strval($tfd->attributes()->FechaTimbrado))); 
                        $tfd_data->rfc_prov_certif = strval($tfd->attributes()->RfcProvCertif); 
                        $tfd_data->sello_cfd = strval($tfd->attributes()->SelloCFD); 
                        $tfd_data->no_cert = strval($tfd->attributes()->NoCertificadoSAT); 
                        $tfd_data->sello_sat = strval($tfd->attributes()->SelloSAT); 
                        $comp->tim()->save($tfd_data); 
                    } 
                    break; 
                case 'Addenda': 
                    $comp->no_cheque = strval($complemento->children($ns['advans'])->attributes()->_10); 
                    $estados_cuentas_mes->com()->save($comp); 
                    break; 
            } 
        } 
    } 
 
    public function ecmPdf(Request $r) 
    { 
        set_time_limit(0); 
        $data['errores'] = []; 
        DB::Begintransaction(); 
        try { 
            $dataF = explode(',', $r->url_pdf); 
            $b64Data = base64_decode($dataF[1]); 
            $name = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".pdf"; 
            $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first(); 
            $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/"; 
            $url_doc_fondo = $path . $name; 
            if ($url_doc_fondo) { 
                $dirname = dirname(public_path() . $url_doc_fondo); 
                if (!is_dir($dirname)) { 
                    mkdir($dirname, 0755, true); 
                } 
                $file = fopen(public_path() . $url_doc_fondo, 'wb'); 
                fwrite($file, $b64Data); 
                fclose($file); 
                $updEcm = DECM::where("id", $r->idEcm)->update(["url_estados_cuentas_pdf" => $url_doc_fondo, "hash_estados_cuentas_pdf" => hash_file('sha256', public_path() . $url_doc_fondo)]); 
            } 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'No se encontr el archivo PDF, debe cargarlo.' . $th->getMessage(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
            unlink(public_path() . $url_doc_fondo); 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data); 
    } 
    public function downloadDocumentos(Request $r) 
    { 
        set_time_limit(0); 
        $docsFondo = DOCF::findOrFail($r->idD); 
        $headers = ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; 
        $urlFondo = null; 
        switch ($r->tipoDocActual) { 
                //paraEstatusDocumentos 
            case 'dAC': 
                $urlFondo = $docsFondo->url_actas_cabildo; 
                break; 
            case 'dCCB': 
                $urlFondo = $docsFondo->url_contratos_cuentas_bancarias; 
                break; 
            case 'dF3': 
                $urlFondo = $docsFondo->url_formato_3; 
                break; 
            case 'dF3A': 
                $urlFondo = $docsFondo->url_formato_3A; 
                break; 
            case 'dF3B': 
                $urlFondo = $docsFondo->url_formato_3B; 
                break; 
            case 'dF4': 
                $urlFondo = $docsFondo->url_formato_4; 
                break; 
        } 
        $nombreArchivo = LU::getRutaAndName($urlFondo)[1]; 
        $urlArchivo = LU::getDirname($urlFondo); 
 
        return response()->download($urlArchivo, $nombreArchivo, $headers); 
    } 
 
    public function downloadEdosCuentas(Request $r) 
    { 
        set_time_limit(0); 
        $headers = ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; 
        $urlEstadoCuenta = null; 
        $estados_cuentas_mes = DECM::findOrFail($r->idEdoCuenta); 
        switch ($r->tipoDocActual) { 
            case 'pdf': 
                $urlEstadoCuenta = $estados_cuentas_mes->url_estados_cuentas_pdf; 
                break; 
            case 'xml': 
                $urlEstadoCuenta = $estados_cuentas_mes->url_estados_cuentas_xml; 
                break; 
        } 
        $nombreArchivo = LU::getRutaAndName($urlEstadoCuenta)[1]; 
        $urlArchivo = LU::getDirname($urlEstadoCuenta); 
        return response()->download($urlArchivo, $nombreArchivo, $headers); 
    } 
 
    public function eliminarDocumentos(Request $r) 
    { 
        set_time_limit(0); 
        DB::Begintransaction(); 
        $url_doc_fondo_borrar = null; 
        $data['errores'] = []; 
        try { 
            $docsFondo = DOCF::findOrFail($r->idD); 
            switch ($r->tipoDocActual) { 
                case 'dAC': 
                    $url_doc_fondo_borrar = $docsFondo->url_actas_cabildo; 
                    $docsFondo->url_actas_cabildo = null; 
                    $docsFondo->actas_cabildo = 0; 
                    break; 
                case 'dCCB': 
                    $url_doc_fondo_borrar = $docsFondo->url_contratos_cuentas_bancarias; 
                    $docsFondo->url_contratos_cuentas_bancarias = null; 
                    $docsFondo->contratos_cuentas_bancarias = 0; 
                    break; 
                case 'dF3': 
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3; 
                    $docsFondo->url_formato_3 = null; 
                    $docsFondo->formato_3 = 0; 
                    break; 
                case 'dF3A': 
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3A; 
                    $docsFondo->url_formato_3A = null; 
                    $docsFondo->formato_3A = 0; 
                    break; 
                case 'dF3B': 
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3B; 
                    $docsFondo->url_formato_3B = null; 
                    $docsFondo->formato_3B = 0; 
                    break; 
                case 'dF4': 
                    $url_doc_fondo_borrar = $docsFondo->url_formato_4; 
                    $docsFondo->url_formato_4 = null; 
                    $docsFondo->formato_4 = 0; 
                    break; 
            } 
            if ($url_doc_fondo_borrar != null) { 
                unlink(public_path() . $url_doc_fondo_borrar); 
            } 
            $docsFondo->save(); 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al eliminar el archivo, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data); 
    } 
 
    public function eliminarEdoCuenta(Request $r) 
    { 
        set_time_limit(0); 
        DB::Begintransaction(); 
        try { 
            $data['errores'] = []; 
            $docsFondo = DOCF::where('id', $r->idD)->first(); 
            $oDecm = DECM::where('id', $r->idEdoCuenta)->first(); 
            $mes = $oDecm->mes; 
            $url_edo_cuentas_borrar_pdf =  $oDecm->url_estados_cuentas_pdf; 
            $url_edo_cuentas_borrar_xml = $oDecm->url_estados_cuentas_xml; 
            $oDecm->delete(); 
            $edos_cuentas_count = DECM::where(['id_documentos_fondo' => $r->idD, 'mes' => $mes])->count(); 
            if ($edos_cuentas_count === 0) { 
                switch ($mes) { 
                    case 'enero': 
                        $docsFondo->edos_cuentas_01 = 0; 
                        break; 
                    case 'febrero': 
                        $docsFondo->edos_cuentas_02 = 0; 
                        break; 
                    case 'marzo': 
                        $docsFondo->edos_cuentas_03 = 0; 
                        break; 
                    case 'abril': 
                        $docsFondo->edos_cuentas_04 = 0; 
                        break; 
                    case 'mayo': 
                        $docsFondo->edos_cuentas_05 = 0; 
                        break; 
                    case 'junio': 
                        $docsFondo->edos_cuentas_06 = 0; 
                        break; 
                    case 'julio': 
                        $docsFondo->edos_cuentas_07 = 0; 
                        break; 
                    case 'agosto': 
                        $docsFondo->edos_cuentas_08 = 0; 
                        break; 
                    case 'septiembre': 
                        $docsFondo->edos_cuentas_09 = 0; 
                        break; 
                    case 'octubre': 
                        $docsFondo->edos_cuentas_10 = 0; 
                        break; 
                    case 'noviembre': 
                        $docsFondo->edos_cuentas_11 = 0; 
                        break; 
                    case 'diciembre': 
                        $docsFondo->edos_cuentas_12 = 0; 
                        break; 
                } 
                $docsFondo->save(); 
            } 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al eliminar los archivos, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
        } else { //caso sin errores 
            DB::commit(); 
            try { 
                if ($url_edo_cuentas_borrar_pdf != null) { 
                    unlink(public_path() . $url_edo_cuentas_borrar_pdf); 
                } 
                unlink(public_path() . $url_edo_cuentas_borrar_xml); 
            } catch (\Throwable $th) { 
            } 
        } 
        return response()->json($data); 
    } 
 
    public function enviarDocumentosRevison(Request $r) 
    { 
        $docsFondo = DOCF::findOrFail($r->idD); 
        $estatus = 2; 
        if ($r->enviarRevisionAuditores == 'Si' || @config('tema.ms.revision_directo_auditores')) { 
            $estatus = 3; 
        } 
        $data['errores'] = []; 
        try { 
            switch ($r->tipoDocActual) { 
                case 'dAC': 
                    $docsFondo->actas_cabildo = $estatus; 
                    break; 
                case 'dCCB': 
                    $docsFondo->contratos_cuentas_bancarias = $estatus; 
                    break; 
                case 'dF3': 
                    $docsFondo->formato_3 = $estatus; 
                    break; 
                case 'dF3A': 
                    $docsFondo->formato_3A = $estatus; 
                    break; 
                case 'dF3B': 
                    $docsFondo->formato_3B = $estatus; 
                    break; 
                case 'dF4': 
                    $docsFondo->formato_4 = $estatus; 
                    break; 
            } 
            $docsFondo->save(); 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al enviar el archivo a revisin, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
        return response()->json($data); 
    } 
 
    public function enviarRevisionEdosCuentas(Request $r) 
    { 
        set_time_limit(0); 
        DB::Begintransaction(); 
        $estatus = 2; 
        if ($r->enviarRevisionAuditores == 'Si' || @config('tema.ms.revision_directo_auditores')) { 
            $estatus = 3; 
        } 
        try { 
            $data['errores'] = []; 
            $docsFondo = DOCF::findOrFail($r->idD); 
            switch ($r->mes) { 
                case 'enero': 
                    $docsFondo->edos_cuentas_01 = $estatus; 
                    break; 
                case 'febrero': 
                    $docsFondo->edos_cuentas_02 = $estatus; 
                    break; 
                case 'marzo': 
                    $docsFondo->edos_cuentas_03 = $estatus; 
                    break; 
                case 'abril': 
                    $docsFondo->edos_cuentas_04 = $estatus; 
                    break; 
                case 'mayo': 
                    $docsFondo->edos_cuentas_05 = $estatus; 
                    break; 
                case 'junio': 
                    $docsFondo->edos_cuentas_06 = $estatus; 
                    break; 
                case 'julio': 
                    $docsFondo->edos_cuentas_07 = $estatus; 
                    break; 
                case 'agosto': 
                    $docsFondo->edos_cuentas_08 = $estatus; 
                    break; 
                case 'septiembre': 
                    $docsFondo->edos_cuentas_09 = $estatus; 
                    break; 
                case 'octubre': 
                    $docsFondo->edos_cuentas_10 = $estatus; 
                    break; 
                case 'noviembre': 
                    $docsFondo->edos_cuentas_11 = $estatus; 
                    break; 
                case 'diciembre': 
                    $docsFondo->edos_cuentas_12 = $estatus; 
                    break; 
            } 
            $docsFondo->save(); 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al enviar los archivos, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data); 
    } 
 
    public function regresarDocumentosRevison(Request $r) 
    { 
        $data['errores'] = []; 
        try { 
            $docsFondo = DOCF::findOrFail($r->idD); 
            $estatus = 4; 
            switch ($r->tipoDocActual) { 
                case 'dAC': 
                    $docsFondo->actas_cabildo = $estatus; 
                    break; 
                case 'dCCB': 
                    $docsFondo->contratos_cuentas_bancarias = $estatus; 
                    break; 
                case 'dF3': 
                    $docsFondo->formato_3 = $estatus; 
                    break; 
                case 'dF3A': 
                    $docsFondo->formato_3A = $estatus; 
                    break; 
                case 'dF3B': 
                    $docsFondo->formato_3B = $estatus; 
                    break; 
                case 'dF4': 
                    $docsFondo->formato_4 = $estatus; 
                    break; 
            } 
            $docsFondo->save(); 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al regresar el archivo, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
        return response()->json($data); 
    } 
 
    public function regresarRevisionEdosCuentas(Request $r) 
    { 
        set_time_limit(0); 
        DB::Begintransaction(); 
        $estatus = 4; 
        try { 
            $data['errores'] = []; 
            $docsFondo = DOCF::findOrFail($r->idD); 
            switch ($r->mes) { 
                case 'enero': 
                    $docsFondo->edos_cuentas_01 = $estatus; 
                    break; 
                case 'febrero': 
                    $docsFondo->edos_cuentas_02 = $estatus; 
                    break; 
                case 'marzo': 
                    $docsFondo->edos_cuentas_03 = $estatus; 
                    break; 
                case 'abril': 
                    $docsFondo->edos_cuentas_04 = $estatus; 
                    break; 
                case 'mayo': 
                    $docsFondo->edos_cuentas_05 = $estatus; 
                    break; 
                case 'junio': 
                    $docsFondo->edos_cuentas_06 = $estatus; 
                    break; 
                case 'julio': 
                    $docsFondo->edos_cuentas_07 = $estatus; 
                    break; 
                case 'agosto': 
                    $docsFondo->edos_cuentas_08 = $estatus; 
                    break; 
                case 'septiembre': 
                    $docsFondo->edos_cuentas_09 = $estatus; 
                    break; 
                case 'octubre': 
                    $docsFondo->edos_cuentas_10 = $estatus; 
                    break; 
                case 'noviembre': 
                    $docsFondo->edos_cuentas_11 = $estatus; 
                    break; 
                case 'diciembre': 
                    $docsFondo->edos_cuentas_12 = $estatus; 
                    break; 
            } 
            $docsFondo->save(); 
        } catch (\Throwable $th) { 
            $data['errores'][] = 'Error al regresar los archivos, contacte con servicio tcnico.' . $th->getMessage(); 
        } 
        if (sizeof($data['errores'])) { 
            DB::rollback(); 
        } else { //caso sin errores 
            DB::commit(); 
        } 
        return response()->json($data); 
    } 
 
    public function getEstadosCuentaMes(Request $r) 
    { 
        $datos['errores'] = []; 
        try { 
            $datos['edos_cuentas'] = DB::table('estados_cuentas_mes')->where(['id_documentos_fondo' => $r->idD, 'mes' => $r->mes])->get(); 
        } catch (\Throwable $th) { 
            $datos['errores'][] = 'Error al obtener datos de la tabla, comunquese con soporte tcnico. ' . $th->getMessage(); 
        } 
        return response()->json($datos); 
    } 
 
    public function datosClavesFFMain(Request $r, $dependencia, $year) 
    { 
        $id_clave_ff = []; 
        $monto_utilizado = 0; 
        $monto_anexo_gd = 0; 
        $monto_cap1k = 0; 
 
        $q = Claves::Where('id_dependencia', $dependencia)->where('year', $year); 
        $x = Claves::Where('id_dependencia', $dependencia)->where('year', $year); 
 
        $data['resumen']['monto_recibido'] = ($q->count() == 0) ? 0.00 : $x->sum('monto_recibido'); 
 
        $fondos = $q->get(); 
 
        $listaGD = []; 
        foreach ($fondos as $i) { 
            $id_clave_ff[] = $i->id_ff; 
            $totalAnexoGD = self::totalAnexoGD($i); 
            $listaGD[$i->id_ff] = $totalAnexoGD; 
            $monto_anexo_gd += (float) $totalAnexoGD->total; 
            $monto_cap1k += (float) $i->cap1k; 
        } 
 
        foreach ($id_clave_ff as $i) { 
            $monto_utilizado += cmb::where('id_ff', $i)->sum('montoPagadoConPart'); 
        } 
        $data['gastos_diversos'] = $listaGD; 
 
        $data['resumen']['monto_utilizado'] = $monto_utilizado + $monto_anexo_gd + $monto_cap1k; 
        $data['resumen']['monto_restante'] = $data['resumen']['monto_recibido'] - $data['resumen']['monto_utilizado']; 
 
        $claves = DB::table('clave_ff as ff') 
            ->join('catalogo_numeros_auditoria as cna', 'ff.id_nauditoria', '=', 'cna.id') 
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id') 
            ->join('catalogo_claves_presupuestales as tcff', 'ff.clave_ff', '=', 'tcff.id') 
            ->join('dependencias as d', 'ff.id_dependencia', '=', 'd.id_dependencia') 
            ->where('ff.year', $year); 
 
 
        $data['cff'] = $claves 
            ->where('ff.id_dependencia', $dependencia) 
            ->select( 
                'ff.id_ff as id_pp', 
                'ff.clave_ff as pp', 
                'tcff.nombre_clave as n_pp', 
                'ff.monto_recibido as monto_recibido', 
                'ff.year as fecha', 
                'ff.estatus as estatus', 
                'ff.id_dependencia as id_d', 
                'd.sDependencia as dependencia', 
                'd.sSiglas as siglas', 
                'ff.obras as obras', 
                'ff.ramo as ramo', 
                'ff.cap1k as capitulomil', 
                'ff.monto_nomina as monto_nomina', 
                'ff.reintegro_tesofe as reintegro_tesofe', 
                'cna.numeroAuditoria as auditoria', 
                'ca.auditoria as uaa', 
            ) 
            ->orderBy('fecha', 'DESC') 
            ->get(); 
 
        $data['claveAnual'] = DB::table('clave_ff as ff') 
            ->whereRaw('YEAR(fecha)=' . date('Y')) 
            ->where('ff.id_dependencia', $dependencia) 
            ->count(); 
 
        return response()->json($data, 200); 
    } 
 
    // CLAVES DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA) 
    public function index() 
    { 
        $d = Dependencias::with(['d_e', 'd_m'])->where('id_dependencia', Auth::user()->id_dependencia)->first(); 
        // $fondo_dependencia = Fondo_dependencia::where('year', now()->year)->where('id_dependencia', Auth::user()->id_dependencia); 
 
        $data['datos_generales'] = (object) [ 
            'dependencia' => $d->sDependencia, 
            'siglas' => $d->sSiglas, 
            'municipio' => ($d->d_m == NULL) ? 'No aplica' : $d->d_m->municipio, 
            'estado' => $d->d_e->estado, 
        ]; 
 
        return view('asf_layout.index', $data); 
    } 
 
    // CLAVES DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA PARA MAIN) (PARA CERRAR FONDOS) 
    public function layouts_main() 
    { 
        $data['usuarioActual'] = U::with('u_d')->where('id', Auth::user()->id)->get()->first(); 
        $lNAU = NAU::with('nau_cna')->where('id_usuario', Auth::user()->id)->get(); 
        $data['CNAusuario'] = []; 
        foreach ($lNAU as $knau => $nau) { 
            $data['CNAusuario'][] = $nau->nau_cna; 
        } 
        return view('asf_layout.main', $data); 
    } 
 
    public function cerrar(Request $r) 
    { 
        $row = Claves::where('id_ff', $r->id)->first(); 
        $row->estatus = '1'; 
        DB::beginTransaction(); 
        try { 
            $row->save(); 
            DB::commit(); 
            return response()->json('OK', 200); 
        } catch (\Exception $e) { 
            DB::rollback(); 
            $error = $e->getMessage(); 
            return response()->json('NO', 200); 
        } 
    } 
 
 
    /*******************************************************/ 
    /*              FUENTE DE FINANCIAMIENTO               */ 
    /*******************************************************/ 
    // PETICIONES JSON PARA FUNCIONALIDAD 
    // Pintar las fuentes de financiamiento por ao 
    public function datosFuenteFinanciamiento(Request $r, $dependencia, $year) 
    { 
        $q = DB::table('fondo_dependencia as fd') 
            ->join('catalogo_claves_presupuestales as ccp', 'fd.clave_ff', '=', 'ccp.id') 
            ->where('fd.year', $year) 
            ->where('fd.id_dependencia', $dependencia) 
            ->join('catalogo_auditorias as ca', 'ca.id', '=', 'fd.id_auditoria') 
            ->join('catalogo_numeros_auditoria as cna', 'cna.id', '=', 'fd.nAuditoria') 
            ->select( 
                'fd.id as id_fondo', 
                'ccp.id as id', 
                'ccp.nombre_clave as clave', 
                'ca.auditoria as uaa', 
                'cna.numeroAuditoria as nAuditoria', 
            ) 
            ->orderBy('clave', 'ASC') 
            ->orderBy('uaa', 'ASC') 
            ->get(); 
 
        return response()->json($q, 200); 
    } 
 
    // Datos del monto de la dependencia y el ramo al que pertenece 
    public function datosClaveFFDependencia(Request $r, $id_clave, $year, $dependencia, $idnAuditoria) 
    { 
        $datos['monto'] = DB::table('fondo_dependencia') 
            ->where('id_dependencia', $dependencia) 
            ->where('year', $year) 
            ->where('clave_ff', $id_clave) 
            ->where('nAuditoria', $idnAuditoria) 
            ->first()->monto; 
 
        $datos['ramo'] = DB::table('catalogo_claves_presupuestales')->where('id', $id_clave)->first()->ramo; 
 
        return response()->json($datos, 200); 
    } 
 
    // AGREGAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA) 
    public function addClave() 
    { 
        $data = []; 
        $dependencias = DB::table('dependencias as d') 
            ->where('id_estado', Auth::user()->id_estado); 
        switch (Auth::user()->type) { 
                // 1 - Root 
            case 1: 
                $data['dependencias'] = $dependencias->where('id_municipio', Auth::user()->id_municipio) 
                    ->select( 
                        'id_dependencia as id', 
                        'sDependencia as nombre', 
                        'sSiglas as siglas' 
                    ) 
                    ->get(); 
                break; 
                // 3 - Enlace estatal 
            case 3: 
                $data['dependencias'] = $dependencias->get(); 
                break; 
                // 2 - Administrador de dependencia 
                // 4 - ejecutor 
            case 2: 
            case 4: 
                $v = DB::table('fondo_dependencia') 
                    ->where('id_dependencia', Auth::user()->id_dependencia) 
                    ->where('year', now()->year) 
                    ->count(); 
 
                $data['dependencias'] = $dependencias->where('id_dependencia', Auth::user()->id_dependencia) 
                    ->select( 
                        'id_dependencia as id', 
                        'sDependencia as nombre', 
                        'sSiglas as siglas' 
                    ) 
                    ->first(); 
 
                $data['fondo'] = DB::table('fondo_dependencia as fd') 
                    ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'fd.clave_ff') 
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia) 
                    ->select( 
                        'fd.id', 
                        'ccp.id as id_clave', 
                        'ccp.nombre_clave as clave', 
                        'ccp.ramo', 
                        'fd.monto as monto' 
                    ) 
                    ->first(); 
 
                $con_cff = DB::table('clave_ff as cff') 
                    ->select('cff.id_fondo_dependencia') 
                    ->where('cff.id_dependencia', Auth::user()->id_dependencia) 
                    ->WhereNotNull('cff.id_fondo_dependencia') 
                    ->get(); 
 
                $a_con_cff = []; 
                foreach ($con_cff as $kIdFondo => $id_fondo) { 
                    $a_con_cff[] = $id_fondo->id_fondo_dependencia; 
                } 
 
                $years = DB::table('fondo_dependencia as fd') 
                    ->select('fd.year') 
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia) 
                    ->whereNotIn('fd.id', $a_con_cff) 
                    ->groupBy('fd.year') 
                    ->orderBy('fd.year', 'asc') 
                    ->get(); 
 
 
                $data['yearsRegistrados'] = []; 
                foreach ($years as $kYear => $year) { 
                    $data['yearsRegistrados'][] = $year->year; 
                } 
 
                break; 
        } 
 
        if ($data['fondo'] == NULL) { 
            return \Redirect::back()->withErrors([LU::t_tr('D', 'dependencia', 's') . '  no tiene ' . LU::t_tr('v', 'fondo', 'p') . ' asignados']); 
        } 
 
        $data['claves'] = TipoClave::all(); 
        return view('asf_layout.addClave', $data); 
    } 
 
    // AGREGAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA) Finanzas 
    public function addClaveFinanzas() 
    { 
        $data = []; 
        $dependencias = DB::table('dependencias as d') 
            ->where('id_estado', Auth::user()->id_estado); 
        switch (Auth::user()->type) { 
            case 8: //finanzas estatal 
            case 9: //finanzas municipal 
                $data['dependencias'] = $dependencias->where('id_dependencia', Auth::user()->id_dependencia) 
                    ->select( 
                        'id_dependencia as id', 
                        'sDependencia as nombre', 
                        'sSiglas as siglas' 
                    ) 
                    ->first(); 
 
                $data['fondo'] = DB::table('fondo_dependencia as fd') 
                    ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'fd.clave_ff') 
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia) 
                    ->select( 
                        'fd.id', 
                        'ccp.id as id_clave', 
                        'ccp.nombre_clave as clave', 
                        'ccp.ramo', 
                        'fd.monto as monto' 
                    ) 
                    ->first(); 
                break; 
        } 
 
        if ($data['fondo'] == NULL) { 
            return \Redirect::back()->withErrors([LU::t_tr('D', 'dependencia', 's') . '  no tiene ' . LU::t_tr('v', 'fondo', 'p') . ' asignados']); 
        } 
 
        $data['claves'] = TipoClave::all(); 
        return view('asf_layout.addClaveFinanzas', $data); 
    } 
 
    //OBTIENE LOS DATOS DE fondo_dependencia Y LOS CONTRASTA CON clave_ff PARA OBTENER UNA LISTA DE FONDOS NO REGISTRADOS 
    public function getClavesFFNotInTable($dependencia, $year) 
    { 
        $data = DB::table('fondo_dependencia as fd') 
            ->leftJoin('clave_ff as cf', 'fd.id', '=', 'cf.id_fondo_dependencia') 
            ->join('catalogo_claves_presupuestales as ccp', 'fd.clave_ff', '=', 'ccp.id') 
            ->join('catalogo_numeros_auditoria as cna', 'fd.nAuditoria', '=', 'cna.id') 
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id') 
            ->select('fd.id as id_fondo', 'fd.clave_ff as id', 'ccp.nombre_clave as clave', 'cna.numeroAuditoria as nAuditoria', 'ca.auditoria as uaa', 'cna.id as id_nAuditoria') 
            ->where('fd.year', $year) 
            ->where('fd.id_dependencia', $dependencia) 
            ->whereNull('cf.id_ff') 
            ->get(); 
        return response()->json($data); 
    } 
 
    // GUARDAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (INSERTAR) 
    public function saveClave(Request $r) 
    { 
        $errorEncontrado = ''; 
        $id_clave_ff = 0; 
        $claveRegistrada = null; 
        DB::Begintransaction(); 
        try { 
            // Insertar 
            $datos = $r->except([ 
                '_token', 
                'excel_url_archivo', 
                'excel_lista_anexo_GD1', 
                'excel_lista_anexo_GD2', 
                //paraEstatusAnexos 
                'cb_anexo_gd', 
                'cb_anexo_adq', 
                'cb_anexo_obras', 
                'cb_anexo_egresos', 
                'cb_anexo_nomina', 
                'cb_anexo_c4k', 
                'cb_anexo_OyAdq', 
                //paraEstatusDocumentos 
                'cb_actas_cabildo', 
                'cb_contratos_cuentas_bancarias', 
                'cb_edos_cuentas01', 
                'cb_edos_cuentas02', 
                'cb_edos_cuentas03', 
                'cb_edos_cuentas04', 
                'cb_edos_cuentas05', 
                'cb_edos_cuentas06', 
                'cb_edos_cuentas07', 
                'cb_edos_cuentas08', 
                'cb_edos_cuentas09', 
                'cb_edos_cuentas10', 
                'cb_edos_cuentas11', 
                'cb_edos_cuentas12', 
                'cb_formato_3', 
                'cb_formato_3A', 
                'cb_formato_3B', 
                'cb_formato_4' 
            ]); 
            $datos['cap1k'] = $r->cap1k ? $r->cap1k : 0; 
            $datos['cap4k'] = $r->cap4k ? $r->cap4k : 0; 
            $datos['monto_nomina'] = $r->monto_nomina != NULL ? $r->monto_nomina : 0; 
            $datos['fecha'] = date('Y-m-d'); 
            $datos['id_estado'] = Auth::user()->id_estado; 
            $datos['id_municipio'] = Auth::user()->id_municipio; 
            $datos['fondo_revolvente'] = 0; 
            $datos['estatus'] = 0; 
            $datos['created_at'] = date('Y-m-d H:i:s'); 
            //paraEstatusAnexos 
            $datos['estatus_archivo'] = isset($r->cb_anexo_gd) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_adq'] = isset($r->cb_anexo_adq) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_obras'] = isset($r->cb_anexo_obras) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_egresos'] = isset($r->cb_anexo_egresos) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_nomina'] = isset($r->cb_anexo_nomina) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_c4k'] = isset($r->cb_anexo_c4k) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['estatus_anexo_obras_y_adq'] = isset($r->cb_anexo_OyAdq) ? '0' : '5'; //coloca "Sin cargar" o "No aplica" 
            $datos['obras'] = isset($r->cb_anexo_obras) ? '1' : '0'; //indica si hay o no obras 
 
            // Guardar y obtener el ID del registro insertado 
            $id_clave_ff = DB::table('clave_ff')->insertGetId($datos); 
            $claveRegistrada = Claves::with(['c_ccp', 'c_cna'])->Where('id_ff', $id_clave_ff)->first(); 
            //paraEstatusDocumentos 
            $documentosFondo = new DOCF; 
            $documentosFondo->id_clave_ff = $id_clave_ff; 
            $documentosFondo->actas_cabildo = isset($r->cb_actas_cabildo) ? '0' : '5'; 
            $documentosFondo->contratos_cuentas_bancarias = isset($r->cb_contratos_cuentas_bancarias) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_01 = isset($r->cb_edos_cuentas01) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_02 = isset($r->cb_edos_cuentas02) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_03 = isset($r->cb_edos_cuentas03) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_04 = isset($r->cb_edos_cuentas04) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_05 = isset($r->cb_edos_cuentas05) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_06 = isset($r->cb_edos_cuentas06) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_07 = isset($r->cb_edos_cuentas07) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_08 = isset($r->cb_edos_cuentas08) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_09 = isset($r->cb_edos_cuentas09) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_10 = isset($r->cb_edos_cuentas10) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_11 = isset($r->cb_edos_cuentas11) ? '0' : '5'; 
            $documentosFondo->edos_cuentas_12 = isset($r->cb_edos_cuentas12) ? '0' : '5'; 
            $documentosFondo->formato_3 = isset($r->cb_formato_3) ? '0' : '5'; 
            $documentosFondo->formato_3A = isset($r->cb_formato_3A) ? '0' : '5'; 
            $documentosFondo->formato_3B = isset($r->cb_formato_3B) ? '0' : '5'; 
            $documentosFondo->formato_4 = isset($r->cb_formato_4) ? '0' : '5'; 
            $documentosFondo->save(); 
 
            if ($r->excel_url_archivo != null) { //cuando no se registr numero del anexo gd, por lo que se registr el excel 
                //guardar anexo gastos diversos y de operaciones 
                $json_lista_anexo_GD1 = json_decode($r->excel_lista_anexo_GD1); 
                $json_lista_anexo_GD2 = json_decode($r->excel_lista_anexo_GD2); 
                foreach ($json_lista_anexo_GD1 as $kranexo => $ranexo) { 
                    $reg = new AGDO; 
                    $reg->rfc                    = $ranexo->rfc; 
                    $reg->nombre                 = $ranexo->nombre; 
                    $reg->descripcion            = $ranexo->descripcion; 
                    $reg->fecha_adq_gasto        = $ranexo->fecha_adq_gasto; 
                    $reg->monto_pagado           = $ranexo->monto_pagado; 
                    $reg->entregable             = $ranexo->entregable; 
                    $reg->monto_pagado_fondo     = $ranexo->monto_pagado_fondo; 
                    $reg->partida_clasificatoria = $ranexo->partida_clasificatoria; 
                    $reg->num_factura            = $ranexo->num_factura; 
                    $reg->num_poliza             = $ranexo->num_poliza; 
                    $reg->num_poliza             = $ranexo->num_poliza; 
                    $reg->es_gasto_diverso       = '1'; 
                    $reg->id_clave_ff            = $id_clave_ff; 
                    $reg->save(); 
                } 
                foreach ($json_lista_anexo_GD2 as $kranexo => $ranexo) { 
                    $reg = new AGDO; 
                    $reg->rfc                    = $ranexo->rfc; 
                    $reg->nombre                 = $ranexo->nombre; 
                    $reg->descripcion            = $ranexo->descripcion; 
                    $reg->fecha_adq_gasto        = $ranexo->fecha_adq_gasto; 
                    $reg->monto_pagado           = $ranexo->monto_pagado; 
                    $reg->entregable             = $ranexo->entregable; 
                    $reg->monto_pagado_fondo     = $ranexo->monto_pagado_fondo; 
                    $reg->partida_clasificatoria = $ranexo->partida_clasificatoria; 
                    $reg->num_factura            = $ranexo->num_factura; 
                    $reg->num_poliza             = $ranexo->num_poliza; 
                    $reg->num_poliza             = $ranexo->num_poliza; 
                    $reg->es_gasto_diverso       = '0'; 
                    $reg->id_clave_ff            = $id_clave_ff; 
                    $reg->save(); 
                } 
                Claves::where('id_ff', $id_clave_ff)->update(['estatus_archivo' => 1]); 
 
                //guardar excel del anexo 
                $json_url_archivo = json_decode($r->excel_url_archivo); 
                $url = '/' . 'uploads/' . $r->year . '/' . 'anexoGD/' . $r->id_dependencia . '/' . $r->clave_ff . '/' . $r->year . '/' . $r->id_nauditoria .  '/anexoGD_' . date('Ymd_His') . '.xlsx'; 
 
                $dirname = dirname(public_path() . $url); 
                if (!is_dir($dirname)) { 
                    mkdir($dirname, 0755, true); 
                } 
                $file = fopen(public_path() . $url, 'wb'); 
                $data = explode(',', $json_url_archivo); 
                fwrite($file, base64_decode($data[1])); 
                fclose($file); 
                $claveRegistrada = Claves::Where('id_ff', $id_clave_ff)->first(); 
                $claveRegistrada->url_anexo_gd = $url; 
                $claveRegistrada->save(); 
            } 
        } catch (\Exception $e) { 
            $errorEncontrado = 'Error al registrar' . LU::t_tr('d', 'fondo', 's') . ', por favor contacte con servicio tcnico.' . $e->getMessage(); 
        } 
 
        if ($errorEncontrado != '') { 
            DB::rollback(); 
            return redirect()->back()->withErrors([$errorEncontrado]); 
        } else { 
            DB::commit(); 
            return redirect()->back()->with('success', 'Se guardaron correctamente los datos: ' . LU::t_tr('v', 'fondo', 's') . ' ' . ($claveRegistrada ? '"' . $claveRegistrada->c_ccp->nombre_clave . '"' : '') . ', ' . LU::t_tr('v', 'num_auditoria', 's') . ' "' . $claveRegistrada->c_cna->numeroAuditoria . '" del ao ' . $r->year . '. Puede verlo en el men "' . LU::t_pr('m_captura_anexos')  . '" - "' . LU::t_tr('v', 'adquisiciones_obras', 'P') . '" y seleccione un "Ao a mostrar".'); 
        } 
    } 
 
    //AGREGAR FONDO FINANZAS 
    public function saveClaveFinanzas(Request $r) 
    { 
        $data['errores'] = null; 
        $newClave = null; 
        $exist =  CFFFINANZAS::where(['id_dependencia' => $r->id_dependencia, 'id_catalogo_numeros_auditoria' => $r->id_catalogo_numeros_auditoria, 'id_catalogo_claves_presupuestales' => $r->id_catalogo_claves_presupuestales])->first(); 
        if ($exist != null) { //caso en que la combinacin ya se encuentra en la BD 
            if ($exist->id != $r->id) { //Caso en que no coinciden los Id ya que son registros diferentes 
                $data['errores'][] = LU::t_tr('D', 'fondo', 's') . ' ya se encuentra registrado, verifique la tabla inferior.'; 
            } //else en caso en que el id coincide por lo que se trata del mismo registro, por lo que si se deberia guardar 
        } //else caso en que la combinacin no se encuentra en la bd, por lo que si se deberia guardar  
        if ($data['errores'] == null) { //guardar en caso que no haya errores 
            try { 
                $newClave = CFFFINANZAS::findOrFail($r->id); 
            } catch (\Throwable $th) { 
                $newClave = new CFFFINANZAS(); 
            } 
            try { 
                $newClave->id_dependencia = $r->id_dependencia; 
                $newClave->id_catalogo_numeros_auditoria = $r->id_catalogo_numeros_auditoria; 
                $newClave->id_catalogo_claves_presupuestales = $r->id_catalogo_claves_presupuestales; 
                $newClave->nombre_responsable = $r->firma_responsable; 
                $newClave->cargo_responsable = $r->cargo_responsable; 
                //paraEstatusAnexos Finanzas 
                $newClave->estatus_anexo_egresos = $this->obtenerEstatusModificado($newClave->estatus_anexo_egresos, $r->estatus_anexo_egresos); 
                $newClave->estatus_anexo_transf = $this->obtenerEstatusModificado($newClave->estatus_anexo_transf, $r->estatus_anexo_transf); 
                $newClave->updated_at = Carbon::now(); 
                $newClave->save(); 
            } catch (\Exception $e) { 
                $data['errores'][] = 'Ocurri un error al intentar editar ' . LU::t_tr('d', 'fondo', 's') . '. Contacte a servicio tcnico.'; 
            } 
        } 
        return $data; 
    } 
    //ELIMINAR FONDO FINANZAS 
    public function deleteClaveFinanzas(Request $r) 
    { 
        $data = []; 
        $mensajeDeErrorGlobal = ''; 
        $oCffFinanzas = CFFFINANZAS::find($r->id_clave_ff_finanzas); 
        if ($oCffFinanzas == null) { 
            $mensajeDeErrorGlobal = 'No se puede eliminar ' . LU::t_tr('d', 'fondo', 's') . ', ya que no existe en el sistema.'; 
        } else { 
            $estatusExistentes = ''; 
            try { 
                //paraEstatusAnexos Finanzas 
                $estatusAnexoEgresos = $oCffFinanzas->estatus_anexo_egresos; 
                if (!in_array($estatusAnexoEgresos, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Egresos es: ' . $this->estatusAnexoArchivo($estatusAnexoEgresos, 8) . "\n"; 
                } 
                $estatusAnexoTransfEjec = $oCffFinanzas->estatus_anexo_transf; 
                if (!in_array($estatusAnexoTransfEjec, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Transferencia a ejecutores es: ' . $this->estatusAnexoArchivo($estatusAnexoTransfEjec, 8) . "\n"; 
                } 
                if ($estatusExistentes == '') { 
                    try { 
                        if ($oCffFinanzas->delete()) { 
                            DB::commit(); 
                        } else { 
                            DB::rollback(); 
                            $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . ' Contacte a soporte tcnico.'; 
                        } 
                    } catch (\Exception $e) { 
                        $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . 'Contacte a servicio tcnico.' . $e->getMessage(); 
                    } 
                } else { 
                    $mensajeDeErrorGlobal = "Solo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " si sus " . LU::t_tr('v', 'anexo', 'p') . " se encuentran en estatus 'Sin cargar' o 'No aplica'.\n\nNo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " debido a que: \n" . $estatusExistentes; 
                } 
            } catch (\Exception $e) { 
                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . ' solicitado. Contacte a servicio tcnico.' . $e->getMessage(); 
            } 
        } 
        $data['errores'] = $mensajeDeErrorGlobal == '' ? null : $mensajeDeErrorGlobal; 
        return $data; 
    } 
 
    // EDITAR UNA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA) 
    public function editClave(Request $r, $idFondo) 
    { 
        $data = []; 
        $data['cff'] = Claves::With(['c_d', 'c_tc', 'c_cna'])->Where('id_ff', $idFondo)->first(); 
        $data['docf'] = []; 
        $documentos_fondo = DOCF::Where('id_clave_ff', $idFondo)->first(); 
        if ($documentos_fondo != null) { 
            $data['docf'] = $documentos_fondo; 
        } 
        $data['cff']->c_cna->cna_ca; 
        $data['h_cff'] = hcf::With(['h_u'])->Where('id_clave_ff', $idFondo)->orderBy('created_at', 'desc')->get(); 
        $data['listaEstatus'] = ['Sin cargar', 'Cargado sin enviar a revisin', 'Enviado ' . LU::t_tr('a_d', 'enlace', 's'), 'Enviado ' . LU::t_tr('a_d', 'asf', 's'), 'Regresado ' . LU::t_tr('a_d', 'ejecutor', 's'), 'No aplica']; 
 
        return view('asf_layout.editClave', $data); 
    } 
 
    // GUARDAR LA EDICIN DE UNA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA EXISTENTE 
    public function updateClave(Request $r, $idFondo) 
    { 
        DB::Begintransaction(); 
        try { 
            $clave = Claves::find($idFondo); 
            $tieneObrasNew = ($r->obras == 'SI' ? 1 : ($r->obras == 'NO' ? 0 : NULL)); 
            HCF::create([ 
                'id_clave_ff' => $idFondo, 
                'monto_recibido' => $r->monto_recibido == $clave->monto_recibido ? NULL : $r->monto_recibido, 
                'cap1k' => $r->cap1k == $clave->cap1k ? NULL : $r->cap1k, 
                'cap4k' => $r->cap4k == $clave->cap4k ? NULL : $r->cap4k, 
                'nombre_responsable' => $r->nombre_responsable == $clave->firma_responsable ? NULL : $r->nombre_responsable, 
                'cargo_responsable' => $r->cargo_responsable == $clave->cargo_responsable ? NULL : $r->cargo_responsable, 
                'obras' => $tieneObrasNew == $clave->obras ? NULL : $tieneObrasNew, 
                'id_usuario' => Auth::user()->id, 
            ]); 
            $documentos_fondo = DOCF::Where('id_clave_ff', $idFondo)->first(); 
            if ($documentos_fondo == null) { 
                $documentos_fondo = new DOCF(); 
                $documentos_fondo->id_clave_ff = $idFondo; 
            } 
            $clave->monto_recibido = ($r->monto_recibido == NULL || $r->monto_recibido == '') ? 0 : $r->monto_recibido; 
            $clave->cap1k = ($r->cap1k == NULL || $r->cap1k == '') ? 0 : $r->cap1k; 
            $clave->cap4k = ($r->cap4k == NULL || $r->cap4k == '') ? 0 : $r->cap4k; 
            $clave->monto_nomina = ($r->monto_nomina == NULL || $r->monto_nomina == '') ? 0 : $r->monto_nomina; 
            $clave->firma_responsable = ($r->nombre_responsable == NULL || $r->nombre_responsable == '') ? $clave->firma_responsable : $r->nombre_responsable; 
            $clave->cargo_responsable = ($r->cargo_responsable == NULL || $r->cargo_responsable == '') ? $clave->cargo_responsable : $r->cargo_responsable; 
            // $clave->obras = $r->obras == 'SI' ? 1 : ($r->obras == 'NO' ? 0 : NULL); 
            //paraEstatusAnexos 
            $clave->estatus_archivo = $this->obtenerEstatusModificado($clave->estatus_archivo, isset($r->cb_anexo_gd)); 
            $clave->estatus_anexo_adq = $this->obtenerEstatusModificado($clave->estatus_anexo_adq, isset($r->cb_anexo_adq)); 
            $clave->estatus_anexo_obras = $this->obtenerEstatusModificado($clave->estatus_anexo_obras, isset($r->cb_anexo_obras)); 
            $clave->estatus_anexo_egresos = $this->obtenerEstatusModificado($clave->estatus_anexo_egresos, isset($r->cb_anexo_egresos)); 
            $clave->estatus_anexo_nomina = $this->obtenerEstatusModificado($clave->estatus_anexo_nomina, isset($r->cb_anexo_nomina)); 
            $clave->estatus_anexo_c4k = $this->obtenerEstatusModificado($clave->estatus_anexo_c4k, isset($r->cb_anexo_c4k)); 
            $clave->estatus_anexo_obras_y_adq = $this->obtenerEstatusModificado($clave->estatus_anexo_obras_y_adq, isset($r->cb_anexo_OyAdq)); 
            $clave->obras = isset($r->cb_anexo_obras) ? '1' : '0'; //indica si hay o no obras 
            //paraEstatusDocumentos 
            $documentos_fondo->actas_cabildo = $this->obtenerEstatusModificado($documentos_fondo->actas_cabildo, isset($r->cb_actas_cabildo)); 
            $documentos_fondo->contratos_cuentas_bancarias = $this->obtenerEstatusModificado($documentos_fondo->contratos_cuentas_bancarias, isset($r->cb_contratos_cuentas_bancarias)); 
            $documentos_fondo->edos_cuentas_01 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_01, isset($r->cb_edos_cuentas01)); 
            $documentos_fondo->edos_cuentas_02 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_02, isset($r->cb_edos_cuentas02)); 
            $documentos_fondo->edos_cuentas_03 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_03, isset($r->cb_edos_cuentas03)); 
            $documentos_fondo->edos_cuentas_04 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_04, isset($r->cb_edos_cuentas04)); 
            $documentos_fondo->edos_cuentas_05 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_05, isset($r->cb_edos_cuentas05)); 
            $documentos_fondo->edos_cuentas_06 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_06, isset($r->cb_edos_cuentas06)); 
            $documentos_fondo->edos_cuentas_07 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_07, isset($r->cb_edos_cuentas07)); 
            $documentos_fondo->edos_cuentas_08 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_08, isset($r->cb_edos_cuentas08)); 
            $documentos_fondo->edos_cuentas_09 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_09, isset($r->cb_edos_cuentas09)); 
            $documentos_fondo->edos_cuentas_10 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_10, isset($r->cb_edos_cuentas10)); 
            $documentos_fondo->edos_cuentas_11 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_11, isset($r->cb_edos_cuentas11)); 
            $documentos_fondo->edos_cuentas_12 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_12, isset($r->cb_edos_cuentas12)); 
            $documentos_fondo->formato_3 = $this->obtenerEstatusModificado($documentos_fondo->formato_3, isset($r->cb_formato_3)); 
            $documentos_fondo->formato_3A = $this->obtenerEstatusModificado($documentos_fondo->formato_3A, isset($r->cb_formato_3A)); 
            $documentos_fondo->formato_3B = $this->obtenerEstatusModificado($documentos_fondo->formato_3B, isset($r->cb_formato_3B)); 
            $documentos_fondo->formato_4 = $this->obtenerEstatusModificado($documentos_fondo->formato_4, isset($r->cb_formato_4)); 
            $documentos_fondo->save(); 
            $clave->save(); 
            DB::commit(); 
            return \Redirect::to('/layouts'); 
        } catch (\Except $e) { 
            DB::rollback(); 
            return \Redirect::to("/layouts")->withErrors(['No se pudo guardar la informacin proporcionada al sistema']); 
        } 
    } 
 
    public function obtenerEstatusModificado($estatus, $estaMarcado) 
    { 
        $estatusNuevo = $estatus != null ? intval($estatus) : intval('5'); 
        if ($estatusNuevo == 5) { //si en la bd es "no aplica" 
            $estatusNuevo = $estaMarcado ? 0 : $estatusNuevo; 
        } else { //casos donde el estatus es diferente de 5 
            $estatusNuevo = $estaMarcado ? $estatusNuevo : 5; 
        } 
        return $estatusNuevo; 
    } 
 
 
    /*******************************************************/ 
    /*              HELPERS CAMBIOS DE VISTAS              */ 
    /*******************************************************/ 
    // SELECCIN DE MDULO DE OBRAS/ADQUISICIONES 
    public function seleccionModulo(Request $r, $id) 
    { 
        $resp['clave_ff'] = $id; 
        $resp['clave'] = DB::table('clave_ff')->where('id_ff', $id)->first(); 
        return view('asf_layout.helpers.obrasomateriales', $resp); 
    } 
 
    // SELECCIN DEL TIPO DE REGISTRO DEL CONTRATO: Bsico (Modo1 y 2) o intermedio (Modo3) 
    public function tipoRegistro(Request $r, $modulo, $id, $year) 
    { 
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first(); 
        $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave; 
        $datos['modulo'] = $modulo; 
        $datos['clave'] = $id; 
        $datos['year'] = $year; 
        $datos['cff'] = DB::table('clave_ff')->where('id_ff', $id)->first(); 
        return view('asf_layout.helpers.tipoRegistro', $datos); 
    } 
 
 
 
 
    /******************************************************/ 
    /*                      CONTRATOS                     */ 
    /******************************************************/ 
    //Variables globales para modoAdd1: 
    private $modulo = ""; 
    private $c_ff = ""; 
    private $guardado_correcto = true; 
    private $abrirExcelCorrecto = true; 
    private $hojaActual = 0; 
    private $contadorRegistro = 0; 
    private $mensajeException = ''; 
    private $soloMensajeException = false; 
 
    private $arrayNombresExcel = [ //el cambio de nombres se debe hacer en todo este archivo y en el rea de las excepciones de la BD de este archivo 
        'DE ANTICIPO' => 'de_anticipo', 
        'DE CUMPLIMIENTO' => 'de_cumplimiento', 
        'DE VICIOS OCULTOS' => 'de_vicios_ocultos', 
        'FECHA DE ACTA FINIQUITO (dd/mm/yyyy)' => 'fecha_de_acta_finiquito_ddmmyyyy', 
        'MODALIDAD DE CONTRATACIN (POR CONTRATO o POR ADMINISTRACIN DIRECTA)' => 'modalidad_de_contratacion_por_contrato_o_por_administracion_directa', 
        'MONTO DEL CONTRATO C/IVA (en pesos)' => 'monto_del_contrato_civa_en_pesos', 
        'MONTO FACTURA C/IVA (en pesos)' => 'monto_factura_civa_en_pesos', 
        'MONTO PAGADO CON FAFEF' => 'monto_pagado_con_fafef', 
        'MONTO PAGADO CON FAIS' => 'monto_pagado_con_fais', 
        'MONTO PAGADO CON FEIEF' => 'monto_pagado_con_feief', 
        'MONTO PAGADO CON PARTICIPACIONES' => 'monto_pagado_con_participaciones', 
        'MONTO PAGADO CON PARTICIPACIONES A MUN.' => 'monto_pagado_con_participaciones_a_mun', 
        'MONTO PAGADO CON FORTAMUN' => 'monto_pagado_con_fortamun', 
        'NOMBRE, DENOMINACIN Y/O RAZN SOCIAL' => 'nombre_denominacion_yo_razon_social', 
        'NM. CONTRATO O ACUERDO DE OBRA' => 'num_contrato_o_acuerdo_de_obra', 
        'NM. CONTRATO' => 'num_contrato', 
        'NM. FACTURA O FOLIO FISCAL' => 'num_factura_o_folio_fiscal', 
        'NM. PLIZA' => 'num_poliza', 
        'OBJETO DEL CONTRATO O NOMBRE DEL PROYECTO' => 'objeto_del_contrato_o_nombre_del_proyecto', 
        'OBJETO DEL CONTRATO' => 'objeto_del_contrato', 
        'PARTIDA CLASIFICADOR' => 'partida_clasificador', 
        'PERIODO DE EJECUCIN FIN (dd/mm/yyyy)' => 'periodo_de_ejecucion_fin_ddmmyyyy', 
        'PERIODO DE EJECUCIN INICIO (dd/mm/yyyy)' => 'periodo_de_ejecucion_inicio_ddmmyyyy', 
        'RFC DE EMPRESAS CONCURSANTES (en caso de ser LP o IR)' => 'rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir', 
        'RFC DE EMPRESAS EN SONDEO DE MERCADO' => 'rfc_de_empresas_en_sondeo_de_mercado', 
        'RFC' => 'rfc', 
        'TIPO DE ENTREGABLE (documento que acredite la entrega)' => 'tipo_de_entregable_documento_que_acredite_la_entrega', 
        'TIPO DE PROCEDIMIENTO (LP o IR o AD)' => 'tipo_de_procedimiento_lp_o_ir_o_ad', 
        'VIGENCIA DEL CONTRATO FIN (dd/mm/yyyy)' => 'vigencia_del_contrato_fin_ddmmyyyy', 
        'VIGENCIA DEL CONTRATO INICIO (dd/mm/yyyy)' => 'vigencia_del_contrato_inicio_ddmmyyyy', 
    ]; 
 
    // validacion de cada celda 
    private function validarCampoAdd1($campos, $nombreColumnaExcel, $permiteNoAplica, $idValidacion = 0, $obligatorio = true) 
    { 
        $mensajeValidacion = ""; 
        $texto = $campos[$nombreColumnaExcel]; 
        $nombreMostrar = str_contains($nombreColumnaExcel, 'monto_pagado_con') ? 'MONTO PAGADO CON ' . mb_strtoupper(LU::t_tr('v', 'fondo_programa', 'S')) : array_search($nombreColumnaExcel, $this->arrayNombresExcel); 
        if ($obligatorio && ($texto == null || $texto == "") && $nombreColumnaExcel != 'tipo_de_procedimiento_lp_o_ir_o_ad') { //campos vacios 
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" debe llenarse. Recuerde no combinar celdas.'; 
            if ($permiteNoAplica) { 
                $mensajeValidacion .= ' Es posible utilizar N/A'; 
            } 
        } 
        if (!$permiteNoAplica && mb_strtoupper($texto) == "N/A" && $nombreColumnaExcel != 'tipo_de_procedimiento_lp_o_ir_o_ad') { //campos con N/A 
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" no debe llenarse con N/A'; 
        } 
 
        $pattern = LU::get_regex($idValidacion, true); 
        $condicion = ""; 
        switch ($idValidacion) { 
            case 1: //"De dd/mm/yyyy a dd/mm/yyyy" 
                $condicion = 'debe contener un rango de fechas "De dd/mm/yyyy a dd/mm/yyyy" (sin comillas).'; 
                break; 
            case 4: //fecha dd/mm/yyyy 
                $condicion = 'debe ser una fecha en formato "dd/mm/yyyy" (sin comillas).'; 
                break; 
            case 8: //partidas clasificadorias para adquisiciones 2k's, 3k's o 5k's, ej: 5057 
                $condicion = 'debe ser un nmero asociado al captulo 2000, 3000  5000.'; 
                break; 
            case 9: //partidas clasificadorias para obras 6k's, ej: 6057 
                $condicion = 'debe ser un nmero asociado al captulo 6000.'; 
                break; 
        } 
        if ($condicion != "") { 
            if ($idValidacion == 4) { //cuando son fechas 
                $fechaDT = NULL; 
                try { //cuando recibe un numero y lo pasa a datetime 
                    $fechaDT = Date::excelToDateTimeObject($texto); 
                } catch (\Exception $e) { 
                } 
                if ($fechaDT == NULL) { //valida si fallo la conversion de numero a datetime 
                    try { //cuando recibe un string y lo pasa a datetime 
                        $fechaDT = date_create_from_format('d/m/Y', $texto); 
                    } catch (\Exception $e) { 
                    } 
                } 
                if ($fechaDT == NULL) { //cuando no se pudo obtener datetime con numero ni string 
                    $mensajeValidacion = 'La columna "' . $nombreMostrar . '" ' . $condicion; 
                } else { //caso en el que se obtuvo datetime correctamente 
                    $campos[$nombreColumnaExcel] = $fechaDT->format('Y-m-d'); 
 
 
                    $fechaMostrar = $fechaDT->format('d/m/Y'); 
                    $yearReg = intval($fechaDT->format('Y')); 
                    if ($yearReg < 100) { //caso en que usaron formato de dos digitos para el ao 
                        $fechaFormat2y = date_create_from_format('d/m/y', $texto); 
                        $fechaMostrar = $fechaFormat2y->format('d/m/Y'); 
                        $yearReg = intval($fechaFormat2y->format('Y')); 
                    } 
                    $yearMin = intval($this->yearDeclarado); 
                    $yearMax = intval($this->yearDeclarado + 1); 
                    if ($yearReg < $yearMin || $yearReg > $yearMax) { 
                        $mensajeValidacion = 'La columna "' . $nombreMostrar . '"' . ': "' . $fechaMostrar . '", debe ser una fecha entre ' . $yearMin . ' y ' . $yearMax . '.'; 
                    } else { 
                        $campos[$nombreColumnaExcel] = $fechaDT->format('Y-m-d'); 
                        if (in_array($nombreColumnaExcel, ['periodo_de_ejecucion_inicio_ddmmyyyy', 'vigencia_del_contrato_inicio_ddmmyyyy'])) { 
                            $this->fechaInicio = $campos[$nombreColumnaExcel]; 
                        } elseif (in_array($nombreColumnaExcel, ['periodo_de_ejecucion_fin_ddmmyyyy', 'vigencia_del_contrato_fin_ddmmyyyy'])) { 
                            $this->fechaFin = $campos[$nombreColumnaExcel]; 
                            if ($this->fechaInicio != null && $this->fechaInicio > $this->fechaFin) { 
                                $mensajeValidacion = 'La columna "' . $nombreMostrar . '"' . ': "' . $fechaMostrar . '", debe ser una fecha igual o posterior a la fecha de inicio.'; 
                            } 
                        } 
                    } 
                } 
            } elseif (!preg_match($pattern, $texto)) { //Validar texto cuando no son fechas 
                $mensajeValidacion = 'La columna "' . $nombreMostrar . '" ' . $condicion; 
            } 
        } 
 
        if (Str::startsWith($texto, "=")) { 
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" no debe contener frmulas, ingrese el valor real en la celda.'; 
        } 
 
        if ($mensajeValidacion != "") { //Casos con errores 
            $this->exceptionModoAdd1($this->mensajeException = $mensajeValidacion); 
        } 
    } 
 
    // validacion de todos los campos en las hojas 
    public $fechaInicio = null; 
    public $fechaFin = null; 
    private function validacionCamposModoAdd1($campos, $modulo, $tituloCabeceraFondo, $modalidadContratacion) 
    { 
        $this->fechaInicio = null; 
        $this->fechaFin = null; 
        $modalidadAD = mb_strtoupper($modalidadContratacion) == 'POR ADMINISTRACIN DIRECTA'; 
        switch ($this->hojaActual) { 
            case 0: 
                $this->validarCampoAdd1($campos, $tituloCabeceraFondo, false); 
                if ($modulo == 'O') { //Obras 
                    $this->validarCampoAdd1($campos, "rfc", $modalidadAD); 
                    $this->validarCampoAdd1($campos, "nombre_denominacion_yo_razon_social", $modalidadAD); 
                    $this->validarCampoAdd1($campos, "modalidad_de_contratacion_por_contrato_o_por_administracion_directa", false); 
                    $this->validarCampoAdd1($campos, "tipo_de_procedimiento_lp_o_ir_o_ad", $modalidadAD); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true); 
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false); 
                    $this->validarCampoAdd1($campos, "objeto_del_contrato_o_nombre_del_proyecto", false); 
                    $this->validarCampoAdd1($campos, "periodo_de_ejecucion_inicio_ddmmyyyy", false, 4); 
                    $this->validarCampoAdd1($campos, "periodo_de_ejecucion_fin_ddmmyyyy", false, 4); 
                    $this->validarCampoAdd1($campos, "monto_del_contrato_civa_en_pesos", false); 
                    $this->validarCampoAdd1($campos, "de_anticipo", !$modalidadAD); 
                    $this->validarCampoAdd1($campos, "de_cumplimiento", !$modalidadAD); 
                    $this->validarCampoAdd1($campos, "de_vicios_ocultos", !$modalidadAD); 
                    $this->validarCampoAdd1($campos, "fecha_de_acta_finiquito_ddmmyyyy", false, 4); 
                    $this->validarCampoAdd1($campos, "partida_clasificador", false, 9); 
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", true); 
                } else { ////Adquisiciones 
                    $this->validarCampoAdd1($campos, "rfc", false); 
                    $this->validarCampoAdd1($campos, "nombre_denominacion_yo_razon_social", false); 
                    $this->validarCampoAdd1($campos, "tipo_de_procedimiento_lp_o_ir_o_ad", false); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true); 
                    $this->validarCampoAdd1($campos, "num_contrato", false); 
                    $this->validarCampoAdd1($campos, "objeto_del_contrato", false); 
                    $this->validarCampoAdd1($campos, "vigencia_del_contrato_inicio_ddmmyyyy", false, 4); 
                    $this->validarCampoAdd1($campos, "vigencia_del_contrato_fin_ddmmyyyy", false, 4); 
                    $this->validarCampoAdd1($campos, "monto_del_contrato_civa_en_pesos", false); 
                    $this->validarCampoAdd1($campos, "de_anticipo", true); 
                    $this->validarCampoAdd1($campos, "de_cumplimiento", true); 
                    $this->validarCampoAdd1($campos, "de_vicios_ocultos", true); 
                    $this->validarCampoAdd1($campos, "tipo_de_entregable_documento_que_acredite_la_entrega", false); 
                    $this->validarCampoAdd1($campos, "partida_clasificador", false, 8); 
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", true); 
                } 
                break; 
            case 1: 
                if ($modulo == 'O') { //Obras 
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true); 
                } else { ////Adquisiciones 
                    $this->validarCampoAdd1($campos, "num_contrato", false); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true); 
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true); 
                } 
                break; 
            case 2: 
                if ($modulo == 'O') { //Obras 
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false); 
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", false); 
                    $this->validarCampoAdd1($campos, "monto_factura_civa_en_pesos", false); 
                    $this->validarCampoAdd1($campos, "num_poliza", false); 
                } else { ////Adquisiciones 
                    $this->validarCampoAdd1($campos, "num_contrato", false); 
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", false); 
                    $this->validarCampoAdd1($campos, "monto_factura_civa_en_pesos", false); 
                    $this->validarCampoAdd1($campos, "num_poliza", false); 
                } 
                break; 
        } 
    } 
 
    // Insertar contratos segn modo 
    private function exceptionModoAdd1($mensajeDeLaExcepcion, $exceptionExterno = false) 
    { 
        $this->guardado_correcto = false; 
        $errorPlantilla = false; 
        $mensajeError = ""; 
        $numeroFilasAumentar = 0; 
        if (!$this->abrirExcelCorrecto) { //verifica que todas las hojas tengan datos 
            $mensajeError = "Verifique que los " . LU::t_tr('v', 'anexo', 'p') . " (hojas de Excel) tengan datos asociados."; 
        } else { 
            $mensajeError = "Existe un dato invlido en la hoja "; 
            switch ($this->hojaActual) { 
                case 0: 
                    $mensajeError .= '1'; 
                    $numeroFilasAumentar = 16; 
                    break; 
                case 1: 
                    $mensajeError .= '2'; 
                    $numeroFilasAumentar = 7; 
                    break; 
                case 2: 
                    $mensajeError .= '3'; 
                    $numeroFilasAumentar = 8; 
                    break; 
            } 
            //Errores en de excepciones automticas al intentar guardar 
            $error = $mensajeDeLaExcepcion; 
            if (strpos($error, "Duplicate entry ") !== false && strpos($error, " for key 'contratos_unicos'") !== false) { //Num. contrato duplicado 
                $this->mensajeException = 'El nmero de contrato est duplicado.'; 
            } elseif (Str::startsWith($error, "Undefined index")) { //Caso que no encontr una cabecera 
                $errorPlantilla = true; 
                $this->todosErroresExcelImport = []; //limpia la lista de errores pues es error de la plantilla 
                $campoEncontrado = true; 
                $nombreCampoExcel = str_replace('Undefined index: ', '', $error); 
 
                $nombreMostrar = array_search($nombreCampoExcel, $this->arrayNombresExcel); 
                if ($nombreMostrar === false) { //Verifica si existe el valor en el array 
                    $nombreMostrar = $nombreCampoExcel; //Asigna la clave 
                    $campoEncontrado = false; 
                } 
 
                $linkPlantillaCorrecta = ''; 
                $this->mensajeException = $campoEncontrado ? 'No se encontr la columna: ' 
                    : 'Se ha detectado una columna indefinida:'; //caso de nuevos campos que se agreguen 
                $this->mensajeException .= $nombreMostrar . ' (de la hoja ' . ($this->hojaActual + 1) . '). ' . 
                    'Verifique que la plantilla utilizada sea del mdulo correcto y que no haya sido alterada 
                    (nombres ni ubicacin de las cabeceras y las hojas). ' . $linkPlantillaCorrecta; 
            } else { 
                $finSubcadena = strpos($error, " at row "); 
                if (strpos($error, " for column ") !== false && $finSubcadena !== false) { //Caso que no pudo registrar una celda invlida 
                    $subcadena = substr($error, 0, $finSubcadena); //cadena con caracter de columna '  ` de la bd 
                    $caracterColumna = substr($subcadena, -1); //obtiene el ltimo caracter 
                    $subcadena = substr($subcadena, 0, -1); //cadena sin caracter de columna '  ` de la bd 
                    $inicioSubcadena = strripos($subcadena, $caracterColumna); //ultima concurrencia 
                    $columnaBD = substr($subcadena, $inicioSubcadena + 1); 
                    $arrayColumnasBD = [ //debe ser conforme a la base de datos 
                        'El RFC es invlido, debe ser alfanumrico. Ingrese uno por campo.' => 'rfc', 
                        'El nombre, denominacin y/o razon social es invlido, debe ser texto.' => 'nombre_d_r_social', 
                        'La modalidad de contratacin es invlida, debe ser alfanumrica.' => 'modalidad_contratacion', 
                        'El tipo de procedimiento es invlido, debe ser alfanumrico.' => 'tipo_procedimiento', 
                        'El RFC de empresas en sondeo de mercado son invlidos, deben ser alfanumricos.' => 'rfc_empresas_sondeo', 
                        'El RFC de empresas concursantes son invlidos, deben ser alfanumricos.' => 'rfc_empresas_concursantes', 
                        'El nmero de contrato es invlido, debe ser alfanumrico.' => 'numero_contrato', 
                        'El nombre del proyecto es invlido, debe ser alfanumrico.' => 'nombre_proyecto', 
                        'El periodo de ejecucion inicio es invlido, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'periodo_ejecucion_inicio', 
                        'El periodo de ejecucion fin es invlido, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'periodo_ejecucion_fin', 
                        'El objeto del contrato es invlido, debe ser alfanumrico.' => 'objeto_contrato', 
                        'La vigencia del contrato inicio es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'vigencia_contrato_inicio', 
                        'La vigencia del contrato fin es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'vigencia_contrato_fin', 
                        'El monto del contrato es invlido, debe ser en pesos (nmero).' => 'monto_contrato', 
                        'El nmero de fianza de anticipo es invlido, puede ser alfanumrico.' => 'de_anticipo', 
                        'El nmero de fianza de cumplimiento es invlido, puede ser alfanumrico.' => 'de_cumplimiento', 
                        'El nmero de fianza de vicios ocultos es invlido, puede ser alfanumrico.' => 'de_vicios_ocultos', 
                        'El tipo de entregable es invlido, debe ser alfanumrico.' => 'tipo_entregable', 
                        'La fecha del acta de finiquito es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'fecha_acta_finiquito', 
                        'El monto pagado con ' . LU::t_tr('i', 'fondo_programa', 's') . ' es invlido, debe ser en pesos (nmero).' => 'montoPagadoConPart', 
                        // 'La partida clasificador es invlida, verifquela.' => 'partidaClasificador', //para no duplicar mensaje se omite 
                        'El nm. factura es invlido, debe ser alfanumrico.' => 'num_factura', 
                        'El nm. pliza es invlido, debe ser alfanumrico.' => 'num_poliza', 
                        'El nm. factura es invlido, debe ser alfanumrico.' => 'nFactura', 
                        'El monto es invlido, debe ser en pesos (nmero).' => 'nMonto', 
                    ]; 
 
                    $errorEnCampoBD = array_search($columnaBD, $arrayColumnasBD); 
                    if ($errorEnCampoBD !== false) { //Verifica si existe el valor en el array 
                        $this->mensajeException = $errorEnCampoBD; 
                    } 
                } else { //descomentar para caso error en el nombre de la columna 
                    // $this->mensajeException = 'Ubicacin error. ' . $error; 
                } 
            } 
 
            if ($exceptionExterno) { 
                $this->mensajeException .= " Despus de corregirlo intntelo de nuevo por favor."; 
            } 
 
            $mensajeError .= " en la fila " . ($this->contadorRegistro + $numeroFilasAumentar) . ". " . $this->mensajeException; 
            if ($this->soloMensajeException || $errorPlantilla) { 
                $mensajeError = $this->mensajeException; 
            } 
            if (strpos($mensajeError, 'El RFC "" no es vlido, verifquelo') === false) { //verifica si el mensaje no es de un rfc est vacio 
                array_push($this->todosErroresExcelImport, $mensajeError); 
            } 
            sort($this->todosErroresExcelImport); 
        } 
    } 
 
    // CONTRATOS 
    public function contratosClave(Request $r, $modulo, $id) 
    { 
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first(); 
        if ($clave_ff->id_dependencia == Auth::user()->id_dependencia) { 
            $d = Dependencias::with(['d_e', 'd_m'])->where('id_dependencia', Auth::user()->id_dependencia)->first(); 
 
            $datos['claveAnual'] = (DB::table('clave_ff as ff')->where('id_ff', $id)->select(DB::Raw('YEAR(fecha) as fecha'))->first()->fecha < date('Y')) ? 1 : 0; 
 
            $datos['id_ff'] = $id; 
            $datos['modulo'] = $modulo; 
            $contratos_o = DB::table('contratos_modo_basico')->where('id_ff', $id); 
            $contratos_a = DB::table('contratos_modo_basico')->where('id_ff', $id); 
 
 
            // DATOS PARA RESUMEN 
            $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave; 
            $datos['monto'] = $clave_ff->monto_recibido; 
            $datos['gastos_diversos'] = self::totalAnexoGD($clave_ff); 
            $datos['ramo'] = $clave_ff->ramo; 
            $datos['monto_ramo28'] = $clave_ff->cap1k; 
            $datos['obras'] = $clave_ff->obras == 1 ? 'Si' : 'No'; 
            $datos['monto_obras'] = $contratos_o->where('modulo', 'O')->where('id_ff', $id)->sum('montoPagadoConPart'); 
            $datos['monto_adquisiciones'] = $contratos_a->where('modulo', 'A')->where('id_ff', $id)->sum('montoPagadoConPart'); 
            $datos['total_reintegro_tesofe'] = Claves::Where(['id_ff' => $id, 'id_dependencia' => $d->id_dependencia])->where('year', $clave_ff->year)->sum('reintegro_tesofe'); 
            // Montos por participaciones se suman ya que no tocan el dinero de la fuente de financiamiento/programa 
            $datos['utilizado'] = $datos['monto_obras'] + $datos['monto_adquisiciones'] + $datos['monto_ramo28'] + $clave_ff->cap4k + $datos['gastos_diversos']->total + $datos['total_reintegro_tesofe']; 
            $datos['disponible'] = $datos['monto'] - $datos['utilizado']; 
            $datos['cff'] = $clave_ff; 
 
            //Anexo cap. 4k 
            $datos['anexo_cap_4k'] = null; 
            if (in_array($clave_ff->estatus_anexo_c4k, [1, 2, 3, 4])) { 
                $datos['anexo_cap_4k'] = DB::table('anexo_cap_4k as ac4k')->where('ac4k.id_clave_ff', $id)->first(); 
            } 
 
            //num auditoria 
            $objCNA = DB::table('catalogo_numeros_auditoria')->where('id', $clave_ff->id_nauditoria)->first(); 
 
            // DATOS GENERALES 
            $datos['datos_generales'] = (object) [ 
                'year' => $clave_ff->year, 
                'dependencia' => $d->sDependencia, 
                'siglas' => $d->sSiglas, 
                'municipio' => ($d->d_m == NULL) ? 'No aplica' : $d->d_m->municipio, 
                'estado' => $d->d_e->estado, 
                'id_dependencia' => $d->id_dependencia, 
                'id_fondo' => $clave_ff->clave_ff, 
                'id_nauditoria' => $clave_ff->id_nauditoria, 
                's_num_auditoria' => $objCNA->numeroAuditoria, 
                'fecha_cierre' => date('d/m/Y', strtotime($objCNA->fecha_cierre)), 
                'monto_asignado' => $clave_ff->monto_recibido, 
                'monto_utilizado' => $datos['utilizado'], 
                'monto_restante' => $datos['disponible'], 
                'url_4000' => $d->d_e->id . '/' . $d->d_m->id . '/' . $d->id_dependencia . '/' . $clave_ff->year . '/' . $clave_ff->id_nauditoria . '/' . $clave_ff->clave_ff, 
            ]; 
            $datos['isNumAuditoriaCerrado'] = $objCNA->fecha_cierre < Carbon::today()->startOfDay(); 
 
            // DATOS PARA TABLA 
            // $datos['contratos'] = cmb::from('contratos_modo_basico as cmb') 
            //     ->with(['stepper']) 
            //     ->join('catalogo_claves_presupuestales as tcff', 'cmb.clave_ff', '=', 'tcff.id') 
            //     ->where('cmb.id_ff', $id) 
            //     ->where('cmb.modulo', $modulo) 
            //     ->select('cmb.*', 'tcff.nombre_clave') 
            //     ->get(); 
            $datos['contratos'] = CMB::with(['stepper', 'c_ccp', 'c_s', 'c_ec', 'c_nf' => function ($q) { 
                $q->with(['f_p']); 
            },]) 
                ->where('id_ff', $id) 
                ->where('modulo', $modulo) 
                ->get(); 
            return view('asf_layout.contratos', $datos); 
        } else { 
            return \Redirect::to('/api/conexion/vistaRdfs')->with('verificacion', ['No tiene autorizacin para entrar a esta seccin.']); 
        } 
    } 
 
    public static function obtenerDatosContrato(Request $r) 
    { 
        $data = DB::table('contratos_modo_basico as cmb') 
            ->join('catalogo_claves_presupuestales as ccp', 'cmb.clave_ff', '=', 'ccp.id') 
            ->leftjoin('control_modo_intermedio as cmi', 'cmb.id', '=', 'cmi.id_contrato') 
            ->leftjoin('job_statuses as js', 'js.id', '=', 'cmi.j_descarga_zip_inter') 
            ->where('cmb.id_ff', $r->id_cff) 
            ->where('cmb.modulo', $r->modulo) 
            ->select( 
                'cmb.id', 
                'ccp.nombre_clave', 
                'cmb.nombre_d_r_social', 
                'cmb.tipo_procedimiento', 
                'cmb.tipo_registro', 
                'cmb.numero_contrato', 
                'cmb.monto_contrato', 
                'js.status', 
                'js.output', 
                'js.operacion_exitosa', 
                'cmi.id_contrato', 
            ) 
            ->selectRaw('DATEDIFF(NOW(), js.finished_at) as dias_transcurridos') 
            ->get(); 
        return response()->json($data); 
    } 
 
    public static function contarContratos(Request $r) 
    { 
        $data = DB::table('contratos_modo_basico as cmb') 
            ->join('catalogo_claves_presupuestales as ccp', 'cmb.clave_ff', '=', 'ccp.id') 
            ->where('cmb.id_ff', $r->id_cff) 
            ->where('cmb.modulo', $r->modulo) 
            ->count(); 
 
        return response()->json($data); 
    } 
 
    public static function obtenerPasoContrato(Request $r) 
    { 
        $consulta = DB::table('contratos_modo_basico as cmb') 
            ->join('control_modo_intermedio as cmi', 'cmi.id_contrato', '=', 'cmb.id') 
            ->where('cmb.id', $r->id_contrato) 
            ->select( 
                'cmi.status', 
                'cmi.step7', 
                'cmi.step6', 
                'cmi.step5', 
                'cmi.step4', 
                'cmi.step3', 
                'cmi.step2', 
                'cmi.step1', 
                'cmi.step0', 
            )->first(); 
        $step = 0; 
        // redireccion de step 
        if ($step == 0) { 
            if (!Auth::user()->u_ptu->c_intermedio_datos_iniciales || $consulta->step0) { 
                $step++; 
            } 
        } 
        if ($step == 1) { 
            if (!Auth::user()->u_ptu->c_intermedio_suficiencia_presupuestal || $consulta->step1) { 
                $step++; 
            } 
        } 
        if ($step == 2) { 
            if (!Auth::user()->u_ptu->c_intermedio_proceso_de_adjudicacion || $consulta->step2) { 
                $step++; 
            } 
        } 
        if ($step == 3) { 
            if (!Auth::user()->u_ptu->c_intermedio_proceso_de_contratacion || $consulta->step3) { 
                $step++; 
            } 
        } 
        if ($step == 4) { 
            if (!Auth::user()->u_ptu->c_intermedio_entrega || $consulta->step4) { 
                $step++; 
            } 
        } 
        if ($step == 5) { 
            if (!Auth::user()->u_ptu->c_intermedio_facturas || $consulta->step5) { 
                $step++; 
            } 
        } 
        if ($step == 6) { 
            if (!Auth::user()->u_ptu->c_intermedio_pago_y_polizas || $consulta->step6) { 
                $step++; 
            } 
        } 
        if ( 
            Auth::user()->u_ptu->c_intermedio_datos_iniciales && 
            Auth::user()->u_ptu->c_intermedio_suficiencia_presupuestal && 
            Auth::user()->u_ptu->c_intermedio_proceso_de_adjudicacion && 
            Auth::user()->u_ptu->c_intermedio_proceso_de_contratacion && 
            Auth::user()->u_ptu->c_intermedio_entrega && 
            Auth::user()->u_ptu->c_intermedio_facturas && 
            Auth::user()->u_ptu->c_intermedio_pago_y_polizas 
        ) { 
            if ($step == 7 && $consulta->step7) { 
                $step++; 
            } 
        } 
        $url = '/layouts/contratos/intermedio/' . $step . '/' . $r->id_contrato . '/' . $r->modulo . '/' . $r->id_cff; 
 
        return response()->json($url); 
    } 
 
    public static function verInformacionContrato(Request $r) 
    { 
 
        $datos['contrato'] = CMB::with(['stepper', 'c_ccp', 'c_s', 'c_ec', 'c_nf' => function ($q) { 
            $q->with(['f_p']); 
        },]) 
            ->where('id', $r->id_contrato) 
            ->get(); 
        $listaRegs = []; 
        $listaRegs['id'] =  $datos['contrato'][0]->id; 
        $listaRegs['clave_ff'] =  $datos['contrato'][0]->c_ccp->nombre_clave; 
        $listaRegs['rfc'] =  $datos['contrato'][0]->rfc; 
        $listaRegs['nombre_d_r_social'] =  $datos['contrato'][0]->nombre_d_r_social; 
        $listaRegs['rfc_empresas_sondeo'] =  $datos['contrato'][0]->c_s; 
        $listaRegs['rfc_empresas_concursantes'] =  $datos['contrato'][0]->c_ec; 
        $listaRegs['numero_contrato'] =  $datos['contrato'][0]->numero_contrato; 
        $listaRegs['monto_contrato'] =  $datos['contrato'][0]->monto_contrato; 
        $listaRegs['de_anticipo'] =  $datos['contrato'][0]->de_anticipo; 
        $listaRegs['de_cumplimiento'] =  $datos['contrato'][0]->de_cumplimiento; 
        $listaRegs['de_vicios_ocultos'] =  $datos['contrato'][0]->de_vicios_ocultos; 
        $listaRegs['monto_pagado_con_part'] =  $datos['contrato'][0]->montoPagadoConPart; 
        $listaRegs['partida_clasificador'] =  $datos['contrato'][0]->partidaClasificador; 
        $listaRegs['num_factura'] =  $datos['contrato'][0]->c_nf; 
        $listaRegs['tipo_registro'] =  $datos['contrato'][0]->tipo_registro; 
        switch ($datos['contrato'][0]->nombre_d_r_social) { 
            case 'lp': 
                $listaRegs['tipo_procedimiento'] = 'Licitacin pblica'; 
                break; 
            case 'ir': 
                $listaRegs['tipo_procedimiento'] = 'Invitacin restringida'; 
                break; 
            case 'ad': 
                $listaRegs['tipo_procedimiento'] = 'Adjudicacin directa'; 
                break; 
 
            default: 
                $listaRegs['tipo_procedimiento'] = 'No aplica'; 
                break; 
        } 
 
        if ($r->modulo == 'O') { 
            $listaRegs['modalidad-contratacion'] =  $datos['contrato'][0]->modalidad_contratacion; 
            $listaRegs['nombre_proyecto'] =  $datos['contrato'][0]->nombre_proyecto; 
            $listaRegs['periodo_ejecucion_inicio'] =  $datos['contrato'][0]->periodo_ejecucion_inicio; 
            $listaRegs['periodo_ejecucion_fin'] =  $datos['contrato'][0]->periodo_ejecucion_fin; 
            $listaRegs['fecha_acta_finiquito'] =  $datos['contrato'][0]->fecha_acta_finiquito; 
        } else if ($r->modulo == 'A') { 
            $listaRegs['objeto_contrato'] =  $datos['contrato'][0]->objeto_contrato; 
            $listaRegs['vigencia_contrato_inicio'] =  $datos['contrato'][0]->vigencia_contrato_inicio; 
            $listaRegs['vigencia_contrato_fin'] =  $datos['contrato'][0]->vigencia_contrato_fin; 
            $listaRegs['tipo_entregable'] =  $datos['contrato'][0]->tipo_entregable; 
        } 
 
        return response()->json($listaRegs); 
    } 
 
    //calculo del total del anexo GD de un fondo al que pertenece un contrato 
    public static function totalAnexoGD($objCFF) 
    { 
        $tieneAnexoGD = !in_array($objCFF->estatus_archivo, [0, 5]); 
        $totalAGDO = $objCFF->fondo_revolvente; 
        return (object)['tieneAnexo' => $tieneAnexoGD, 'total' => $totalAGDO]; 
    } 
 
    // EDITAR CONTRATO 
    public function editarContrato(Request $r, $modulo, $clave, $id) 
    { 
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $clave)->first(); 
        $datos['cff'] = DB::table('clave_ff')->where('id_ff', $clave)->first(); 
        $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave; 
        $datos['clave'] = $clave; 
        $datos['modulo'] = $modulo; 
        $datos['id_contrato'] = $id; 
        $datos['contratos'] = DB::table('contratos_modo_basico as cmb') 
            ->join('catalogo_claves_presupuestales as tcff', 'cmb.clave_ff', '=', 'tcff.id') 
            ->where('cmb.id', $id) 
            ->select('cmb.*', 'tcff.nombre_clave') 
            ->get(); 
        return View('asf_layout.editar_contrato', $datos); 
    } 
    // Seleccin de modo de carga de contratos 
    public function modoClave(Request $r, $modulo, $id) 
    { 
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first(); 
        $ccp = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first(); 
        $datos['n_ff'] = $ccp->nombre_clave; 
        $datos['ccp_id'] = $ccp->id; 
        $datos['c_ff'] = $clave_ff->clave_ff; 
        $datos['cff'] = DB::table('clave_ff as c') 
            ->join('catalogo_claves_presupuestales as tcff', 'c.clave_ff', '=', 'tcff.id') 
            ->where('c.id_ff', $id) 
            ->select('c.*', 'tcff.nombre_clave') 
            ->first(); 
        $datos['clave'] = $id; 
        $datos['modulo'] = $modulo; 
        $datos['year'] = $r->year; 
        $datos['nAuditoria'] = $clave_ff->id_nauditoria; 
        switch ($r->modo) { 
            case 1: 
                $datos['contratos'] = DB::table('contratos_excel_files as c') 
                    ->join('usuarios as u', 'u.id', '=', 'c.id_usuario') 
                    ->join('clave_ff as cff', 'c.id_ff', '=', 'cff.id_ff') 
                    ->join('catalogo_claves_presupuestales as ccp', 'cff.clave_ff', '=', 'ccp.id') 
                    ->where('c.id_ff', $id) 
                    ->where('c.modulo', $modulo) 
                    ->select( 
                        'c.*', 
                        'ccp.nombre_clave as fondo_programa', 
                        DB::raw("CONCAT(u.firstname,' ',u.lastname) as username") 
                    ) 
                    ->get(); 
                return view('asf_layout.modo.modo1', $datos); 
                break; 
            case 2: 
                $datos['contratos'] = DB::table('contratos_modo_basico as c') 
                    ->join('catalogo_claves_presupuestales as tcff', 'c.clave_ff', '=', 'tcff.id') 
                    ->join('usuarios as u', 'u.id', '=', 'c.id_usuario') 
                    ->where('c.id_ff', $id) 
                    ->where('c.modulo', $modulo) 
                    ->wherein('c.tipo_registro', ['1', '2']) 
                    ->select( 
                        'c.*', 
                        'tcff.nombre_clave as nombre_clave', 
                        DB::raw("CONCAT(u.firstname,' ',u.lastname) as username") 
                    ) 
                    ->get(); 
                $datos['id_contrato'] = $r->has('id_contrato') ? $r->id_contrato : "void"; 
                return View('asf_layout.modo.modo2', $datos); 
                break; 
            case 3: 
                $id_contrato = DB::table('contratos_modo_basico') 
                    ->insertGetId([ 
                        'id_ff' => $id, 
                        'id_usuario' => Auth::user()->id, 
                        'clave_ff' => $datos['c_ff'], 
                        'tipo_registro' => 3, 
                        'modulo' => $modulo 
                    ]); 
                DB::table('control_modo_intermedio')->insert(['id_ff' => $id, 'modulo' => $modulo, 'id_contrato' => $id_contrato]); 
                DB::table('files_contratos_modo_basico')->insert(['id_ff' => $id, 'modulo' => $modulo, 'id_contrato' => $id_contrato]); 
                return \Redirect::to('/layouts/contratos/intermedio/0/' . $id_contrato . '/' . $modulo . '/' . $id); 
                break; 
        } 
    } 
    //variables 
    public $lista_anexo_regs = []; 
    public $todosErroresExcelImport = []; 
    public $yearDeclarado = 0; 
    public $userAnexo; 
    public $hojasAnexo; 
    public $idNumAuditoriaAnexo; 
    public $idCcpAnexo; 
    public $tipoVistaAnexo; 
    public $archivoExcelAnexo; 
    // Insertar contratos segn modo 
    public function modoAdd(Request $r, $modo, $modulo, $id) 
    { 
        set_time_limit(0); 
        $url = ''; 
        $patternRFC = LU::get_regex(0, true); 
        switch ($modo) { 
            case 1: 
                set_time_limit(0); 
                $mensajeError = ''; 
                $contieneArchivo = false; 
                try { 
                    if ($r->has('archivo_excel')) { 
                        $data = explode(',', $r->archivo_excel); 
                        $b64Data = base64_decode($data[1]); 
                        $contieneArchivo = true; 
                    } 
                } catch (\Exception $ex) { 
                } 
                if ($contieneArchivo) { 
                    $path = '/' . 'uploads/' . $r->year . '/' . 'basico/' . $modulo . '/'; 
                    $name = ($modulo == 'O' ? 'anexoObras_' : 'anexoAdq_') . $id . '-' . Auth::user()->id . '-' . date('Ymd_His') . '.xlsx'; 
                    $url = $path . $name; 
                    $dirname = dirname(public_path() . $url); 
 
                    if (!is_dir($dirname)) { 
                        mkdir($dirname, 0755, true); 
                    } 
                    $file = fopen(public_path() . $url, 'wb'); 
                    fwrite($file, $b64Data); 
                    fclose($file); 
 
                    try { 
                        $this->yearDeclarado = $r->year; 
                        $this->idCcpAnexo = $r->ccp_id; 
                        $this->userAnexo = Auth::user(); 
                        try { 
                            $ExcelImport = $modulo == 'O' ? new AnexoObras($this->yearDeclarado, $this->userAnexo, $id, $modulo) : new AnexoAdq($this->yearDeclarado, $this->userAnexo, $id, $modulo); 
                            Excel::import($ExcelImport, public_path($url)); 
                        } catch (\Throwable $e) { 
                            $ExcelImport->todosErroresExcelImport['Hoja ' . $ExcelImport->hojaActualAnalizada . '. ']['No se pudo analizar, verifique la plantilla y que no haya frmulas que involucren diferentes hojas'] = []; 
                        } 
                        $this->lista_anexo_regs = $ExcelImport->lista_anexo_regs; 
                        $this->todosErroresExcelImport = $ExcelImport->todosErroresExcelImport; 
                        $hayProblemaEmail = false; 
                        if (!sizeof($this->todosErroresExcelImport)) { //si no hay errores se guarda 
                            $hayProblemaEmail = $this->guardarAdqObras($modulo, $id, $r->correo_contacto, $url); 
                        } 
                        if (!sizeof($this->todosErroresExcelImport)) { 
                            $datos = [ 
                                'hayProblemaEmail' => $hayProblemaEmail, 
                            ]; 
                        } 
                    } catch (\Exception $e) { 
                        $error = $e->getMessage(); 
                        switch (true) { 
                            case strpos($error, 'Your requested sheet name [') !== false: 
                                $inicioNombre = substr($error, strpos($error, '[') + 1); 
                                $finalNombre = strpos($inicioNombre, ']'); 
                                $nombreHoja = substr($inicioNombre, 0, $finalNombre); 
                                $mensajeError = 'No se encontr la hoja "' . $nombreHoja  . '", use la plantilla correcta'; 
                                break; 
 
                            default: 
                                $mensajeError = 'Error durante el anlisis del documento, comunquese con servicio tcnico'; 
                                break; 
                        } 
                    } 
                } else { 
                    $mensajeError = 'No se encontr el archivo de Excel'; 
                } 
                if ($mensajeError != '') { 
                    $this->todosErroresExcelImport['No pudo analizarse. '][$mensajeError] = []; 
                } 
 
                if (sizeof($this->todosErroresExcelImport)) { 
                    $datos = ['errores' => $this->todosErroresExcelImport]; 
                    if ($url != '') { 
                        unlink(public_path() . $url); 
                    } 
                } 
 
                return response()->json($datos); 
 
                //Codigo viejo: 
                $numContratos = 0; 
                DB::beginTransaction(); 
                $this->guardado_correcto = true; 
                $this->modulo = $modulo; 
 
                $datos['modulo'] = $modulo; 
                $datos['id_ff'] = $id; 
                $clave_ff = DB::table('clave_ff')->where('id_ff', $id)->first()->clave_ff; 
                $this->c_ff = $clave_ff; 
                // $this->year = $r->year; 
                $this->yearDeclarado = $r->year; 
                $datos['id_usuario'] = Auth::user()->id; 
                $datos['correo_contacto'] = $r->correo_contacto; 
                $datos['created_at'] = date('Y-m-d H:i:s'); 
 
                $query = DB::table('contratos_excel_files')->where('id_ff', $id); 
                if ($query->count() < 1) { 
                    $id_cef = DB::table('contratos_excel_files')->insertGetId($datos); 
                } else if ($query->count() >= 1) { 
                    $query_2 = $query->whereNull('url_archivo'); 
                    if ($query_2->count() < 1) { 
                        $id_cef = DB::table('contratos_excel_files')->insertGetId($datos); 
                    } else { 
                        $id_cef = $query->whereNull('url_archivo')->first()->id; 
                    } 
                } 
 
                $name = ""; 
                $path = ""; 
                if (Input::hasFile('archivo_excel')) { 
                    $name = ($modulo == 'O' ? 'AnexoObrasPublicas_' : 'AnexoAdquisiciones_') . $clave_ff . '_' . $id_cef . '.' . Input::file('archivo_excel')->getClientOriginalExtension(); 
                    $path = '/' . 'uploads/' . $r->year . '/' . 'basico/' . $id . '/'; 
                    $datos['url_archivo'] = $path . $name; 
                    $datos['updated_at'] = Carbon::now(); 
 
                    Input::file('archivo_excel')->move(public_path() . '/' . $path, $name); 
 
                    $this->todosErroresExcelImport = []; 
                    $this->mensajeException = ''; 
                    try { 
                        $this->abrirExcelCorrecto = false; 
                        $ExcelImport = new ExcelImport($this); 
                        Excel::import($ExcelImport, public_path($path . $name)); 
                        $this->abrirExcelCorrecto = true; 
 
                        // Data processing 
                        $this->hojaActual = 0; 
                        $this->contadorRegistro = 0; 
 
                        //Validacin dinmica 
                        $idFFClaveFF = 0; 
                        $nombreFondoPrograma = ""; 
                        $yearCompare = 0; 
                        $query = DB::table('clave_ff')->where('id_ff', $id); 
                        if ($query->count() >= 1) { 
                            $yearCompare = $query->first()->year; 
                            $idDependenciaCompare = Auth::user()->id_dependencia; 
                            $claveFFCompare = $clave_ff; 
 
                            $query = DB::table('fondo_dependencia')->where([ 
                                'id_dependencia' => $idDependenciaCompare, 
                                'year' => $yearCompare, 
                                'clave_ff' => $claveFFCompare 
                            ]); 
                            if ($query->count() >= 1) { 
                                $idFondoDependenciaCompare = $query->first()->id; 
                                $query = DB::table('clave_ff')->where(['id_fondo_dependencia' => $idFondoDependenciaCompare]); 
                                if ($query->count() >= 1) { 
                                    $idFFClaveFF = $query->first()->id_ff; 
                                } 
                            } 
                        } 
                        $idFFClaveFF = $id; //asignacion manual de idff 
                        if ($idFFClaveFF == 0) { 
                            throw new Exception($this->mensajeException = LU::t_tr('D', 'fondo_programa', 's') . ', el ao y ' . LU::t_tr('d', 'dependencia', 's') . ' no coinciden, verifquelos.'); 
                        } else { 
                            $query = DB::table('catalogo_claves_presupuestales')->where(['id' => $clave_ff]); 
                            if ($query->count() >= 1) { 
                                $nombreFondoPrograma = $query->first()->nombre_clave; 
                            } else { 
                                throw new Exception($this->mensajeException = LU::t_tr('D', 'fondo_programa', 's') . ' no se encontr, verifquelo.'); 
                            } 
                        } 
 
                        $arrayNumContratosAnexo0 = []; 
                        $arrayNumContratosAnexo1 = []; 
                        $arrayNumContratosAnexo2 = []; 
                        $tituloCabeceraFondo = 'monto_pagado_con_' . strtolower(LU::limpiarSimplificarString($nombreFondoPrograma)); 
 
                        $modContratacion = ""; 
                        $this->soloMensajeException = false; 
                        foreach ($this->lista_contratos_modo_basico as $i => $cmb) { 
                            echo var_dump(" "); 
                            $this->hojaActual = 0; 
                            $this->contadorRegistro = $i; 
 
                            //Verificar si existen campos vacios 
                            $todosCamposVacios = true; 
                            $almenosUnVacio = false; 
                            $saltar = true; //evita el primero, pues est vacia la cabecera 
                            foreach ($cmb as $c => $atributo) { //verificar vacios 
                                if ($saltar) { 
                                    $saltar = false; 
                                } else { 
                                    if ($atributo) { 
                                        $todosCamposVacios = false; 
                                    } else { 
                                        $almenosUnVacio = true; 
                                    } 
                                } 
                            } 
                            if ($todosCamposVacios) { //saltar registros completamente vacios 
                                continue; 
                            } 
 
                            //Validacion de campos 
                            if ($modulo == 'O') { 
                                $modContratacion = $cmb['modalidad_de_contratacion_por_contrato_o_por_administracion_directa']; 
                                $this->validacionCamposModoAdd1($cmb, $modulo, $tituloCabeceraFondo, $modContratacion); 
                            } else { 
                                $this->validacionCamposModoAdd1($cmb, $modulo, $tituloCabeceraFondo, ""); 
                            } 
 
                            //Objeto 
                            $arr_row_cmb = []; 
                            //Campos tabla 
                            $arr_row_cmb['id_ff'] = $idFFClaveFF; 
                            $arr_row_cmb['id_usuario'] = Auth::user()->id; 
                            $arr_row_cmb['tipo_registro'] = 1; 
                            $arr_row_cmb['modulo'] = $modulo; 
                            //Campos tanto en obras como en adquisiciones 
                            $arr_row_cmb['clave_ff'] = $clave_ff; 
 
                            //RFC 
                            if ($cmb['rfc'] == "N/A") { //valida si hay "N/A" 
                                $arr_row_cmb['rfc'] = null; 
                            } elseif (preg_match($patternRFC, $cmb['rfc'])) { //Validar RFC 
                                $arr_row_cmb['rfc'] = $cmb['rfc']; 
                            } else { //RFC invlido 
                                $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $cmb['rfc'] . '" no es vlido, verifquelo.'); 
                            } 
 
                            $arr_row_cmb['rfc'] = $cmb['rfc'] == "N/A" ? null : $cmb['rfc']; 
                            $arr_row_cmb['nombre_d_r_social'] = $cmb['nombre_denominacion_yo_razon_social'] == "N/A" ? null : $cmb['nombre_denominacion_yo_razon_social']; 
                            $arr_row_cmb['monto_contrato'] = $cmb['monto_del_contrato_civa_en_pesos'] == "N/A" ? null : $cmb['monto_del_contrato_civa_en_pesos']; 
                            $arr_row_cmb['de_anticipo'] = $cmb['de_anticipo'] == "N/A" ? null : $cmb['de_anticipo']; 
                            $arr_row_cmb['de_cumplimiento'] = $cmb['de_cumplimiento'] == "N/A" ? null : $cmb['de_cumplimiento']; 
                            $arr_row_cmb['de_vicios_ocultos'] = $cmb['de_vicios_ocultos'] == "N/A" ? null : $cmb['de_vicios_ocultos']; 
                            $arr_row_cmb['partidaClasificador'] = $cmb['partida_clasificador'] == "N/A" ? null : $cmb['partida_clasificador']; 
 
                            //opcionesMontoPagado 
                            $arr_row_cmb['montoPagadoConPart'] = $cmb[$tituloCabeceraFondo] == "N/A" ? null : $cmb[$tituloCabeceraFondo]; 
 
                            //opciones tipo de procedimiento 
                            $arrayTiposProcedimientos = [ 
                                'lp' => 'lp', 
                                'ir' => 'ir', 
                                'ad' => 'ad', 
                            ]; 
                            $tipoDeProcedimiento = strtolower($cmb['tipo_de_procedimiento_lp_o_ir_o_ad']); 
                            $puedeAsignarNoAplica = $modulo == 'O' && mb_strtoupper($modContratacion) == 'POR ADMINISTRACIN DIRECTA'; 
                            if ($puedeAsignarNoAplica) { //asignacin automtica de N/A en tipo de procedimiento 
                                // if ($puedeAsignarNoAplica && $tipoDeProcedimiento == 'n/a') {//condicin antigua 
                                $arr_row_cmb['tipo_procedimiento'] = null; 
                            } elseif (!array_key_exists($tipoDeProcedimiento, $arrayTiposProcedimientos)) { //Verifica si no existe la clave en el array 
                                //caso en que no se puede utilizar n/a ni ningun otra respuesta pues se debe ingresar el tipo de procedimiento 
                                $mensaje = 'Verifique que el TIPO DE PROCEDIMIENTO sea: LP o IR o AD.'; 
                                // if ($puedeAsignarNoAplica) { 
                                //     $mensaje .= ' Es posible utilizar N/A'; 
                                // } 
                                $this->exceptionModoAdd1($this->mensajeException = $mensaje); 
                            } else { //Si encontr el valor en el array, por lo que asigna el valor 
                                $arr_row_cmb['tipo_procedimiento'] = $arrayTiposProcedimientos[$tipoDeProcedimiento]; 
                            } 
 
                            //Calcular nmero contrato 
                            $numeroContrato = $modulo == 'O' ? $cmb['num_contrato_o_acuerdo_de_obra'] : $cmb['num_contrato']; 
                            if ($numeroContrato == "N/A") { 
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato no puede ser N/A. Use la nomenclatura SNCx (Sin nmero de contrato, donde x es un nmero) en los ' . LU::t_tr('v', 'anexo', 'p') . ' para asociar los datos.'); 
                            } else { 
                                $arr_row_cmb['numero_contrato'] = strpos($numeroContrato, "SNC") === 0 ? libUtilities::consecutivos($arr_row_cmb['id_ff'], $yearCompare) : $numeroContrato; 
                            } 
 
                            if ($modulo == 'O') { //Campos en Obras 
                                //opciones modalidad de contratacin 
                                $arrayModalidadesContratacion = [ 
                                    'POR CONTRATO' => 'Por contrato', 
                                    'POR ADMINISTRACIN DIRECTA' => 'Por administracin directa', 
                                ]; 
                                $modalidadDeContratacion = mb_strtoupper($cmb['modalidad_de_contratacion_por_contrato_o_por_administracion_directa']); 
                                if (!array_key_exists($modalidadDeContratacion, $arrayModalidadesContratacion)) { //Verifica si no existe la clave en el array 
                                    $this->exceptionModoAdd1($this->mensajeException = 'Verifique que la MODALIDAD DE CONTRATACIN sea: 
                                        POR CONTRATO o POR ADMINISTRACIN DIRECTA'); 
                                } else { //Si encontr el valor en el array, por lo que asigna el valor 
                                    $arr_row_cmb['modalidad_contratacion'] = $arrayModalidadesContratacion[$modalidadDeContratacion]; 
                                } 
 
                                $arr_row_cmb['nombre_proyecto'] = $cmb['objeto_del_contrato_o_nombre_del_proyecto'] == "N/A" ? null : $cmb['objeto_del_contrato_o_nombre_del_proyecto']; 
                                $arr_row_cmb['periodo_ejecucion_inicio'] = $cmb['periodo_de_ejecucion_inicio_ddmmyyyy'] == "N/A" ? null : $cmb['periodo_de_ejecucion_inicio_ddmmyyyy']; 
                                $arr_row_cmb['periodo_ejecucion_fin'] = $cmb['periodo_de_ejecucion_fin_ddmmyyyy'] == "N/A" ? null : $cmb['periodo_de_ejecucion_fin_ddmmyyyy']; 
                                $arr_row_cmb['fecha_acta_finiquito'] = $cmb['fecha_de_acta_finiquito_ddmmyyyy'] == "N/A" ? null : $cmb['fecha_de_acta_finiquito_ddmmyyyy']; 
                            } else { //Campos en Adquisiciones 
                                $arr_row_cmb['objeto_contrato'] = $cmb['objeto_del_contrato'] == "N/A" ? null : $cmb['objeto_del_contrato']; 
                                $arr_row_cmb['vigencia_contrato_inicio'] = $cmb['vigencia_del_contrato_inicio_ddmmyyyy'] == "N/A" ? null : $cmb['vigencia_del_contrato_inicio_ddmmyyyy']; 
                                $arr_row_cmb['vigencia_contrato_fin'] = $cmb['vigencia_del_contrato_fin_ddmmyyyy'] == "N/A" ? null : $cmb['vigencia_del_contrato_fin_ddmmyyyy']; 
                                $arr_row_cmb['tipo_entregable'] = $cmb['tipo_de_entregable_documento_que_acredite_la_entrega'] == "N/A" ? null : $cmb['tipo_de_entregable_documento_que_acredite_la_entrega']; 
                            } 
 
                            $id_cmb = 0; 
                            try { 
                                $id_cmb = DB::table('contratos_modo_basico')->insertGetId($arr_row_cmb); 
                                $numContratos += 1; 
                            } catch (\Exception $e) { 
                                $this->exceptionModoAdd1($e->getMessage()); 
                            } 
                            array_push($arrayNumContratosAnexo0, $numeroContrato); 
 
                            $array_rfc_sondeo = []; 
                            $array_rfc_concursantes = []; 
                            $this->hojaActual = 1; 
 
                            foreach ($this->lista_rfc_empresas_sondeo_y_concursantes as $j => $resc) { 
                                $this->contadorRegistro = $j; 
 
                                //Verificar si existen campos vacios 
                                $todosCamposVacios = true; 
                                $almenosUnVacio = false; 
                                $saltar = true; //evita el primero, pues est vacia la cabecera 
                                foreach ($resc as $c => $atributo) { //verificar vacios 
                                    if ($saltar) { 
                                        $saltar = false; 
                                    } else { 
                                        if ($atributo) { 
                                            $todosCamposVacios = false; 
                                        } else { 
                                            $almenosUnVacio = true; 
                                        } 
                                    } 
                                } 
                                if ($todosCamposVacios) { //saltar registros completamente vacios 
                                    continue; 
                                } 
 
                                //Validacion de campos 
                                if ($modulo == 'O') { 
                                    $this->validacionCamposModoAdd1($resc, $modulo, $tituloCabeceraFondo, $modContratacion); 
                                } else { 
                                    $this->validacionCamposModoAdd1($resc, $modulo, $tituloCabeceraFondo, ""); 
                                } 
 
                                $numContratoHoja = $modulo == 'O' ? $resc['num_contrato_o_acuerdo_de_obra'] : $resc['num_contrato']; 
                                array_push($arrayNumContratosAnexo1, $numContratoHoja); 
                                if ($numeroContrato == $numContratoHoja) { 
 
                                    //Para rfc_de_empresas_en_sondeo_de_mercado 
                                    //Objeto 
                                    $arr_row_res = []; 
                                    $arr_row_res['id_contrato'] = $id_cmb; 
                                    if ($resc['rfc_de_empresas_en_sondeo_de_mercado'] == "N/A") { //valida si hay "N/A" 
                                        //en este caso no se guarda pues el rfc no aplica 
                                    } elseif (preg_match($patternRFC, $resc['rfc_de_empresas_en_sondeo_de_mercado'])) { //Validar RFC 
                                        $arr_row_res['rfc'] = $resc['rfc_de_empresas_en_sondeo_de_mercado']; 
                                        $rfc_sondeo['srfcsondeo'] = $arr_row_res['rfc']; 
                                        array_push($array_rfc_sondeo, $rfc_sondeo); 
 
                                        try { 
                                            $id_res = DB::table('rfc_empresas_sondeo')->insertGetId($arr_row_res); 
                                        } catch (\Exception $e) { 
                                            $this->exceptionModoAdd1($e->getMessage()); 
                                        } 
                                    } else { //RFC invlido 
                                        $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $resc['rfc_de_empresas_en_sondeo_de_mercado'] . '" no es vlido, verifquelo.'); 
                                    } 
 
                                    //Para rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir 
                                    //Objeto 
                                    $arr_row_rec = []; 
                                    $arr_row_rec['id_contrato'] = $id_cmb; 
 
                                    if ($resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'] == "N/A") { //valida si hay "N/A" 
                                        //en este caso no se guarda pues el rfc no aplica 
                                    } elseif (preg_match($patternRFC, $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'])) { //Validar RFC 
                                        $arr_row_rec['rfc'] = $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir']; 
                                        $rfc_concursante['srfc'] = $arr_row_rec['rfc']; 
                                        array_push($array_rfc_concursantes, $rfc_concursante); 
 
                                        try { 
                                            $id_rec = DB::table('rfc_empresas_concursantes')->insertGetId($arr_row_rec); 
                                        } catch (\Exception $e) { 
                                            $this->exceptionModoAdd1($e->getMessage()); 
                                        } 
                                    } else { //RFC invlido 
                                        $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'] . '" no es vlido, verifquelo.'); 
                                    } 
                                } 
                            } 
                            $json_res = sizeof($array_rfc_sondeo) == 0 ? null : json_encode($array_rfc_sondeo); 
                            try { 
                                $valorCorrecto = $json_res == '[]' ? null : $json_res; 
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['rfc_empresas_sondeo' => $valorCorrecto]); 
                            } catch (\Exception $e) { 
                                $this->exceptionModoAdd1($e->getMessage()); 
                            } 
 
                            $json_rec = sizeof($array_rfc_concursantes) == 0 ? null : json_encode($array_rfc_concursantes); 
                            try { 
                                $valorCorrecto = $json_rec == '[]' ? null : $json_rec; 
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['rfc_empresas_concursantes' => $valorCorrecto]); 
                            } catch (\Exception $e) { 
                                $this->exceptionModoAdd1($e->getMessage()); 
                            } 
 
                            $array_num_factura = []; 
                            $array_polizas = []; 
                            $this->hojaActual = 2; 
                            foreach ($this->lista_num_factura as $l => $nf) { 
                                $this->contadorRegistro = $l; 
 
                                //Verificar si existen campos vacios 
                                $todosCamposVacios = true; 
                                $almenosUnVacio = false; 
                                $saltar = true; //evita el primero, pues est vacia la cabecera 
                                foreach ($nf as $c => $atributo) { //verificar vacios 
                                    if ($saltar) { 
                                        $saltar = false; 
                                    } else { 
                                        if ($atributo) { 
                                            $todosCamposVacios = false; 
                                        } else { 
                                            $almenosUnVacio = true; 
                                        } 
                                    } 
                                } 
                                if ($todosCamposVacios) { //saltar registros completamente vacios 
                                    continue; 
                                } 
 
                                //Validacion de campos 
                                if ($modulo == 'O') { 
                                    $this->validacionCamposModoAdd1($nf, $modulo, $tituloCabeceraFondo, $modContratacion); 
                                } else { 
                                    $this->validacionCamposModoAdd1($nf, $modulo, $tituloCabeceraFondo, ""); 
                                } 
 
                                $numContratoHoja = $modulo == 'O' ? $nf['num_contrato_o_acuerdo_de_obra'] : $nf['num_contrato']; 
                                array_push($arrayNumContratosAnexo2, $numContratoHoja); 
                                if ($numeroContrato == $numContratoHoja) { 
                                    //Objeto poliza 
                                    $arr_row_p = []; 
                                    $arr_row_p['id_contrato'] = $id_cmb; 
                                    $arr_row_p['num_poliza'] = $nf['num_poliza']; 
                                    $idPoliza = 0; 
                                    $poliza = DB::table('polizas')->where(['id_contrato' => $arr_row_p['id_contrato'], 'num_poliza' => $arr_row_p['num_poliza']])->get(); 
                                    $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p)); 
 
                                    //Objeto factura 
                                    $arr_row_nf = []; 
                                    $arr_row_nf['id_contrato'] = $id_cmb; 
                                    $arr_row_nf['nFactura'] = $nf['num_factura_o_folio_fiscal'] == "N/A" ? null : $nf['num_factura_o_folio_fiscal']; 
                                    $arr_row_nf['nMonto'] = $nf['monto_factura_civa_en_pesos'] == "N/A" ? null : $nf['monto_factura_civa_en_pesos']; 
                                    $arr_row_nf['idPoliza'] = $idPoliza; 
                                    $num_factura_cmb['nFactura'] = '' . $arr_row_nf['nFactura']; 
                                    $num_factura_cmb['nMonto'] = '' . $arr_row_nf['nMonto']; 
                                    $num_factura_cmb['num_poliza'] = '' . $arr_row_p['num_poliza']; 
 
                                    array_push($array_num_factura, $num_factura_cmb); 
 
                                    try { 
                                        $id_nf = DB::table('num_factura')->insertGetId($arr_row_nf); 
                                    } catch (\Exception $e) { 
                                        $this->exceptionModoAdd1($e->getMessage()); 
                                    } 
                                } 
                            } 
                            $json_nf = sizeof($array_num_factura) == 0 ? null : json_encode($array_num_factura); 
                            try { 
                                $valorCorrecto = $json_nf == '[]' ? null : $json_nf; 
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['num_factura' => $valorCorrecto]); 
                            } catch (\Exception $e) { 
                                $this->exceptionModoAdd1($e->getMessage()); 
                            } 
                        } 
 
                        //validar si los contratos de las hojas anexas estan asociados 
                        $this->soloMensajeException = true; 
                        $arrayNumContratos0unicos = array_unique($arrayNumContratosAnexo0); //hoja0 
                        $arrayNumContratos1unicos = array_unique($arrayNumContratosAnexo1); //hoja1 
                        $arrayNumContratos2unicos = array_unique($arrayNumContratosAnexo2); //hoja2 
                        /*Valida si existen datos asociados entre hojas de la 0 a la 1 y 2 mediante el nmero de contrato 
                        foreach ($arrayNumContratos0unicos as $n => $numContrato) { //numContratos de hoja0 en hoja1 y en hoja2 
                            if (!in_array($numContrato, $arrayNumContratos1unicos)) { 
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 1) no est asociado a la hoja 2, verifquelo.'); 
                            } 
                            if (!in_array($numContrato, $arrayNumContratos2unicos)) { 
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 1) no est asociado a la hoja 3, verifquelo.'); 
                            } 
                        }*/ 
                        foreach ($arrayNumContratos1unicos as $n => $numContrato) { //numContratos de hoja1 en hoja0 
                            if (!in_array($numContrato, $arrayNumContratos0unicos) && $numContrato != "") { 
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 2) no est asociado a la hoja 1, verifquelo.'); 
                            } 
                        } 
                        foreach ($arrayNumContratos2unicos as $n => $numContrato) { //numContratos de hoja2 en hoja0 
                            if (!in_array($numContrato, $arrayNumContratos0unicos) && $numContrato != "") { 
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 3) no est asociado a la hoja 1, verifquelo.'); 
                            } 
                        } 
                        $this->soloMensajeException = false; 
 
                        try { 
                            DB::table('contratos_excel_files')->where('id', $id_cef)->update($datos); 
                        } catch (\Exception $e) { 
                            $this->exceptionModoAdd1($e->getMessage()); 
                        } 
                    } catch (\Exception $e) { 
                        $this->exceptionModoAdd1($e->getMessage(), true); //exception externo (tiene try-catch internos) 
                    } 
                } else { 
                    $this->guardado_correcto = false; 
                } 
                if ($numContratos == 0) { 
                    $linkPlantillaCorrecta = ''; 
                    array_push($this->todosErroresExcelImport, "No se encontraron contratos en el archivo, revise si la plantilla es la correcta. " . $linkPlantillaCorrecta); 
                    $this->guardado_correcto = false; 
                } 
 
                if ($this->guardado_correcto) { 
                    DB::commit(); 
                    try { 
                        Mail::send(new ME($id, date('Y-m-d H:i:s'), $modo, $numContratos, $modulo)); 
                    } catch (\Throwable $th) { 
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['Se guardaron correctamente los contratos, pero el correo electrnico no pudo enviarse.'])->withInput(); 
                    } 
                    return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id); 
                } else { 
                    DB::rollback(); 
                    try { 
                        unlink($path . $name); 
                    } catch (\Exception $e) { 
                    } 
                    $cantidadErrores = 0; 
                    foreach ($this->todosErroresExcelImport as $key => $value) { 
                        $cantidadErrores += 1; 
                        if (strpos($value, "No se encontraron contratos en el archivo") !== false) { 
                            if (count($this->todosErroresExcelImport) != 1) { 
                                unset($this->todosErroresExcelImport[$key]); 
                            } 
                        } 
                    } 
                    // return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id . '/' . $this->year . '/tipoRegistro') 
                    //     ->withErrors([$this->todosErroresExcelImport]); 
                } 
                break; 
            case 2: 
                DB::beginTransaction(); 
                try { 
                    $datos = $r->except(['_token', 'none']); 
                    $numContratos = sizeof($r->clave_ff); 
                    $keys = array_keys($datos); 
                    for ($i = 0; $i < count($datos[$keys[0]]); $i++) { 
                        $arr_row = []; 
                        $arr_row['created_at'] = date('Y-m-d H:i:s'); 
                        $arr_row['id_usuario'] = Auth::user()->id; 
                        $arr_row['tipo_registro'] = 2; 
                        $arr_row['modulo'] = $modulo; 
 
                        if (!in_array('numero_contrato', $keys)) { 
                            $year = Claves::where('id_ff', $id)->first()->year; 
                            $arr_row['numero_contrato'] = libUtilities::consecutivos($id, $year); 
                        } 
                        $empr_conc = "[]"; 
                        $empr_sondeo = "[]"; 
                        $num_fac = "[]"; 
 
                        foreach ($keys as $k) { 
                            $arr_row[$k] = $datos[$k][$i]; 
                            if ($k == 'numero_contrato') 
                                if ($arr_row['numero_contrato'] == NULL || $arr_row['numero_contrato'] == '') 
                                    $arr_row['numero_contrato'] = libUtilities::consecutivos($id, Claves::where('id_ff', $id)->first()->year); 
 
                            if ($k == 'rfc_empresas_concursantes' && $datos[$k][$i] != NULL) 
                                $empr_conc = $datos[$k][$i]; 
                            if ($k == 'rfc_empresas_sondeo' && $datos[$k][$i] != NULL) 
                                $empr_sondeo = $datos[$k][$i]; 
                            if ($k == 'num_factura'  && $datos[$k][$i] != NULL) 
                                $num_fac = $datos[$k][$i]; 
                        } 
 
                        $contrato_id = DB::table('contratos_modo_basico')->insertGetId($arr_row); 
 
                        foreach (json_decode($empr_conc) as $x) 
                            DB::table('rfc_empresas_concursantes')->insert(['id_contrato' => $contrato_id, 'rfc' => $x->srfc]); 
                        foreach (json_decode($empr_sondeo) as $y) 
                            DB::table('rfc_empresas_sondeo')->insert(['id_contrato' => $contrato_id, 'rfc' => $y->srfcsondeo]); 
                        foreach (json_decode($num_fac) as $z) { 
                            $arr_row_p = []; 
                            $arr_row_p['id_contrato'] = $contrato_id; 
                            $arr_row_p['num_poliza'] = $z->num_poliza; 
                            $idPoliza = 0; 
                            $poliza = DB::table('polizas')->where(['id_contrato' => $contrato_id, 'num_poliza' => $z->num_poliza])->get(); 
                            $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p)); 
                            DB::table('num_factura')->insert(['id_contrato' => $contrato_id, 'nFactura' => $z->nFactura, 'nMonto' => $z->nMonto, 'idPoliza' => $idPoliza]); 
                        } 
                    } 
                    DB::commit(); 
                    try { 
                        Mail::send(new ME($id, date('Y-m-d H:i:s'), $modo, $numContratos, $modulo)); 
                    } catch (\Throwable $th) { 
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['Se guard correctamente, pero el correo electrnico no pudo enviarse.'])->withInput(); 
                    } 
                    return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id); 
                } catch (\Exception $e) { 
                    DB::rollback(); 
                    $error = $e->getMessage(); 
                    if (strpos($error, "Duplicate entry ") !== false && strpos($error, " for key 'numero_contrato'") !== false) { //Num. contrato duplicado 
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['El nmero de contrato est duplicado.'])->withInput(); 
                    } 
                } 
                break; 
        } 
    } 
 
    public function guardarAdqObras($modulo, $id_ff, $correo_contacto, $url_archivo) 
    { 
        $mensajeError = ''; 
        $hayProblemaEmail = false; 
        DB::Begintransaction(); 
        try { 
            foreach ($this->lista_anexo_regs[1] as $kreg => $reg) { 
                $arrayc_s = []; 
                $arrayc_ec = []; 
                $arrayHoja3 = []; 
                $obj = new cmb(); 
                foreach ($reg as $kattr => $attr) { 
                    switch ($kattr) { //['regsH2', 'regsH3'] son registros de hojas asociadas 
                        case 'regsH2': //regs de la hoja 2 
                            if (array_key_exists("rfc_empresas_sondeo", $attr)) { 
                                $aRFC = []; 
                                foreach ($attr['rfc_empresas_sondeo'] as $res => $celdasrfc) { 
                                    $vRfc = $celdasrfc[0]; // para acceder al unico array de valores del RFC 
                                    $aRFC[] = ['srfcsondeo' => $res]; 
                                    $arrayc_s[] = new RES(['rfc' => $res, 'empresa' => $vRfc['nombre']]); 
                                } 
                                $obj['rfc_empresas_sondeo'] = json_encode($aRFC); 
                            } 
                            if (array_key_exists("rfc_empresas_concursantes", $attr)) { 
                                $aRFC = []; 
                                foreach ($attr['rfc_empresas_concursantes'] as $rec => $celdasrfc) { 
                                    $vRfc = $celdasrfc[0]; // para acceder al unico array de valores del RFC 
                                    $aRFC[] = ['srfc' => $rec]; 
                                    $arrayc_ec[] = new REC(['rfc' => $rec, 'empresa' => $vRfc['nombre']]); 
                                } 
                                $obj['rfc_empresas_concursantes'] = json_encode($aRFC); 
                            } 
                            break; 
                        case 'regsH3': // regs de la hoja 3 
                            $aFacturas = []; 
                            foreach ($attr as $krh3 => $rh3) { //registro de la hoja 3 
                                $oFactura = []; 
                                $oFactura['nFactura'] =   $rh3['nFactura']; 
                                $oFactura['nMonto'] =     $rh3['nMonto']; 
                                if (array_key_exists("num_poliza", $rh3)) { 
                                    $oFactura['num_poliza'] = $rh3['num_poliza']; 
                                } 
                                $aFacturas[] = $oFactura; 
                                $arrayHoja3[] = $oFactura; 
                            } 
                            $obj['num_factura'] = json_encode($aFacturas); 
                            break; 
 
                        default: //regs de la hoja 1 
                            $obj[$kattr] = $attr; 
                            break; 
                    } 
                } //posteriormente attrs extras de la tabla bd 
                $obj['id_ff'] = $id_ff; 
                $obj['id_usuario'] = Auth::user()->id; 
                $obj['clave_ff'] = $this->idCcpAnexo; 
                $obj['tipo_registro'] = 1; 
                $obj['modulo'] = $modulo; 
                $obj['status'] = 1; 
 
                $obj->save(); 
 
                if (sizeof($arrayc_s)) { 
                    $obj->c_s()->saveMany($arrayc_s); 
                } 
                if (sizeof($arrayc_ec)) { 
                    $obj->c_ec()->saveMany($arrayc_ec); 
                } 
                foreach ($arrayHoja3 as $krh3 => $rh3) { //registro hoja 3 
                    if (array_key_exists('num_poliza', $rh3)) { 
                        $oPoliza = new P(['num_poliza' => $rh3['num_poliza']]); 
                        $obj->c_polizas()->save($oPoliza); 
                        $oNumFactura = new NF(['nFactura' => $rh3['nFactura'], 'nMonto' => $rh3['nMonto'], 'idPoliza' => $oPoliza['id']]); 
                    } else { 
                        $oNumFactura = new NF(['nFactura' => $rh3['nFactura'], 'nMonto' => $rh3['nMonto']]); 
                    } 
                    $obj->c_nf()->save($oNumFactura); 
                } 
            } 
            DB::table('contratos_excel_files')->insert([ 
                'modulo' => $modulo, 
                'url_archivo' => $url_archivo, 
                'hash_archivo' => hash_file('sha256', public_path() . $url_archivo), 
                'correo_contacto' => $correo_contacto, 
                'id_ff' => $id_ff, 
                'id_usuario' => Auth::user()->id, 
            ]); 
            Claves::where('id_ff', $id_ff)->update([($modulo == 'O' ? 'estatus_anexo_obras' : 'estatus_anexo_adq') => 1]); 
            //try { 
            //    Mail::send(new ME($id_ff, date('Y-m-d H:i:s'), 1, sizeof($this->lista_anexo_regs[1]), $modulo)); 
            //} catch (\Throwable $th) { 
            //    $hayProblemaEmail = true; 
            //} 
            $hayProblemaEmail = false; 
        } catch (\Exception $e) { 
            $mensajeError = 'No se pudo guardar ' . LU::t_tr('d', 'anexo', 's') . ', contacte con soporte tcnico' . $e->getMessage(); 
        } 
        if ($mensajeError != '') { //caso con errores 
            DB::rollback(); 
            $this->todosErroresExcelImport['Analizado. '][$mensajeError] = []; 
        } else { //caso correcto 
            DB::commit(); 
        } 
        return $hayProblemaEmail; 
    } 
 
    // Actualizar contratos 
    public function modoUpdate(Request $r, $modo, $modulo, $id) 
    { 
        $editar = $r->editar; 
        $data = $r->except(['_token', '_method', 'editar', 'none']); 
        $data['modulo'] = $modulo; 
        $data['tipo_registro'] = $modo; 
        $data['id_usuario'] = Auth::user()->id; 
        $clave = DB::table('contratos_modo_basico')->where('id', $id)->first()->id_ff; 
 
        $update = DB::table('contratos_modo_basico')->where('id', $id)->update($data); 
 
        // Limpieza de tablas de relacin 
        DB::table('num_factura')->where('id_contrato', $id)->delete(); 
        DB::table('polizas')->where('id_contrato', $id)->delete(); 
        DB::table('rfc_empresas_concursantes')->where('id_contrato', $id)->delete(); 
        DB::table('rfc_empresas_sondeo')->where('id_contrato', $id)->delete(); 
 
        // Creacin de nuevos registros en tablas de relacin 
        if ($r->rfc_empresas_concursantes != '') 
            foreach (json_decode($r->rfc_empresas_concursantes) as $x) 
                DB::table('rfc_empresas_concursantes')->insert(['id_contrato' => $id, 'rfc' => $x->srfc]); 
        if ($r->rfc_empresas_sondeo != '') 
            foreach (json_decode($r->rfc_empresas_sondeo) as $y) 
                DB::table('rfc_empresas_sondeo')->insert(['id_contrato' => $id, 'rfc' => $y->srfcsondeo]); 
        if ($r->num_factura != '') 
            foreach (json_decode($r->num_factura) as $z) { 
                $arr_row_p = []; 
                $arr_row_p['id_contrato'] = $id; 
                $arr_row_p['num_poliza'] = $z->num_poliza; 
                $idPoliza = 0; 
                $poliza = DB::table('polizas')->where(['id_contrato' => $id, 'num_poliza' => $z->num_poliza])->get(); 
                $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p)); 
                DB::table('num_factura')->insert(['id_contrato' => $id, 'nFactura' => $z->nFactura, 'nMonto' => $z->nMonto, 'idPoliza' => $idPoliza]); 
            } 
 
 
        if ($update) { 
            if ($editar == 'si') 
                return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $clave); 
            else 
                return response()->json('OK', 200); 
        } else { 
            if ($editar == 'si') 
                return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $clave); 
            else 
                return response()->json('NO', 200); 
        } 
    } 
 
    // Eliminar contratos 
    public function modoDelete(Request $r, $modo, $modulo, $id) 
    { 
        $delete = DB::table('contratos_modo_basico')->where('id', $id)->delete(); 
 
        DB::table('num_factura')->where('id_contrato', '$id')->delete(); 
        DB::table('rfc_empresas_concursantes')->where('id_contrato', '$id')->delete(); 
        DB::table('rfc_empresas_sondeo')->where('id_contrato', '$id')->delete(); 
 
        if ($delete) { 
            return response()->json('OK', 200); 
        } else { 
            return response()->json('NO', 200); 
        } 
    } 
 
 
 
 
    /******************************************************/ 
    /*        DESCARGA DE PLANTILLAS PARA LAYOUTS         */ 
    /******************************************************/ 
    public function downloadTemplate(Request $r, $modulo) 
    { 
        $ruta = ''; 
        $nombre = ''; 
 
        switch ($modulo) { 
            case 'A': 
                $ruta = '/templates/template_adquisiciones.xlsx'; 
                $nombre = 'plantilla_adquisiciones.xlsx'; 
                break; 
            case 'O': 
                $ruta = '/templates/template_obras.xlsx'; 
                $nombre = 'plantilla_obras.xlsx'; 
                break; 
        } 
        return Storage::disk('downloads')->download($ruta, $nombre); 
    } 
 
    public function saveTesofe(Request $r) 
    { 
        $row = Claves::where('id_ff', $r->id)->first(); 
        $row->reintegro_tesofe = $r->tesofe; 
        DB::beginTransaction(); 
        try { 
            $row->save(); 
            DB::commit(); 
            return response()->json('OK', 200); 
        } catch (\Exception $e) { 
            DB::rollback(); 
            $error = $e->getMessage(); 
            return response()->json('NO', 200); 
        } 
    } 
 
    // Eliminar clave FF - fondo 
 
    public function eliminarFondo(Request $r, $idClaveFF) 
    { 
        $data = []; 
        $mensajeDeErrorGlobal = ''; 
        $claveFF = Claves::find($idClaveFF); 
        if ($claveFF == null) { 
            $mensajeDeErrorGlobal = 'No se puede eliminar ' . LU::t_tr('d', 'fondo', 's') . ', ya que no existe en el sistema.'; 
        } else { 
            $estatusExistentes = ''; 
            DB::beginTransaction(); 
            try { 
                //paraEstatusAnexos 
                $archivoEstatus = $claveFF->estatus_archivo; 
                $estatusAnexoAdq = $claveFF->estatus_anexo_adq; 
                $estatusAnexoObras = $claveFF->estatus_anexo_obras; 
                $estatusAnexoEgresos = $claveFF->estatus_anexo_egresos; 
                $estatusAnexoNomina = $claveFF->estatus_anexo_nomina; 
                $estatusAnexoC4K = $claveFF->estatus_anexo_c4k; 
                //paraEstatusAnexos 
                if (!in_array($archivoEstatus, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' GD (Gastos Diversos) es: ' . $this->estatusAnexoArchivo($archivoEstatus) . "\n"; 
                } 
                if (!in_array($estatusAnexoAdq, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Adquisiciones es: ' . $this->estatusAnexoArchivo($estatusAnexoAdq) . "\n"; 
                } 
                if (!in_array($estatusAnexoObras, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Obras Pblicas es: ' . $this->estatusAnexoArchivo($estatusAnexoObras) . "\n"; 
                } 
                if (!in_array($estatusAnexoEgresos, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Egresos es: ' . $this->estatusAnexoArchivo($estatusAnexoEgresos) . "\n"; 
                } 
                if (!in_array($estatusAnexoNomina, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Nmina es: ' . $this->estatusAnexoArchivo($estatusAnexoNomina) . "\n"; 
                } 
                if (!in_array($estatusAnexoC4K, [0, 5])) { 
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Cap. 4000 es: ' . $this->estatusAnexoArchivo($estatusAnexoC4K) . "\n"; 
                } 
                if ($estatusExistentes == '') { 
                    try { 
                        $claveFF->delete(); 
                        if (isset($r->id_fondo_dependencia)) { 
                            $fondoDependencia = FD::find($r->id_fondo_dependencia); 
                            try { 
                                $fondoDependencia->delete(); 
                            } catch (\Throwable $th) { 
                                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . '. Contacte a soporte tcnico.'; 
                            } 
                        } 
                    } catch (\Exception $e) { 
                        $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . 'Contacte a servicio tcnico.' . $e->getMessage(); 
                    } 
                } else { 
                    $mensajeDeErrorGlobal = "Solo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " si sus " . LU::t_tr('v', 'anexo', 'p') . " se encuentran en estatus 'Sin cargar' o 'No aplica'.\n\nNo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " debido a que: \n" . $estatusExistentes; 
                } 
            } catch (\Exception $e) { 
                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . ' solicitado. Contacte a servicio tcnico' . $e->getMessage(); 
            } 
        } 
 
        if ($mensajeDeErrorGlobal != '') { 
            DB::rollback(); 
        } else { 
            DB::commit(); 
        } 
 
        $data['errores'] = $mensajeDeErrorGlobal; 
        return $data; 
    } 
 
    //ejecutores 
    public function estatusAnexoArchivo($estatus, $tipoUsuario = 4) //tipo de usuario que solicita, por ejemplo el 4 (por defecto) es ejecutor, el 8 y 9 son de finanzas 
    { 
        $estatusReal = ''; 
        switch ($estatus) { 
            case 0: 
                $estatusReal = 'An sin cargar'; 
                break; 
            case 1: 
                $estatusReal = 'Cargado sin enviar'; 
                break; 
            case 2: 
                $estatusReal = 'Enviado ' . LU::t_tr('a_d', 'enlace', 's'); 
                break; 
            case 3: 
                $estatusReal = 'Enviado a ' . LU::t_tr('d', 'asf', 's'); 
                break; 
            case 4: 
                switch ($tipoUsuario) { 
                    case 4: 
                        $estatusReal = 'Regresado al ' . LU::t_tr('v', 'ejecutor', 's'); 
                        break; 
                    case 8: 
                    case 9: 
                        $estatusReal = 'Regresado a finanzas'; 
                        break; 
 
                    default: 
                        alertaErrorIndefinido(); //para el desarrollo 
                        break; 
                } 
                break; 
            case 5: 
                $estatusReal = 'No aplica'; 
                break; 
            default: 
                $estatusReal = ''; 
                break; 
        } 
        return $estatusReal; 
    } 
 
    public function getAlertas(Request $request) 
    { 
 
        $fechaActual = carbon::now()->startOfDay(); 
        $query  = DB::table('catalogo_numeros_auditoria as cna') 
            ->join('estados as e', 'e.id', '=', 'cna.id_estado') 
            ->join('municipios as m', 'm.id', '=', 'cna.id_municipio') 
            ->select( 
                'cna.numeroAuditoria', 
                'cna.year', 
                'cna.fecha_cierre', 
                'e.estado', 
                'm.municipio', 
                'm.id as id_municipio' 
            )->orderBy('cna.fecha_cierre', 'asc'); 
 
        switch ($request->type) { 
            case 1: //main tiene todas las alertas  
            case 11: 
                //sin lmites 
                $query = $query->get(); 
                break; 
            case 4: //ejecutor 
            case 8: //finanzas estatal  
            case 9: //finanzas municipal 
            case 10: // enlace AE 
                // lmite el rea ejecutora 
                $query = $query->where('cna.id_estado', Auth::user()->u_d->id_estado) 
                    ->where('cna.id_municipio', Auth::user()->u_d->id_municipio) 
                    ->get(); 
                break; 
            case 3: //enlace estatal ,  
            case 7: //enlace miunicipal 
                // lmite su propio estado y municipio 
                $query = $query->where('cna.id_estado', Auth::user()->id_estado) 
                    ->where('cna.id_municipio', Auth::user()->id_municipio) 
                    ->get(); 
                break; 
            case 5: // auditor 
            case 6: //Auditor financiero 
                //lmite son los numeros de auditoria asociados al usuario 
                $query  = $query->join('num_auditorias_de_usuario as nau', 'nau.id_num_auditoria', '=', 'cna.id') 
                    ->where('nau.id_usuario', Auth::user()->id)->get(); 
                break; 
            default: 
                paraProgramacionPreventiva(); //para el desarrollo 
                break; 
        } 
        $alerts['active'] = $query->where('fecha_cierre', '>=', $fechaActual); 
        $alerts['noDate'] = $query->where('fecha_cierre', null); 
        $alerts['close'] = $query->where('fecha_cierre', '<', $fechaActual); 
 
        return response()->json($alerts); 
    } 
} 
 ?>

Did this file decode correctly?

Original Code

<?php

namespace App\Http\Controllers;
// DEPENDENCIASS
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use Illuminate\Support\Facades\Mail;
use Carbon\Carbon;
use Excel;
use Auth;
use DB;
use App\Models\Fondo_dependencia as FD;
use Illuminate\Support\Facades\Storage;
use Exception;
use Illuminate\Support\Str;

// IMPORTS
use App\Imports\ExcelImport;
use App\Imports\AnexoAdq;
use App\Imports\AnexoObras;
use App\Libraries\libUtilities;
use App\Libraries\libUtilities as LU;

// MODELOS
use App\Models\Claves;
use App\Models\Historial_cambios_fondo as hcf;
use App\Models\Dependencias;
use App\Models\Contratos_modo_basico as cmb;
use App\Models\Anexo_gastos_diversos_operacion as AGDO;
use App\Models\Fondo_dependencia;
use App\Models\TipoClave;
use App\Models\Estados_cuentas_mes as DECM;
use App\Models\TipoUsuario;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Redirect;
use \App\Models\Usuarios as U;
use \App\Models\Num_auditorias_de_usuario as NAU;
use App\Models\Rfc_empresas_sondeo as RES;
use App\Models\Rfc_empresas_concursantes as REC;
use App\Models\Num_factura as NF;
use App\Models\Polizas as P;
use App\Models\Clave_ff_finanzas as CFFFINANZAS;
use App\Models\Catalogo_numeros_auditoria as CNA;
use App\Models\Documentos_fondo as DOCF;

// MAILS
use App\Mail\MailContratosModoBasico_E as ME;
use PhpOffice\PhpSpreadsheet\Style\Conditional;

// XML
use App\Models\Cfdi_xml_comprobante;
use App\Models\Cfdi_xml_emisor_cfdi;
use App\Models\Cfdi_xml_receptor_cfdi;
use App\Models\Cfdi_xml_concepto_cfdi;
use App\Models\Cfdi_xml_nomina;
use App\Models\Cfdi_xml_emisor_nomina;
use App\Models\Cfdi_xml_receptor_nomina;
use App\Models\Cfdi_xml_percepciones;
use App\Models\Cfdi_xml_percepciones_nom;
use App\Models\Cfdi_xml_deducciones;
use App\Models\Cfdi_xml_deducciones_nom;
use App\Models\Cfdi_xml_nom_otro_pago;
use App\Models\Cfdi_xml_timbre_fiscal_digital;
use Imtigger\LaravelJobStatus\JobStatus;
use SimpleXMLIterator;


class ltController extends Controller
{
    /*************************************/
    /*            VARIABLES              */
    /*************************************/
    public $lista_contratos_modo_basico;
    public $lista_rfc_empresas_sondeo_y_concursantes;
    public $lista_num_factura;

    /*************************************/
    /*             METODOS               */
    /*************************************/

    /*********************************************/
    /*             VISTA PRINCIPAL               */
    /*********************************************/
    // PETICIONES JSON PARA FUNCIONALIDAD
    public function datosClavesFF(Request $r, $year)
    {
        $id_clave_ff = [];
        $monto_utilizado = 0;
        $monto_anexo_gd = 0;
        $monto_cap1k = 0;
        $monto_cap4k = 0;
        $total_reintegro_tesofe = 0;

        $q = Claves::Where('id_dependencia', Auth::user()->id_dependencia)->where('year', $year);
        $x = Claves::Where('id_dependencia', Auth::user()->id_dependencia)->where('year', $year);

        $data['resumen']['monto_recibido'] = ($q->count() == 0) ? 0.00 : $x->sum('monto_recibido');

        $fondos = $q->get();

        $listaGD = [];
        foreach ($fondos as $i) {
            $id_clave_ff[] = $i->id_ff;
            $totalAnexoGD = self::totalAnexoGD($i);
            $listaGD[$i->id_ff] = $totalAnexoGD;
            $monto_anexo_gd += (float) $totalAnexoGD->total;
            $monto_cap1k += (float) $i->cap1k;
            $monto_cap4k += (float) $i->cap4k;
            $total_reintegro_tesofe += (float) $i->reintegro_tesofe;
        }

        foreach ($id_clave_ff as $i) {
            $monto_utilizado += cmb::where('id_ff', $i)->sum('montoPagadoConPart');
        }
        $data['gastos_diversos'] = $listaGD;
        $data['total_reintegro_tesofe'] = $total_reintegro_tesofe;

        $data['resumen']['monto_utilizado'] = $monto_utilizado + $monto_anexo_gd + $monto_cap1k + $monto_cap4k + $total_reintegro_tesofe;
        $data['resumen']['monto_restante'] = $data['resumen']['monto_recibido'] - $data['resumen']['monto_utilizado'];

        $claves = DB::table('clave_ff as ff')
            ->join('catalogo_numeros_auditoria as cna', 'ff.id_nauditoria', '=', 'cna.id')
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id')
            ->join('catalogo_claves_presupuestales as tcff', 'ff.clave_ff', '=', 'tcff.id')
            ->join('dependencias as d', 'ff.id_dependencia', '=', 'd.id_dependencia')
            ->join('estados as e', 'e.id', '=', 'd.id_estado')
            ->join('municipios as m', 'm.id', '=', 'd.id_municipio')
            ->leftJoin('anexo_cap_4k as ac4k', 'ac4k.id_clave_ff', '=', 'ff.id_ff')
            ->where('ff.year', $year);
        //paraEstatusAnexos
        switch (Auth::user()->type) {
                // 1 - ROOT
                // 5 - Auditor
            case 1:
            case 5:
                $data['cff'] = $claves
                    ->select(
                        'ff.id_ff as id_pp',
                        'ff.clave_ff as pp',
                        'tcff.nombre_clave as n_pp',
                        'ff.monto_recibido as monto_recibido',
                        DB::Raw('YEAR(ff.fecha) as fecha'),
                        'ff.estatus as estatus',
                        'ff.id_dependencia as id_d',
                        'd.sDependencia as dependencia',
                        'd.sSiglas as siglas',
                        'ff.obras as obras',
                        'ff.cap1k as capitulomil',
                        'ff.cap4k as capitulo4mil',
                        'ff.monto_nomina as monto_nomina',
                        'ff.reintegro_tesofe as reintegro_tesofe',
                        'cna.id as id_cna',
                        'cna.numeroAuditoria as auditoria',
                        'ca.auditoria as uaa',
                        'ff.estatus_archivo',
                        'ff.estatus_anexo_adq',
                        'ff.estatus_anexo_obras',
                        'ff.estatus_anexo_egresos',
                        'ff.estatus_anexo_nomina',
                        'ff.estatus_anexo_c4k',
                        'ff.url_anexo_gd',
                        'ac4k.total_pagado_fondo as ac4k_total_pagado_fondo',
                        'ac4k.url_archivo as ac4k_url_archivo',
                        'ac4k.id as ac4k_id',
                        'd.id_estado',
                        'd.id_municipio',
                        'e.estado as sEstado',
                        'm.municipio as sMunicipio',
                        'cna.numeroAuditoria as sNumAuditoria',
                    )
                    ->orderBy('fecha', 'DESC')
                    ->get();
                break;
                //  2 - Administrador de dependencia
                //  4 - Ejecutor de dependencia
            case 2:
            case 4:
            case 11:
                $data['cff'] = $claves
                    ->where('ff.id_dependencia', Auth::user()->id_dependencia)
                    ->select(
                        'ff.id_ff as id_pp',
                        'ff.clave_ff as pp',
                        'tcff.nombre_clave as n_pp',
                        'ff.monto_recibido as monto_recibido',
                        'ff.year as fecha',
                        'ff.estatus as estatus',
                        'ff.id_dependencia as id_d',
                        'd.sDependencia as dependencia',
                        'd.sSiglas as siglas',
                        'ff.obras as obras',
                        'ff.ramo as ramo',
                        'ff.cap1k as capitulomil',
                        'ff.cap4k as capitulo4mil',
                        'ff.monto_nomina as monto_nomina',
                        'ff.reintegro_tesofe as reintegro_tesofe',
                        'cna.id as id_cna',
                        'cna.numeroAuditoria as auditoria',
                        'ca.auditoria as uaa',
                        'ff.estatus_archivo',
                        'ff.estatus_anexo_adq',
                        'ff.estatus_anexo_obras',
                        'ff.estatus_anexo_egresos',
                        'ff.estatus_anexo_nomina',
                        'ff.estatus_anexo_c4k',
                        'ff.url_anexo_gd',
                        'ac4k.total_pagado_fondo as ac4k_total_pagado_fondo',
                        'ac4k.url_archivo as ac4k_url_archivo',
                        'ac4k.id as ac4k_id',
                        'd.id_estado',
                        'd.id_municipio',
                        'e.estado as sEstado',
                        'm.municipio as sMunicipio',
                        'cna.numeroAuditoria as sNumAuditoria',
                    )
                    ->orderBy('fecha', 'DESC')
                    ->get();

                $data['claveAnual'] = DB::table('clave_ff as ff')
                    ->whereRaw('YEAR(fecha)=' . date('Y'))
                    ->where('ff.id_dependencia', Auth::user()->id_dependencia)
                    ->count();
                break;
            case 3:
                break;
        }
        return response()->json($data, 200);
    }

    public function indexDocumentos($idFondo = 0)
    {
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $idFondo)->first();
        if ($idFondo != 0 && $clave_ff->id_dependencia != Auth::user()->id_dependencia) {
            return \Redirect::to('/api/conexion/vistaRdfs')->with('verificacion', ['No tiene autorizacin para entrar a esta seccin.']);
        }
        $editar = false; //editar el contenido y enviar a revisin
        $enviarRevisionAuditores = false; //Envia la revisin de los auditores
        $regresarDesdeRevisionEnlace = false; //Regresa el estatus de los documentos al ejecutor
        $regresarDesdeRevisionAuditores = false; //Regresa el estatus de los documentos al ejecutor
        switch (Auth::user()->type) {
            case '1': //root
                $regresarDesdeRevisionEnlace = true;
                $regresarDesdeRevisionAuditores = true;
                break;
            case '3': //enlace estatal
            case '7': //enlace municipal
            case '10': //enlace rea ejecutora
                if (Auth::user()->sub_type != 'ES') {
                    $regresarDesdeRevisionEnlace = true;
                    $enviarRevisionAuditores = true;
                }
                break;
            case '5': //auditor
                // case '6': //financiero
                if (@config('tema.ms.auditor_btn_estatus_anexo_regresar')) {
                    $regresarDesdeRevisionEnlace = true;
                }
                break;
            case '4': //ejecutor
                $editar = true;
                break;
        }
        return view('asf_layout.indexDocumentos', compact(['idFondo', 'editar', 'regresarDesdeRevisionEnlace', 'regresarDesdeRevisionAuditores', 'enviarRevisionAuditores']));
    }

    public function getDataDocumentos($idFondo = 0)
    {
        $datos['errores'] = [];
        set_time_limit(0);
        try {
            $query = DB::table('clave_ff as cff')
                ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'cff.clave_ff')
                ->join('fondo_dependencia as fd', 'fd.id', '=', 'cff.id_fondo_dependencia')
                ->leftjoin('catalogo_numeros_auditoria as cna', 'cna.id', '=', 'cff.id_nauditoria')
                ->leftJoin('estados as es', 'es.id', '=', 'cff.id_estado')
                ->leftJoin('municipios as mun', 'mun.id', '=', 'cff.id_municipio')
                ->leftJoin('dependencias as dep', 'dep.id_dependencia', '=', 'cff.id_dependencia')
                ->leftJoin('documentos_fondo as docf', 'docf.id_clave_ff', '=', 'cff.id_ff');
            switch (Auth::user()->type) {
                case '1': //root
                    break;
                case '3': //enlace estatal
                case '7': //enlace municipal
                    // case '8': //finanzas estatal
                    // case '9': //finanzas municipal
                    $query->where(['es.id' => Auth::user()->id_estado, 'mun.id' => Auth::user()->id_municipio]);
                    break;
                case '4': //ejecutor
                case '10': //enlace rea ejecutora
                    if ($idFondo != 0) {
                        $query->where('cff.id_ff',  $idFondo);
                    }
                    $query->where('cff.id_dependencia',  Auth::user()->id_dependencia);
                    break;
                case '5': //auditor
                case '6': //financiero
                    $lNAU = Auth::user()->u_nau;
                    $aCNA = [];
                    foreach ($lNAU as $knau => $nau) {
                        $aCNA[] = $nau->id_num_auditoria;
                    }
                    $query->whereIn('cff.id_nauditoria',  $aCNA);
                    break;
                default:
                    paraProgramacionPreventiva(); //para el desarrollo
                    break;
            }
            $query->select(
                //paraEstatusDocumentos
                'docf.id',
                'docf.actas_cabildo',
                'docf.contratos_cuentas_bancarias',
                'docf.edos_cuentas_01',
                'docf.edos_cuentas_02',
                'docf.edos_cuentas_03',
                'docf.edos_cuentas_04',
                'docf.edos_cuentas_05',
                'docf.edos_cuentas_06',
                'docf.edos_cuentas_07',
                'docf.edos_cuentas_08',
                'docf.edos_cuentas_09',
                'docf.edos_cuentas_10',
                'docf.edos_cuentas_11',
                'docf.edos_cuentas_12',
                'docf.formato_3',
                'docf.formato_3A',
                'docf.formato_3B',
                'docf.formato_4',
                'ccp.ramo as ramo',
                'ccp.nombre_clave as fondo',
                'cff.year as year',
                'cna.numeroAuditoria as nAuditoria',
                'cna.fecha_cierre',
                'dep.sDependencia',
                'es.estado',
                'mun.municipio',
                'docf.updated_at',
                'cff.id_ff'
            );
            $datos['docsFondo'] = $query->get();
            $hoy = Carbon::now()->startOfDay();
            $datos['fechaHoy'] = $hoy->format('Y-m-d H:i:s');
            $datos['listaEstatus'] = ['Sin cargar', 'Cargado sin enviar a revisin', 'Enviado ' . LU::t_tr('a_d', 'enlace', 's'), 'Enviado ' . LU::t_tr('a_d', 'asf', 'S'), 'Regresado ' . LU::t_tr('a_d', 'ejecutor', 's'), 'No aplica'];
        } catch (\Throwable $th) {
            $datos['errores'][] = 'Error al obtener datos de la tabla, comunquese con soporte tcnico. ' . $th->getMessage();
        }
        return response()->json($datos);
    }

    public function cargarDocumentos(Request $r)
    {
        $data['errores'] = [];
        set_time_limit(0);
        DB::Begintransaction();
        try {
            $url_doc_fondo = '';
            $url_doc_fondo_borrar = '';
            $extension = '';
            $nombreArchivo = '';
            $docsFondo = DOCF::findOrFail($r->idD);
            $contieneArchivo = false;
            switch ($r->tipoDocActual) {
                case 'dAC':
                    $extension = '.pdf';
                    $nombreArchivo = LU::t_tr('v', 'actas_cabildo', 's') . '_';
                    $docBD = 1;
                    break;
                case 'dCCB':
                    $extension = '.pdf';
                    $nombreArchivo = 'Contratos_cuentas_';
                    $docBD = 2;
                    break;
                case 'dF3':
                    $extension = '.xlsx';
                    $nombreArchivo = 'Formato_3_';
                    $docBD = 4;
                    break;
                case 'dF3A':
                    $extension = '.xlsx';
                    $nombreArchivo = 'Formato_3A_';
                    $docBD = 5;
                    break;
                case 'dF3B':
                    $extension = '.xlsx';
                    $nombreArchivo = 'Formato_3B_';
                    $docBD = 6;
                    break;
                case 'dF4':
                    $extension = '.xlsx';
                    $nombreArchivo = 'Formato_4_';
                    $docBD = 7;
                    break;
            }
            if ($r->has('url_fondo') && $r->url_fondo != null) {
                try {
                    $dataF = explode(',', $r->url_fondo);
                    $b64Data = base64_decode($dataF[1]);
                    $name = $nombreArchivo . $r->idF . "_" . date('Ymd_His') . $extension;
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first();
                    $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/";
                    $url_doc_fondo = $path . $name;
                    $contieneArchivo = true;
                } catch (\Throwable $th) {
                    $data['errores'][] = 'No se encontr el archivo, debe cargarlo.';
                }
            }
            if ($contieneArchivo) {
                if ($url_doc_fondo) {
                    $dirname = dirname(public_path() . $url_doc_fondo);
                    if (!is_dir($dirname)) {
                        mkdir($dirname, 0755, true);
                    }
                    $file = fopen(public_path() . $url_doc_fondo, 'wb');
                    fwrite($file, $b64Data);
                    fclose($file);
                }
                if ($url_doc_fondo_borrar != null) {
                    unlink(public_path() . $url_doc_fondo_borrar);
                }
                switch ($docBD) {
                    case 1:
                        $url_doc_fondo_borrar = ($docsFondo->url_actas_cabildo ? $docsFondo->url_actas_cabildo : null);
                        $docsFondo->url_actas_cabildo = $url_doc_fondo;
                        $docsFondo->hash_actas_cabildo = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->actas_cabildo = 1;
                        $docsFondo->save();
                        break;
                    case 2:
                        $url_doc_fondo_borrar = (isset($docsFondo->url_contratos_cuentas_bancarias) ? $docsFondo->url_contratos_cuentas_bancarias : null);
                        $docsFondo->url_contratos_cuentas_bancarias = $url_doc_fondo;
                        $docsFondo->hash_contratos_cuentas_bancarias = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->contratos_cuentas_bancarias = 1;
                        $docsFondo->save();
                        break;
                    case 4:
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3) ? $docsFondo->url_formato_3 : null);
                        $docsFondo->url_formato_3 = $url_doc_fondo;
                        $docsFondo->hash_formato_3 = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->formato_3 = 1;
                        $docsFondo->save();
                        break;
                    case 5:
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3A) ? $docsFondo->url_formato_3A : null);
                        $docsFondo->url_formato_3A = $url_doc_fondo;
                        $docsFondo->hash_formato_3A = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->formato_3A = 1;
                        $docsFondo->save();
                        break;
                    case 6:
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_3B) ? $docsFondo->url_formato_3B : null);
                        $docsFondo->url_formato_3B = $url_doc_fondo;
                        $docsFondo->hash_formato_3B = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->formato_3B = 1;
                        $docsFondo->save();
                        break;
                    case 7:
                        $url_doc_fondo_borrar = (isset($docsFondo->url_formato_4) ? $docsFondo->url_formato_4 : null);
                        $docsFondo->url_formato_4 = $url_doc_fondo;
                        $docsFondo->hash_formato_4 = hash_file('sha256', public_path() . $url_doc_fondo);
                        $docsFondo->formato_4 = 1;
                        $docsFondo->save();
                        break;
                }
            } else {
                $data['errores'][] = 'No se encontr el archivo, debe cargarlo.';
            }
        } catch (\Throwable $th) {
            $data['errores'][] = "No pudo guardarse el archivo, comunquese con soporte tcnico. " .  $th->getLine() . ', ' . $th->getMessage();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data, 200);
    }

    public function cargarDocumentosMes(Request $r)
    {
        $analizarXml = false; //quitarc Sirve para intercambiar entre versiones de lectura masiva de xml,  posteriormente quitar
        $data['errores'] = [];
        set_time_limit(0);
        DB::Begintransaction();
        try {
            $url_doc_fondo = null;
            $url_doc_fondo_xml = null;
            $hash_doc_fondo = null;
            $hash_doc_fondo_xml = null;
            $docsFondo = DOCF::findOrFail($r->idD);
            $contieneArchivo = false;
            $contieneArchivoXML = false;
            if ($r->has('url_fondo') && $r->url_fondo != null) {
                try {
                    $dataF = explode(',', $r->url_fondo);
                    $b64Data = base64_decode($dataF[1]);
                    $name = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".pdf";
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first();
                    $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/";
                    $url_doc_fondo = $path . $name;
                    $contieneArchivo = true;
                } catch (\Throwable $th) {
                    $data['errores'][] = 'No se encontr el archivo PDF, debe cargarlo.';
                }
            }
            if ($r->has('url_fondo_cfdi')) {
                try {
                    $datax = explode(',', $r->url_fondo_cfdi);
                    $b64DataX = base64_decode($datax[1]);
                    $nameD = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".xml";
                    $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first();
                    $pathXML = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/";
                    $url_doc_fondo_xml = $pathXML . $nameD;
                    $contieneArchivoXML = true;
                } catch (\Throwable $th) {
                    $data['errores'][] = 'No se encontr el archivo XML, debe cargarlo. ' . $th->getMessage();
                }
            }
            $estados_cuentas_mes = new DECM;
            $estados_cuentas_mes->id_documentos_fondo = $docsFondo->id;
            $estados_cuentas_mes->mes = $r->mes;
            $estados_cuentas_mes->url_estados_cuentas_pdf = $url_doc_fondo;
            $estados_cuentas_mes->url_estados_cuentas_xml = $url_doc_fondo_xml;
            switch ($r->mes) {
                case 'enero':
                    $docsFondo->edos_cuentas_01 = 1;
                    break;
                case 'febrero':
                    $docsFondo->edos_cuentas_02 = 1;
                    break;
                case 'marzo':
                    $docsFondo->edos_cuentas_03 = 1;
                    break;
                case 'abril':
                    $docsFondo->edos_cuentas_04 = 1;
                    break;
                case 'mayo':
                    $docsFondo->edos_cuentas_05 = 1;
                    break;
                case 'junio':
                    $docsFondo->edos_cuentas_06 = 1;
                    break;
                case 'julio':
                    $docsFondo->edos_cuentas_07 = 1;
                    break;
                case 'agosto':
                    $docsFondo->edos_cuentas_08 = 1;
                    break;
                case 'septiembre':
                    $docsFondo->edos_cuentas_09 = 1;
                    break;
                case 'octubre':
                    $docsFondo->edos_cuentas_10 = 1;
                    break;
                case 'noviembre':
                    $docsFondo->edos_cuentas_11 = 1;
                    break;
                case 'diciembre':
                    $docsFondo->edos_cuentas_12 = 1;
                    break;
            }
            if ($contieneArchivo) {
                if ($url_doc_fondo) {
                    $dirname = dirname(public_path() . $url_doc_fondo);
                    if (!is_dir($dirname)) {
                        mkdir($dirname, 0755, true);
                    }
                    $file = fopen(public_path() . $url_doc_fondo, 'wb');
                    fwrite($file, $b64Data);
                    fclose($file);
                    $hash_doc_fondo = hash_file('sha256', public_path() . $url_doc_fondo);
                    $estados_cuentas_mes->hash_estados_cuentas_pdf = $hash_doc_fondo;
                }
            }
            if ($contieneArchivoXML) {
                if ($url_doc_fondo_xml) {
                    try {
                        $dirname = dirname(public_path() . $url_doc_fondo_xml);
                        if (!is_dir($dirname)) {
                            mkdir($dirname, 0755, true);
                        }
                        $fileXML = fopen(public_path() . $url_doc_fondo_xml, 'wb');
                        fwrite($fileXML, $b64DataX);
                        fclose($fileXML);
                        if ($analizarXml) {
                            $cfdi_reader = new SimpleXMLIterator(public_path() . $url_doc_fondo_xml, 0, TRUE);
                            $ns = $cfdi_reader->getDocNamespaces(true);
                            $nsNomina = null;
                            foreach ($ns as $kllave => $valorNs) {
                                if (Str::startsWith($kllave, "nomina")) {
                                    $nsNomina = $kllave;
                                }
                            }
                            if (!$nsNomina) {
                                //Error: No se encontro el NameSpace "Nomina"
                                $data['errores'][] = 'Error de validacion de xml. No se encuentra el NameSpace "nomina"';
                            }

                            if ($cfdi_reader->getName() == 'comprobantes') {
                                foreach ($cfdi_reader->children($ns['cfdi']) as $comprobante) {
                                    self::lecturaComprobanteXML($comprobante, $ns, $nsNomina, $estados_cuentas_mes);
                                }
                            } else {
                                self::lecturaComprobanteXML($cfdi_reader, $ns, $nsNomina, $estados_cuentas_mes);
                            }
                        }
                    } catch (\Throwable $e) {
                        $data['errores'][] = 'Error de validacion de xml. Comunquese con soporte tcnico. ' . $e->getLine() . '. ' . $e->getMessage();
                    }
                }
                $docsFondo->save();
                $hash_doc_fondo_xml = hash_file('sha256', public_path() . $url_doc_fondo_xml);
                $estados_cuentas_mes->hash_estados_cuentas_xml = $hash_doc_fondo_xml;
                $estados_cuentas_mes->save();
            } else {
                $data['errores'][] = 'No se encontr el archivo XML, debe cargarlo.';
            }
        } catch (\Throwable $th) {
            $data['errores'][] = "No pudo guardarse el archivo, comunquese con soporte tcnico. " . $th->getMessage() . ' linea: ' . $th->getLine();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
            try {
                if ($url_doc_fondo_xml) {
                    unlink(public_path() . $url_doc_fondo_xml);
                }
                if ($url_doc_fondo) {
                    unlink(public_path() . $url_doc_fondo);
                }
            } catch (\Throwable $th) {
            }
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data);
    }

    public function lecturaComprobanteXML($cfdi_reader, $ns, $nsNomina, $estados_cuentas_mes) //A partir del nodo 'Comprobante'
    {
        $comp = new Cfdi_xml_comprobante();
        $comp->version_comprobante = strval($cfdi_reader->attributes()->Version);
        $comp->serie = strval($cfdi_reader->attributes()->Serie);
        $comp->folio = strval($cfdi_reader->attributes()->Folio);
        $comp->fecha = date('Y-m-d', strtotime(strval($cfdi_reader->attributes()->Fecha)));
        $comp->no_certificado = strval($cfdi_reader->attributes()->NoCertificado);
        $comp->subtotal = strval($cfdi_reader->attributes()->SubTotal);
        $comp->descuento = strval($cfdi_reader->attributes()->Descuento);
        $comp->moneda = strval($cfdi_reader->attributes()->Moneda);
        $comp->total = strval($cfdi_reader->attributes()->Total);
        $comp->tipo_comprobante = strval($cfdi_reader->attributes()->TipoDeComprobante);
        $comp->exportacion = strval($cfdi_reader->attributes()->Exportacion);
        $comp->metodo_pago = strval($cfdi_reader->attributes()->MetodoPago);
        $comp->lugar_expedicion = strval($cfdi_reader->attributes()->LugarExpedicion);
        $comp->certificado = strval($cfdi_reader->attributes()->Certificado);
        $comp->sello = strval($cfdi_reader->attributes()->Sello);
        $estados_cuentas_mes->com()->save($comp);

        foreach ($cfdi_reader->children($ns['cfdi']) as $complemento) {
            switch ($complemento->getName()) {
                case 'Emisor':
                    $em = new Cfdi_xml_emisor_cfdi();
                    $em->rfc_em = strval($complemento->attributes()->Rfc);
                    $em->nombre_em = strval($complemento->attributes()->Nombre);
                    $em->regimen_fiscal_em = strval($complemento->attributes()->RegimenFiscal);
                    $comp->emi()->save($em);
                    break;
                case 'Receptor':
                    $rec = new Cfdi_xml_receptor_cfdi();
                    $rec->rfc_rec = strval($complemento->attributes()->Rfc);
                    $rec->nombre_rec = strval($complemento->attributes()->Nombre);
                    $rec->uso_cfdi = strval($complemento->attributes()->UsoCFDI);
                    //$rec->domicilio_fiscal_rec = strval($complemento->attributes()->DomicilioFiscalReceptor);
                    //$rec->regimen_fiscal_rec = strval($complemento->attributes()->RegimenFiscalReceptor);
                    $comp->rec()->save($rec);
                    break;
                case 'Conceptos':
                    $aConceptos = array();
                    foreach ($complemento->children($ns['cfdi']) as $concepto) {
                        $concepto_cfdi = array(
                            'clave_prod_serv' => strval($concepto->attributes()->ClaveProdServ),
                            'cantidad' => strval($concepto->attributes()->Cantidad),
                            'clave_unidad' => strval($concepto->attributes()->ClaveUnidad),
                            'descripcion' => strval($concepto->attributes()->Descripcion),
                            'valor_unitario' => strval($concepto->attributes()->ValorUnitario),
                            'importe' => strval($concepto->attributes()->Importe),
                            //'objeto_imp' => strval($concepto->attributes()->ObjetoImp),
                            'descuento' => strval($concepto->attributes()->Descuento),
                        );
                        $conc = new Cfdi_xml_concepto_cfdi($concepto_cfdi);
                        $aConceptos[] = $conc;
                    }
                    $comp->conc()->saveMany($aConceptos);
                    $aConceptos = null;
                    break;
                case 'Complemento':
                    foreach ($complemento->children($ns[$nsNomina]) as $nom) {
                        $nomina_nomina = array(
                            'version' => strval($nom->attributes()->Version),
                            'tipo_nomina' => strval($nom->attributes()->TipoNomina),
                            'fecha_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaPago))),
                            'fecha_inicial_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaInicialPago))),
                            'fecha_final_pago' =>  date('Y-m-d', strtotime(strval($nom->attributes()->FechaFinalPago))),
                            'dias_pagados' => strval($nom->attributes()->NumDiasPagados),
                            'total_percepciones' => strval($nom->attributes()->TotalPercepciones),
                            'total_deducciones' => strval($nom->attributes()->TotalDeducciones),
                            'total_otros_pagos' => strval($nom->attributes()->TotalOtrosPagos),

                        );
                        $nomina = new Cfdi_xml_nomina($nomina_nomina);
                        $comp->nom()->save($nomina);
                        foreach ($nom->children($ns[$nsNomina]) as $nomdet) {
                            switch ($nomdet->getName()) {
                                case 'Emisor':
                                    $nomina_emisor = new Cfdi_xml_emisor_nomina();
                                    //$nomina_emisor->registro_patronal = strval($nomdet->attributes()->RfcPatronOrigen);
                                    $nomina_emisor->rfc_patron_origen = strval($nomdet->attributes()->RegistroPatronal);
                                    $nomina->emi_nom()->save($nomina_emisor);
                                    break;
                                case 'Receptor':
                                    $nomina_receptor = new Cfdi_xml_receptor_nomina();
                                    $nomina_receptor->curp_receptor = strval($nomdet->attributes()->Curp);
                                    $nomina_receptor->tipo_contrato = strval($nomdet->attributes()->TipoContrato);
                                    $nomina_receptor->tipo_regimen = strval($nomdet->attributes()->TipoRegimen);
                                    $nomina_receptor->num_empleado = strval($nomdet->attributes()->NumEmpleado);
                                    $nomina_receptor->tipo_jornada = strval($nomdet->attributes()->TipoJornada);
                                    $nomina_receptor->periodicidad_pago = strval($nomdet->attributes()->PeriodicidadPago);
                                    $nomina_receptor->cuenta_bancaria = strval($nomdet->attributes()->CuentaBancaria);
                                    $nomina_receptor->clave_ent_fed = strval($nomdet->attributes()->ClaveEntFed);
                                    $nomina_receptor->nss = strval($nomdet->attributes()->NumSeguridadSocial);
                                    $nomina_receptor->inicio_rel_laboral =  date('Y-m-d', strtotime(strval($nomdet->attributes()->FechaInicioRelLaboral)));
                                    $nomina_receptor->antiguedad = strval($nomdet->attributes()->Antigedad);
                                    $nomina_receptor->riesgo_puesto = strval($nomdet->attributes()->RiesgoPuesto);
                                    $nomina_receptor->salario_diario_integrado = strval($nomdet->attributes()->SalarioDiarioIntegrado);
                                    $nomina->rec_nom()->save($nomina_receptor);
                                    break;
                                case 'Percepciones':
                                    $nomina_percepciones = new Cfdi_xml_percepciones_nom();
                                    $nomina_percepciones->total_sueldos = strval($nomdet->attributes()->TotalSueldos);
                                    $nomina_percepciones->total_gravado = strval($nomdet->attributes()->TotalGravado);
                                    $nomina_percepciones->total_exento = strval($nomdet->attributes()->TotalExento);
                                    $nomina->perc()->save($nomina_percepciones);
                                    $aPercepciones = array();
                                    foreach ($nomdet->children($ns[$nsNomina]) as $percepcion) {
                                        $nomina_percepcion = array(
                                            'tipo_p' => strval($percepcion->attributes()->TipoPercepcion),
                                            'clave_p' => strval($percepcion->attributes()->Clave),
                                            'concepto_p' => strval($percepcion->attributes()->Concepto),
                                            'importe_gravado' => strval($percepcion->attributes()->ImporteGravado),
                                            'importe_exento' => strval($percepcion->attributes()->ImporteExento),
                                        );
                                        $oPercepcion = new Cfdi_xml_percepciones($nomina_percepcion);
                                        $aPercepciones[] = $oPercepcion;
                                    }
                                    $nomina_percepciones->perc()->saveMany($aPercepciones);
                                    $aPercepciones = null;
                                    break;
                                case 'Deducciones':
                                    $nomina_deducciones = new Cfdi_xml_deducciones_nom();
                                    $nomina_deducciones->total_deducciones = strval($nomdet->attributes()->TotalOtrasDeducciones);
                                    $nomina_deducciones->total_imp_retenidos = strval($nomdet->attributes()->TotalImpuestosRetenidos);
                                    $nomina->ded()->save($nomina_deducciones);
                                    $aDeducciones = array();
                                    foreach ($nomdet->children($ns[$nsNomina]) as $deducion) {
                                        $nomina_deduccion = array(
                                            'tipo_d' => strval($deducion->attributes()->TipoDeduccion),
                                            'clave_d' => strval($deducion->attributes()->Clave),
                                            'concepto_d' => strval($deducion->attributes()->Concepto),
                                            'importe_d' => strval($deducion->attributes()->Importe),
                                        );
                                        $oDeduccion = new Cfdi_xml_deducciones($nomina_deduccion);
                                        $aDeducciones[] = $oDeduccion;
                                    }
                                    $nomina_deducciones->ded()->saveMany($aDeducciones);
                                    $aDeducciones = null;
                                    break;
                                case 'OtrosPagos':
                                    foreach ($nomdet->children($ns[$nsNomina]) as $otropago) {
                                        $nomina_otropago = new Cfdi_xml_nom_otro_pago();
                                        $nomina_otropago->tipo_op = strval($otropago->attributes()->TipoOtroPago);
                                        $nomina_otropago->clave_op = strval($otropago->attributes()->Clave);
                                        $nomina_otropago->concepto_op = strval($otropago->attributes()->Concepto);
                                        $nomina_otropago->importe_op = strval($otropago->attributes()->Importe);
                                        foreach ($otropago->children($ns[$nsNomina]) as $subsidio) {
                                            $nomina_otropago->subsidio_causado = strval($subsidio->attributes()->SubsidioCausado);
                                        }
                                        $nomina->op()->save($nomina_otropago);
                                    }
                                    break;
                            }
                        }
                    }
                    foreach ($complemento->children($ns['tfd']) as $tfd) {
                        $tfd_data = new Cfdi_xml_timbre_fiscal_digital();
                        $tfd_data->version_tfd = strval($tfd->attributes()->Version);
                        $tfd_data->uuid = strval($tfd->attributes()->UUID);
                        $tfd_data->fecha_timbrado = date('Y-m-d', strtotime(strval($tfd->attributes()->FechaTimbrado)));
                        $tfd_data->rfc_prov_certif = strval($tfd->attributes()->RfcProvCertif);
                        $tfd_data->sello_cfd = strval($tfd->attributes()->SelloCFD);
                        $tfd_data->no_cert = strval($tfd->attributes()->NoCertificadoSAT);
                        $tfd_data->sello_sat = strval($tfd->attributes()->SelloSAT);
                        $comp->tim()->save($tfd_data);
                    }
                    break;
                case 'Addenda':
                    $comp->no_cheque = strval($complemento->children($ns['advans'])->attributes()->_10);
                    $estados_cuentas_mes->com()->save($comp);
                    break;
            }
        }
    }

    public function ecmPdf(Request $r)
    {
        set_time_limit(0);
        $data['errores'] = [];
        DB::Begintransaction();
        try {
            $dataF = explode(',', $r->url_pdf);
            $b64Data = base64_decode($dataF[1]);
            $name = "Estados_cuentas_" . $r->mes . "_" . $r->idF . "_" . date('Ymd_His') . ".pdf";
            $year = DB::table('clave_ff')->where('id_ff', $r->idF)->select('year')->first();
            $path = "/" . "uploads/" . $year->year .  "/" . "documentosFondo/" . $r->idF . "/";
            $url_doc_fondo = $path . $name;
            if ($url_doc_fondo) {
                $dirname = dirname(public_path() . $url_doc_fondo);
                if (!is_dir($dirname)) {
                    mkdir($dirname, 0755, true);
                }
                $file = fopen(public_path() . $url_doc_fondo, 'wb');
                fwrite($file, $b64Data);
                fclose($file);
                $updEcm = DECM::where("id", $r->idEcm)->update(["url_estados_cuentas_pdf" => $url_doc_fondo, "hash_estados_cuentas_pdf" => hash_file('sha256', public_path() . $url_doc_fondo)]);
            }
        } catch (\Throwable $th) {
            $data['errores'][] = 'No se encontr el archivo PDF, debe cargarlo.' . $th->getMessage();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
            unlink(public_path() . $url_doc_fondo);
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data);
    }
    public function downloadDocumentos(Request $r)
    {
        set_time_limit(0);
        $docsFondo = DOCF::findOrFail($r->idD);
        $headers = ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
        $urlFondo = null;
        switch ($r->tipoDocActual) {
                //paraEstatusDocumentos
            case 'dAC':
                $urlFondo = $docsFondo->url_actas_cabildo;
                break;
            case 'dCCB':
                $urlFondo = $docsFondo->url_contratos_cuentas_bancarias;
                break;
            case 'dF3':
                $urlFondo = $docsFondo->url_formato_3;
                break;
            case 'dF3A':
                $urlFondo = $docsFondo->url_formato_3A;
                break;
            case 'dF3B':
                $urlFondo = $docsFondo->url_formato_3B;
                break;
            case 'dF4':
                $urlFondo = $docsFondo->url_formato_4;
                break;
        }
        $nombreArchivo = LU::getRutaAndName($urlFondo)[1];
        $urlArchivo = LU::getDirname($urlFondo);

        return response()->download($urlArchivo, $nombreArchivo, $headers);
    }

    public function downloadEdosCuentas(Request $r)
    {
        set_time_limit(0);
        $headers = ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
        $urlEstadoCuenta = null;
        $estados_cuentas_mes = DECM::findOrFail($r->idEdoCuenta);
        switch ($r->tipoDocActual) {
            case 'pdf':
                $urlEstadoCuenta = $estados_cuentas_mes->url_estados_cuentas_pdf;
                break;
            case 'xml':
                $urlEstadoCuenta = $estados_cuentas_mes->url_estados_cuentas_xml;
                break;
        }
        $nombreArchivo = LU::getRutaAndName($urlEstadoCuenta)[1];
        $urlArchivo = LU::getDirname($urlEstadoCuenta);
        return response()->download($urlArchivo, $nombreArchivo, $headers);
    }

    public function eliminarDocumentos(Request $r)
    {
        set_time_limit(0);
        DB::Begintransaction();
        $url_doc_fondo_borrar = null;
        $data['errores'] = [];
        try {
            $docsFondo = DOCF::findOrFail($r->idD);
            switch ($r->tipoDocActual) {
                case 'dAC':
                    $url_doc_fondo_borrar = $docsFondo->url_actas_cabildo;
                    $docsFondo->url_actas_cabildo = null;
                    $docsFondo->actas_cabildo = 0;
                    break;
                case 'dCCB':
                    $url_doc_fondo_borrar = $docsFondo->url_contratos_cuentas_bancarias;
                    $docsFondo->url_contratos_cuentas_bancarias = null;
                    $docsFondo->contratos_cuentas_bancarias = 0;
                    break;
                case 'dF3':
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3;
                    $docsFondo->url_formato_3 = null;
                    $docsFondo->formato_3 = 0;
                    break;
                case 'dF3A':
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3A;
                    $docsFondo->url_formato_3A = null;
                    $docsFondo->formato_3A = 0;
                    break;
                case 'dF3B':
                    $url_doc_fondo_borrar = $docsFondo->url_formato_3B;
                    $docsFondo->url_formato_3B = null;
                    $docsFondo->formato_3B = 0;
                    break;
                case 'dF4':
                    $url_doc_fondo_borrar = $docsFondo->url_formato_4;
                    $docsFondo->url_formato_4 = null;
                    $docsFondo->formato_4 = 0;
                    break;
            }
            if ($url_doc_fondo_borrar != null) {
                unlink(public_path() . $url_doc_fondo_borrar);
            }
            $docsFondo->save();
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al eliminar el archivo, contacte con servicio tcnico.' . $th->getMessage();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data);
    }

    public function eliminarEdoCuenta(Request $r)
    {
        set_time_limit(0);
        DB::Begintransaction();
        try {
            $data['errores'] = [];
            $docsFondo = DOCF::where('id', $r->idD)->first();
            $oDecm = DECM::where('id', $r->idEdoCuenta)->first();
            $mes = $oDecm->mes;
            $url_edo_cuentas_borrar_pdf =  $oDecm->url_estados_cuentas_pdf;
            $url_edo_cuentas_borrar_xml = $oDecm->url_estados_cuentas_xml;
            $oDecm->delete();
            $edos_cuentas_count = DECM::where(['id_documentos_fondo' => $r->idD, 'mes' => $mes])->count();
            if ($edos_cuentas_count === 0) {
                switch ($mes) {
                    case 'enero':
                        $docsFondo->edos_cuentas_01 = 0;
                        break;
                    case 'febrero':
                        $docsFondo->edos_cuentas_02 = 0;
                        break;
                    case 'marzo':
                        $docsFondo->edos_cuentas_03 = 0;
                        break;
                    case 'abril':
                        $docsFondo->edos_cuentas_04 = 0;
                        break;
                    case 'mayo':
                        $docsFondo->edos_cuentas_05 = 0;
                        break;
                    case 'junio':
                        $docsFondo->edos_cuentas_06 = 0;
                        break;
                    case 'julio':
                        $docsFondo->edos_cuentas_07 = 0;
                        break;
                    case 'agosto':
                        $docsFondo->edos_cuentas_08 = 0;
                        break;
                    case 'septiembre':
                        $docsFondo->edos_cuentas_09 = 0;
                        break;
                    case 'octubre':
                        $docsFondo->edos_cuentas_10 = 0;
                        break;
                    case 'noviembre':
                        $docsFondo->edos_cuentas_11 = 0;
                        break;
                    case 'diciembre':
                        $docsFondo->edos_cuentas_12 = 0;
                        break;
                }
                $docsFondo->save();
            }
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al eliminar los archivos, contacte con servicio tcnico.' . $th->getMessage();
        }

        if (sizeof($data['errores'])) {
            DB::rollback();
        } else { //caso sin errores
            DB::commit();
            try {
                if ($url_edo_cuentas_borrar_pdf != null) {
                    unlink(public_path() . $url_edo_cuentas_borrar_pdf);
                }
                unlink(public_path() . $url_edo_cuentas_borrar_xml);
            } catch (\Throwable $th) {
            }
        }
        return response()->json($data);
    }

    public function enviarDocumentosRevison(Request $r)
    {
        $docsFondo = DOCF::findOrFail($r->idD);
        $estatus = 2;
        if ($r->enviarRevisionAuditores == 'Si' || @config('tema.ms.revision_directo_auditores')) {
            $estatus = 3;
        }
        $data['errores'] = [];
        try {
            switch ($r->tipoDocActual) {
                case 'dAC':
                    $docsFondo->actas_cabildo = $estatus;
                    break;
                case 'dCCB':
                    $docsFondo->contratos_cuentas_bancarias = $estatus;
                    break;
                case 'dF3':
                    $docsFondo->formato_3 = $estatus;
                    break;
                case 'dF3A':
                    $docsFondo->formato_3A = $estatus;
                    break;
                case 'dF3B':
                    $docsFondo->formato_3B = $estatus;
                    break;
                case 'dF4':
                    $docsFondo->formato_4 = $estatus;
                    break;
            }
            $docsFondo->save();
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al enviar el archivo a revisin, contacte con servicio tcnico.' . $th->getMessage();
        }
        return response()->json($data);
    }

    public function enviarRevisionEdosCuentas(Request $r)
    {
        set_time_limit(0);
        DB::Begintransaction();
        $estatus = 2;
        if ($r->enviarRevisionAuditores == 'Si' || @config('tema.ms.revision_directo_auditores')) {
            $estatus = 3;
        }
        try {
            $data['errores'] = [];
            $docsFondo = DOCF::findOrFail($r->idD);
            switch ($r->mes) {
                case 'enero':
                    $docsFondo->edos_cuentas_01 = $estatus;
                    break;
                case 'febrero':
                    $docsFondo->edos_cuentas_02 = $estatus;
                    break;
                case 'marzo':
                    $docsFondo->edos_cuentas_03 = $estatus;
                    break;
                case 'abril':
                    $docsFondo->edos_cuentas_04 = $estatus;
                    break;
                case 'mayo':
                    $docsFondo->edos_cuentas_05 = $estatus;
                    break;
                case 'junio':
                    $docsFondo->edos_cuentas_06 = $estatus;
                    break;
                case 'julio':
                    $docsFondo->edos_cuentas_07 = $estatus;
                    break;
                case 'agosto':
                    $docsFondo->edos_cuentas_08 = $estatus;
                    break;
                case 'septiembre':
                    $docsFondo->edos_cuentas_09 = $estatus;
                    break;
                case 'octubre':
                    $docsFondo->edos_cuentas_10 = $estatus;
                    break;
                case 'noviembre':
                    $docsFondo->edos_cuentas_11 = $estatus;
                    break;
                case 'diciembre':
                    $docsFondo->edos_cuentas_12 = $estatus;
                    break;
            }
            $docsFondo->save();
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al enviar los archivos, contacte con servicio tcnico.' . $th->getMessage();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data);
    }

    public function regresarDocumentosRevison(Request $r)
    {
        $data['errores'] = [];
        try {
            $docsFondo = DOCF::findOrFail($r->idD);
            $estatus = 4;
            switch ($r->tipoDocActual) {
                case 'dAC':
                    $docsFondo->actas_cabildo = $estatus;
                    break;
                case 'dCCB':
                    $docsFondo->contratos_cuentas_bancarias = $estatus;
                    break;
                case 'dF3':
                    $docsFondo->formato_3 = $estatus;
                    break;
                case 'dF3A':
                    $docsFondo->formato_3A = $estatus;
                    break;
                case 'dF3B':
                    $docsFondo->formato_3B = $estatus;
                    break;
                case 'dF4':
                    $docsFondo->formato_4 = $estatus;
                    break;
            }
            $docsFondo->save();
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al regresar el archivo, contacte con servicio tcnico.' . $th->getMessage();
        }
        return response()->json($data);
    }

    public function regresarRevisionEdosCuentas(Request $r)
    {
        set_time_limit(0);
        DB::Begintransaction();
        $estatus = 4;
        try {
            $data['errores'] = [];
            $docsFondo = DOCF::findOrFail($r->idD);
            switch ($r->mes) {
                case 'enero':
                    $docsFondo->edos_cuentas_01 = $estatus;
                    break;
                case 'febrero':
                    $docsFondo->edos_cuentas_02 = $estatus;
                    break;
                case 'marzo':
                    $docsFondo->edos_cuentas_03 = $estatus;
                    break;
                case 'abril':
                    $docsFondo->edos_cuentas_04 = $estatus;
                    break;
                case 'mayo':
                    $docsFondo->edos_cuentas_05 = $estatus;
                    break;
                case 'junio':
                    $docsFondo->edos_cuentas_06 = $estatus;
                    break;
                case 'julio':
                    $docsFondo->edos_cuentas_07 = $estatus;
                    break;
                case 'agosto':
                    $docsFondo->edos_cuentas_08 = $estatus;
                    break;
                case 'septiembre':
                    $docsFondo->edos_cuentas_09 = $estatus;
                    break;
                case 'octubre':
                    $docsFondo->edos_cuentas_10 = $estatus;
                    break;
                case 'noviembre':
                    $docsFondo->edos_cuentas_11 = $estatus;
                    break;
                case 'diciembre':
                    $docsFondo->edos_cuentas_12 = $estatus;
                    break;
            }
            $docsFondo->save();
        } catch (\Throwable $th) {
            $data['errores'][] = 'Error al regresar los archivos, contacte con servicio tcnico.' . $th->getMessage();
        }
        if (sizeof($data['errores'])) {
            DB::rollback();
        } else { //caso sin errores
            DB::commit();
        }
        return response()->json($data);
    }

    public function getEstadosCuentaMes(Request $r)
    {
        $datos['errores'] = [];
        try {
            $datos['edos_cuentas'] = DB::table('estados_cuentas_mes')->where(['id_documentos_fondo' => $r->idD, 'mes' => $r->mes])->get();
        } catch (\Throwable $th) {
            $datos['errores'][] = 'Error al obtener datos de la tabla, comunquese con soporte tcnico. ' . $th->getMessage();
        }
        return response()->json($datos);
    }

    public function datosClavesFFMain(Request $r, $dependencia, $year)
    {
        $id_clave_ff = [];
        $monto_utilizado = 0;
        $monto_anexo_gd = 0;
        $monto_cap1k = 0;

        $q = Claves::Where('id_dependencia', $dependencia)->where('year', $year);
        $x = Claves::Where('id_dependencia', $dependencia)->where('year', $year);

        $data['resumen']['monto_recibido'] = ($q->count() == 0) ? 0.00 : $x->sum('monto_recibido');

        $fondos = $q->get();

        $listaGD = [];
        foreach ($fondos as $i) {
            $id_clave_ff[] = $i->id_ff;
            $totalAnexoGD = self::totalAnexoGD($i);
            $listaGD[$i->id_ff] = $totalAnexoGD;
            $monto_anexo_gd += (float) $totalAnexoGD->total;
            $monto_cap1k += (float) $i->cap1k;
        }

        foreach ($id_clave_ff as $i) {
            $monto_utilizado += cmb::where('id_ff', $i)->sum('montoPagadoConPart');
        }
        $data['gastos_diversos'] = $listaGD;

        $data['resumen']['monto_utilizado'] = $monto_utilizado + $monto_anexo_gd + $monto_cap1k;
        $data['resumen']['monto_restante'] = $data['resumen']['monto_recibido'] - $data['resumen']['monto_utilizado'];

        $claves = DB::table('clave_ff as ff')
            ->join('catalogo_numeros_auditoria as cna', 'ff.id_nauditoria', '=', 'cna.id')
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id')
            ->join('catalogo_claves_presupuestales as tcff', 'ff.clave_ff', '=', 'tcff.id')
            ->join('dependencias as d', 'ff.id_dependencia', '=', 'd.id_dependencia')
            ->where('ff.year', $year);


        $data['cff'] = $claves
            ->where('ff.id_dependencia', $dependencia)
            ->select(
                'ff.id_ff as id_pp',
                'ff.clave_ff as pp',
                'tcff.nombre_clave as n_pp',
                'ff.monto_recibido as monto_recibido',
                'ff.year as fecha',
                'ff.estatus as estatus',
                'ff.id_dependencia as id_d',
                'd.sDependencia as dependencia',
                'd.sSiglas as siglas',
                'ff.obras as obras',
                'ff.ramo as ramo',
                'ff.cap1k as capitulomil',
                'ff.monto_nomina as monto_nomina',
                'ff.reintegro_tesofe as reintegro_tesofe',
                'cna.numeroAuditoria as auditoria',
                'ca.auditoria as uaa',
            )
            ->orderBy('fecha', 'DESC')
            ->get();

        $data['claveAnual'] = DB::table('clave_ff as ff')
            ->whereRaw('YEAR(fecha)=' . date('Y'))
            ->where('ff.id_dependencia', $dependencia)
            ->count();

        return response()->json($data, 200);
    }

    // CLAVES DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA)
    public function index()
    {
        $d = Dependencias::with(['d_e', 'd_m'])->where('id_dependencia', Auth::user()->id_dependencia)->first();
        // $fondo_dependencia = Fondo_dependencia::where('year', now()->year)->where('id_dependencia', Auth::user()->id_dependencia);

        $data['datos_generales'] = (object) [
            'dependencia' => $d->sDependencia,
            'siglas' => $d->sSiglas,
            'municipio' => ($d->d_m == NULL) ? 'No aplica' : $d->d_m->municipio,
            'estado' => $d->d_e->estado,
        ];

        return view('asf_layout.index', $data);
    }

    // CLAVES DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA PARA MAIN) (PARA CERRAR FONDOS)
    public function layouts_main()
    {
        $data['usuarioActual'] = U::with('u_d')->where('id', Auth::user()->id)->get()->first();
        $lNAU = NAU::with('nau_cna')->where('id_usuario', Auth::user()->id)->get();
        $data['CNAusuario'] = [];
        foreach ($lNAU as $knau => $nau) {
            $data['CNAusuario'][] = $nau->nau_cna;
        }
        return view('asf_layout.main', $data);
    }

    public function cerrar(Request $r)
    {
        $row = Claves::where('id_ff', $r->id)->first();
        $row->estatus = '1';
        DB::beginTransaction();
        try {
            $row->save();
            DB::commit();
            return response()->json('OK', 200);
        } catch (\Exception $e) {
            DB::rollback();
            $error = $e->getMessage();
            return response()->json('NO', 200);
        }
    }


    /*******************************************************/
    /*              FUENTE DE FINANCIAMIENTO               */
    /*******************************************************/
    // PETICIONES JSON PARA FUNCIONALIDAD
    // Pintar las fuentes de financiamiento por ao
    public function datosFuenteFinanciamiento(Request $r, $dependencia, $year)
    {
        $q = DB::table('fondo_dependencia as fd')
            ->join('catalogo_claves_presupuestales as ccp', 'fd.clave_ff', '=', 'ccp.id')
            ->where('fd.year', $year)
            ->where('fd.id_dependencia', $dependencia)
            ->join('catalogo_auditorias as ca', 'ca.id', '=', 'fd.id_auditoria')
            ->join('catalogo_numeros_auditoria as cna', 'cna.id', '=', 'fd.nAuditoria')
            ->select(
                'fd.id as id_fondo',
                'ccp.id as id',
                'ccp.nombre_clave as clave',
                'ca.auditoria as uaa',
                'cna.numeroAuditoria as nAuditoria',
            )
            ->orderBy('clave', 'ASC')
            ->orderBy('uaa', 'ASC')
            ->get();

        return response()->json($q, 200);
    }

    // Datos del monto de la dependencia y el ramo al que pertenece
    public function datosClaveFFDependencia(Request $r, $id_clave, $year, $dependencia, $idnAuditoria)
    {
        $datos['monto'] = DB::table('fondo_dependencia')
            ->where('id_dependencia', $dependencia)
            ->where('year', $year)
            ->where('clave_ff', $id_clave)
            ->where('nAuditoria', $idnAuditoria)
            ->first()->monto;

        $datos['ramo'] = DB::table('catalogo_claves_presupuestales')->where('id', $id_clave)->first()->ramo;

        return response()->json($datos, 200);
    }

    // AGREGAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA)
    public function addClave()
    {
        $data = [];
        $dependencias = DB::table('dependencias as d')
            ->where('id_estado', Auth::user()->id_estado);
        switch (Auth::user()->type) {
                // 1 - Root
            case 1:
                $data['dependencias'] = $dependencias->where('id_municipio', Auth::user()->id_municipio)
                    ->select(
                        'id_dependencia as id',
                        'sDependencia as nombre',
                        'sSiglas as siglas'
                    )
                    ->get();
                break;
                // 3 - Enlace estatal
            case 3:
                $data['dependencias'] = $dependencias->get();
                break;
                // 2 - Administrador de dependencia
                // 4 - ejecutor
            case 2:
            case 4:
                $v = DB::table('fondo_dependencia')
                    ->where('id_dependencia', Auth::user()->id_dependencia)
                    ->where('year', now()->year)
                    ->count();

                $data['dependencias'] = $dependencias->where('id_dependencia', Auth::user()->id_dependencia)
                    ->select(
                        'id_dependencia as id',
                        'sDependencia as nombre',
                        'sSiglas as siglas'
                    )
                    ->first();

                $data['fondo'] = DB::table('fondo_dependencia as fd')
                    ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'fd.clave_ff')
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia)
                    ->select(
                        'fd.id',
                        'ccp.id as id_clave',
                        'ccp.nombre_clave as clave',
                        'ccp.ramo',
                        'fd.monto as monto'
                    )
                    ->first();

                $con_cff = DB::table('clave_ff as cff')
                    ->select('cff.id_fondo_dependencia')
                    ->where('cff.id_dependencia', Auth::user()->id_dependencia)
                    ->WhereNotNull('cff.id_fondo_dependencia')
                    ->get();

                $a_con_cff = [];
                foreach ($con_cff as $kIdFondo => $id_fondo) {
                    $a_con_cff[] = $id_fondo->id_fondo_dependencia;
                }

                $years = DB::table('fondo_dependencia as fd')
                    ->select('fd.year')
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia)
                    ->whereNotIn('fd.id', $a_con_cff)
                    ->groupBy('fd.year')
                    ->orderBy('fd.year', 'asc')
                    ->get();


                $data['yearsRegistrados'] = [];
                foreach ($years as $kYear => $year) {
                    $data['yearsRegistrados'][] = $year->year;
                }

                break;
        }

        if ($data['fondo'] == NULL) {
            return \Redirect::back()->withErrors([LU::t_tr('D', 'dependencia', 's') . '  no tiene ' . LU::t_tr('v', 'fondo', 'p') . ' asignados']);
        }

        $data['claves'] = TipoClave::all();
        return view('asf_layout.addClave', $data);
    }

    // AGREGAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA) Finanzas
    public function addClaveFinanzas()
    {
        $data = [];
        $dependencias = DB::table('dependencias as d')
            ->where('id_estado', Auth::user()->id_estado);
        switch (Auth::user()->type) {
            case 8: //finanzas estatal
            case 9: //finanzas municipal
                $data['dependencias'] = $dependencias->where('id_dependencia', Auth::user()->id_dependencia)
                    ->select(
                        'id_dependencia as id',
                        'sDependencia as nombre',
                        'sSiglas as siglas'
                    )
                    ->first();

                $data['fondo'] = DB::table('fondo_dependencia as fd')
                    ->join('catalogo_claves_presupuestales as ccp', 'ccp.id', '=', 'fd.clave_ff')
                    ->where('fd.id_dependencia', Auth::user()->id_dependencia)
                    ->select(
                        'fd.id',
                        'ccp.id as id_clave',
                        'ccp.nombre_clave as clave',
                        'ccp.ramo',
                        'fd.monto as monto'
                    )
                    ->first();
                break;
        }

        if ($data['fondo'] == NULL) {
            return \Redirect::back()->withErrors([LU::t_tr('D', 'dependencia', 's') . '  no tiene ' . LU::t_tr('v', 'fondo', 'p') . ' asignados']);
        }

        $data['claves'] = TipoClave::all();
        return view('asf_layout.addClaveFinanzas', $data);
    }

    //OBTIENE LOS DATOS DE fondo_dependencia Y LOS CONTRASTA CON clave_ff PARA OBTENER UNA LISTA DE FONDOS NO REGISTRADOS
    public function getClavesFFNotInTable($dependencia, $year)
    {
        $data = DB::table('fondo_dependencia as fd')
            ->leftJoin('clave_ff as cf', 'fd.id', '=', 'cf.id_fondo_dependencia')
            ->join('catalogo_claves_presupuestales as ccp', 'fd.clave_ff', '=', 'ccp.id')
            ->join('catalogo_numeros_auditoria as cna', 'fd.nAuditoria', '=', 'cna.id')
            ->join('catalogo_auditorias as ca', 'cna.id_auditoria', '=', 'ca.id')
            ->select('fd.id as id_fondo', 'fd.clave_ff as id', 'ccp.nombre_clave as clave', 'cna.numeroAuditoria as nAuditoria', 'ca.auditoria as uaa', 'cna.id as id_nAuditoria')
            ->where('fd.year', $year)
            ->where('fd.id_dependencia', $dependencia)
            ->whereNull('cf.id_ff')
            ->get();
        return response()->json($data);
    }

    // GUARDAR NUEVA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (INSERTAR)
    public function saveClave(Request $r)
    {
        $errorEncontrado = '';
        $id_clave_ff = 0;
        $claveRegistrada = null;
        DB::Begintransaction();
        try {
            // Insertar
            $datos = $r->except([
                '_token',
                'excel_url_archivo',
                'excel_lista_anexo_GD1',
                'excel_lista_anexo_GD2',
                //paraEstatusAnexos
                'cb_anexo_gd',
                'cb_anexo_adq',
                'cb_anexo_obras',
                'cb_anexo_egresos',
                'cb_anexo_nomina',
                'cb_anexo_c4k',
                'cb_anexo_OyAdq',
                //paraEstatusDocumentos
                'cb_actas_cabildo',
                'cb_contratos_cuentas_bancarias',
                'cb_edos_cuentas01',
                'cb_edos_cuentas02',
                'cb_edos_cuentas03',
                'cb_edos_cuentas04',
                'cb_edos_cuentas05',
                'cb_edos_cuentas06',
                'cb_edos_cuentas07',
                'cb_edos_cuentas08',
                'cb_edos_cuentas09',
                'cb_edos_cuentas10',
                'cb_edos_cuentas11',
                'cb_edos_cuentas12',
                'cb_formato_3',
                'cb_formato_3A',
                'cb_formato_3B',
                'cb_formato_4'
            ]);
            $datos['cap1k'] = $r->cap1k ? $r->cap1k : 0;
            $datos['cap4k'] = $r->cap4k ? $r->cap4k : 0;
            $datos['monto_nomina'] = $r->monto_nomina != NULL ? $r->monto_nomina : 0;
            $datos['fecha'] = date('Y-m-d');
            $datos['id_estado'] = Auth::user()->id_estado;
            $datos['id_municipio'] = Auth::user()->id_municipio;
            $datos['fondo_revolvente'] = 0;
            $datos['estatus'] = 0;
            $datos['created_at'] = date('Y-m-d H:i:s');
            //paraEstatusAnexos
            $datos['estatus_archivo'] = isset($r->cb_anexo_gd) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_adq'] = isset($r->cb_anexo_adq) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_obras'] = isset($r->cb_anexo_obras) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_egresos'] = isset($r->cb_anexo_egresos) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_nomina'] = isset($r->cb_anexo_nomina) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_c4k'] = isset($r->cb_anexo_c4k) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['estatus_anexo_obras_y_adq'] = isset($r->cb_anexo_OyAdq) ? '0' : '5'; //coloca "Sin cargar" o "No aplica"
            $datos['obras'] = isset($r->cb_anexo_obras) ? '1' : '0'; //indica si hay o no obras

            // Guardar y obtener el ID del registro insertado
            $id_clave_ff = DB::table('clave_ff')->insertGetId($datos);
            $claveRegistrada = Claves::with(['c_ccp', 'c_cna'])->Where('id_ff', $id_clave_ff)->first();
            //paraEstatusDocumentos
            $documentosFondo = new DOCF;
            $documentosFondo->id_clave_ff = $id_clave_ff;
            $documentosFondo->actas_cabildo = isset($r->cb_actas_cabildo) ? '0' : '5';
            $documentosFondo->contratos_cuentas_bancarias = isset($r->cb_contratos_cuentas_bancarias) ? '0' : '5';
            $documentosFondo->edos_cuentas_01 = isset($r->cb_edos_cuentas01) ? '0' : '5';
            $documentosFondo->edos_cuentas_02 = isset($r->cb_edos_cuentas02) ? '0' : '5';
            $documentosFondo->edos_cuentas_03 = isset($r->cb_edos_cuentas03) ? '0' : '5';
            $documentosFondo->edos_cuentas_04 = isset($r->cb_edos_cuentas04) ? '0' : '5';
            $documentosFondo->edos_cuentas_05 = isset($r->cb_edos_cuentas05) ? '0' : '5';
            $documentosFondo->edos_cuentas_06 = isset($r->cb_edos_cuentas06) ? '0' : '5';
            $documentosFondo->edos_cuentas_07 = isset($r->cb_edos_cuentas07) ? '0' : '5';
            $documentosFondo->edos_cuentas_08 = isset($r->cb_edos_cuentas08) ? '0' : '5';
            $documentosFondo->edos_cuentas_09 = isset($r->cb_edos_cuentas09) ? '0' : '5';
            $documentosFondo->edos_cuentas_10 = isset($r->cb_edos_cuentas10) ? '0' : '5';
            $documentosFondo->edos_cuentas_11 = isset($r->cb_edos_cuentas11) ? '0' : '5';
            $documentosFondo->edos_cuentas_12 = isset($r->cb_edos_cuentas12) ? '0' : '5';
            $documentosFondo->formato_3 = isset($r->cb_formato_3) ? '0' : '5';
            $documentosFondo->formato_3A = isset($r->cb_formato_3A) ? '0' : '5';
            $documentosFondo->formato_3B = isset($r->cb_formato_3B) ? '0' : '5';
            $documentosFondo->formato_4 = isset($r->cb_formato_4) ? '0' : '5';
            $documentosFondo->save();

            if ($r->excel_url_archivo != null) { //cuando no se registr numero del anexo gd, por lo que se registr el excel
                //guardar anexo gastos diversos y de operaciones
                $json_lista_anexo_GD1 = json_decode($r->excel_lista_anexo_GD1);
                $json_lista_anexo_GD2 = json_decode($r->excel_lista_anexo_GD2);
                foreach ($json_lista_anexo_GD1 as $kranexo => $ranexo) {
                    $reg = new AGDO;
                    $reg->rfc                    = $ranexo->rfc;
                    $reg->nombre                 = $ranexo->nombre;
                    $reg->descripcion            = $ranexo->descripcion;
                    $reg->fecha_adq_gasto        = $ranexo->fecha_adq_gasto;
                    $reg->monto_pagado           = $ranexo->monto_pagado;
                    $reg->entregable             = $ranexo->entregable;
                    $reg->monto_pagado_fondo     = $ranexo->monto_pagado_fondo;
                    $reg->partida_clasificatoria = $ranexo->partida_clasificatoria;
                    $reg->num_factura            = $ranexo->num_factura;
                    $reg->num_poliza             = $ranexo->num_poliza;
                    $reg->num_poliza             = $ranexo->num_poliza;
                    $reg->es_gasto_diverso       = '1';
                    $reg->id_clave_ff            = $id_clave_ff;
                    $reg->save();
                }
                foreach ($json_lista_anexo_GD2 as $kranexo => $ranexo) {
                    $reg = new AGDO;
                    $reg->rfc                    = $ranexo->rfc;
                    $reg->nombre                 = $ranexo->nombre;
                    $reg->descripcion            = $ranexo->descripcion;
                    $reg->fecha_adq_gasto        = $ranexo->fecha_adq_gasto;
                    $reg->monto_pagado           = $ranexo->monto_pagado;
                    $reg->entregable             = $ranexo->entregable;
                    $reg->monto_pagado_fondo     = $ranexo->monto_pagado_fondo;
                    $reg->partida_clasificatoria = $ranexo->partida_clasificatoria;
                    $reg->num_factura            = $ranexo->num_factura;
                    $reg->num_poliza             = $ranexo->num_poliza;
                    $reg->num_poliza             = $ranexo->num_poliza;
                    $reg->es_gasto_diverso       = '0';
                    $reg->id_clave_ff            = $id_clave_ff;
                    $reg->save();
                }
                Claves::where('id_ff', $id_clave_ff)->update(['estatus_archivo' => 1]);

                //guardar excel del anexo
                $json_url_archivo = json_decode($r->excel_url_archivo);
                $url = '/' . 'uploads/' . $r->year . '/' . 'anexoGD/' . $r->id_dependencia . '/' . $r->clave_ff . '/' . $r->year . '/' . $r->id_nauditoria .  '/anexoGD_' . date('Ymd_His') . '.xlsx';

                $dirname = dirname(public_path() . $url);
                if (!is_dir($dirname)) {
                    mkdir($dirname, 0755, true);
                }
                $file = fopen(public_path() . $url, 'wb');
                $data = explode(',', $json_url_archivo);
                fwrite($file, base64_decode($data[1]));
                fclose($file);
                $claveRegistrada = Claves::Where('id_ff', $id_clave_ff)->first();
                $claveRegistrada->url_anexo_gd = $url;
                $claveRegistrada->save();
            }
        } catch (\Exception $e) {
            $errorEncontrado = 'Error al registrar' . LU::t_tr('d', 'fondo', 's') . ', por favor contacte con servicio tcnico.' . $e->getMessage();
        }

        if ($errorEncontrado != '') {
            DB::rollback();
            return redirect()->back()->withErrors([$errorEncontrado]);
        } else {
            DB::commit();
            return redirect()->back()->with('success', 'Se guardaron correctamente los datos: ' . LU::t_tr('v', 'fondo', 's') . ' ' . ($claveRegistrada ? '"' . $claveRegistrada->c_ccp->nombre_clave . '"' : '') . ', ' . LU::t_tr('v', 'num_auditoria', 's') . ' "' . $claveRegistrada->c_cna->numeroAuditoria . '" del ao ' . $r->year . '. Puede verlo en el men "' . LU::t_pr('m_captura_anexos')  . '" - "' . LU::t_tr('v', 'adquisiciones_obras', 'P') . '" y seleccione un "Ao a mostrar".');
        }
    }

    //AGREGAR FONDO FINANZAS
    public function saveClaveFinanzas(Request $r)
    {
        $data['errores'] = null;
        $newClave = null;
        $exist =  CFFFINANZAS::where(['id_dependencia' => $r->id_dependencia, 'id_catalogo_numeros_auditoria' => $r->id_catalogo_numeros_auditoria, 'id_catalogo_claves_presupuestales' => $r->id_catalogo_claves_presupuestales])->first();
        if ($exist != null) { //caso en que la combinacin ya se encuentra en la BD
            if ($exist->id != $r->id) { //Caso en que no coinciden los Id ya que son registros diferentes
                $data['errores'][] = LU::t_tr('D', 'fondo', 's') . ' ya se encuentra registrado, verifique la tabla inferior.';
            } //else en caso en que el id coincide por lo que se trata del mismo registro, por lo que si se deberia guardar
        } //else caso en que la combinacin no se encuentra en la bd, por lo que si se deberia guardar 
        if ($data['errores'] == null) { //guardar en caso que no haya errores
            try {
                $newClave = CFFFINANZAS::findOrFail($r->id);
            } catch (\Throwable $th) {
                $newClave = new CFFFINANZAS();
            }
            try {
                $newClave->id_dependencia = $r->id_dependencia;
                $newClave->id_catalogo_numeros_auditoria = $r->id_catalogo_numeros_auditoria;
                $newClave->id_catalogo_claves_presupuestales = $r->id_catalogo_claves_presupuestales;
                $newClave->nombre_responsable = $r->firma_responsable;
                $newClave->cargo_responsable = $r->cargo_responsable;
                //paraEstatusAnexos Finanzas
                $newClave->estatus_anexo_egresos = $this->obtenerEstatusModificado($newClave->estatus_anexo_egresos, $r->estatus_anexo_egresos);
                $newClave->estatus_anexo_transf = $this->obtenerEstatusModificado($newClave->estatus_anexo_transf, $r->estatus_anexo_transf);
                $newClave->updated_at = Carbon::now();
                $newClave->save();
            } catch (\Exception $e) {
                $data['errores'][] = 'Ocurri un error al intentar editar ' . LU::t_tr('d', 'fondo', 's') . '. Contacte a servicio tcnico.';
            }
        }
        return $data;
    }
    //ELIMINAR FONDO FINANZAS
    public function deleteClaveFinanzas(Request $r)
    {
        $data = [];
        $mensajeDeErrorGlobal = '';
        $oCffFinanzas = CFFFINANZAS::find($r->id_clave_ff_finanzas);
        if ($oCffFinanzas == null) {
            $mensajeDeErrorGlobal = 'No se puede eliminar ' . LU::t_tr('d', 'fondo', 's') . ', ya que no existe en el sistema.';
        } else {
            $estatusExistentes = '';
            try {
                //paraEstatusAnexos Finanzas
                $estatusAnexoEgresos = $oCffFinanzas->estatus_anexo_egresos;
                if (!in_array($estatusAnexoEgresos, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Egresos es: ' . $this->estatusAnexoArchivo($estatusAnexoEgresos, 8) . "\n";
                }
                $estatusAnexoTransfEjec = $oCffFinanzas->estatus_anexo_transf;
                if (!in_array($estatusAnexoTransfEjec, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Transferencia a ejecutores es: ' . $this->estatusAnexoArchivo($estatusAnexoTransfEjec, 8) . "\n";
                }
                if ($estatusExistentes == '') {
                    try {
                        if ($oCffFinanzas->delete()) {
                            DB::commit();
                        } else {
                            DB::rollback();
                            $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . ' Contacte a soporte tcnico.';
                        }
                    } catch (\Exception $e) {
                        $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . 'Contacte a servicio tcnico.' . $e->getMessage();
                    }
                } else {
                    $mensajeDeErrorGlobal = "Solo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " si sus " . LU::t_tr('v', 'anexo', 'p') . " se encuentran en estatus 'Sin cargar' o 'No aplica'.\n\nNo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " debido a que: \n" . $estatusExistentes;
                }
            } catch (\Exception $e) {
                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . ' solicitado. Contacte a servicio tcnico.' . $e->getMessage();
            }
        }
        $data['errores'] = $mensajeDeErrorGlobal == '' ? null : $mensajeDeErrorGlobal;
        return $data;
    }

    // EDITAR UNA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA (VISTA)
    public function editClave(Request $r, $idFondo)
    {
        $data = [];
        $data['cff'] = Claves::With(['c_d', 'c_tc', 'c_cna'])->Where('id_ff', $idFondo)->first();
        $data['docf'] = [];
        $documentos_fondo = DOCF::Where('id_clave_ff', $idFondo)->first();
        if ($documentos_fondo != null) {
            $data['docf'] = $documentos_fondo;
        }
        $data['cff']->c_cna->cna_ca;
        $data['h_cff'] = hcf::With(['h_u'])->Where('id_clave_ff', $idFondo)->orderBy('created_at', 'desc')->get();
        $data['listaEstatus'] = ['Sin cargar', 'Cargado sin enviar a revisin', 'Enviado ' . LU::t_tr('a_d', 'enlace', 's'), 'Enviado ' . LU::t_tr('a_d', 'asf', 's'), 'Regresado ' . LU::t_tr('a_d', 'ejecutor', 's'), 'No aplica'];

        return view('asf_layout.editClave', $data);
    }

    // GUARDAR LA EDICIN DE UNA CLAVE DE FUENTE DE FINANCIAMIENTO-PROGRAMA EXISTENTE
    public function updateClave(Request $r, $idFondo)
    {
        DB::Begintransaction();
        try {
            $clave = Claves::find($idFondo);
            $tieneObrasNew = ($r->obras == 'SI' ? 1 : ($r->obras == 'NO' ? 0 : NULL));
            HCF::create([
                'id_clave_ff' => $idFondo,
                'monto_recibido' => $r->monto_recibido == $clave->monto_recibido ? NULL : $r->monto_recibido,
                'cap1k' => $r->cap1k == $clave->cap1k ? NULL : $r->cap1k,
                'cap4k' => $r->cap4k == $clave->cap4k ? NULL : $r->cap4k,
                'nombre_responsable' => $r->nombre_responsable == $clave->firma_responsable ? NULL : $r->nombre_responsable,
                'cargo_responsable' => $r->cargo_responsable == $clave->cargo_responsable ? NULL : $r->cargo_responsable,
                'obras' => $tieneObrasNew == $clave->obras ? NULL : $tieneObrasNew,
                'id_usuario' => Auth::user()->id,
            ]);
            $documentos_fondo = DOCF::Where('id_clave_ff', $idFondo)->first();
            if ($documentos_fondo == null) {
                $documentos_fondo = new DOCF();
                $documentos_fondo->id_clave_ff = $idFondo;
            }
            $clave->monto_recibido = ($r->monto_recibido == NULL || $r->monto_recibido == '') ? 0 : $r->monto_recibido;
            $clave->cap1k = ($r->cap1k == NULL || $r->cap1k == '') ? 0 : $r->cap1k;
            $clave->cap4k = ($r->cap4k == NULL || $r->cap4k == '') ? 0 : $r->cap4k;
            $clave->monto_nomina = ($r->monto_nomina == NULL || $r->monto_nomina == '') ? 0 : $r->monto_nomina;
            $clave->firma_responsable = ($r->nombre_responsable == NULL || $r->nombre_responsable == '') ? $clave->firma_responsable : $r->nombre_responsable;
            $clave->cargo_responsable = ($r->cargo_responsable == NULL || $r->cargo_responsable == '') ? $clave->cargo_responsable : $r->cargo_responsable;
            // $clave->obras = $r->obras == 'SI' ? 1 : ($r->obras == 'NO' ? 0 : NULL);
            //paraEstatusAnexos
            $clave->estatus_archivo = $this->obtenerEstatusModificado($clave->estatus_archivo, isset($r->cb_anexo_gd));
            $clave->estatus_anexo_adq = $this->obtenerEstatusModificado($clave->estatus_anexo_adq, isset($r->cb_anexo_adq));
            $clave->estatus_anexo_obras = $this->obtenerEstatusModificado($clave->estatus_anexo_obras, isset($r->cb_anexo_obras));
            $clave->estatus_anexo_egresos = $this->obtenerEstatusModificado($clave->estatus_anexo_egresos, isset($r->cb_anexo_egresos));
            $clave->estatus_anexo_nomina = $this->obtenerEstatusModificado($clave->estatus_anexo_nomina, isset($r->cb_anexo_nomina));
            $clave->estatus_anexo_c4k = $this->obtenerEstatusModificado($clave->estatus_anexo_c4k, isset($r->cb_anexo_c4k));
            $clave->estatus_anexo_obras_y_adq = $this->obtenerEstatusModificado($clave->estatus_anexo_obras_y_adq, isset($r->cb_anexo_OyAdq));
            $clave->obras = isset($r->cb_anexo_obras) ? '1' : '0'; //indica si hay o no obras
            //paraEstatusDocumentos
            $documentos_fondo->actas_cabildo = $this->obtenerEstatusModificado($documentos_fondo->actas_cabildo, isset($r->cb_actas_cabildo));
            $documentos_fondo->contratos_cuentas_bancarias = $this->obtenerEstatusModificado($documentos_fondo->contratos_cuentas_bancarias, isset($r->cb_contratos_cuentas_bancarias));
            $documentos_fondo->edos_cuentas_01 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_01, isset($r->cb_edos_cuentas01));
            $documentos_fondo->edos_cuentas_02 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_02, isset($r->cb_edos_cuentas02));
            $documentos_fondo->edos_cuentas_03 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_03, isset($r->cb_edos_cuentas03));
            $documentos_fondo->edos_cuentas_04 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_04, isset($r->cb_edos_cuentas04));
            $documentos_fondo->edos_cuentas_05 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_05, isset($r->cb_edos_cuentas05));
            $documentos_fondo->edos_cuentas_06 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_06, isset($r->cb_edos_cuentas06));
            $documentos_fondo->edos_cuentas_07 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_07, isset($r->cb_edos_cuentas07));
            $documentos_fondo->edos_cuentas_08 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_08, isset($r->cb_edos_cuentas08));
            $documentos_fondo->edos_cuentas_09 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_09, isset($r->cb_edos_cuentas09));
            $documentos_fondo->edos_cuentas_10 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_10, isset($r->cb_edos_cuentas10));
            $documentos_fondo->edos_cuentas_11 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_11, isset($r->cb_edos_cuentas11));
            $documentos_fondo->edos_cuentas_12 = $this->obtenerEstatusModificado($documentos_fondo->edos_cuentas_12, isset($r->cb_edos_cuentas12));
            $documentos_fondo->formato_3 = $this->obtenerEstatusModificado($documentos_fondo->formato_3, isset($r->cb_formato_3));
            $documentos_fondo->formato_3A = $this->obtenerEstatusModificado($documentos_fondo->formato_3A, isset($r->cb_formato_3A));
            $documentos_fondo->formato_3B = $this->obtenerEstatusModificado($documentos_fondo->formato_3B, isset($r->cb_formato_3B));
            $documentos_fondo->formato_4 = $this->obtenerEstatusModificado($documentos_fondo->formato_4, isset($r->cb_formato_4));
            $documentos_fondo->save();
            $clave->save();
            DB::commit();
            return \Redirect::to('/layouts');
        } catch (\Except $e) {
            DB::rollback();
            return \Redirect::to("/layouts")->withErrors(['No se pudo guardar la informacin proporcionada al sistema']);
        }
    }

    public function obtenerEstatusModificado($estatus, $estaMarcado)
    {
        $estatusNuevo = $estatus != null ? intval($estatus) : intval('5');
        if ($estatusNuevo == 5) { //si en la bd es "no aplica"
            $estatusNuevo = $estaMarcado ? 0 : $estatusNuevo;
        } else { //casos donde el estatus es diferente de 5
            $estatusNuevo = $estaMarcado ? $estatusNuevo : 5;
        }
        return $estatusNuevo;
    }


    /*******************************************************/
    /*              HELPERS CAMBIOS DE VISTAS              */
    /*******************************************************/
    // SELECCIN DE MDULO DE OBRAS/ADQUISICIONES
    public function seleccionModulo(Request $r, $id)
    {
        $resp['clave_ff'] = $id;
        $resp['clave'] = DB::table('clave_ff')->where('id_ff', $id)->first();
        return view('asf_layout.helpers.obrasomateriales', $resp);
    }

    // SELECCIN DEL TIPO DE REGISTRO DEL CONTRATO: Bsico (Modo1 y 2) o intermedio (Modo3)
    public function tipoRegistro(Request $r, $modulo, $id, $year)
    {
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first();
        $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave;
        $datos['modulo'] = $modulo;
        $datos['clave'] = $id;
        $datos['year'] = $year;
        $datos['cff'] = DB::table('clave_ff')->where('id_ff', $id)->first();
        return view('asf_layout.helpers.tipoRegistro', $datos);
    }




    /******************************************************/
    /*                      CONTRATOS                     */
    /******************************************************/
    //Variables globales para modoAdd1:
    private $modulo = "";
    private $c_ff = "";
    private $guardado_correcto = true;
    private $abrirExcelCorrecto = true;
    private $hojaActual = 0;
    private $contadorRegistro = 0;
    private $mensajeException = '';
    private $soloMensajeException = false;

    private $arrayNombresExcel = [ //el cambio de nombres se debe hacer en todo este archivo y en el rea de las excepciones de la BD de este archivo
        'DE ANTICIPO' => 'de_anticipo',
        'DE CUMPLIMIENTO' => 'de_cumplimiento',
        'DE VICIOS OCULTOS' => 'de_vicios_ocultos',
        'FECHA DE ACTA FINIQUITO (dd/mm/yyyy)' => 'fecha_de_acta_finiquito_ddmmyyyy',
        'MODALIDAD DE CONTRATACIN (POR CONTRATO o POR ADMINISTRACIN DIRECTA)' => 'modalidad_de_contratacion_por_contrato_o_por_administracion_directa',
        'MONTO DEL CONTRATO C/IVA (en pesos)' => 'monto_del_contrato_civa_en_pesos',
        'MONTO FACTURA C/IVA (en pesos)' => 'monto_factura_civa_en_pesos',
        'MONTO PAGADO CON FAFEF' => 'monto_pagado_con_fafef',
        'MONTO PAGADO CON FAIS' => 'monto_pagado_con_fais',
        'MONTO PAGADO CON FEIEF' => 'monto_pagado_con_feief',
        'MONTO PAGADO CON PARTICIPACIONES' => 'monto_pagado_con_participaciones',
        'MONTO PAGADO CON PARTICIPACIONES A MUN.' => 'monto_pagado_con_participaciones_a_mun',
        'MONTO PAGADO CON FORTAMUN' => 'monto_pagado_con_fortamun',
        'NOMBRE, DENOMINACIN Y/O RAZN SOCIAL' => 'nombre_denominacion_yo_razon_social',
        'NM. CONTRATO O ACUERDO DE OBRA' => 'num_contrato_o_acuerdo_de_obra',
        'NM. CONTRATO' => 'num_contrato',
        'NM. FACTURA O FOLIO FISCAL' => 'num_factura_o_folio_fiscal',
        'NM. PLIZA' => 'num_poliza',
        'OBJETO DEL CONTRATO O NOMBRE DEL PROYECTO' => 'objeto_del_contrato_o_nombre_del_proyecto',
        'OBJETO DEL CONTRATO' => 'objeto_del_contrato',
        'PARTIDA CLASIFICADOR' => 'partida_clasificador',
        'PERIODO DE EJECUCIN FIN (dd/mm/yyyy)' => 'periodo_de_ejecucion_fin_ddmmyyyy',
        'PERIODO DE EJECUCIN INICIO (dd/mm/yyyy)' => 'periodo_de_ejecucion_inicio_ddmmyyyy',
        'RFC DE EMPRESAS CONCURSANTES (en caso de ser LP o IR)' => 'rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir',
        'RFC DE EMPRESAS EN SONDEO DE MERCADO' => 'rfc_de_empresas_en_sondeo_de_mercado',
        'RFC' => 'rfc',
        'TIPO DE ENTREGABLE (documento que acredite la entrega)' => 'tipo_de_entregable_documento_que_acredite_la_entrega',
        'TIPO DE PROCEDIMIENTO (LP o IR o AD)' => 'tipo_de_procedimiento_lp_o_ir_o_ad',
        'VIGENCIA DEL CONTRATO FIN (dd/mm/yyyy)' => 'vigencia_del_contrato_fin_ddmmyyyy',
        'VIGENCIA DEL CONTRATO INICIO (dd/mm/yyyy)' => 'vigencia_del_contrato_inicio_ddmmyyyy',
    ];

    // validacion de cada celda
    private function validarCampoAdd1($campos, $nombreColumnaExcel, $permiteNoAplica, $idValidacion = 0, $obligatorio = true)
    {
        $mensajeValidacion = "";
        $texto = $campos[$nombreColumnaExcel];
        $nombreMostrar = str_contains($nombreColumnaExcel, 'monto_pagado_con') ? 'MONTO PAGADO CON ' . mb_strtoupper(LU::t_tr('v', 'fondo_programa', 'S')) : array_search($nombreColumnaExcel, $this->arrayNombresExcel);
        if ($obligatorio && ($texto == null || $texto == "") && $nombreColumnaExcel != 'tipo_de_procedimiento_lp_o_ir_o_ad') { //campos vacios
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" debe llenarse. Recuerde no combinar celdas.';
            if ($permiteNoAplica) {
                $mensajeValidacion .= ' Es posible utilizar N/A';
            }
        }
        if (!$permiteNoAplica && mb_strtoupper($texto) == "N/A" && $nombreColumnaExcel != 'tipo_de_procedimiento_lp_o_ir_o_ad') { //campos con N/A
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" no debe llenarse con N/A';
        }

        $pattern = LU::get_regex($idValidacion, true);
        $condicion = "";
        switch ($idValidacion) {
            case 1: //"De dd/mm/yyyy a dd/mm/yyyy"
                $condicion = 'debe contener un rango de fechas "De dd/mm/yyyy a dd/mm/yyyy" (sin comillas).';
                break;
            case 4: //fecha dd/mm/yyyy
                $condicion = 'debe ser una fecha en formato "dd/mm/yyyy" (sin comillas).';
                break;
            case 8: //partidas clasificadorias para adquisiciones 2k's, 3k's o 5k's, ej: 5057
                $condicion = 'debe ser un nmero asociado al captulo 2000, 3000  5000.';
                break;
            case 9: //partidas clasificadorias para obras 6k's, ej: 6057
                $condicion = 'debe ser un nmero asociado al captulo 6000.';
                break;
        }
        if ($condicion != "") {
            if ($idValidacion == 4) { //cuando son fechas
                $fechaDT = NULL;
                try { //cuando recibe un numero y lo pasa a datetime
                    $fechaDT = Date::excelToDateTimeObject($texto);
                } catch (\Exception $e) {
                }
                if ($fechaDT == NULL) { //valida si fallo la conversion de numero a datetime
                    try { //cuando recibe un string y lo pasa a datetime
                        $fechaDT = date_create_from_format('d/m/Y', $texto);
                    } catch (\Exception $e) {
                    }
                }
                if ($fechaDT == NULL) { //cuando no se pudo obtener datetime con numero ni string
                    $mensajeValidacion = 'La columna "' . $nombreMostrar . '" ' . $condicion;
                } else { //caso en el que se obtuvo datetime correctamente
                    $campos[$nombreColumnaExcel] = $fechaDT->format('Y-m-d');


                    $fechaMostrar = $fechaDT->format('d/m/Y');
                    $yearReg = intval($fechaDT->format('Y'));
                    if ($yearReg < 100) { //caso en que usaron formato de dos digitos para el ao
                        $fechaFormat2y = date_create_from_format('d/m/y', $texto);
                        $fechaMostrar = $fechaFormat2y->format('d/m/Y');
                        $yearReg = intval($fechaFormat2y->format('Y'));
                    }
                    $yearMin = intval($this->yearDeclarado);
                    $yearMax = intval($this->yearDeclarado + 1);
                    if ($yearReg < $yearMin || $yearReg > $yearMax) {
                        $mensajeValidacion = 'La columna "' . $nombreMostrar . '"' . ': "' . $fechaMostrar . '", debe ser una fecha entre ' . $yearMin . ' y ' . $yearMax . '.';
                    } else {
                        $campos[$nombreColumnaExcel] = $fechaDT->format('Y-m-d');
                        if (in_array($nombreColumnaExcel, ['periodo_de_ejecucion_inicio_ddmmyyyy', 'vigencia_del_contrato_inicio_ddmmyyyy'])) {
                            $this->fechaInicio = $campos[$nombreColumnaExcel];
                        } elseif (in_array($nombreColumnaExcel, ['periodo_de_ejecucion_fin_ddmmyyyy', 'vigencia_del_contrato_fin_ddmmyyyy'])) {
                            $this->fechaFin = $campos[$nombreColumnaExcel];
                            if ($this->fechaInicio != null && $this->fechaInicio > $this->fechaFin) {
                                $mensajeValidacion = 'La columna "' . $nombreMostrar . '"' . ': "' . $fechaMostrar . '", debe ser una fecha igual o posterior a la fecha de inicio.';
                            }
                        }
                    }
                }
            } elseif (!preg_match($pattern, $texto)) { //Validar texto cuando no son fechas
                $mensajeValidacion = 'La columna "' . $nombreMostrar . '" ' . $condicion;
            }
        }

        if (Str::startsWith($texto, "=")) {
            $mensajeValidacion = 'La columna "' . $nombreMostrar . '" no debe contener frmulas, ingrese el valor real en la celda.';
        }

        if ($mensajeValidacion != "") { //Casos con errores
            $this->exceptionModoAdd1($this->mensajeException = $mensajeValidacion);
        }
    }

    // validacion de todos los campos en las hojas
    public $fechaInicio = null;
    public $fechaFin = null;
    private function validacionCamposModoAdd1($campos, $modulo, $tituloCabeceraFondo, $modalidadContratacion)
    {
        $this->fechaInicio = null;
        $this->fechaFin = null;
        $modalidadAD = mb_strtoupper($modalidadContratacion) == 'POR ADMINISTRACIN DIRECTA';
        switch ($this->hojaActual) {
            case 0:
                $this->validarCampoAdd1($campos, $tituloCabeceraFondo, false);
                if ($modulo == 'O') { //Obras
                    $this->validarCampoAdd1($campos, "rfc", $modalidadAD);
                    $this->validarCampoAdd1($campos, "nombre_denominacion_yo_razon_social", $modalidadAD);
                    $this->validarCampoAdd1($campos, "modalidad_de_contratacion_por_contrato_o_por_administracion_directa", false);
                    $this->validarCampoAdd1($campos, "tipo_de_procedimiento_lp_o_ir_o_ad", $modalidadAD);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true);
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false);
                    $this->validarCampoAdd1($campos, "objeto_del_contrato_o_nombre_del_proyecto", false);
                    $this->validarCampoAdd1($campos, "periodo_de_ejecucion_inicio_ddmmyyyy", false, 4);
                    $this->validarCampoAdd1($campos, "periodo_de_ejecucion_fin_ddmmyyyy", false, 4);
                    $this->validarCampoAdd1($campos, "monto_del_contrato_civa_en_pesos", false);
                    $this->validarCampoAdd1($campos, "de_anticipo", !$modalidadAD);
                    $this->validarCampoAdd1($campos, "de_cumplimiento", !$modalidadAD);
                    $this->validarCampoAdd1($campos, "de_vicios_ocultos", !$modalidadAD);
                    $this->validarCampoAdd1($campos, "fecha_de_acta_finiquito_ddmmyyyy", false, 4);
                    $this->validarCampoAdd1($campos, "partida_clasificador", false, 9);
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", true);
                } else { ////Adquisiciones
                    $this->validarCampoAdd1($campos, "rfc", false);
                    $this->validarCampoAdd1($campos, "nombre_denominacion_yo_razon_social", false);
                    $this->validarCampoAdd1($campos, "tipo_de_procedimiento_lp_o_ir_o_ad", false);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true);
                    $this->validarCampoAdd1($campos, "num_contrato", false);
                    $this->validarCampoAdd1($campos, "objeto_del_contrato", false);
                    $this->validarCampoAdd1($campos, "vigencia_del_contrato_inicio_ddmmyyyy", false, 4);
                    $this->validarCampoAdd1($campos, "vigencia_del_contrato_fin_ddmmyyyy", false, 4);
                    $this->validarCampoAdd1($campos, "monto_del_contrato_civa_en_pesos", false);
                    $this->validarCampoAdd1($campos, "de_anticipo", true);
                    $this->validarCampoAdd1($campos, "de_cumplimiento", true);
                    $this->validarCampoAdd1($campos, "de_vicios_ocultos", true);
                    $this->validarCampoAdd1($campos, "tipo_de_entregable_documento_que_acredite_la_entrega", false);
                    $this->validarCampoAdd1($campos, "partida_clasificador", false, 8);
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", true);
                }
                break;
            case 1:
                if ($modulo == 'O') { //Obras
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true);
                } else { ////Adquisiciones
                    $this->validarCampoAdd1($campos, "num_contrato", false);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_en_sondeo_de_mercado", true);
                    $this->validarCampoAdd1($campos, "rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir", true);
                }
                break;
            case 2:
                if ($modulo == 'O') { //Obras
                    $this->validarCampoAdd1($campos, "num_contrato_o_acuerdo_de_obra", false);
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", false);
                    $this->validarCampoAdd1($campos, "monto_factura_civa_en_pesos", false);
                    $this->validarCampoAdd1($campos, "num_poliza", false);
                } else { ////Adquisiciones
                    $this->validarCampoAdd1($campos, "num_contrato", false);
                    $this->validarCampoAdd1($campos, "num_factura_o_folio_fiscal", false);
                    $this->validarCampoAdd1($campos, "monto_factura_civa_en_pesos", false);
                    $this->validarCampoAdd1($campos, "num_poliza", false);
                }
                break;
        }
    }

    // Insertar contratos segn modo
    private function exceptionModoAdd1($mensajeDeLaExcepcion, $exceptionExterno = false)
    {
        $this->guardado_correcto = false;
        $errorPlantilla = false;
        $mensajeError = "";
        $numeroFilasAumentar = 0;
        if (!$this->abrirExcelCorrecto) { //verifica que todas las hojas tengan datos
            $mensajeError = "Verifique que los " . LU::t_tr('v', 'anexo', 'p') . " (hojas de Excel) tengan datos asociados.";
        } else {
            $mensajeError = "Existe un dato invlido en la hoja ";
            switch ($this->hojaActual) {
                case 0:
                    $mensajeError .= '1';
                    $numeroFilasAumentar = 16;
                    break;
                case 1:
                    $mensajeError .= '2';
                    $numeroFilasAumentar = 7;
                    break;
                case 2:
                    $mensajeError .= '3';
                    $numeroFilasAumentar = 8;
                    break;
            }
            //Errores en de excepciones automticas al intentar guardar
            $error = $mensajeDeLaExcepcion;
            if (strpos($error, "Duplicate entry ") !== false && strpos($error, " for key 'contratos_unicos'") !== false) { //Num. contrato duplicado
                $this->mensajeException = 'El nmero de contrato est duplicado.';
            } elseif (Str::startsWith($error, "Undefined index")) { //Caso que no encontr una cabecera
                $errorPlantilla = true;
                $this->todosErroresExcelImport = []; //limpia la lista de errores pues es error de la plantilla
                $campoEncontrado = true;
                $nombreCampoExcel = str_replace('Undefined index: ', '', $error);

                $nombreMostrar = array_search($nombreCampoExcel, $this->arrayNombresExcel);
                if ($nombreMostrar === false) { //Verifica si existe el valor en el array
                    $nombreMostrar = $nombreCampoExcel; //Asigna la clave
                    $campoEncontrado = false;
                }

                $linkPlantillaCorrecta = '';
                $this->mensajeException = $campoEncontrado ? 'No se encontr la columna: '
                    : 'Se ha detectado una columna indefinida:'; //caso de nuevos campos que se agreguen
                $this->mensajeException .= $nombreMostrar . ' (de la hoja ' . ($this->hojaActual + 1) . '). ' .
                    'Verifique que la plantilla utilizada sea del mdulo correcto y que no haya sido alterada
                    (nombres ni ubicacin de las cabeceras y las hojas). ' . $linkPlantillaCorrecta;
            } else {
                $finSubcadena = strpos($error, " at row ");
                if (strpos($error, " for column ") !== false && $finSubcadena !== false) { //Caso que no pudo registrar una celda invlida
                    $subcadena = substr($error, 0, $finSubcadena); //cadena con caracter de columna '  ` de la bd
                    $caracterColumna = substr($subcadena, -1); //obtiene el ltimo caracter
                    $subcadena = substr($subcadena, 0, -1); //cadena sin caracter de columna '  ` de la bd
                    $inicioSubcadena = strripos($subcadena, $caracterColumna); //ultima concurrencia
                    $columnaBD = substr($subcadena, $inicioSubcadena + 1);
                    $arrayColumnasBD = [ //debe ser conforme a la base de datos
                        'El RFC es invlido, debe ser alfanumrico. Ingrese uno por campo.' => 'rfc',
                        'El nombre, denominacin y/o razon social es invlido, debe ser texto.' => 'nombre_d_r_social',
                        'La modalidad de contratacin es invlida, debe ser alfanumrica.' => 'modalidad_contratacion',
                        'El tipo de procedimiento es invlido, debe ser alfanumrico.' => 'tipo_procedimiento',
                        'El RFC de empresas en sondeo de mercado son invlidos, deben ser alfanumricos.' => 'rfc_empresas_sondeo',
                        'El RFC de empresas concursantes son invlidos, deben ser alfanumricos.' => 'rfc_empresas_concursantes',
                        'El nmero de contrato es invlido, debe ser alfanumrico.' => 'numero_contrato',
                        'El nombre del proyecto es invlido, debe ser alfanumrico.' => 'nombre_proyecto',
                        'El periodo de ejecucion inicio es invlido, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'periodo_ejecucion_inicio',
                        'El periodo de ejecucion fin es invlido, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'periodo_ejecucion_fin',
                        'El objeto del contrato es invlido, debe ser alfanumrico.' => 'objeto_contrato',
                        'La vigencia del contrato inicio es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'vigencia_contrato_inicio',
                        'La vigencia del contrato fin es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'vigencia_contrato_fin',
                        'El monto del contrato es invlido, debe ser en pesos (nmero).' => 'monto_contrato',
                        'El nmero de fianza de anticipo es invlido, puede ser alfanumrico.' => 'de_anticipo',
                        'El nmero de fianza de cumplimiento es invlido, puede ser alfanumrico.' => 'de_cumplimiento',
                        'El nmero de fianza de vicios ocultos es invlido, puede ser alfanumrico.' => 'de_vicios_ocultos',
                        'El tipo de entregable es invlido, debe ser alfanumrico.' => 'tipo_entregable',
                        'La fecha del acta de finiquito es invlida, debe ser una fecha "dd/mm/yyyy" (sin comillas).' => 'fecha_acta_finiquito',
                        'El monto pagado con ' . LU::t_tr('i', 'fondo_programa', 's') . ' es invlido, debe ser en pesos (nmero).' => 'montoPagadoConPart',
                        // 'La partida clasificador es invlida, verifquela.' => 'partidaClasificador', //para no duplicar mensaje se omite
                        'El nm. factura es invlido, debe ser alfanumrico.' => 'num_factura',
                        'El nm. pliza es invlido, debe ser alfanumrico.' => 'num_poliza',
                        'El nm. factura es invlido, debe ser alfanumrico.' => 'nFactura',
                        'El monto es invlido, debe ser en pesos (nmero).' => 'nMonto',
                    ];

                    $errorEnCampoBD = array_search($columnaBD, $arrayColumnasBD);
                    if ($errorEnCampoBD !== false) { //Verifica si existe el valor en el array
                        $this->mensajeException = $errorEnCampoBD;
                    }
                } else { //descomentar para caso error en el nombre de la columna
                    // $this->mensajeException = 'Ubicacin error. ' . $error;
                }
            }

            if ($exceptionExterno) {
                $this->mensajeException .= " Despus de corregirlo intntelo de nuevo por favor.";
            }

            $mensajeError .= " en la fila " . ($this->contadorRegistro + $numeroFilasAumentar) . ". " . $this->mensajeException;
            if ($this->soloMensajeException || $errorPlantilla) {
                $mensajeError = $this->mensajeException;
            }
            if (strpos($mensajeError, 'El RFC "" no es vlido, verifquelo') === false) { //verifica si el mensaje no es de un rfc est vacio
                array_push($this->todosErroresExcelImport, $mensajeError);
            }
            sort($this->todosErroresExcelImport);
        }
    }

    // CONTRATOS
    public function contratosClave(Request $r, $modulo, $id)
    {
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first();
        if ($clave_ff->id_dependencia == Auth::user()->id_dependencia) {
            $d = Dependencias::with(['d_e', 'd_m'])->where('id_dependencia', Auth::user()->id_dependencia)->first();

            $datos['claveAnual'] = (DB::table('clave_ff as ff')->where('id_ff', $id)->select(DB::Raw('YEAR(fecha) as fecha'))->first()->fecha < date('Y')) ? 1 : 0;

            $datos['id_ff'] = $id;
            $datos['modulo'] = $modulo;
            $contratos_o = DB::table('contratos_modo_basico')->where('id_ff', $id);
            $contratos_a = DB::table('contratos_modo_basico')->where('id_ff', $id);


            // DATOS PARA RESUMEN
            $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave;
            $datos['monto'] = $clave_ff->monto_recibido;
            $datos['gastos_diversos'] = self::totalAnexoGD($clave_ff);
            $datos['ramo'] = $clave_ff->ramo;
            $datos['monto_ramo28'] = $clave_ff->cap1k;
            $datos['obras'] = $clave_ff->obras == 1 ? 'Si' : 'No';
            $datos['monto_obras'] = $contratos_o->where('modulo', 'O')->where('id_ff', $id)->sum('montoPagadoConPart');
            $datos['monto_adquisiciones'] = $contratos_a->where('modulo', 'A')->where('id_ff', $id)->sum('montoPagadoConPart');
            $datos['total_reintegro_tesofe'] = Claves::Where(['id_ff' => $id, 'id_dependencia' => $d->id_dependencia])->where('year', $clave_ff->year)->sum('reintegro_tesofe');
            // Montos por participaciones se suman ya que no tocan el dinero de la fuente de financiamiento/programa
            $datos['utilizado'] = $datos['monto_obras'] + $datos['monto_adquisiciones'] + $datos['monto_ramo28'] + $clave_ff->cap4k + $datos['gastos_diversos']->total + $datos['total_reintegro_tesofe'];
            $datos['disponible'] = $datos['monto'] - $datos['utilizado'];
            $datos['cff'] = $clave_ff;

            //Anexo cap. 4k
            $datos['anexo_cap_4k'] = null;
            if (in_array($clave_ff->estatus_anexo_c4k, [1, 2, 3, 4])) {
                $datos['anexo_cap_4k'] = DB::table('anexo_cap_4k as ac4k')->where('ac4k.id_clave_ff', $id)->first();
            }

            //num auditoria
            $objCNA = DB::table('catalogo_numeros_auditoria')->where('id', $clave_ff->id_nauditoria)->first();

            // DATOS GENERALES
            $datos['datos_generales'] = (object) [
                'year' => $clave_ff->year,
                'dependencia' => $d->sDependencia,
                'siglas' => $d->sSiglas,
                'municipio' => ($d->d_m == NULL) ? 'No aplica' : $d->d_m->municipio,
                'estado' => $d->d_e->estado,
                'id_dependencia' => $d->id_dependencia,
                'id_fondo' => $clave_ff->clave_ff,
                'id_nauditoria' => $clave_ff->id_nauditoria,
                's_num_auditoria' => $objCNA->numeroAuditoria,
                'fecha_cierre' => date('d/m/Y', strtotime($objCNA->fecha_cierre)),
                'monto_asignado' => $clave_ff->monto_recibido,
                'monto_utilizado' => $datos['utilizado'],
                'monto_restante' => $datos['disponible'],
                'url_4000' => $d->d_e->id . '/' . $d->d_m->id . '/' . $d->id_dependencia . '/' . $clave_ff->year . '/' . $clave_ff->id_nauditoria . '/' . $clave_ff->clave_ff,
            ];
            $datos['isNumAuditoriaCerrado'] = $objCNA->fecha_cierre < Carbon::today()->startOfDay();

            // DATOS PARA TABLA
            // $datos['contratos'] = cmb::from('contratos_modo_basico as cmb')
            //     ->with(['stepper'])
            //     ->join('catalogo_claves_presupuestales as tcff', 'cmb.clave_ff', '=', 'tcff.id')
            //     ->where('cmb.id_ff', $id)
            //     ->where('cmb.modulo', $modulo)
            //     ->select('cmb.*', 'tcff.nombre_clave')
            //     ->get();
            $datos['contratos'] = CMB::with(['stepper', 'c_ccp', 'c_s', 'c_ec', 'c_nf' => function ($q) {
                $q->with(['f_p']);
            },])
                ->where('id_ff', $id)
                ->where('modulo', $modulo)
                ->get();
            return view('asf_layout.contratos', $datos);
        } else {
            return \Redirect::to('/api/conexion/vistaRdfs')->with('verificacion', ['No tiene autorizacin para entrar a esta seccin.']);
        }
    }

    public static function obtenerDatosContrato(Request $r)
    {
        $data = DB::table('contratos_modo_basico as cmb')
            ->join('catalogo_claves_presupuestales as ccp', 'cmb.clave_ff', '=', 'ccp.id')
            ->leftjoin('control_modo_intermedio as cmi', 'cmb.id', '=', 'cmi.id_contrato')
            ->leftjoin('job_statuses as js', 'js.id', '=', 'cmi.j_descarga_zip_inter')
            ->where('cmb.id_ff', $r->id_cff)
            ->where('cmb.modulo', $r->modulo)
            ->select(
                'cmb.id',
                'ccp.nombre_clave',
                'cmb.nombre_d_r_social',
                'cmb.tipo_procedimiento',
                'cmb.tipo_registro',
                'cmb.numero_contrato',
                'cmb.monto_contrato',
                'js.status',
                'js.output',
                'js.operacion_exitosa',
                'cmi.id_contrato',
            )
            ->selectRaw('DATEDIFF(NOW(), js.finished_at) as dias_transcurridos')
            ->get();
        return response()->json($data);
    }

    public static function contarContratos(Request $r)
    {
        $data = DB::table('contratos_modo_basico as cmb')
            ->join('catalogo_claves_presupuestales as ccp', 'cmb.clave_ff', '=', 'ccp.id')
            ->where('cmb.id_ff', $r->id_cff)
            ->where('cmb.modulo', $r->modulo)
            ->count();

        return response()->json($data);
    }

    public static function obtenerPasoContrato(Request $r)
    {
        $consulta = DB::table('contratos_modo_basico as cmb')
            ->join('control_modo_intermedio as cmi', 'cmi.id_contrato', '=', 'cmb.id')
            ->where('cmb.id', $r->id_contrato)
            ->select(
                'cmi.status',
                'cmi.step7',
                'cmi.step6',
                'cmi.step5',
                'cmi.step4',
                'cmi.step3',
                'cmi.step2',
                'cmi.step1',
                'cmi.step0',
            )->first();
        $step = 0;
        // redireccion de step
        if ($step == 0) {
            if (!Auth::user()->u_ptu->c_intermedio_datos_iniciales || $consulta->step0) {
                $step++;
            }
        }
        if ($step == 1) {
            if (!Auth::user()->u_ptu->c_intermedio_suficiencia_presupuestal || $consulta->step1) {
                $step++;
            }
        }
        if ($step == 2) {
            if (!Auth::user()->u_ptu->c_intermedio_proceso_de_adjudicacion || $consulta->step2) {
                $step++;
            }
        }
        if ($step == 3) {
            if (!Auth::user()->u_ptu->c_intermedio_proceso_de_contratacion || $consulta->step3) {
                $step++;
            }
        }
        if ($step == 4) {
            if (!Auth::user()->u_ptu->c_intermedio_entrega || $consulta->step4) {
                $step++;
            }
        }
        if ($step == 5) {
            if (!Auth::user()->u_ptu->c_intermedio_facturas || $consulta->step5) {
                $step++;
            }
        }
        if ($step == 6) {
            if (!Auth::user()->u_ptu->c_intermedio_pago_y_polizas || $consulta->step6) {
                $step++;
            }
        }
        if (
            Auth::user()->u_ptu->c_intermedio_datos_iniciales &&
            Auth::user()->u_ptu->c_intermedio_suficiencia_presupuestal &&
            Auth::user()->u_ptu->c_intermedio_proceso_de_adjudicacion &&
            Auth::user()->u_ptu->c_intermedio_proceso_de_contratacion &&
            Auth::user()->u_ptu->c_intermedio_entrega &&
            Auth::user()->u_ptu->c_intermedio_facturas &&
            Auth::user()->u_ptu->c_intermedio_pago_y_polizas
        ) {
            if ($step == 7 && $consulta->step7) {
                $step++;
            }
        }
        $url = '/layouts/contratos/intermedio/' . $step . '/' . $r->id_contrato . '/' . $r->modulo . '/' . $r->id_cff;

        return response()->json($url);
    }

    public static function verInformacionContrato(Request $r)
    {

        $datos['contrato'] = CMB::with(['stepper', 'c_ccp', 'c_s', 'c_ec', 'c_nf' => function ($q) {
            $q->with(['f_p']);
        },])
            ->where('id', $r->id_contrato)
            ->get();
        $listaRegs = [];
        $listaRegs['id'] =  $datos['contrato'][0]->id;
        $listaRegs['clave_ff'] =  $datos['contrato'][0]->c_ccp->nombre_clave;
        $listaRegs['rfc'] =  $datos['contrato'][0]->rfc;
        $listaRegs['nombre_d_r_social'] =  $datos['contrato'][0]->nombre_d_r_social;
        $listaRegs['rfc_empresas_sondeo'] =  $datos['contrato'][0]->c_s;
        $listaRegs['rfc_empresas_concursantes'] =  $datos['contrato'][0]->c_ec;
        $listaRegs['numero_contrato'] =  $datos['contrato'][0]->numero_contrato;
        $listaRegs['monto_contrato'] =  $datos['contrato'][0]->monto_contrato;
        $listaRegs['de_anticipo'] =  $datos['contrato'][0]->de_anticipo;
        $listaRegs['de_cumplimiento'] =  $datos['contrato'][0]->de_cumplimiento;
        $listaRegs['de_vicios_ocultos'] =  $datos['contrato'][0]->de_vicios_ocultos;
        $listaRegs['monto_pagado_con_part'] =  $datos['contrato'][0]->montoPagadoConPart;
        $listaRegs['partida_clasificador'] =  $datos['contrato'][0]->partidaClasificador;
        $listaRegs['num_factura'] =  $datos['contrato'][0]->c_nf;
        $listaRegs['tipo_registro'] =  $datos['contrato'][0]->tipo_registro;
        switch ($datos['contrato'][0]->nombre_d_r_social) {
            case 'lp':
                $listaRegs['tipo_procedimiento'] = 'Licitacin pblica';
                break;
            case 'ir':
                $listaRegs['tipo_procedimiento'] = 'Invitacin restringida';
                break;
            case 'ad':
                $listaRegs['tipo_procedimiento'] = 'Adjudicacin directa';
                break;

            default:
                $listaRegs['tipo_procedimiento'] = 'No aplica';
                break;
        }

        if ($r->modulo == 'O') {
            $listaRegs['modalidad-contratacion'] =  $datos['contrato'][0]->modalidad_contratacion;
            $listaRegs['nombre_proyecto'] =  $datos['contrato'][0]->nombre_proyecto;
            $listaRegs['periodo_ejecucion_inicio'] =  $datos['contrato'][0]->periodo_ejecucion_inicio;
            $listaRegs['periodo_ejecucion_fin'] =  $datos['contrato'][0]->periodo_ejecucion_fin;
            $listaRegs['fecha_acta_finiquito'] =  $datos['contrato'][0]->fecha_acta_finiquito;
        } else if ($r->modulo == 'A') {
            $listaRegs['objeto_contrato'] =  $datos['contrato'][0]->objeto_contrato;
            $listaRegs['vigencia_contrato_inicio'] =  $datos['contrato'][0]->vigencia_contrato_inicio;
            $listaRegs['vigencia_contrato_fin'] =  $datos['contrato'][0]->vigencia_contrato_fin;
            $listaRegs['tipo_entregable'] =  $datos['contrato'][0]->tipo_entregable;
        }

        return response()->json($listaRegs);
    }

    //calculo del total del anexo GD de un fondo al que pertenece un contrato
    public static function totalAnexoGD($objCFF)
    {
        $tieneAnexoGD = !in_array($objCFF->estatus_archivo, [0, 5]);
        $totalAGDO = $objCFF->fondo_revolvente;
        return (object)['tieneAnexo' => $tieneAnexoGD, 'total' => $totalAGDO];
    }

    // EDITAR CONTRATO
    public function editarContrato(Request $r, $modulo, $clave, $id)
    {
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $clave)->first();
        $datos['cff'] = DB::table('clave_ff')->where('id_ff', $clave)->first();
        $datos['n_ff'] = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first()->nombre_clave;
        $datos['clave'] = $clave;
        $datos['modulo'] = $modulo;
        $datos['id_contrato'] = $id;
        $datos['contratos'] = DB::table('contratos_modo_basico as cmb')
            ->join('catalogo_claves_presupuestales as tcff', 'cmb.clave_ff', '=', 'tcff.id')
            ->where('cmb.id', $id)
            ->select('cmb.*', 'tcff.nombre_clave')
            ->get();
        return View('asf_layout.editar_contrato', $datos);
    }
    // Seleccin de modo de carga de contratos
    public function modoClave(Request $r, $modulo, $id)
    {
        $clave_ff = DB::table('clave_ff as ff')->where('ff.id_ff', $id)->first();
        $ccp = DB::table('catalogo_claves_presupuestales')->where('id', $clave_ff->clave_ff)->first();
        $datos['n_ff'] = $ccp->nombre_clave;
        $datos['ccp_id'] = $ccp->id;
        $datos['c_ff'] = $clave_ff->clave_ff;
        $datos['cff'] = DB::table('clave_ff as c')
            ->join('catalogo_claves_presupuestales as tcff', 'c.clave_ff', '=', 'tcff.id')
            ->where('c.id_ff', $id)
            ->select('c.*', 'tcff.nombre_clave')
            ->first();
        $datos['clave'] = $id;
        $datos['modulo'] = $modulo;
        $datos['year'] = $r->year;
        $datos['nAuditoria'] = $clave_ff->id_nauditoria;
        switch ($r->modo) {
            case 1:
                $datos['contratos'] = DB::table('contratos_excel_files as c')
                    ->join('usuarios as u', 'u.id', '=', 'c.id_usuario')
                    ->join('clave_ff as cff', 'c.id_ff', '=', 'cff.id_ff')
                    ->join('catalogo_claves_presupuestales as ccp', 'cff.clave_ff', '=', 'ccp.id')
                    ->where('c.id_ff', $id)
                    ->where('c.modulo', $modulo)
                    ->select(
                        'c.*',
                        'ccp.nombre_clave as fondo_programa',
                        DB::raw("CONCAT(u.firstname,' ',u.lastname) as username")
                    )
                    ->get();
                return view('asf_layout.modo.modo1', $datos);
                break;
            case 2:
                $datos['contratos'] = DB::table('contratos_modo_basico as c')
                    ->join('catalogo_claves_presupuestales as tcff', 'c.clave_ff', '=', 'tcff.id')
                    ->join('usuarios as u', 'u.id', '=', 'c.id_usuario')
                    ->where('c.id_ff', $id)
                    ->where('c.modulo', $modulo)
                    ->wherein('c.tipo_registro', ['1', '2'])
                    ->select(
                        'c.*',
                        'tcff.nombre_clave as nombre_clave',
                        DB::raw("CONCAT(u.firstname,' ',u.lastname) as username")
                    )
                    ->get();
                $datos['id_contrato'] = $r->has('id_contrato') ? $r->id_contrato : "void";
                return View('asf_layout.modo.modo2', $datos);
                break;
            case 3:
                $id_contrato = DB::table('contratos_modo_basico')
                    ->insertGetId([
                        'id_ff' => $id,
                        'id_usuario' => Auth::user()->id,
                        'clave_ff' => $datos['c_ff'],
                        'tipo_registro' => 3,
                        'modulo' => $modulo
                    ]);
                DB::table('control_modo_intermedio')->insert(['id_ff' => $id, 'modulo' => $modulo, 'id_contrato' => $id_contrato]);
                DB::table('files_contratos_modo_basico')->insert(['id_ff' => $id, 'modulo' => $modulo, 'id_contrato' => $id_contrato]);
                return \Redirect::to('/layouts/contratos/intermedio/0/' . $id_contrato . '/' . $modulo . '/' . $id);
                break;
        }
    }
    //variables
    public $lista_anexo_regs = [];
    public $todosErroresExcelImport = [];
    public $yearDeclarado = 0;
    public $userAnexo;
    public $hojasAnexo;
    public $idNumAuditoriaAnexo;
    public $idCcpAnexo;
    public $tipoVistaAnexo;
    public $archivoExcelAnexo;
    // Insertar contratos segn modo
    public function modoAdd(Request $r, $modo, $modulo, $id)
    {
        set_time_limit(0);
        $url = '';
        $patternRFC = LU::get_regex(0, true);
        switch ($modo) {
            case 1:
                set_time_limit(0);
                $mensajeError = '';
                $contieneArchivo = false;
                try {
                    if ($r->has('archivo_excel')) {
                        $data = explode(',', $r->archivo_excel);
                        $b64Data = base64_decode($data[1]);
                        $contieneArchivo = true;
                    }
                } catch (\Exception $ex) {
                }
                if ($contieneArchivo) {
                    $path = '/' . 'uploads/' . $r->year . '/' . 'basico/' . $modulo . '/';
                    $name = ($modulo == 'O' ? 'anexoObras_' : 'anexoAdq_') . $id . '-' . Auth::user()->id . '-' . date('Ymd_His') . '.xlsx';
                    $url = $path . $name;
                    $dirname = dirname(public_path() . $url);

                    if (!is_dir($dirname)) {
                        mkdir($dirname, 0755, true);
                    }
                    $file = fopen(public_path() . $url, 'wb');
                    fwrite($file, $b64Data);
                    fclose($file);

                    try {
                        $this->yearDeclarado = $r->year;
                        $this->idCcpAnexo = $r->ccp_id;
                        $this->userAnexo = Auth::user();
                        try {
                            $ExcelImport = $modulo == 'O' ? new AnexoObras($this->yearDeclarado, $this->userAnexo, $id, $modulo) : new AnexoAdq($this->yearDeclarado, $this->userAnexo, $id, $modulo);
                            Excel::import($ExcelImport, public_path($url));
                        } catch (\Throwable $e) {
                            $ExcelImport->todosErroresExcelImport['Hoja ' . $ExcelImport->hojaActualAnalizada . '. ']['No se pudo analizar, verifique la plantilla y que no haya frmulas que involucren diferentes hojas'] = [];
                        }
                        $this->lista_anexo_regs = $ExcelImport->lista_anexo_regs;
                        $this->todosErroresExcelImport = $ExcelImport->todosErroresExcelImport;
                        $hayProblemaEmail = false;
                        if (!sizeof($this->todosErroresExcelImport)) { //si no hay errores se guarda
                            $hayProblemaEmail = $this->guardarAdqObras($modulo, $id, $r->correo_contacto, $url);
                        }
                        if (!sizeof($this->todosErroresExcelImport)) {
                            $datos = [
                                'hayProblemaEmail' => $hayProblemaEmail,
                            ];
                        }
                    } catch (\Exception $e) {
                        $error = $e->getMessage();
                        switch (true) {
                            case strpos($error, 'Your requested sheet name [') !== false:
                                $inicioNombre = substr($error, strpos($error, '[') + 1);
                                $finalNombre = strpos($inicioNombre, ']');
                                $nombreHoja = substr($inicioNombre, 0, $finalNombre);
                                $mensajeError = 'No se encontr la hoja "' . $nombreHoja  . '", use la plantilla correcta';
                                break;

                            default:
                                $mensajeError = 'Error durante el anlisis del documento, comunquese con servicio tcnico';
                                break;
                        }
                    }
                } else {
                    $mensajeError = 'No se encontr el archivo de Excel';
                }
                if ($mensajeError != '') {
                    $this->todosErroresExcelImport['No pudo analizarse. '][$mensajeError] = [];
                }

                if (sizeof($this->todosErroresExcelImport)) {
                    $datos = ['errores' => $this->todosErroresExcelImport];
                    if ($url != '') {
                        unlink(public_path() . $url);
                    }
                }

                return response()->json($datos);

                //Codigo viejo:
                $numContratos = 0;
                DB::beginTransaction();
                $this->guardado_correcto = true;
                $this->modulo = $modulo;

                $datos['modulo'] = $modulo;
                $datos['id_ff'] = $id;
                $clave_ff = DB::table('clave_ff')->where('id_ff', $id)->first()->clave_ff;
                $this->c_ff = $clave_ff;
                // $this->year = $r->year;
                $this->yearDeclarado = $r->year;
                $datos['id_usuario'] = Auth::user()->id;
                $datos['correo_contacto'] = $r->correo_contacto;
                $datos['created_at'] = date('Y-m-d H:i:s');

                $query = DB::table('contratos_excel_files')->where('id_ff', $id);
                if ($query->count() < 1) {
                    $id_cef = DB::table('contratos_excel_files')->insertGetId($datos);
                } else if ($query->count() >= 1) {
                    $query_2 = $query->whereNull('url_archivo');
                    if ($query_2->count() < 1) {
                        $id_cef = DB::table('contratos_excel_files')->insertGetId($datos);
                    } else {
                        $id_cef = $query->whereNull('url_archivo')->first()->id;
                    }
                }

                $name = "";
                $path = "";
                if (Input::hasFile('archivo_excel')) {
                    $name = ($modulo == 'O' ? 'AnexoObrasPublicas_' : 'AnexoAdquisiciones_') . $clave_ff . '_' . $id_cef . '.' . Input::file('archivo_excel')->getClientOriginalExtension();
                    $path = '/' . 'uploads/' . $r->year . '/' . 'basico/' . $id . '/';
                    $datos['url_archivo'] = $path . $name;
                    $datos['updated_at'] = Carbon::now();

                    Input::file('archivo_excel')->move(public_path() . '/' . $path, $name);

                    $this->todosErroresExcelImport = [];
                    $this->mensajeException = '';
                    try {
                        $this->abrirExcelCorrecto = false;
                        $ExcelImport = new ExcelImport($this);
                        Excel::import($ExcelImport, public_path($path . $name));
                        $this->abrirExcelCorrecto = true;

                        // Data processing
                        $this->hojaActual = 0;
                        $this->contadorRegistro = 0;

                        //Validacin dinmica
                        $idFFClaveFF = 0;
                        $nombreFondoPrograma = "";
                        $yearCompare = 0;
                        $query = DB::table('clave_ff')->where('id_ff', $id);
                        if ($query->count() >= 1) {
                            $yearCompare = $query->first()->year;
                            $idDependenciaCompare = Auth::user()->id_dependencia;
                            $claveFFCompare = $clave_ff;

                            $query = DB::table('fondo_dependencia')->where([
                                'id_dependencia' => $idDependenciaCompare,
                                'year' => $yearCompare,
                                'clave_ff' => $claveFFCompare
                            ]);
                            if ($query->count() >= 1) {
                                $idFondoDependenciaCompare = $query->first()->id;
                                $query = DB::table('clave_ff')->where(['id_fondo_dependencia' => $idFondoDependenciaCompare]);
                                if ($query->count() >= 1) {
                                    $idFFClaveFF = $query->first()->id_ff;
                                }
                            }
                        }
                        $idFFClaveFF = $id; //asignacion manual de idff
                        if ($idFFClaveFF == 0) {
                            throw new Exception($this->mensajeException = LU::t_tr('D', 'fondo_programa', 's') . ', el ao y ' . LU::t_tr('d', 'dependencia', 's') . ' no coinciden, verifquelos.');
                        } else {
                            $query = DB::table('catalogo_claves_presupuestales')->where(['id' => $clave_ff]);
                            if ($query->count() >= 1) {
                                $nombreFondoPrograma = $query->first()->nombre_clave;
                            } else {
                                throw new Exception($this->mensajeException = LU::t_tr('D', 'fondo_programa', 's') . ' no se encontr, verifquelo.');
                            }
                        }

                        $arrayNumContratosAnexo0 = [];
                        $arrayNumContratosAnexo1 = [];
                        $arrayNumContratosAnexo2 = [];
                        $tituloCabeceraFondo = 'monto_pagado_con_' . strtolower(LU::limpiarSimplificarString($nombreFondoPrograma));

                        $modContratacion = "";
                        $this->soloMensajeException = false;
                        foreach ($this->lista_contratos_modo_basico as $i => $cmb) {
                            echo var_dump(" ");
                            $this->hojaActual = 0;
                            $this->contadorRegistro = $i;

                            //Verificar si existen campos vacios
                            $todosCamposVacios = true;
                            $almenosUnVacio = false;
                            $saltar = true; //evita el primero, pues est vacia la cabecera
                            foreach ($cmb as $c => $atributo) { //verificar vacios
                                if ($saltar) {
                                    $saltar = false;
                                } else {
                                    if ($atributo) {
                                        $todosCamposVacios = false;
                                    } else {
                                        $almenosUnVacio = true;
                                    }
                                }
                            }
                            if ($todosCamposVacios) { //saltar registros completamente vacios
                                continue;
                            }

                            //Validacion de campos
                            if ($modulo == 'O') {
                                $modContratacion = $cmb['modalidad_de_contratacion_por_contrato_o_por_administracion_directa'];
                                $this->validacionCamposModoAdd1($cmb, $modulo, $tituloCabeceraFondo, $modContratacion);
                            } else {
                                $this->validacionCamposModoAdd1($cmb, $modulo, $tituloCabeceraFondo, "");
                            }

                            //Objeto
                            $arr_row_cmb = [];
                            //Campos tabla
                            $arr_row_cmb['id_ff'] = $idFFClaveFF;
                            $arr_row_cmb['id_usuario'] = Auth::user()->id;
                            $arr_row_cmb['tipo_registro'] = 1;
                            $arr_row_cmb['modulo'] = $modulo;
                            //Campos tanto en obras como en adquisiciones
                            $arr_row_cmb['clave_ff'] = $clave_ff;

                            //RFC
                            if ($cmb['rfc'] == "N/A") { //valida si hay "N/A"
                                $arr_row_cmb['rfc'] = null;
                            } elseif (preg_match($patternRFC, $cmb['rfc'])) { //Validar RFC
                                $arr_row_cmb['rfc'] = $cmb['rfc'];
                            } else { //RFC invlido
                                $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $cmb['rfc'] . '" no es vlido, verifquelo.');
                            }

                            $arr_row_cmb['rfc'] = $cmb['rfc'] == "N/A" ? null : $cmb['rfc'];
                            $arr_row_cmb['nombre_d_r_social'] = $cmb['nombre_denominacion_yo_razon_social'] == "N/A" ? null : $cmb['nombre_denominacion_yo_razon_social'];
                            $arr_row_cmb['monto_contrato'] = $cmb['monto_del_contrato_civa_en_pesos'] == "N/A" ? null : $cmb['monto_del_contrato_civa_en_pesos'];
                            $arr_row_cmb['de_anticipo'] = $cmb['de_anticipo'] == "N/A" ? null : $cmb['de_anticipo'];
                            $arr_row_cmb['de_cumplimiento'] = $cmb['de_cumplimiento'] == "N/A" ? null : $cmb['de_cumplimiento'];
                            $arr_row_cmb['de_vicios_ocultos'] = $cmb['de_vicios_ocultos'] == "N/A" ? null : $cmb['de_vicios_ocultos'];
                            $arr_row_cmb['partidaClasificador'] = $cmb['partida_clasificador'] == "N/A" ? null : $cmb['partida_clasificador'];

                            //opcionesMontoPagado
                            $arr_row_cmb['montoPagadoConPart'] = $cmb[$tituloCabeceraFondo] == "N/A" ? null : $cmb[$tituloCabeceraFondo];

                            //opciones tipo de procedimiento
                            $arrayTiposProcedimientos = [
                                'lp' => 'lp',
                                'ir' => 'ir',
                                'ad' => 'ad',
                            ];
                            $tipoDeProcedimiento = strtolower($cmb['tipo_de_procedimiento_lp_o_ir_o_ad']);
                            $puedeAsignarNoAplica = $modulo == 'O' && mb_strtoupper($modContratacion) == 'POR ADMINISTRACIN DIRECTA';
                            if ($puedeAsignarNoAplica) { //asignacin automtica de N/A en tipo de procedimiento
                                // if ($puedeAsignarNoAplica && $tipoDeProcedimiento == 'n/a') {//condicin antigua
                                $arr_row_cmb['tipo_procedimiento'] = null;
                            } elseif (!array_key_exists($tipoDeProcedimiento, $arrayTiposProcedimientos)) { //Verifica si no existe la clave en el array
                                //caso en que no se puede utilizar n/a ni ningun otra respuesta pues se debe ingresar el tipo de procedimiento
                                $mensaje = 'Verifique que el TIPO DE PROCEDIMIENTO sea: LP o IR o AD.';
                                // if ($puedeAsignarNoAplica) {
                                //     $mensaje .= ' Es posible utilizar N/A';
                                // }
                                $this->exceptionModoAdd1($this->mensajeException = $mensaje);
                            } else { //Si encontr el valor en el array, por lo que asigna el valor
                                $arr_row_cmb['tipo_procedimiento'] = $arrayTiposProcedimientos[$tipoDeProcedimiento];
                            }

                            //Calcular nmero contrato
                            $numeroContrato = $modulo == 'O' ? $cmb['num_contrato_o_acuerdo_de_obra'] : $cmb['num_contrato'];
                            if ($numeroContrato == "N/A") {
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato no puede ser N/A. Use la nomenclatura SNCx (Sin nmero de contrato, donde x es un nmero) en los ' . LU::t_tr('v', 'anexo', 'p') . ' para asociar los datos.');
                            } else {
                                $arr_row_cmb['numero_contrato'] = strpos($numeroContrato, "SNC") === 0 ? libUtilities::consecutivos($arr_row_cmb['id_ff'], $yearCompare) : $numeroContrato;
                            }

                            if ($modulo == 'O') { //Campos en Obras
                                //opciones modalidad de contratacin
                                $arrayModalidadesContratacion = [
                                    'POR CONTRATO' => 'Por contrato',
                                    'POR ADMINISTRACIN DIRECTA' => 'Por administracin directa',
                                ];
                                $modalidadDeContratacion = mb_strtoupper($cmb['modalidad_de_contratacion_por_contrato_o_por_administracion_directa']);
                                if (!array_key_exists($modalidadDeContratacion, $arrayModalidadesContratacion)) { //Verifica si no existe la clave en el array
                                    $this->exceptionModoAdd1($this->mensajeException = 'Verifique que la MODALIDAD DE CONTRATACIN sea:
                                        POR CONTRATO o POR ADMINISTRACIN DIRECTA');
                                } else { //Si encontr el valor en el array, por lo que asigna el valor
                                    $arr_row_cmb['modalidad_contratacion'] = $arrayModalidadesContratacion[$modalidadDeContratacion];
                                }

                                $arr_row_cmb['nombre_proyecto'] = $cmb['objeto_del_contrato_o_nombre_del_proyecto'] == "N/A" ? null : $cmb['objeto_del_contrato_o_nombre_del_proyecto'];
                                $arr_row_cmb['periodo_ejecucion_inicio'] = $cmb['periodo_de_ejecucion_inicio_ddmmyyyy'] == "N/A" ? null : $cmb['periodo_de_ejecucion_inicio_ddmmyyyy'];
                                $arr_row_cmb['periodo_ejecucion_fin'] = $cmb['periodo_de_ejecucion_fin_ddmmyyyy'] == "N/A" ? null : $cmb['periodo_de_ejecucion_fin_ddmmyyyy'];
                                $arr_row_cmb['fecha_acta_finiquito'] = $cmb['fecha_de_acta_finiquito_ddmmyyyy'] == "N/A" ? null : $cmb['fecha_de_acta_finiquito_ddmmyyyy'];
                            } else { //Campos en Adquisiciones
                                $arr_row_cmb['objeto_contrato'] = $cmb['objeto_del_contrato'] == "N/A" ? null : $cmb['objeto_del_contrato'];
                                $arr_row_cmb['vigencia_contrato_inicio'] = $cmb['vigencia_del_contrato_inicio_ddmmyyyy'] == "N/A" ? null : $cmb['vigencia_del_contrato_inicio_ddmmyyyy'];
                                $arr_row_cmb['vigencia_contrato_fin'] = $cmb['vigencia_del_contrato_fin_ddmmyyyy'] == "N/A" ? null : $cmb['vigencia_del_contrato_fin_ddmmyyyy'];
                                $arr_row_cmb['tipo_entregable'] = $cmb['tipo_de_entregable_documento_que_acredite_la_entrega'] == "N/A" ? null : $cmb['tipo_de_entregable_documento_que_acredite_la_entrega'];
                            }

                            $id_cmb = 0;
                            try {
                                $id_cmb = DB::table('contratos_modo_basico')->insertGetId($arr_row_cmb);
                                $numContratos += 1;
                            } catch (\Exception $e) {
                                $this->exceptionModoAdd1($e->getMessage());
                            }
                            array_push($arrayNumContratosAnexo0, $numeroContrato);

                            $array_rfc_sondeo = [];
                            $array_rfc_concursantes = [];
                            $this->hojaActual = 1;

                            foreach ($this->lista_rfc_empresas_sondeo_y_concursantes as $j => $resc) {
                                $this->contadorRegistro = $j;

                                //Verificar si existen campos vacios
                                $todosCamposVacios = true;
                                $almenosUnVacio = false;
                                $saltar = true; //evita el primero, pues est vacia la cabecera
                                foreach ($resc as $c => $atributo) { //verificar vacios
                                    if ($saltar) {
                                        $saltar = false;
                                    } else {
                                        if ($atributo) {
                                            $todosCamposVacios = false;
                                        } else {
                                            $almenosUnVacio = true;
                                        }
                                    }
                                }
                                if ($todosCamposVacios) { //saltar registros completamente vacios
                                    continue;
                                }

                                //Validacion de campos
                                if ($modulo == 'O') {
                                    $this->validacionCamposModoAdd1($resc, $modulo, $tituloCabeceraFondo, $modContratacion);
                                } else {
                                    $this->validacionCamposModoAdd1($resc, $modulo, $tituloCabeceraFondo, "");
                                }

                                $numContratoHoja = $modulo == 'O' ? $resc['num_contrato_o_acuerdo_de_obra'] : $resc['num_contrato'];
                                array_push($arrayNumContratosAnexo1, $numContratoHoja);
                                if ($numeroContrato == $numContratoHoja) {

                                    //Para rfc_de_empresas_en_sondeo_de_mercado
                                    //Objeto
                                    $arr_row_res = [];
                                    $arr_row_res['id_contrato'] = $id_cmb;
                                    if ($resc['rfc_de_empresas_en_sondeo_de_mercado'] == "N/A") { //valida si hay "N/A"
                                        //en este caso no se guarda pues el rfc no aplica
                                    } elseif (preg_match($patternRFC, $resc['rfc_de_empresas_en_sondeo_de_mercado'])) { //Validar RFC
                                        $arr_row_res['rfc'] = $resc['rfc_de_empresas_en_sondeo_de_mercado'];
                                        $rfc_sondeo['srfcsondeo'] = $arr_row_res['rfc'];
                                        array_push($array_rfc_sondeo, $rfc_sondeo);

                                        try {
                                            $id_res = DB::table('rfc_empresas_sondeo')->insertGetId($arr_row_res);
                                        } catch (\Exception $e) {
                                            $this->exceptionModoAdd1($e->getMessage());
                                        }
                                    } else { //RFC invlido
                                        $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $resc['rfc_de_empresas_en_sondeo_de_mercado'] . '" no es vlido, verifquelo.');
                                    }

                                    //Para rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir
                                    //Objeto
                                    $arr_row_rec = [];
                                    $arr_row_rec['id_contrato'] = $id_cmb;

                                    if ($resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'] == "N/A") { //valida si hay "N/A"
                                        //en este caso no se guarda pues el rfc no aplica
                                    } elseif (preg_match($patternRFC, $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'])) { //Validar RFC
                                        $arr_row_rec['rfc'] = $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'];
                                        $rfc_concursante['srfc'] = $arr_row_rec['rfc'];
                                        array_push($array_rfc_concursantes, $rfc_concursante);

                                        try {
                                            $id_rec = DB::table('rfc_empresas_concursantes')->insertGetId($arr_row_rec);
                                        } catch (\Exception $e) {
                                            $this->exceptionModoAdd1($e->getMessage());
                                        }
                                    } else { //RFC invlido
                                        $this->exceptionModoAdd1($this->mensajeException = 'El RFC "' . $resc['rfc_de_empresas_concursantes_en_caso_de_ser_lp_o_ir'] . '" no es vlido, verifquelo.');
                                    }
                                }
                            }
                            $json_res = sizeof($array_rfc_sondeo) == 0 ? null : json_encode($array_rfc_sondeo);
                            try {
                                $valorCorrecto = $json_res == '[]' ? null : $json_res;
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['rfc_empresas_sondeo' => $valorCorrecto]);
                            } catch (\Exception $e) {
                                $this->exceptionModoAdd1($e->getMessage());
                            }

                            $json_rec = sizeof($array_rfc_concursantes) == 0 ? null : json_encode($array_rfc_concursantes);
                            try {
                                $valorCorrecto = $json_rec == '[]' ? null : $json_rec;
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['rfc_empresas_concursantes' => $valorCorrecto]);
                            } catch (\Exception $e) {
                                $this->exceptionModoAdd1($e->getMessage());
                            }

                            $array_num_factura = [];
                            $array_polizas = [];
                            $this->hojaActual = 2;
                            foreach ($this->lista_num_factura as $l => $nf) {
                                $this->contadorRegistro = $l;

                                //Verificar si existen campos vacios
                                $todosCamposVacios = true;
                                $almenosUnVacio = false;
                                $saltar = true; //evita el primero, pues est vacia la cabecera
                                foreach ($nf as $c => $atributo) { //verificar vacios
                                    if ($saltar) {
                                        $saltar = false;
                                    } else {
                                        if ($atributo) {
                                            $todosCamposVacios = false;
                                        } else {
                                            $almenosUnVacio = true;
                                        }
                                    }
                                }
                                if ($todosCamposVacios) { //saltar registros completamente vacios
                                    continue;
                                }

                                //Validacion de campos
                                if ($modulo == 'O') {
                                    $this->validacionCamposModoAdd1($nf, $modulo, $tituloCabeceraFondo, $modContratacion);
                                } else {
                                    $this->validacionCamposModoAdd1($nf, $modulo, $tituloCabeceraFondo, "");
                                }

                                $numContratoHoja = $modulo == 'O' ? $nf['num_contrato_o_acuerdo_de_obra'] : $nf['num_contrato'];
                                array_push($arrayNumContratosAnexo2, $numContratoHoja);
                                if ($numeroContrato == $numContratoHoja) {
                                    //Objeto poliza
                                    $arr_row_p = [];
                                    $arr_row_p['id_contrato'] = $id_cmb;
                                    $arr_row_p['num_poliza'] = $nf['num_poliza'];
                                    $idPoliza = 0;
                                    $poliza = DB::table('polizas')->where(['id_contrato' => $arr_row_p['id_contrato'], 'num_poliza' => $arr_row_p['num_poliza']])->get();
                                    $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p));

                                    //Objeto factura
                                    $arr_row_nf = [];
                                    $arr_row_nf['id_contrato'] = $id_cmb;
                                    $arr_row_nf['nFactura'] = $nf['num_factura_o_folio_fiscal'] == "N/A" ? null : $nf['num_factura_o_folio_fiscal'];
                                    $arr_row_nf['nMonto'] = $nf['monto_factura_civa_en_pesos'] == "N/A" ? null : $nf['monto_factura_civa_en_pesos'];
                                    $arr_row_nf['idPoliza'] = $idPoliza;
                                    $num_factura_cmb['nFactura'] = '' . $arr_row_nf['nFactura'];
                                    $num_factura_cmb['nMonto'] = '' . $arr_row_nf['nMonto'];
                                    $num_factura_cmb['num_poliza'] = '' . $arr_row_p['num_poliza'];

                                    array_push($array_num_factura, $num_factura_cmb);

                                    try {
                                        $id_nf = DB::table('num_factura')->insertGetId($arr_row_nf);
                                    } catch (\Exception $e) {
                                        $this->exceptionModoAdd1($e->getMessage());
                                    }
                                }
                            }
                            $json_nf = sizeof($array_num_factura) == 0 ? null : json_encode($array_num_factura);
                            try {
                                $valorCorrecto = $json_nf == '[]' ? null : $json_nf;
                                DB::table('contratos_modo_basico')->where('id', $id_cmb)->update(['num_factura' => $valorCorrecto]);
                            } catch (\Exception $e) {
                                $this->exceptionModoAdd1($e->getMessage());
                            }
                        }

                        //validar si los contratos de las hojas anexas estan asociados
                        $this->soloMensajeException = true;
                        $arrayNumContratos0unicos = array_unique($arrayNumContratosAnexo0); //hoja0
                        $arrayNumContratos1unicos = array_unique($arrayNumContratosAnexo1); //hoja1
                        $arrayNumContratos2unicos = array_unique($arrayNumContratosAnexo2); //hoja2
                        /*Valida si existen datos asociados entre hojas de la 0 a la 1 y 2 mediante el nmero de contrato
                        foreach ($arrayNumContratos0unicos as $n => $numContrato) { //numContratos de hoja0 en hoja1 y en hoja2
                            if (!in_array($numContrato, $arrayNumContratos1unicos)) {
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 1) no est asociado a la hoja 2, verifquelo.');
                            }
                            if (!in_array($numContrato, $arrayNumContratos2unicos)) {
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 1) no est asociado a la hoja 3, verifquelo.');
                            }
                        }*/
                        foreach ($arrayNumContratos1unicos as $n => $numContrato) { //numContratos de hoja1 en hoja0
                            if (!in_array($numContrato, $arrayNumContratos0unicos) && $numContrato != "") {
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 2) no est asociado a la hoja 1, verifquelo.');
                            }
                        }
                        foreach ($arrayNumContratos2unicos as $n => $numContrato) { //numContratos de hoja2 en hoja0
                            if (!in_array($numContrato, $arrayNumContratos0unicos) && $numContrato != "") {
                                $this->exceptionModoAdd1($this->mensajeException = 'El nmero de contrato ' . $numContrato . ' (de la hoja 3) no est asociado a la hoja 1, verifquelo.');
                            }
                        }
                        $this->soloMensajeException = false;

                        try {
                            DB::table('contratos_excel_files')->where('id', $id_cef)->update($datos);
                        } catch (\Exception $e) {
                            $this->exceptionModoAdd1($e->getMessage());
                        }
                    } catch (\Exception $e) {
                        $this->exceptionModoAdd1($e->getMessage(), true); //exception externo (tiene try-catch internos)
                    }
                } else {
                    $this->guardado_correcto = false;
                }
                if ($numContratos == 0) {
                    $linkPlantillaCorrecta = '';
                    array_push($this->todosErroresExcelImport, "No se encontraron contratos en el archivo, revise si la plantilla es la correcta. " . $linkPlantillaCorrecta);
                    $this->guardado_correcto = false;
                }

                if ($this->guardado_correcto) {
                    DB::commit();
                    try {
                        Mail::send(new ME($id, date('Y-m-d H:i:s'), $modo, $numContratos, $modulo));
                    } catch (\Throwable $th) {
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['Se guardaron correctamente los contratos, pero el correo electrnico no pudo enviarse.'])->withInput();
                    }
                    return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id);
                } else {
                    DB::rollback();
                    try {
                        unlink($path . $name);
                    } catch (\Exception $e) {
                    }
                    $cantidadErrores = 0;
                    foreach ($this->todosErroresExcelImport as $key => $value) {
                        $cantidadErrores += 1;
                        if (strpos($value, "No se encontraron contratos en el archivo") !== false) {
                            if (count($this->todosErroresExcelImport) != 1) {
                                unset($this->todosErroresExcelImport[$key]);
                            }
                        }
                    }
                    // return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id . '/' . $this->year . '/tipoRegistro')
                    //     ->withErrors([$this->todosErroresExcelImport]);
                }
                break;
            case 2:
                DB::beginTransaction();
                try {
                    $datos = $r->except(['_token', 'none']);
                    $numContratos = sizeof($r->clave_ff);
                    $keys = array_keys($datos);
                    for ($i = 0; $i < count($datos[$keys[0]]); $i++) {
                        $arr_row = [];
                        $arr_row['created_at'] = date('Y-m-d H:i:s');
                        $arr_row['id_usuario'] = Auth::user()->id;
                        $arr_row['tipo_registro'] = 2;
                        $arr_row['modulo'] = $modulo;

                        if (!in_array('numero_contrato', $keys)) {
                            $year = Claves::where('id_ff', $id)->first()->year;
                            $arr_row['numero_contrato'] = libUtilities::consecutivos($id, $year);
                        }
                        $empr_conc = "[]";
                        $empr_sondeo = "[]";
                        $num_fac = "[]";

                        foreach ($keys as $k) {
                            $arr_row[$k] = $datos[$k][$i];
                            if ($k == 'numero_contrato')
                                if ($arr_row['numero_contrato'] == NULL || $arr_row['numero_contrato'] == '')
                                    $arr_row['numero_contrato'] = libUtilities::consecutivos($id, Claves::where('id_ff', $id)->first()->year);

                            if ($k == 'rfc_empresas_concursantes' && $datos[$k][$i] != NULL)
                                $empr_conc = $datos[$k][$i];
                            if ($k == 'rfc_empresas_sondeo' && $datos[$k][$i] != NULL)
                                $empr_sondeo = $datos[$k][$i];
                            if ($k == 'num_factura'  && $datos[$k][$i] != NULL)
                                $num_fac = $datos[$k][$i];
                        }

                        $contrato_id = DB::table('contratos_modo_basico')->insertGetId($arr_row);

                        foreach (json_decode($empr_conc) as $x)
                            DB::table('rfc_empresas_concursantes')->insert(['id_contrato' => $contrato_id, 'rfc' => $x->srfc]);
                        foreach (json_decode($empr_sondeo) as $y)
                            DB::table('rfc_empresas_sondeo')->insert(['id_contrato' => $contrato_id, 'rfc' => $y->srfcsondeo]);
                        foreach (json_decode($num_fac) as $z) {
                            $arr_row_p = [];
                            $arr_row_p['id_contrato'] = $contrato_id;
                            $arr_row_p['num_poliza'] = $z->num_poliza;
                            $idPoliza = 0;
                            $poliza = DB::table('polizas')->where(['id_contrato' => $contrato_id, 'num_poliza' => $z->num_poliza])->get();
                            $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p));
                            DB::table('num_factura')->insert(['id_contrato' => $contrato_id, 'nFactura' => $z->nFactura, 'nMonto' => $z->nMonto, 'idPoliza' => $idPoliza]);
                        }
                    }
                    DB::commit();
                    try {
                        Mail::send(new ME($id, date('Y-m-d H:i:s'), $modo, $numContratos, $modulo));
                    } catch (\Throwable $th) {
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['Se guard correctamente, pero el correo electrnico no pudo enviarse.'])->withInput();
                    }
                    return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id);
                } catch (\Exception $e) {
                    DB::rollback();
                    $error = $e->getMessage();
                    if (strpos($error, "Duplicate entry ") !== false && strpos($error, " for key 'numero_contrato'") !== false) { //Num. contrato duplicado
                        return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $id)->withErrors(['El nmero de contrato est duplicado.'])->withInput();
                    }
                }
                break;
        }
    }

    public function guardarAdqObras($modulo, $id_ff, $correo_contacto, $url_archivo)
    {
        $mensajeError = '';
        $hayProblemaEmail = false;
        DB::Begintransaction();
        try {
            foreach ($this->lista_anexo_regs[1] as $kreg => $reg) {
                $arrayc_s = [];
                $arrayc_ec = [];
                $arrayHoja3 = [];
                $obj = new cmb();
                foreach ($reg as $kattr => $attr) {
                    switch ($kattr) { //['regsH2', 'regsH3'] son registros de hojas asociadas
                        case 'regsH2': //regs de la hoja 2
                            if (array_key_exists("rfc_empresas_sondeo", $attr)) {
                                $aRFC = [];
                                foreach ($attr['rfc_empresas_sondeo'] as $res => $celdasrfc) {
                                    $vRfc = $celdasrfc[0]; // para acceder al unico array de valores del RFC
                                    $aRFC[] = ['srfcsondeo' => $res];
                                    $arrayc_s[] = new RES(['rfc' => $res, 'empresa' => $vRfc['nombre']]);
                                }
                                $obj['rfc_empresas_sondeo'] = json_encode($aRFC);
                            }
                            if (array_key_exists("rfc_empresas_concursantes", $attr)) {
                                $aRFC = [];
                                foreach ($attr['rfc_empresas_concursantes'] as $rec => $celdasrfc) {
                                    $vRfc = $celdasrfc[0]; // para acceder al unico array de valores del RFC
                                    $aRFC[] = ['srfc' => $rec];
                                    $arrayc_ec[] = new REC(['rfc' => $rec, 'empresa' => $vRfc['nombre']]);
                                }
                                $obj['rfc_empresas_concursantes'] = json_encode($aRFC);
                            }
                            break;
                        case 'regsH3': // regs de la hoja 3
                            $aFacturas = [];
                            foreach ($attr as $krh3 => $rh3) { //registro de la hoja 3
                                $oFactura = [];
                                $oFactura['nFactura'] =   $rh3['nFactura'];
                                $oFactura['nMonto'] =     $rh3['nMonto'];
                                if (array_key_exists("num_poliza", $rh3)) {
                                    $oFactura['num_poliza'] = $rh3['num_poliza'];
                                }
                                $aFacturas[] = $oFactura;
                                $arrayHoja3[] = $oFactura;
                            }
                            $obj['num_factura'] = json_encode($aFacturas);
                            break;

                        default: //regs de la hoja 1
                            $obj[$kattr] = $attr;
                            break;
                    }
                } //posteriormente attrs extras de la tabla bd
                $obj['id_ff'] = $id_ff;
                $obj['id_usuario'] = Auth::user()->id;
                $obj['clave_ff'] = $this->idCcpAnexo;
                $obj['tipo_registro'] = 1;
                $obj['modulo'] = $modulo;
                $obj['status'] = 1;

                $obj->save();

                if (sizeof($arrayc_s)) {
                    $obj->c_s()->saveMany($arrayc_s);
                }
                if (sizeof($arrayc_ec)) {
                    $obj->c_ec()->saveMany($arrayc_ec);
                }
                foreach ($arrayHoja3 as $krh3 => $rh3) { //registro hoja 3
                    if (array_key_exists('num_poliza', $rh3)) {
                        $oPoliza = new P(['num_poliza' => $rh3['num_poliza']]);
                        $obj->c_polizas()->save($oPoliza);
                        $oNumFactura = new NF(['nFactura' => $rh3['nFactura'], 'nMonto' => $rh3['nMonto'], 'idPoliza' => $oPoliza['id']]);
                    } else {
                        $oNumFactura = new NF(['nFactura' => $rh3['nFactura'], 'nMonto' => $rh3['nMonto']]);
                    }
                    $obj->c_nf()->save($oNumFactura);
                }
            }
            DB::table('contratos_excel_files')->insert([
                'modulo' => $modulo,
                'url_archivo' => $url_archivo,
                'hash_archivo' => hash_file('sha256', public_path() . $url_archivo),
                'correo_contacto' => $correo_contacto,
                'id_ff' => $id_ff,
                'id_usuario' => Auth::user()->id,
            ]);
            Claves::where('id_ff', $id_ff)->update([($modulo == 'O' ? 'estatus_anexo_obras' : 'estatus_anexo_adq') => 1]);
            //try {
            //    Mail::send(new ME($id_ff, date('Y-m-d H:i:s'), 1, sizeof($this->lista_anexo_regs[1]), $modulo));
            //} catch (\Throwable $th) {
            //    $hayProblemaEmail = true;
            //}
            $hayProblemaEmail = false;
        } catch (\Exception $e) {
            $mensajeError = 'No se pudo guardar ' . LU::t_tr('d', 'anexo', 's') . ', contacte con soporte tcnico' . $e->getMessage();
        }
        if ($mensajeError != '') { //caso con errores
            DB::rollback();
            $this->todosErroresExcelImport['Analizado. '][$mensajeError] = [];
        } else { //caso correcto
            DB::commit();
        }
        return $hayProblemaEmail;
    }

    // Actualizar contratos
    public function modoUpdate(Request $r, $modo, $modulo, $id)
    {
        $editar = $r->editar;
        $data = $r->except(['_token', '_method', 'editar', 'none']);
        $data['modulo'] = $modulo;
        $data['tipo_registro'] = $modo;
        $data['id_usuario'] = Auth::user()->id;
        $clave = DB::table('contratos_modo_basico')->where('id', $id)->first()->id_ff;

        $update = DB::table('contratos_modo_basico')->where('id', $id)->update($data);

        // Limpieza de tablas de relacin
        DB::table('num_factura')->where('id_contrato', $id)->delete();
        DB::table('polizas')->where('id_contrato', $id)->delete();
        DB::table('rfc_empresas_concursantes')->where('id_contrato', $id)->delete();
        DB::table('rfc_empresas_sondeo')->where('id_contrato', $id)->delete();

        // Creacin de nuevos registros en tablas de relacin
        if ($r->rfc_empresas_concursantes != '')
            foreach (json_decode($r->rfc_empresas_concursantes) as $x)
                DB::table('rfc_empresas_concursantes')->insert(['id_contrato' => $id, 'rfc' => $x->srfc]);
        if ($r->rfc_empresas_sondeo != '')
            foreach (json_decode($r->rfc_empresas_sondeo) as $y)
                DB::table('rfc_empresas_sondeo')->insert(['id_contrato' => $id, 'rfc' => $y->srfcsondeo]);
        if ($r->num_factura != '')
            foreach (json_decode($r->num_factura) as $z) {
                $arr_row_p = [];
                $arr_row_p['id_contrato'] = $id;
                $arr_row_p['num_poliza'] = $z->num_poliza;
                $idPoliza = 0;
                $poliza = DB::table('polizas')->where(['id_contrato' => $id, 'num_poliza' => $z->num_poliza])->get();
                $idPoliza = (count($poliza) > 0 ? $poliza[0]->id : DB::table('polizas')->insertGetId($arr_row_p));
                DB::table('num_factura')->insert(['id_contrato' => $id, 'nFactura' => $z->nFactura, 'nMonto' => $z->nMonto, 'idPoliza' => $idPoliza]);
            }


        if ($update) {
            if ($editar == 'si')
                return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $clave);
            else
                return response()->json('OK', 200);
        } else {
            if ($editar == 'si')
                return \Redirect::to('/layouts/contratos/' . $modulo . '/' . $clave);
            else
                return response()->json('NO', 200);
        }
    }

    // Eliminar contratos
    public function modoDelete(Request $r, $modo, $modulo, $id)
    {
        $delete = DB::table('contratos_modo_basico')->where('id', $id)->delete();

        DB::table('num_factura')->where('id_contrato', '$id')->delete();
        DB::table('rfc_empresas_concursantes')->where('id_contrato', '$id')->delete();
        DB::table('rfc_empresas_sondeo')->where('id_contrato', '$id')->delete();

        if ($delete) {
            return response()->json('OK', 200);
        } else {
            return response()->json('NO', 200);
        }
    }




    /******************************************************/
    /*        DESCARGA DE PLANTILLAS PARA LAYOUTS         */
    /******************************************************/
    public function downloadTemplate(Request $r, $modulo)
    {
        $ruta = '';
        $nombre = '';

        switch ($modulo) {
            case 'A':
                $ruta = '/templates/template_adquisiciones.xlsx';
                $nombre = 'plantilla_adquisiciones.xlsx';
                break;
            case 'O':
                $ruta = '/templates/template_obras.xlsx';
                $nombre = 'plantilla_obras.xlsx';
                break;
        }
        return Storage::disk('downloads')->download($ruta, $nombre);
    }

    public function saveTesofe(Request $r)
    {
        $row = Claves::where('id_ff', $r->id)->first();
        $row->reintegro_tesofe = $r->tesofe;
        DB::beginTransaction();
        try {
            $row->save();
            DB::commit();
            return response()->json('OK', 200);
        } catch (\Exception $e) {
            DB::rollback();
            $error = $e->getMessage();
            return response()->json('NO', 200);
        }
    }

    // Eliminar clave FF - fondo

    public function eliminarFondo(Request $r, $idClaveFF)
    {
        $data = [];
        $mensajeDeErrorGlobal = '';
        $claveFF = Claves::find($idClaveFF);
        if ($claveFF == null) {
            $mensajeDeErrorGlobal = 'No se puede eliminar ' . LU::t_tr('d', 'fondo', 's') . ', ya que no existe en el sistema.';
        } else {
            $estatusExistentes = '';
            DB::beginTransaction();
            try {
                //paraEstatusAnexos
                $archivoEstatus = $claveFF->estatus_archivo;
                $estatusAnexoAdq = $claveFF->estatus_anexo_adq;
                $estatusAnexoObras = $claveFF->estatus_anexo_obras;
                $estatusAnexoEgresos = $claveFF->estatus_anexo_egresos;
                $estatusAnexoNomina = $claveFF->estatus_anexo_nomina;
                $estatusAnexoC4K = $claveFF->estatus_anexo_c4k;
                //paraEstatusAnexos
                if (!in_array($archivoEstatus, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' GD (Gastos Diversos) es: ' . $this->estatusAnexoArchivo($archivoEstatus) . "\n";
                }
                if (!in_array($estatusAnexoAdq, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Adquisiciones es: ' . $this->estatusAnexoArchivo($estatusAnexoAdq) . "\n";
                }
                if (!in_array($estatusAnexoObras, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Obras Pblicas es: ' . $this->estatusAnexoArchivo($estatusAnexoObras) . "\n";
                }
                if (!in_array($estatusAnexoEgresos, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Egresos es: ' . $this->estatusAnexoArchivo($estatusAnexoEgresos) . "\n";
                }
                if (!in_array($estatusAnexoNomina, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Nmina es: ' . $this->estatusAnexoArchivo($estatusAnexoNomina) . "\n";
                }
                if (!in_array($estatusAnexoC4K, [0, 5])) {
                    $estatusExistentes .= '-El estatus de ' . LU::t_tr('d', 'anexo', 's') . ' Cap. 4000 es: ' . $this->estatusAnexoArchivo($estatusAnexoC4K) . "\n";
                }
                if ($estatusExistentes == '') {
                    try {
                        $claveFF->delete();
                        if (isset($r->id_fondo_dependencia)) {
                            $fondoDependencia = FD::find($r->id_fondo_dependencia);
                            try {
                                $fondoDependencia->delete();
                            } catch (\Throwable $th) {
                                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . '. Contacte a soporte tcnico.';
                            }
                        }
                    } catch (\Exception $e) {
                        $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar' . LU::t_tr('d', 'fondo', 's') . 'Contacte a servicio tcnico.' . $e->getMessage();
                    }
                } else {
                    $mensajeDeErrorGlobal = "Solo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " si sus " . LU::t_tr('v', 'anexo', 'p') . " se encuentran en estatus 'Sin cargar' o 'No aplica'.\n\nNo se puede eliminar " . LU::t_tr('d', 'fondo', 's') . " debido a que: \n" . $estatusExistentes;
                }
            } catch (\Exception $e) {
                $mensajeDeErrorGlobal = 'Ocurri un error al intentar eliminar ' . LU::t_tr('d', 'fondo', 's') . ' solicitado. Contacte a servicio tcnico' . $e->getMessage();
            }
        }

        if ($mensajeDeErrorGlobal != '') {
            DB::rollback();
        } else {
            DB::commit();
        }

        $data['errores'] = $mensajeDeErrorGlobal;
        return $data;
    }

    //ejecutores
    public function estatusAnexoArchivo($estatus, $tipoUsuario = 4) //tipo de usuario que solicita, por ejemplo el 4 (por defecto) es ejecutor, el 8 y 9 son de finanzas
    {
        $estatusReal = '';
        switch ($estatus) {
            case 0:
                $estatusReal = 'An sin cargar';
                break;
            case 1:
                $estatusReal = 'Cargado sin enviar';
                break;
            case 2:
                $estatusReal = 'Enviado ' . LU::t_tr('a_d', 'enlace', 's');
                break;
            case 3:
                $estatusReal = 'Enviado a ' . LU::t_tr('d', 'asf', 's');
                break;
            case 4:
                switch ($tipoUsuario) {
                    case 4:
                        $estatusReal = 'Regresado al ' . LU::t_tr('v', 'ejecutor', 's');
                        break;
                    case 8:
                    case 9:
                        $estatusReal = 'Regresado a finanzas';
                        break;

                    default:
                        alertaErrorIndefinido(); //para el desarrollo
                        break;
                }
                break;
            case 5:
                $estatusReal = 'No aplica';
                break;
            default:
                $estatusReal = '';
                break;
        }
        return $estatusReal;
    }

    public function getAlertas(Request $request)
    {

        $fechaActual = carbon::now()->startOfDay();
        $query  = DB::table('catalogo_numeros_auditoria as cna')
            ->join('estados as e', 'e.id', '=', 'cna.id_estado')
            ->join('municipios as m', 'm.id', '=', 'cna.id_municipio')
            ->select(
                'cna.numeroAuditoria',
                'cna.year',
                'cna.fecha_cierre',
                'e.estado',
                'm.municipio',
                'm.id as id_municipio'
            )->orderBy('cna.fecha_cierre', 'asc');

        switch ($request->type) {
            case 1: //main tiene todas las alertas 
            case 11:
                //sin lmites
                $query = $query->get();
                break;
            case 4: //ejecutor
            case 8: //finanzas estatal 
            case 9: //finanzas municipal
            case 10: // enlace AE
                // lmite el rea ejecutora
                $query = $query->where('cna.id_estado', Auth::user()->u_d->id_estado)
                    ->where('cna.id_municipio', Auth::user()->u_d->id_municipio)
                    ->get();
                break;
            case 3: //enlace estatal , 
            case 7: //enlace miunicipal
                // lmite su propio estado y municipio
                $query = $query->where('cna.id_estado', Auth::user()->id_estado)
                    ->where('cna.id_municipio', Auth::user()->id_municipio)
                    ->get();
                break;
            case 5: // auditor
            case 6: //Auditor financiero
                //lmite son los numeros de auditoria asociados al usuario
                $query  = $query->join('num_auditorias_de_usuario as nau', 'nau.id_num_auditoria', '=', 'cna.id')
                    ->where('nau.id_usuario', Auth::user()->id)->get();
                break;
            default:
                paraProgramacionPreventiva(); //para el desarrollo
                break;
        }
        $alerts['active'] = $query->where('fecha_cierre', '>=', $fechaActual);
        $alerts['noDate'] = $query->where('fecha_cierre', null);
        $alerts['close'] = $query->where('fecha_cierre', '<', $fechaActual);

        return response()->json($alerts);
    }
}

Function Calls

None

Variables

None

Stats

MD5 58c8af5896cb1f97fbd43165dfc792d8
Eval Count 0
Decode Time 454 ms