<?php

namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Http\Request;

use Oriceon\PdfMerger\Facades\PdfMerger;

use DB;

class LEDDocs extends Controller {
	public static function dagasBackend() {
		return view('/led/carga_documentacion/panel_dagas');
	}

	public static function rechazadosBackend(){
		return view('/led/carga_documentacion/panel_rechazados');
	}

	public static function documentosBackendPendientes() {
		//$docs = SQLConnection::backendStoreProcedure('LN_docs_backend', array('documentos'), 'select');
		$docs = SQLConnection::backendStoreProcedure('LN_docs_backend', array('documentos', NULL, 'N', NULL, NULL, NULL, NULL, env('PLATAFORMA')), 'select');
		//
		$data = [];
		$paises = [];
		foreach ($docs as $k => $item) {
			$item->acciones = '<button type="button" class="btn btn-primary btn-fidelitas detalle" data-doc-id="' . $item->doc_id . '" data-contraparte="' . $item->contraparte . '" >Detalles</button>';
			$item->icono_pais = '<span class="flag-icon flag-icon-' . strtolower($item->country_code) . '"></span>';
			$data[$k] = $item;
			$paises[$item->country_code] = $item->country_name;
		}
		return json_encode(array('data' => $data, 'country' => $paises));
	}

	public static function documentosBackendRechazados() { 
		$docs = SQLConnection::backendStoreProcedure('LN_docs_backend', array('documentos', NULL, 'R', NULL, NULL, NULL, NULL, env('PLATAFORMA')), 'select');
		$data = [];
		$paises = [];
		foreach ($docs as $k => $item) {
			$item->acciones = '<button type="button" class="btn btn-primary btn-fidelitas detalle" data-doc-id="' . $item->doc_id . '" data-contraparte="' . $item->contraparte . '" >Detalles</button>';
			$item->icono_pais = '<span class="flag-icon flag-icon-' . strtolower($item->country_code) . '"></span>';
			$data[$k] = $item;
			$paises[$item->country_code] = $item->country_name;
		}
		return json_encode(array('data' => $data, 'country' => $paises));
	}

	// Trae los campos del documento
	public static function documentosBackendDetalleDoc(Request $req) {
		$doc_id = $req->doc_id;
		$integ_carga = $req->integ_carga;
		$integ_verif = $req->integ_verif;
		$integ_rech = $req->integ_rech;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

		$tipo_doc = $doc->tipo_doc;
		if ($doc->es_balance == 1) {
			// Carga de documento Balance - Campos fijos
			$file_exists = false;
			$file_path = null;
			$file_url = null;
			if (!empty($doc->ruta_archivo) && !empty($doc->id_externo)) {
				$file_path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
				$file_url = env('RUTA_COMPARTIDO') . $doc->ruta_archivo;
				;
				$file_exists = file_exists($file_path);
			}

			$monedas = SQLConnection::backendStoreProcedure('obtener_Monedas', array(), 'select');

			return view('/led/carga_documentacion_balance')->with(compact(['doc', 'monedas', 'file_path', 'file_url', 'file_exists']));
		} else {

			/* Información de los campos del documento */
			$flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
			$secciones = [];

			$hay_campos = false;
			$hay_archivo = false;
			foreach ($flds as $fld) {
				$hay_campos = !$hay_campos ? ($fld->tipo_campo != 'F' ? true : $hay_campos) : $hay_campos;
				$hay_archivo = !$hay_archivo ? ($fld->tipo_campo == 'F' ? true : $hay_archivo) : $hay_archivo;
			}

			$data = [];
			foreach ($flds as $k => $fld) {

				if ($fld->tipo_campo == 'G') {
					/* encabezados de la tabla */
					$c1 = SQLConnection::backendStoreProcedure('LN_campos_col_', array('search', $fld->campo, null, null, NULL, NULL, NULL, NULL), 'select');
					$cols = [];
					foreach ($c1 as $clm) {
						$cols[] = $clm->etiqueta;
					}

					/* configuración de los campos y valores de la tabla */
					$c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
					$valores = [];
					foreach ($c2 as $k1 => $valor) {
						$valores[$valor->fila][$valor->col]['valor_texto'] = $valor->valor_texto;
						$valores[$valor->fila][$valor->col]['valor_fecha'] = $valor->valor_fecha;
						$valores[$valor->fila][$valor->col]['valor_fecha_str'] = $valor->valor_fecha_str;
						$valores[$valor->fila][$valor->col]['valor_numerico'] = $valor->valor_numerico;
						$valores[$valor->fila][$valor->col]['tipo_campo'] = $valor->tipo_campo;
						$valores[$valor->fila][$valor->col]['longitud'] = $valor->longitud;
						$valores[$valor->fila][$valor->col]['decimales'] = $valor->decimales;

						//$valores[$valor->fila][$valor->col]['opciones'] = $valor->opciones;

						if ($valor->tipo_campo == 'S' || $valor->tipo_campo == 'R' || $valor->tipo_campo == 'C') {

							if (strlen($valor->opciones) > 0) {
								$r = explode("^", $valor->opciones);
								$txt = [];
								$val = [];
								if (sizeof($r) >= 2) {
									$txt = explode("|", $r[0]);
									$val = explode("|", $r[1]);
								}
								$valores[$valor->fila][$valor->col]['opciones']['txt'] = $txt;
								$valores[$valor->fila][$valor->col]['opciones']['val'] = $val;
							}

						}
					}

					$fld->headers = $cols;
					$fld->values = $valores;
				} else {

					/* campo no tabla */

					if ($fld->tipo_campo == 'S' || $fld->tipo_campo == 'R' || $fld->tipo_campo == 'C') {

						$valores = [];

						if (strlen($fld->opciones) > 0) {
							$r = explode("^", $fld->opciones);
							$txt = [];
							$val = [];
							if (sizeof($r) >= 2) {
								$txt = explode("|", $r[0]);
								$val = explode("|", $r[1]);
							}
							$valores[] = $txt;
							$valores[] = $val;
						}

						$fld->opciones = $valores;

					} elseif ($fld->tipo_campo == 'F' && $fld->tipo_attach != 'P') {
						// MODIFICADO PARA LED , PARA QUE SIEMPRE SUBAN PDF
						$fld->tipo_attach = 'P';
					}



				}

				$data[$fld->titulo_seccion][] = $fld;

				if ($fld->titulo_seccion != '') {
					$secciones[$fld->titulo_seccion]['texto_bajada'] = $fld->texto_bajada;
					$secciones[$fld->titulo_seccion]['texto_pie'] = $fld->texto_pie;
				}
			}
			/* Fin información de los campos del documento */


			/* Archivo adjunto */
			if ($doc->es_balance > 0) {
				$file_path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
				$file_url = env('RUTA_COMPARTIDO') . $doc->ruta_archivo;
				;
			} else {
				$file_path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
				$file_url = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
			}
			$file_exists = file_exists($file_path);

			return view('/led/carga_documentacion_detalle')->with(compact(['doc','tipo_doc', 'secciones', 'data', 'file_exists', 'file_path', 'file_url', 'integ_carga', 'integ_verif', 'integ_rech']));

		}

	}

	// guardar datos del documento
	public static function documentosBackendGuardar(Request $req) {
		$result = 0;
		$message = 'Los datos del documento fueron guardados correctamente.';


		$doc_id = $req->doc_id;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');
		// AGREGADO PARA CASOS DE DEPENDENCIA
		$dep_doc = SQLConnection::backendStoreProcedure('LN_docs_AGB', array('SELECT', $doc_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
		/* Información de los campos del documento */
		//$flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
		$flds = [];
		foreach ($dep_doc as $doce) {
			$doce_flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doce->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
			foreach ($doce_flds as $doce_fld) {
				array_push($flds, $doce_fld);
			}
		}

		// Variables para agregar nuevo domicilio
		$dom_domicilio = null;
		$dom_taxid = null;
		$dom_altura = null;
		$dom_piso = null;
		$dom_depto = null;
		$dom_localidad = null;
		$dom_provincia = null;
		$dom_cod_pos = null;
		//
		foreach ($flds as $h => $fld) {
			if ($fld->tipo_campo != 'G') {
				// Analizamos si son campos de domicilio, comparamos con los domicilios conocidos, si no existe se agrega a la lista como tipo G
				if ($fld->nombre_campo == 'domicilio' || $fld->nombre_campo == 'domnumeracion' || $fld->nombre_campo == 'dompiso' || $fld->nombre_campo == 'Localidad' || $fld->nombre_campo == 'Provincia' || $fld->nombre_campo == 'codigo_postal') {
					if ($fld->nombre_campo == 'domicilio') {
						if ($fld->valor_texto != null) {
							$dom_domicilio = $fld->valor_texto;
							$dom_taxid = $fld->numero;
						}
					} else if ($fld->nombre_campo == 'domnumeracion') {
						if ($fld->valor_texto != null) {
							$dom_altura = $fld->valor_texto;
						}
					} else if ($fld->nombre_campo == 'dompiso') {
						if ($fld->valor_texto != null) {
							if (isset(explode(',', $fld->valor_texto)[1])) {
								$dom_piso = trim(explode(',', $fld->valor_texto)[0]);
								$dom_depto = trim(explode(',', $fld->valor_texto)[1]);
							}
						}
					} else if ($fld->nombre_campo == 'Localidad') {
						if ($fld->valor_texto != null) {
							$dom_localidad = $fld->valor_texto;
						}
					} else if ($fld->nombre_campo == 'Provincia') {
						if ($fld->valor_texto != null) {
							$dom_provincia = $fld->valor_texto;
						}
					} else if ($fld->nombre_campo == 'codigo_postal') {
						if ($fld->valor_texto != null) {
							$dom_cod_pos = $fld->valor_texto;
						}
					}
				}
				// Analizamos por separado campos texto, numérico, fecha y select de opciones de los radio y checkboxes o si/no
				if ($fld->tipo_campo == 'N' || $fld->tipo_campo == 'T' || $fld->tipo_campo == 'D' || $fld->tipo_campo == 'M' || $fld->tipo_campo == 'S') {

					$vf = ($fld->tipo_campo == 'D') ? (null != $req->{$fld->FORM_NAME} ? date_create_from_format('d/m/Y', $req->{$fld->FORM_NAME}) : null) : null;
					$vt = ($fld->tipo_campo == 'T' || $fld->tipo_campo == 'M' || $fld->tipo_campo == 'S') ? $req->{$fld->FORM_NAME} : null;
					$vn = ($fld->tipo_campo == 'N') ? str_replace(",", ".", $req->{$fld->FORM_NAME}) : null;
				}

				if ($fld->tipo_campo == 'B') {
					$vf = null;
					$vt = null;
					$vn = null;
					if (null !== $req->{$fld->FORM_NAME}) {
						$vn = $req->{$fld->FORM_NAME};
					}
				}

				if ($fld->tipo_campo == 'R') {
					$vf = null;
					$vt = null;
					$vn = null;
					if (null !== $req->{$fld->FORM_NAME}) {
						$vt = $req->{$fld->FORM_NAME};
					}
				}

				if ($fld->tipo_campo == 'C') {
					$vf = null;
					$vt = null;
					$vn = null;
					if (null !== $req->{$fld->FORM_NAME}) {
						$vt = implode(",", $req->{$fld->FORM_NAME});
					}

				}

				if ($fld->tipo_campo != 'F' && $fld->tipo_campo != 'L') {
					$temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $vf, $vt, $vn, null, null, null), 'selectOne');
					// dd('update', $fld->doc_id, $fld->seccion, $fld->campo, $vf, $vt, $vn, null, null, null);
				}
			} else {
				/* tabla */
				for ($c = 1; $c <= $fld->columnas; $c++) {
					//
					$espec = SQLConnection::backendStoreProcedure('LN_campos_col_', array('select', $fld->campo, $c, null, null, null, null, null), 'selectOne');
					//
					for ($f = 1; $f <= $fld->filas; $f++) {
						$fname = 'campo_' . $fld->seccion . '_' . $fld->campo . '_' . $f . '_' . $c;
						// Analizamos por separado campos texto, numérico, fecha y select de opciones de los radio y checkboxes o si/no
						if ($espec->tipo_campo == 'N' || $espec->tipo_campo == 'T' || $espec->tipo_campo == 'D' || $espec->tipo_campo == 'M' || $espec->tipo_campo == 'S') {

							$vf = ($espec->tipo_campo == 'D') ? (null != $req->{$fname} ? date_create_from_format('d/m/Y', $req->{$fname}) : null) : null;
							$vt = ($espec->tipo_campo == 'T' || $espec->tipo_campo == 'M' || $espec->tipo_campo == 'S') ? $req->{$fname} : null;
							$vn = ($espec->tipo_campo == 'N') ? str_replace(",", ".", $req->{$fname}) : null;

						}
						//
						if ($espec->tipo_campo == 'B') {
							$vf = null;
							$vt = null;
							$vn = null;
							if (null !== $req->{$fname}) {
								$vn = $req->{$fname};
							}
						}
						//
						if ($espec->tipo_campo == 'R') {
							$vf = null;
							$vt = null;
							$vn = null;
							if (null !== $req->{$fname}) {
								$vt = $req->{$fname};
							}
						}
						//
						if ($espec->tipo_campo == 'C') {
							$vf = null;
							$vt = null;
							$vn = null;
							if (null !== $req->{$fname}) {
								$vt = implode(",", $req->{$fname});
							}
						}
						//
						if ($espec->tipo_campo == 'F') {
							// si el campo esta cargado
							if (isset($_FILES[$fname])) {
								$tiene_archivo++;
								//
								if (!file_exists(env('PATH_DOCUMENTOS') . '/' . $doc->cliente)) {
									mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente);
								}
								//
								if (!file_exists(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte)) {
									mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte);
								}
								//
								if (!file_exists(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion)) {
									mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion);
								}
								//
								if (!file_exists(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id)) {
									mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id);
								}
								//
								if (!file_exists(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo)) {
									mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo);
								}
								// las imagenes cargadas se unen en un PDF
								if ($espec->multiple && is_array($_FILES[$fname]['size'])) {
									// si es una lista de archivos
									$path_file_row_pdf = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $f . '.pdf';
									$joinedpdf = PdfMerger::init();
									$files_uploaded = false;
									//
									$cant_archivos = count($_FILES[$fname]['size']);
									if ($cant_archivos && !empty($_FILES[$fname]['tmp_name'][0])) {
										$i = 0;
										while ($i < $cant_archivos) {
											//
											$path_file_row_i = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . DIRECTORY_SEPARATOR . $doc->doc_id . DIRECTORY_SEPARATOR . $fld->campo . DIRECTORY_SEPARATOR . $f . '_' . $i . '.png';
											$path_file_row_pdf_i = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . DIRECTORY_SEPARATOR . $doc->doc_id . DIRECTORY_SEPARATOR . $fld->campo . DIRECTORY_SEPARATOR . $f . '_' . $i . '.pdf';
											$path_file_row_html_i = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . DIRECTORY_SEPARATOR . $doc->doc_id . DIRECTORY_SEPARATOR . $fld->campo . DIRECTORY_SEPARATOR . $f . '_' . $i . '.html';
											//
											if (file_exists($path_file_row_i)) {
												unlink($path_file_row_i);
											}
											//
											if (file_exists($path_file_row_pdf_i)) {
												unlink($path_file_row_pdf_i);
											}
											//
											if (file_exists($path_file_row_html_i)) {
												unlink($path_file_row_html_i);
											}
											//
											if ($_FILES[$fname]['size'][$i] != 0 && preg_match('/image/', $_FILES[$fname]['type'][$i])) {
												if (move_uploaded_file($_FILES[$fname]['tmp_name'][$i], $path_file_row_i)) {
													self::imgToPDF($path_file_row_i, $path_file_row_html_i, $path_file_row_pdf_i);
													//
													$joinedpdf->addPDF($path_file_row_pdf_i, 'all');
												}
											}
											//
											$i++;
										}
										//
										if (file_exists($path_file_row_pdf)) {
											unlink($path_file_row_pdf);
										}
										// se hace el merge
										$joinedpdf->merge('file');
										$joinedpdf->save($path_file_row_pdf);
										//
										$i--;
										while ($i >= 0) {
											$path_file_row_pdf_i = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $f . '_' . $i . '.pdf';
											//
											if (file_exists($path_file_row_pdf_i)) {
												unlink($path_file_row_pdf_i);
											}
											//
											$i--;
										}
									}
								} else {
									// si es un archivo nada mas
									$path_file_row = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $f . '_' . $c . '.png';
									$path_file_row_pdf = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $f . '_' . $c . '.pdf';
									$path_file_row_html = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $f . '_' . $c . '.html';
									//
									if (file_exists($path_file_row)) {
										unlink($path_file_row);
									}
									//
									if ($_FILES[$fname]['size'] != 0 && preg_match('/image/', $_FILES[$fname]['type'])) {
										if (move_uploaded_file($_FILES[$fname]['tmp_name'], $path_file_row)) {
											if ($espec->tipo_archivo == 'I') {

											} else {
												self::imgToPDF($path_file_row, $path_file_row_html, $path_file_row_pdf);
											}
										}
									}
								}
							}
						}
						//
						$temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $vf, $vt, $vn, $f, $c, null), 'selectOne');
					}
				}
			}
		}
		// Si tiene datos nuevos de direccion, agrega a la lista de domicilios
		if (!empty($dom_domicilio)) {
			Misc::addDomicilio($dom_taxid, $dom_domicilio, $dom_altura, $dom_piso, $dom_depto, $dom_localidad, $dom_provincia, $dom_cod_pos, 1);
		}

		return json_encode(array('result' => $result, 'message' => $message));

	}

	public static function documentosDescartarConfirm(Request $req) {
		$doc_id = $req->doc_id;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

		$integ_carga = $req->integ_carga;
		$integ_verif = $req->integ_verif;
		$integ_rech = $req->integ_rech;
		$de_informe_tareas = isset($_POST['de_informe_tareas']) ? $req->de_informe_tareas : null;
		$doc_int = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
		$temp = Misc::integridadDocStore($doc_int, 0, $integ_carga, $integ_verif, $integ_rech, 1);
		return view('/led/carga_documentacion_descartar_confirm')->with(compact(['doc', 'de_informe_tareas']));
	}

	public static function documentosDescartarDoc(Request $req) {
		$doc_id = $req->doc_id;
		$temp = SQLConnection::backendStoreProcedure('LN_docs_backend', array('no_aplica', $doc_id, NULL, Session::get('usuario')->user_id), 'selectOne'); /* da respuesta null y genera el no aplica */
		$doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
		$temp = Misc::integridadDocStore($doc, 3, 0, 0, 0, 1);
		// $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento Descartado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'DESCARTA_DOCUMENTO','BACK', $doc->contraparte,Session::get('usuario')->user_id,$doc_id,$doc->servicio_contratado), 'selectOne');
		// 
		SQLConnection::logTrazabilidad('Se descartó el documento ' . $doc->nombre_tipo_doc, 'DESCARTA_DOC', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $doc->cliente, $doc->contraparte, $doc_id);
		if (isset($_POST['de_informe_tareas']) && $_POST['de_informe_tareas'] == '1') {
			echo ("<script>window.close();</script>");
		} else {
			return redirect('/led/carga-documentacion-backend');
		}
	}

	public static function documentosBackendUpload(Request $req) {
		$result = 0;
		$message = '';
		$file_url = '';

		$doc_id = $req->doc_id;

		if ($req->filefield != NULL) {
			$fld = $req->filefield;

			if (!empty($_FILES[$fld]) && !empty($_FILES[$fld]['name'])) {

				$ext = pathinfo($_FILES[$fld]['name'], PATHINFO_EXTENSION);

				if (in_array($ext, array('pdf', 'jpg', 'png', 'gif', 'jpeg'))) {

					$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

					if (!is_dir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente)) {
						mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente);
					}
					if (!is_dir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte)) {
						mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte);
					}
					if (!is_dir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion)) {
						mkdir(env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion);
					}


					if ($req->append_replace == 'R') {
						if (!move_uploaded_file($_FILES[$fld]['tmp_name'], env('PATH_DOCUMENTOS') . '/' . $doc->docpath . '/' . $doc->doc_id . '.' . $ext)) {
							$result = 1;
							$message = 'No se pudo subir el archivo.';
						} else {
							$file_url = env('RUTA_DOCUMENTOS') . '/' . $doc->docpath . '/' . $doc->doc_id . '.' . $ext . '?q=' . time();
						}

					} else {
						// AGREGA UNA HOJA AL PDF
						$tempfname = time() . '.' . $ext;

						if (move_uploaded_file($_FILES[$fld]['tmp_name'], env('PATH_DOCUMENTOS') . '/' . $doc->docpath . '/' . $tempfname)) {

							$file_doc = env('PATH_DOCUMENTOS') . '/' . $doc->docpath . '/' . $doc->doc_id . '.' . $ext;
							$file_adjuntar = env('PATH_DOCUMENTOS') . '/' . $doc->docpath . '/' . $tempfname;

							if (file_exists($file_doc)) {
								$joinedpdf = PdfMerger::init();
								$joinedpdf->addPDF($file_doc, 'all');
								$joinedpdf->addPDF($file_adjuntar, 'all');
								$joinedpdf->merge('file');
								$joinedpdf->save($file_doc);
								unlink($file_adjuntar);

								$file_url = env('RUTA_DOCUMENTOS') . '/' . $doc->docpath . '/' . $doc->doc_id . '.' . $ext . '?q=' . time();
							}
						} else {
							$result = 1;
							$message = 'Error al subir el archivo';
						}
					}

				} else {
					$result = 2;
					$message = 'La extensión o tipo de archivo no está permitido.';
				}

			}

		}
		return json_encode(array('result' => $result, 'message' => $message, 'file_url' => $file_url));
	}

	public static function eliminarArchivoAlmacenado(Request $req) {
		// $doc_id = Request::input('doc_id');
		// return 'En construccion';
		//-- SE DECRIPTA EL DOC ID
		try {
			// $doc_id = decrypt(Request::input('doc_id'));
			$doc_id = $req->doc_id;
			// $doc_id = Request::input('doc_id');
		} catch (\Exception $e) {
			return;
		}
		//--
		$doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
		if ($doc->id_externo > 0 && $doc->ruta_archivo != '') {
			$path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
		} else {
			$path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
		}
		//---
		if (file_exists($path)) {
			unlink($path);
		}
		if ($doc->tipo_doc == env('DOC_ID_DATOS_PERSONALES')) {
			$dni_frente = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . '.png';
			$dni_dorso = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . '.png';
			if (file_exists($dni_frente)) {
				unlink($dni_frente);
			}
			if (file_exists($dni_dorso)) {
				unlink($dni_dorso);
			}
		} else {
			$ftype = '.png';
			$filename_temp = '';
			$path_img = '';
			for ($i = 0; $i < 10; $i++) {
				$filename_temp = $doc->doc_id . '_' . $i . $ftype;
				$path_img = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $filename_temp;

				if (file_exists($path_img)) {
					unlink($path_img);
				}
			}

		}
		//
		$file_imagen = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.png';
		if (file_exists($file_imagen)) {
			unlink($file_imagen);
		}
		//---
		return 0;
	}

	// formulario para confirmar envío de documento a verificar o verificado
	public static function documentosBackendConfirm(Request $req) {
		$doc_id = $req->doc_id;
		$integ_carga = $req->integ_carga;
		$integ_verif = $req->integ_verif;
		$integ_rech = $req->integ_rech;
		// próximo estado del documento : Ingresado o Verificado según el botón seleccionado
		$proximo_estado = $req->estado_doc;

		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

		$result = 0;
		$message = ($proximo_estado == 'I') ? 'Por favor confirme que desea enviar el documento como pendiente de verificar.' : 'Por favor confirme que desea enviar el documento como verificado.';

		// Si el estado es "R" (rechazo), mostrar modal de rechazo
		if ($proximo_estado === 'R') {
			return view('/led/carga_documentacion/carga_documentacion_rechazar')
				->with(compact('doc', 'integ_carga', 'integ_verif', 'integ_rech', 'proximo_estado'));
		}

		if ($doc->es_balance == 0) {

			/// Check de datos completos y archivo subido 
			$flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'select');

			$incompletos = 0;
			$archivo_obligatorio = false;

			$hay_archivo = false;
			if ($doc->es_balance > 0) {
				$hay_archivo = true;
				$archivo_obligatorio = true;
			}

			foreach ($flds as $fld) {
				$hay_archivo = !$hay_archivo ? ($fld->tipo_campo == 'F' ? true : $hay_archivo) : $hay_archivo;
				$archivo_obligatorio = !$archivo_obligatorio ? ($fld->tipo_campo == 'F' ? (($fld->obligatorio > 0) ? true : false) : $archivo_obligatorio) : $archivo_obligatorio;
			}

			$check = SQLConnection::backendStoreProcedure('LN_docs_verificar_carga', array($doc_id), 'selectOne');
			$incompletos = $check->faltantes;

			$file_exists = false;
			$path = '';
			if ($hay_archivo == true) {
				if ($doc->es_balance > 0) {
					if ($doc->ruta_archivo != '') {
						$path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
					}
				} else {
					$path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
				}

				if ($path != '') {
					$file_exists = file_exists($path);
				}
			}
			if ($incompletos > 0) {
				$result = 1;
				$message = 'Por favor complete todos los datos obligatorios faltantes antes de enviar el documento (indicados con <span class="text-danger">*</span>).';
			} else {
				if ($hay_archivo == true && $archivo_obligatorio == true) {
					if ($file_exists == false) {
						$result = 2;
						$message = 'Antes de enviar el documento debe subir el archivo requerido.';
					}
				}
			}
		} else {
			// Check de documento Balance

			$hay_archivo = false;
			if ($doc->id_externo > 0 && $doc->ruta_archivo != NULL) {
				$hay_archivo = file_exists(env('PATH_COMPARTIDO') . $doc->ruta_archivo);
			}
			if ($hay_archivo == true) {

				// verifico los campos
				$datos_completos = ($doc->id_externo > 0
					&& $doc->ruta_archivo != NULL
					&& $doc->inicio_ejercicio != NULL
					&& $doc->fin_ejercicio != NULL
					&& $doc->bal_manifestacion != NULL
					&& $doc->ejercicio > 0
					&& $doc->periodo > 0
					&& $doc->moneda != NULL);

				if (!$datos_completos) {
					$result = 1;
					$message = 'Por favor complete todos los datos obligatorios faltantes antes de enviar el documento (indicados con <span class="text-danger">*</span>).';
				}

			} else {
				$result = 2;
				$message = 'Antes de enviar el documento debe subir el archivo requerido.';
			}

		}

		return view('/led/carga_documentacion_confirm')->with(compact(['doc', 'proximo_estado', 'result', 'message', 'integ_carga', 'integ_verif', 'integ_rech']));
	}

	// enviar el documento a verificar o verificado
	public static function documentosBackendEnviar(Request $req) {
		$doc_id = $req->doc_id;
		$estado_doc = $req->estado_doc;
		//
		$integ_carga = $req->integ_carga;
		$integ_verif = $req->integ_verif;
		$integ_rech = $req->integ_rech;

		$docs = SQLConnection::backendStoreProcedure('LN_docs_backend', array('enviar', $doc_id, $estado_doc, Session::get('usuario')->user_id), 'select');
		// 
		$doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
		// 
		SQLConnection::logTrazabilidad('Se verificó el documento ' . $doc->nombre_tipo_doc, 'DOC_VERIF', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $doc->cliente, $doc->contraparte, $doc_id);
		// 
		if ($doc->tipo_doc == env('DOC_ID_EXPERIENCIA_LABORAL')) {
			// self::cargarDocReferencia($doc->doc_id,$doc->doc_id_refe);  // LN_docs_ DEBERIA TRAER EL DOC DE REFE
		}

		if ($estado_doc == 'V' || $estado_doc == 'I') {
			$temp = Misc::integridadDocStore($doc, 3, $integ_carga, $integ_verif, $integ_rech, 1);
		}
		//
		return redirect('/led/carga-documentacion-backend');
		/* $doc_siguiente = NULL;
						  $docs_activos = SQLConnection::backendStoreProcedure('LN_contrapartes_',array('DOCUMENTOS_GESTION_ACTIVA', $doc->contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
						  foreach($docs_activos as $doc ){
							  if ( $doc->quien_carga == 'F' && $doc->estado_doc == 'N' && $doc->aplica == '1' && $doc->doc_id != $doc_id ){
								  $doc_siguiente = $doc;
								  break;
							  }
						  }
						  //
						  if ( is_null($doc_siguiente) ){
							  return '0';
						  } else {
							  $data = ['tipo_doc' => $doc_siguiente->tipo_doc,'doc_id' => $doc_siguiente->doc_id,'integ_carga' => $doc_siguiente->integ_carga, 'integ_verif' => $doc_siguiente->integ_verif, 'integ_rech' => $doc_siguiente->integ_rech];
							  return $data;
						  } */
	}

	public static function documentosBackendRechazar(Request $req){
		$doc_id = $req->doc_id;
		$estado_doc = $req->estado_doc;
		$integ_carga = $req->integ_carga;
		$integ_verif = $req->integ_verif;
		$integ_rech = $req->integ_rech;
		$texto_rechazo = $req->texto_rechazo;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
 		SQLConnection::backendStoreProcedure('LN_docs_backend', array('enviar', $doc_id, $estado_doc, Session::get('usuario')->user_id,null,null,null,env('PLATAFORMA'),$texto_rechazo), 'select');
		SQLConnection::logTrazabilidad('Se rechazó documento ' . $doc->nombre_tipo_doc, 'RECHAZO_DOC', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $doc->cliente, $doc->contraparte, $doc_id);
		Misc::integridadDocStore($doc, 3, $integ_carga, $integ_verif, $integ_rech, 1);
		return redirect('/led/carga-documentacion-rechazados-backend');
	}

	// Guardar datos de documento Balance en balances contables
	public static function documentosBackendBalance(Request $req) {
		$doc_id = $req->doc_id;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

		$result = 0;
		$message = '';
		$id_balance = NULL;
		$ruta_archivo = NULL;

		$params[] = $req->id_externo;
		$params[] = $doc->identificacion;
		$params[] = $doc->id_padron;
		$params[] = $req->bal_manifestacion;
		$params[] = !empty($req->fin_ejercicio) ? date_format(date_create_from_format('!d/m/Y', $req->fin_ejercicio), 'Y-m-d') : NULL;
		$params[] = $req->ejercicio;
		$params[] = $req->periodo;
		$params[] = $req->moneda;
		$params[] = 0;
		$params[] = 'CARGA LED';
		$params[] = Session::get('usuario')->user_id;
		// ultimo parametro DOC_ID sólo lo especifico en el upload para actualizar el registro de LN_docs
		$params[] = NULL;

		$balance = SQLConnection::backendStoreProcedure('insert_update_balance_led', $params, 'selectOne');

		if (!empty($balance)) {
			$result = $balance->error;
			$message = $balance->mensaje;
			$id_balance = $balance->id;
			$ruta_archivo = $balance->ruta_archivo;

			$actualizar_balance[] = 'actualizar_balance';
			$actualizar_balance[] = $doc_id;
			$actualizar_balance[] = NULL;
			$actualizar_balance[] = Session::get('usuario')->user_id;
			$actualizar_balance[] = $id_balance;
			$actualizar_balance[] = !empty($req->inicio_ejercicio) ? date_create_from_format('!d/m/Y', $req->inicio_ejercicio) : NULL;
			$actualizar_balance[] = !empty($req->fin_ejercicio) ? date_create_from_format('!d/m/Y', $req->fin_ejercicio) : NULL;

			$temp = SQLConnection::backendStoreProcedure('LN_docs_backend', $actualizar_balance, 'selectOne');

		} else {
			$result = 1;
			$message = 'Error al grabar datos del balance.';
		}


		return json_encode(array('result' => $result, 'message' => $message, 'id_balance' => $id_balance, 'ruta_archivo' => $ruta_archivo));
	}

	// subir archivo de balance
	public static function documentosBackendUploadBalance(Request $req) {
		$result = 0;
		$message = '';

		$doc_id = $req->doc_id;
		$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

		$file_path = NULL;
		$file_url = NULL;
		$id_balance = NULL;

		if (!empty($_FILES['archivo_balance'])) {
			if (!empty($_FILES['archivo_balance']['name'])) {
				$ext = pathinfo($_FILES['archivo_balance']['name'], PATHINFO_EXTENSION);

				if (strtolower($ext) == 'pdf') {
					if (!is_dir(env('PATH_COMPARTIDO') . '/balances/' . $doc->identificacion)) {
						// dd(env('PATH_COMPARTIDO') . '/balances/' . $doc->identificacion);
						mkdir(env('PATH_COMPARTIDO') . '/balances/' . $doc->identificacion);
					}

					if (empty($doc->id_externo)) {
						// se está subiendo el archivo pero no se generó el registro en contables
						// dd('vamo bien');
						$params[] = $req->id_externo;
						$params[] = $doc->identificacion;
						$params[] = $doc->id_padron;
						$params[] = $req->bal_manifestacion;
						$params[] = !empty($req->fin_ejercicio) ? date_format(date_create_from_format('!d/m/Y', $req->fin_ejercicio), 'Y-m-d') : NULL;
						$params[] = $req->ejercicio;
						$params[] = $req->periodo;
						$params[] = $req->moneda;
						$params[] = 0;
						$params[] = 'CARGA LED';
						$params[] = Session::get('usuario')->user_id;
						$params[] = $doc_id;

						$balance = SQLConnection::backendStoreProcedure('insert_update_balance_led', $params, 'selectOne');

						if (!empty($balance)) {
							$id_balance = $balance->id;

							$actualizar_balance[] = 'actualizar_balance';
							$actualizar_balance[] = $doc_id;
							$actualizar_balance[] = NULL;
							$actualizar_balance[] = Session::get('usuario')->user_id;
							$actualizar_balance[] = $id_balance;
							$actualizar_balance[] = !empty($req->inicio_ejercicio) ? date_create_from_format('!d/m/Y', $req->inicio_ejercicio) : NULL;
							$actualizar_balance[] = !empty($req->fin_ejercicio) ? date_create_from_format('!d/m/Y', $req->fin_ejercicio) : NULL;

							$temp = SQLConnection::backendStoreProcedure('LN_docs_backend', $actualizar_balance, 'selectOne');
						}
					} else {
						$id_balance = $req->id_externo;
					}

					if ($id_balance > 0) {
						// releo el documento para obtener el path
						$doc = SQLConnection::backendStoreProcedure('LN_docs_backend', array('detalle', $doc_id), 'selectOne');

						if ($req->append_replace == 'R') {
							if (move_uploaded_file($_FILES['archivo_balance']['tmp_name'], env('PATH_COMPARTIDO') . $doc->ruta_archivo)) {
								$file_path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
								$file_url = env('RUTA_COMPARTIDO') . $doc->ruta_archivo . '?rnd=' . time();
							} else {
								$result = 1;
								$message = 'Error al subir el archivo';
							}
						} else {
							$tempfname = time() . '.' . $ext;
							if (move_uploaded_file($_FILES['archivo_balance']['tmp_name'], env('PATH_COMPARTIDO') . '/' . $tempfname)) {

								$file_balance = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
								$file_adjuntar = env('PATH_COMPARTIDO') . '/' . $tempfname;

								if (file_exists($file_balance)) {
									$joinedpdf = PdfMerger::init();
									$joinedpdf->addPDF($file_balance);
									$joinedpdf->addPDF($file_adjuntar);
									$joinedpdf->merge('file');
									$joinedpdf->save($file_balance);
									unlink($file_adjuntar);

									$file_path = $file_balance;
									$file_url = env('RUTA_COMPARTIDO') . $doc->ruta_archivo . '?rnd=' . time();
								}
							} else {
								$result = 1;
								$message = 'Error al subir el archivo';
							}
						}


					} else {
						$result = 2;
						$message = 'No se encuentra el balance';
					}

				} else {
					$result = 3;
					$message = 'Extensión o tipo de archivo no permitido.';
				}

			} else {
				$result = 4;
				$message = 'No se encuentra el archivo subido.';
			}

		}

		return json_encode(array('result' => $result, 'message' => $message, 'id_balance' => $id_balance, 'file_path' => $file_path, 'file_url' => $file_url));
	}
}
