<?php

namespace App\Custom;

use App\Custom\SQLConnection;

/**
 * Clase que genera el
 * archivo excel del 
 * panel de control LED
 * */
class ExcelLed 
{
    /**
     * el servicio actual
     * solicitado
     * @access private
     * @var string|int
     */
    private $servicio_actual;

    /**
     * el id del cliente
     * @access private
     * @var string|int
     */
    private $cliente;

    /**
     * un lista de 
     * los id de las contrapartes
     * a generar excel con
     * @access public
     * @var array
     */
    public $contrapartes_id;

    
    public function __construct($servicio,$cliente){
        ini_set('memory_limit','4096M');
		ini_set('max_execution_time', 10000); // 1000 segundos
		set_time_limit(0); 
        //
        if ( is_numeric($servicio) && is_numeric($cliente) ){
            $this->servicio_actual = $servicio;
            $this->cliente = $cliente;
        } else {
            throw new Exception('Datos estructurales invalidos.');
        }
        
    }

    public function ledExcelPanelControlChunks(){
		
		if ( is_null($ids) ){
			return json_encode(['error' => 1,'mensaje' => 'Sin datos a procesar.']);
		}
		$contrap_str = implode(',',$ids);
		//
		$periodo_historico = null; 
		$periodo_archivo = Request::input('periodo') ?? null;
		if ($periodo_archivo !== null) {
			/* El archivo de un mes, tiene los datos del periodo_anterior 
			Por ejemplo: El panel al 31/01/2022 tienen los datos del periodo 202112 */ 
			$fecha = substr($periodo_archivo,0,4) . '-' . substr($periodo_archivo,4,2) . '-01';
			$date = new DateTime($fecha);
			$dt = date_format($date, 'Y-m-d'); 
			$periodo_historico = date("Ym",strtotime($dt."- 1 day")); 

			$dt2 = date("Y-m-d",strtotime($dt."+ 1 month")); 
			$fecha_archivo = date("Y-m-d",strtotime($dt2."- 1 day")); 
			/* para que le ponga el ultimo dia del mes le sumamos 1 mes y le restamos 1 dia */
		}
		//
		$contrap = SQLConnection::backendStoreProcedure('LN_panel_control_excel', array($cliente, $contrap_str, $servicio_actual), 'select');
		// AGREGA PERSONAL 
		// (AMX)
		$personal = [];
		if ($cliente == 5546348) {
			$personal = SQLConnection::backendStoreProcedure('LN_panel_control_excel_personal', array($cliente, $contrap_str, $servicio_actual), 'select');
		}
		// 7/6/2023: Agrega datos comerciales 
		// (AMX)
		$datos_comerciales = [];
		$email_contacto = [];
		if ($cliente == 5546348) {
			$datos_comerciales1 = [];
			$datos_comerciales1 = SQLConnection::backendStoreProcedure('LN_panel_control_excel_datos_comerciales', array($cliente, $contrap_str, $servicio_actual), 'select');
			foreach ($datos_comerciales1 as $key => $dc) {
				$datos_comerciales[$dc->contraparte] = str_replace('<BR>','',$dc->datos_comerciales); 
				$email_contacto[$dc->contraparte] = str_replace('<BR>','',$dc->email_contacto); 
			}
		}
		//
		$pacto_mundial = [];
		if ($cliente == 1226057645) {
			$pacto_mundial1 = [];
			$pacto_mundial1 = SQLConnection::backendStoreProcedure('LN_panel_control_excel_pacto_mundial', array($cliente, $contrap_str, $servicio_actual), 'select');
			foreach ($pacto_mundial1 as $key => $pacto) {
				$pacto_mundial[$pacto->contraparte] = $pacto->valor; 
			}
		}
		//
		$deuda_Aportes = [];
		$deuda_Contribuciones = [];
		$deuda_previsional = [];
		if ($cliente == 2046807993 && $servicio_actual == 73) {
			$deuda_previsional = SQLConnection::backendStoreProcedure('LN_panel_control_excel_deuda_previsional', array($cliente, $ids, $servicio_actual), 'select');
			foreach ($deuda_previsional as $key => $deuda) {
				$deuda_Aportes[$deuda->contraparte] = $deuda->deuda_301; 
				$deuda_Contribuciones[$deuda->contraparte] = $deuda->deuda_351;  
			}
		}
		//
    	$ind = SQLConnection::backendStoreProcedure('LN_dashboard_cliente', array('PRODUCTOS_INDICADORES',$cliente, null, null, null, null, null, null, null, null, null, 1,null,0,null,$servicio_actual),'select');
		/******************************************************/
		/* sacamos indicadores no habilitados para el usuario */
		$indicadores_habilitados_usuario = []	;
		$indicadores_habilitados_usuario = Session::get('indicadores_habilitados_usuario');
		if (is_array($indicadores_habilitados_usuario) && count($indicadores_habilitados_usuario) > 0)  {	
			foreach ($ind as $key => $indicador) {	
				$sacar = $key; 
				foreach ($indicadores_habilitados_usuario as $prod => $habilitado) {			
					if ($habilitado->indicador == $indicador->indicador) { 
						$sacar = null;
						break;
					}
				}
				if ($sacar !== null) {
					unset($ind[$key]);
				}
			}
		}
		// Se obtienen los documentos
		foreach ($ids as $id) {
			$docs = DB::select('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('DOCUMENTOS_GESTION_ACTIVA', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
			$documentos[$id]['N'] = '';
			$documentos[$id]['V'] = '';
			$documentos[$id]['I'] = '';
			$documentos[$id]['R'] = '';
			foreach ($docs as $doc) {
				if ( $doc->aplica ) {
					$documentos[$id][$doc->estado_doc] .= $doc->nombre_tipo_doc . '<br style="mso-data-placement:same-cell;" />'; 
				}
			} 
		} 
		//
		$empleados = []; 
		foreach ($personal as $doc) {
			$empleados[$doc->contraparte][$doc->etiqueta] = $doc->valor; 
		}
		//		
		$titulo_score = DB::selectOne("SELECT top 1 titulo as titulo from ln_cliente_nivel where titulo is not null and cliente = " . $cliente); 
		//
		$tiene_dias_gestion = 'N'; 
		//
		$prodind = []; 
		foreach ($ind as $data) {
			$prodind[$data->etiqueta][$data->indicador]['etiqueta'] = $data->etiqueta_indicador;
			$prodind[$data->etiqueta][$data->indicador]['tipo_dato'] = $data->tipo_dato;
			$prodind[$data->etiqueta][$data->indicador]['clave_indicador'] = $data->clave_indicador;

			if ($data->clave_indicador=="INICIO_GESTION") {
				$tiene_dias_gestion = 'S'; 
			}

	  		if ($data->indicador == 37 ) { 
				$prodind[$data->etiqueta]['9990']['etiqueta'] = "Datos Informe Exterior"; 
				$prodind[$data->etiqueta]['9990']['tipo_dato'] = "T";
				$prodind[$data->etiqueta]['9990']['clave_indicador'] = $data->clave_indicador;
			}

			if ($data->clave_indicador=="CTRL_ETICO") { 
				$prodind[$data->etiqueta]['9993']['etiqueta'] = $data->etiqueta_indicador . " Cruce con Base de Personas no autorizadas"; 
				$prodind[$data->etiqueta]['9993']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9993']['clave_indicador'] = $data->clave_indicador;
			}

			if ($data->clave_indicador=="CTRL_CALIDAD") { 
				$prodind[$data->etiqueta]['9994']['etiqueta'] = $data->etiqueta_indicador . " Cruce con Base de Proveedores no autorizados"; 
				$prodind[$data->etiqueta]['9994']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9994']['clave_indicador'] = $data->clave_indicador;
			}

			if ($data->clave_indicador=="SCORE_FINAL" && isset($titulo_score)) { 
				$prodind[$data->etiqueta]['9995']['etiqueta'] = $titulo_score->titulo; 
				$prodind[$data->etiqueta]['9995']['tipo_dato'] = "T";
				$prodind[$data->etiqueta]['9995']['clave_indicador'] = $data->clave_indicador;
			}



			if ($data->clave_indicador=="CUMPL_DOC") {
				$prodind[$data->etiqueta]['9996']['etiqueta'] = "Verificados";
				$prodind[$data->etiqueta]['9996']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9996']['clave_indicador'] = "V";
				
				$prodind[$data->etiqueta]['9997']['etiqueta'] = "Pendientes de Verificar";
				$prodind[$data->etiqueta]['9997']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9997']['clave_indicador'] = "I";

				$prodind[$data->etiqueta]['9998']['etiqueta'] = "Rechazados";
				$prodind[$data->etiqueta]['9998']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9998']['clave_indicador'] = "R";
				
				$prodind[$data->etiqueta]['9999']['etiqueta'] = "Pendientes de Ingreso";
				$prodind[$data->etiqueta]['9999']['tipo_dato'] = "I";
				$prodind[$data->etiqueta]['9999']['clave_indicador'] = "N";
			}

		}
		//
		$aind = []; 
		$tipo_datos = [];
		foreach ($prodind as $nombre_producto => $indicadores) {
			foreach ($indicadores as $key => $data) {
				$aind[] = $key; 
				$tipo_datos[$key] = $indicadores[$key]['tipo_dato']; 
			}
		}
		//
		$titulo_personal = []; 
		foreach ($empleados as $key => $data) {
			foreach ($data as $key => $tit) {
				$titulo_personal[$key] = $key; 
			}
		}
		//
		if ($periodo_historico !== null) {
			$led = SQLConnection::backendStoreProcedure('LN_dashboard_cliente', array('VALORES_GRILLA_HIST',$cliente, null, null, null, null, null, null, null, null, null, 1,null,0,null,Session::get('servicio_actual'),$periodo_historico), 'select');	
		}
		else {
			if ($cliente == '2046807993'){
				$accionln = 'VALORES_GRILLA_NEW';
			} else {
				$accionln = 'VALORES_GRILLA';
			}
			//
			$led = SQLConnection::backendStoreProcedure('LN_dashboard_cliente', array($accionln, $cliente, null, null, null, null, null, null, null, null, null, 1,null,0,null,$servicio_actual), 'select');
		}
		//
		foreach ($led as $datos) {
			if(in_array($datos->indicador, $aind)) {	  
				if ($datos->valor == 'SIN CALCULAR'){ 
					$datos->valor = 'SIN DATOS'; 
				}
				//
				$valores[$datos->contraparte][$datos->indicador] = $datos->valor;
				//
				if($datos->indicador == 37) {
					$valores[$datos->contraparte]['9990'] = $datos->valor_memo;
				}
				//
				if($datos->indicador == 361 || $datos->indicador == 360) {
					$valores[$datos->contraparte][$datos->indicador] = $datos->valor_memo;
				}
				//
				if($datos->indicador == 4 && isset($titulo_score)) {
					if ($datos->texto!=null)  {
						$valores[$datos->contraparte]['9995'] = $datos->texto;
					} else {
						$valores[$datos->contraparte]['9995'] = ''; 
					}
				}
			}
		}
		/*****************************************************************/
		/* Saco registros que no cumplen restricciones de pais / familia */
	  	$usuarios_restricciones = Session::get('usuarios_restricciones');
		//
		if(!empty($usuarios_restricciones)) {
			foreach ($usuarios_restricciones as $key_ur => $value_ur) {
				if($servicio_actual == $key_ur) {
					foreach ($contrap as $key1 => $datos1) {
						foreach ($value_ur as $key_n2 => $value_n2) {
							//busco sólo por familia.
							if($value_n2->pais_servicio == null && $value_n2->indicador  == null && $value_n2->familia != null ) {
								if (isset($datos1->familia)) {
									if($datos1->familia == $value_n2->familia ) {
										unset($contrap[$key1]);
									}
								}
								//busco por familia y por pais de servicio.
							} else if($value_n2->pais_servicio != null && $value_n2->indicador  == null && $value_n2->familia != null){
								if (isset($datos1->ps) && isset($datos1->familia))  {
									if(strtolower($datos1->ps) == strtolower($value_n2->pais_servicio) && $datos1->familia == $value_n2->familia ){
										unset($contrap[$key1]);
									}
								} else if (!isset($datos1->ps) && isset($datos1->familia)) {
									if($datos1->familia == $value_n2->familia ) {
										unset($contrap[$key1]);
									}
								}
							} else if($value_n2->pais_servicio != null && $value_n2->indicador  == null && $value_n2->familia == null) {
								if (isset($datos1->ps)) {
									if(strtolower($datos1->ps) == strtolower($value_n2->pais_servicio) ){
											unset($contrap[$key1]);
								    }
								}
							}
						}
					}
				}
			}
		}
		/************************************************************/
		$mostrar_ps = $contrap[0]->cant_ps;
		//
		// $file = '';
		$file = [];
		$cabezera = [];
		if($mostrar_ps > 1){
			// $file .= "<td>PAIS DE SERVICIO</td>";
			$cabezera[] = 'PAIS DE SERVICIO';
		}
		// $file .= '<td>PAIS' . "</td><td>" . 'FAMILIA' . "</td><td>" . 'RAZON SOCIAL' . "</ td><td>IDENTIFICADOR</td>" . "<td>IDENTIFICACION" . "</td>"; 
		$cabezera[] = 'PAIS';
		$cabezera[] = 'FAMILIA';
		$cabezera[] = 'RAZON SOCIAL';
		$cabezera[] = 'IDENTIFICADOR';
		$cabezera[] = 'IDENTIFICACION';
		//
		if ($tiene_dias_gestion == 'S') { 
			//$file .= "<td>DIAS GESTION</td>";
			$cabezera[] = 'DIAS GESTION';
		}
		if ($cliente==5546348) { 
			//$file .= "<td>DATOS COMERCALES</td><td>EMAIL CONTACTO</td>";
			$cabezera[] = 'DATOS COMERCALES';
			$cabezera[] = 'EMAIL CONTACTO';
		}
		//
		foreach ($prodind as $nombre_producto => $ìndicadores) {
			if (!empty($ìndicadores)) {
				foreach ($ìndicadores as $fld => $data_indicador) { 				
					//if ($data_indicador['clave_indicador']=="SCORE_IC" && $fld == "37") {
					if ( $data_indicador['clave_indicador'] != "SCORE_IC" || $fld != "37" ){
						$cabezera[] = $data_indicador['etiqueta'];
						//continue;
					}
					//
					//$file .= "<td>" . $data_indicador['etiqueta'] . "</td>";
				}
			} else {
				// $file .= "<td>" . $nombre_producto . "</td>";
				$cabezera[] = $nombre_producto;
			}
		}
		//
		if ($servicio_actual == 47) {
			$cabezera[] = 'Detalle Rechazos';
			// $file .= "<td>Detalle Rechazos</td>";
		}
		foreach ($titulo_personal as $key => $tit) {
			$cabezera[] = $key;
			// $file .= "<td>" . $key. "</td>";
		}
		if ($cliente == 1226057645) {
			$cabezera[] = 'PACTO MUNDIAL';
			// $file .= "<td>PACTO MUNDIAL</td>";
		}
		if ($cliente == 2046807993 && $servicio_actual == 73) {
			// $file .= "<td>Meses Deuda Aportes</td>";
	   		// $file .= "<td>Meses Deuda Contribuciones</td>";
			$cabezera[] = 'Meses Deuda Aportes';
			$cabezera[] = 'Meses Deuda Contribuciones';
		}
		// $file .= '</tr>'; 
		//
		$datos_cruce = ''; 
		
		foreach($contrap as $contraparte){
	  		$file .= '<tr valign="top">';
      		if($mostrar_ps > 1) {
      			$file .= "<td>" . $contraparte->pais_servicio . "</td>";
  			}
	  		$file .= "<td>" . $contraparte->country_name . "</td>" . "<td>".$contraparte->nombre_familia . "</td>" . "<td>" . $contraparte->nombre_persona . "</td>" . "<td>" . $contraparte->abreviatura . "</td>" . "<td>" . $contraparte->numero . "</td>"; 
      		//"<td>".$contraparte->inicio_gestion  . "</td>" . 
			if ($tiene_dias_gestion == 'S') { 
				$file .= "<td>".$contraparte->dias_gestion . "</td>";
			}

			if ($cliente == 5546348) {
				if(isset($datos_comerciales[$contraparte->contraparte])) {
  					$file .= "<td>" . $datos_comerciales[$contraparte->contraparte] . "</td>";
				} else {
					$file .= "<td></td>";
				}
				if(isset($email_contacto[$contraparte->contraparte])) {
  					$file .= "<td>" . $email_contacto[$contraparte->contraparte] . "</td>";
				} else {
					$file .= "<td></td>";
				}
			}

			$datos_cruce = ''; 
			$cruce_socios = SQLConnection::backendStoreProcedure('LN_control_etica', array($contraparte->contraparte), 'select');
		
			foreach ($cruce_socios as $cruce) {
				if ($datos_cruce == '') { 
					$datos_cruce = $cruce->cuit . ' ' . $cruce->nombre . ' - ' . $cruce->cargo; 
				} else {
					$datos_cruce = '<br style="mso-data-placement:same-cell;" />' . $cruce->cuit . ' ' . $cruce->nombre . ' - ' . $cruce->cargo; 
				}
			}
	  		$valores[$contraparte->contraparte]['9993'] = $datos_cruce;

			$datos_cruce = ''; 
			$cruce_socios = SQLConnection::backendStoreProcedure('LN_control_calidad', array($contraparte->contraparte), 'select');
			foreach ($cruce_socios as $cruce) {
				if ($datos_cruce == '') { 
					$datos_cruce = $cruce->cuit . ' ' . $cruce->nombre . ' - ' . $cruce->cargo; 
				} else  {
					$datos_cruce = '<br style="mso-data-placement:same-cell;" />' . $cruce->cuit . ' ' . $cruce->nombre . ' - ' . $cruce->cargo; 
				}
			}
			
	  		$valores[$contraparte->contraparte]['9994'] = $datos_cruce;
	  		foreach ($aind as $k => $id) {
				switch ($id) {
					case 9999:
						$file .= "<td>" . (isset($documentos[$contraparte->contraparte]['N']) ? $documentos[$contraparte->contraparte]['N'] : "") . "</td>";
						break;
					case 9998:
						$file .= "<td>" . (isset($documentos[$contraparte->contraparte]['R']) ? $documentos[$contraparte->contraparte]['R'] : "") . "</td>";
						break;
					case 9997:
						$file .= "<td>" . (isset($documentos[$contraparte->contraparte]['I']) ? $documentos[$contraparte->contraparte]['I'] : "") . "</td>";
						break;
					case 9996:
						$file .= "<td>" . (isset($documentos[$contraparte->contraparte]['V']) ? $documentos[$contraparte->contraparte]['V'] : "") . "</td>";
						break;
					case 6:
						if (!isset($valores[$contraparte->contraparte][$id])) {
							$valores[$contraparte->contraparte][6] = (isset($valores[$contraparte->contraparte][37]) ? $valores[$contraparte->contraparte][37] : "");
						}
						$file .= "<td>" . (isset($valores[$contraparte->contraparte][$id]) ? $valores[$contraparte->contraparte][$id] : "") . "</td>"; 
						break;
					case 37:
						break;
		  			default:
						if (isset($valores[$contraparte->contraparte][$id])) { 
							if (substr($valores[$contraparte->contraparte][$id],0,4)==(-100)) { 
								$valores[$contraparte->contraparte][$id] = str_replace('-100','N/A', $valores[$contraparte->contraparte][$id]);
							}
							if ($tipo_datos[$id] == 'I') { 
								$valores[$contraparte->contraparte][$id] = str_replace('.','', $valores[$contraparte->contraparte][$id]);
							}
						}
						switch ($tipo_datos[$id]) {
							case 'F':
								$file .= '<td style="mso-number-format:\'0.00\';">'; 
								break;
							default:
								$file .= "<td>"; 
								break;
						}
						$file .= (isset($valores[$contraparte->contraparte][$id]) ? $valores[$contraparte->contraparte][$id] : "") . "</td>"; 
						break;
				}
			}
			//
			if ($servicio_actual == 47)  {
				$detalle = trim($contraparte->detalle_killer); 
				$detalle = str_replace(';', '<br style="mso-data-placement:same-cell;" />', $detalle); 
				$file .= '<td>' . $detalle . '</td>';
			}
			//
			if(isset($empleados[$contraparte->contraparte])) {
				$empleado = []; 
				$empleado = $empleados[$contraparte->contraparte]; 
				foreach ($titulo_personal as $key1 => $tit) {
					foreach ($empleado as $key => $val) {
						if ($key == $tit) {
							if ($key=='No tenemos personal')  {
								if ($val == '0') { 
									$val = ''; 
								} else  { 
									$val = 'X'; 
								}
							}
							$file .= '<td>' . $val . '</td>';
						}
					}
				}
			} else {
		  		foreach ($titulo_personal as $key => $tit) {
			  		$file .= "<td></td>";
		  		}
			}
			//
			if ($cliente == 1226057645) {
				if(isset($pacto_mundial[$contraparte->contraparte])) {
  					$file .= "<td>" . $pacto_mundial[$contraparte->contraparte] . "</td>";
				} else {
					$file .= "<td></td>";
				}
			}
			//
			if ($cliente == 2046807993 && $servicio_actual == 73) {
				if(isset($deuda_Aportes[$contraparte->contraparte])) {
  					$file .= "<td>" . $deuda_Aportes[$contraparte->contraparte] . "-</td>";
				} else {
					$file .= "<td></td>";
				}
				if(isset($deuda_Contribuciones[$contraparte->contraparte])) {
  					$file .= "<td>" . $deuda_Contribuciones[$contraparte->contraparte] . "-</td>";
				} else {
					$file .= "<td></td>";
				}
			}
			//
			$file .= '</tr>'; 
	  	}
		//
		return $file;
		

		
	}
}