<?php

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class NibaldoController extends \BaseController {

	public static $jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'ID',
			'hidden' => true
		],
		[
			'label' => 'ESTADO1',
			'name' => 'ESTADO1',
			'hidden' => true
		],
		[
			'label' => 'Fecha',
			'name' => 'FECHA_F',
			'searchoptions' => [
				'sopt' => ['custom']
			]
		],
		[
			'label' => 'Nombre Producto',
			'name' => 'NOMBRE',
		],
		[
			'label' => 'Volumen (LTS)',
			'name' => 'CANTIDAD',
		],
		[
			'label' => 'Estado',
			'name' => 'ESTADO',
			'stype' => 'select',
			'searchoptions' => [
				'value' => ':;1:Pendiente'
			]
		]
	];

	public function index(){
		$title = 'Control de Calidad';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('fabricacion', self::$jqgrid_colmodel);
		return View::make('nibaldo.index', compact('title'));
	}

	public function datagrid() {
		Jqgrid::init('vPlanificacion', self::$jqgrid_colmodel, self::jqgrid_format(), self::jqgrid_filter_format());
		Jqgrid::get_query()->where('ESTADO', '2');
		return Jqgrid::datagrid();
	}

	/**
	 * Retorna funcion anonima que define los formatos para los valores de las distintas columnas de la grilla
	 * @return function
	 */
	private static function jqgrid_format() {
		return function ($column, $value) {
			$result = $value;
			if (in_array($column, ['ESTADO'])) {
               if ($value == 2) 
			   {
                 $archivo = asset('img/candadoAbierto.png');
				 $result  = "<center><img src='$archivo' width='20'></center>";
			   }
			   else
			   {
                 $archivo = asset('img/candadoCerrado.png');
				 $result  = "<center><img src='$archivo' width='20'></center>";
			   }
			}
			if (in_array($column, ['DIFERENCIA'])) {
               if ($value == 0) 
			   {
				 $result = "<div style='background: green; color: white;'> Hoy </div>";
			   }
			   elseif ($value  > -11 && $value  < 0) 
			   {
				 $result = "<div style='background: orange; color: black;'> Deberá fabricar en ".abs($value)." días más</div>";
			   }
               elseif ($value  < -10) 
			   {
				 $result = "<div style='background: orange; color: black;'> Deberá fabricar en ".abs($value)." días más</div>";
			   }
               else
			   {
				 $result = "<div style='background: white; color: black;'> Debió fabricar hace ".abs($value)." días</div>";
			   }
			}

			return $result;
		};
	}

	/**
	 * Retorna funcion anonima que define los formatos de búsqueda para los valores de las distintas columnas de la grilla
	 * @return function
	 */
	private static function jqgrid_filter_format() {
		return function ($field, $data) {
			$result = $data;
			if (in_array($field, ['FECHA_F'])) {
				$values = explode(' | ', $data);
				$v1 = date('d-m-Y', strtotime($values[0]));
				$v2 = date('d-m-Y', strtotime($values[1]));
				$aux = "FECHA >= '$v1 00:00:00' AND FECHA <= '$v2 23:59:59'";
				$result = $aux;
			}
			return $result;
		};
	}

	/**
	 * Muestra Vista de editar fórmula
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function vista_editar($id) {
		$title = 'Editar';
		Breadcrumb::append_crumb('Fabricación');
		Breadcrumb::append_crumb($title);

		$planificacion      = DB::table('vPlanificacion')->where('ID', '=',$id)->first();
		$producto           = $planificacion->NOMBRE;
		$IDFORM             = $planificacion->IDFORM;

		$formula            = DB::table('vFormulas')->where('NOMBRE', '=',$producto)->first();
		if(empty($formula)) {
			App::abort(404);
		}
		$IDFORMULA          = $formula->ID;
		$formula->VOLUMEN   = $planificacion->CANTIDAD;

		$detalles_formula   = DB::table('vRespuestasProduccion')
			->where('ID', '=', $id, 'and', 'IDFORMULA', '=', $IDFORM, 'and', 'PREGUNTA', '<>', '')
            ->select(DB::raw("PREGUNTA, IDPREGUNTA ID, RESPUESTA, rangos_inf, TIPOPREGUNTA, rangos1, rangos2, opciones, opcion"))	
			->get();

		if (empty($detalles_formula)) {
            $detalles_formula               = new stdClass;
            $detalles_formula->ID           = $formula->ID;
            $detalles_formula->IDFORMULA    = 10;
			$detalles_formula->IDPREGUNTA   = NULL;
            $detalles_formula->PREGUNTA     = NULL;
            $detalles_formula->IDCALIDAD    = NULL;
			$detalles_formula->RESPUESTA    = NULL;
            $detalles_formula->rangos_inf   = NULL;
			$detalles_formula->TIPOPREGUNTA = NULL;
			$detalles_formula->rangos1      = NULL;
			$detalles_formula->rangos2      = NULL;
			$detalles_formula->opciones     = NULL;
            $detalles_formula->opcion       = NULL;
		}
	
		$agua = DB::table('vProductos')
			->where('NREGUIST', Config::get('settings.agua_id'))
			->first();
		return View::make('calidad.editar', compact('id', 'title', 'planificacion', 'formula', 'detalles_formula', 'agua'));
	}

	/**
	 * Obtiene datos del Lote
	 * @param $id
	 * @return mixed
	 */
	 
	/**
	 * Guarda fórmula en base de datos
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function editar_calidad() {
		$data       = json_decode(Input::get('data'), true);
		$nrovale    = Input::get('nrovale');
        $nroguia    = Input::get('nroguia');
		$idd        = Input::get('id');
		$IDFORMULA  = $data['IDFORMULA'];
		$nreguist   = $data['nreguist'];
		$CANTIDAD   = $data['volumen'];
		$grabaError = 0;
		
		$vdata     = [];
		$vrules    = [];
		$vmessages = [];

		if (isset($data['materias_primas'])) {
           foreach($data['materias_primas'] as $ii=>$mp) {
				$id                 = $ii;
                /* Exige el ingreso de una respuesta */
				if ($mp["TIPOPREGUNTA"] == 1)
                {
					$vdata["RESPUESTA$id"]              = isset($mp["RESPUESTA"])?$mp["RESPUESTA"]:'';
					$vrules["RESPUESTA$id"]             = 'required';
					$vmessages["RESPUESTA$id.required"] = 'El campo RESPUESTA debe ser ingresado.';
				}
				else
                {
                    /* Valida el rango ingresado */
                    if ($mp["rangos_inf"] < $mp["rangos1"] || $mp["rangos_inf"] > $mp["rangos2"] )
                    {
                        $grabaError = 1;
                    }
                }					
           }
		}
		$validador    = Validator::make($vdata, $vrules, $vmessages);
		if ($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		}
        else 
		{				 
			/* Si tiene error no graba los detalles */
			if ($grabaError == 0)
            {
                /* Asignación de los campos */
            
    			$FECHA           = DATE('d-m-Y');
	    		$NRUTFACT        = 1938;
	    		$RUTFACT         = '76107759-7';
	    		$NRUTCLIE        = 1938;
	    		$TOTNETO         = 0;
	    		$TASACBIO        = 1;
	    		$FECHAMODIF      = DATE('d-m-Y');
	    		$USERMODI        = 'ADM';
	    		$IVA             = 19;
	    		$FECHCONT        = DATE('d-m-Y');
	    		$SUCUR           = 1;			

                /* Lee Número de GUIA RECEPCION */
	    	    $GUIASDETALLE    = DB::table('vValorDocumentos')
	    		->select(DB::raw('Max(TOTAL) TOTAL'))
	    		->where('TIPODOC', '=', 6)
	    		->where('NUMFACT', '=', $nrovale)
	    		->first();

	    		$TOTNETO         = $GUIASDETALLE->TOTAL;
	    		$TOTIVA          = round((($TOTNETO * $IVA) / 100), 1);
	    		$TOTAL           = ($TOTNETO + $TOTIVA);
			
	    		// Insert DOCU_DB WHERE TIPODOC=9 (Guia de Recepción)
                if ($nroguia == 0 || $nroguia == '' || $nroguia == null)
                {
                    /* Lee Número de GUIA RECEPCION */
		            $DOCU_DB = DB::table('DOCU_DB')
    				->select(DB::raw('Max(NUMFACT) NUMFACT'))
	    			->where('TIPODOC', '=', 9)
		    	    ->first();

                    /* Campos */    
		    		$NUMFACT     = $DOCU_DB->NUMFACT;

                    /* Lee Número de CORRELATIVOS */
    		        $DOCU_DB = DB::table('DOCU_DB')
    			    ->select(DB::raw('Max(NUMREG) NUMREG, Max(NUMCORR) NUMCORR'))
	    		    ->first();

                    /* Campos */    
		    		$NUMREG      = $DOCU_DB->NUMREG;
		    		$NUMCORR     = $DOCU_DB->NUMCORR; 

                    $noDuplicado = false;
                    $i           = 0;
				
                    do {
						$noDuplicado  = true; 
						$NUMFACT      = $NUMFACT + 1;
						$NUMREG       = $NUMREG  + 1;
						$NUMCORR      = $NUMCORR + 1;

                        try
						{
							DB::table('DOCU_DB')->insert([
								'NUMFACT'=>$NUMFACT, 'FECHA'=>$FECHA, 'NRUTFACT'=>$NRUTFACT, 'RUTFACT'=>$RUTFACT, 'NRUTCLIE'=>$NRUTCLIE, 
								'PROFORMA'=>0, 'NUMREG'=>$NUMREG, 'CODVEND'=>0, 'GLOSACON'=>'', 'NUMORDEN'=>0, 'NUMGUIAF'=>'', 
								'FORMPAGO'=>'', 'VENCIMIE'=>NULL, 'MONEDA'=>'', 'DCTOTIPO'=>0, 'DCTOPJE'=> 0, 'GARANTIA'=>0, 
								'STOCK'=>1, 'NULA'=>0, 'CANCELA'=>0, 'TOTNETO'=>$TOTNETO, 'TASACBIO'=>$TASACBIO, 'VENCIDIA'=>0, 
								'FECHAMODIF'=>$FECHA, 'USERMODI'=>$USERMODI, 'IDNRMOV'=>0, 'IDNRCON'=>0, 'FECPACK'=>NULL, 'HORAPACK'=>'', 
								'FECRECEP'=>NULL, 'HORARECEP'=>'', 'FECHADESP'=>NULL, 'HORADESP'=>'', 'FECACTUAL'=>NULL, 'HORACTUAL'=>'',
								'KM'=>0, 'IDNREMP'=>0, 'PESO'=>0, 'NGUIA'=>'', 'VALORDES'=>0, 'RECIBIDO'=>'', 'IVA'=>$IVA, 'TIPODOC'=>9, 
								'ENTR_DIR'=>'', 'ENTR_COMU'=>'', 'ENTR_CIUD'=>'', 'ENTREGAR'=>'', 'CENTRZADO'=>0, 'TRASPASO'=>0, 
								'VALE'=>0, 'FACTURAD'=>0, 'BODEGATR'=>0, 'VENTA'=>1, 'COMISION'=>0, 'IMPRESA'=>0, 'NOTAOBS'=>'', 
								'NOTAFACT'=>'', 'NDIASF'=>0, 'NUMEMPDO'=>1, 'NUMOTS'=>0, 'NUMCORR'=>$NUMCORR, 'FECHCONT'=>$FECHCONT, 'AFECTO'=>$TOTNETO, 
								'EXENTO'=>0, 'TOTIVA'=>$TOTIVA, 'IMP1'=>0, 'IMP2'=>0, 'TOTAL'=>$TOTAL, 'GASTO'=>0, 'DOCPAGO'=>0, 'SUCUR'=>$SUCUR, 
								'SQVALEB_DE'=>0, 'SQVALEB_A'=>0, 'PROCESONUM'=>'', 'ATT'=>'', 'CODCOMIS'=>0, 'TIPOVTA'=>0, 
								'NUMFV'=>0, 'NUMCOT'=>0, 'DEBITO'=>0, 'FECHPAGO'=>NULL, 'DESCTO2'=>0, 'DESCTO3'=>0, 'DESCTO4'=>0, 
								'CARGO2'=>0, 'CARGO3'=>0, 'CARGO4'=>0, 'SUBTOTAL'=>0, 'PGNUMRECOR'=>0, 'TDOCNETEO'=>9, 'ABONO'=>0, 
								'PGITEM'=>0, 'CTA'=>1253, 'CC'=>0, 'GTO'=>0, 'DEBE'=>0, 'HABER'=>$TOTAL, 'BANCO'=>'', 'CARTOLA'=>0, 'CARTOAÑO'=>0, 
								'DEBE1'=>0, 'HABER1'=>0, 'DEBE2'=>0, 'HABER2'=>0, 'OLD_CSL'=>0, 'CAJERO'=>0, 'TURNO'=>0, 'SINANALIS'=>0, 
								'STATUS'=>0, 'FLUJO'=>0, 'FECHFLUJO'=>NULL, 'JDD'=>0, 'KMLL'=>0, 'TIPODESP'=>0, 'EMITEPACK'=>0, 'BODEGA'=>942, 
								'LETSEQ'=>'', 'ESELECTR'=>0, 'E_ENVIADO'=>0, 'FPAGELE'=>'', 'MPAGELE'=>'', 'RAZONREF'=>'', 'REFELE'=>0, 
								'OBRA'=>'', 'APPSTK'=>0, 'PRCONCESION'=>0, 'NUMORDENC'=>'', 'TOTAL2M'=>0, 'NROOCCODE'=>'', 'FCHOCCODE'=>NULL, 
								'NROHESCODE'=>'', 'FCHHESCODE'=>NULL, 'NROGDVCODE'=>'', 'FCHGDVCODE'=>NULL, 'COMPCLS1'=>0, 'COMPCLS2'=>0, 
								'COMPCLS3'=>0]);

						} catch (\Exception $e) {
							$noDuplicado = false;
							sleep(1);
						}
                    }     
                    while ($noDuplicado == false);
                }
    			// Actualiza MovVen - MovDet
                else
                {
                    // Actualiza Modificar
                    DB::table('DOCU_DB')
				    ->where('NUMREG', $NUMREG)
				    ->update(['FECHA'=>$FECHA, 'NRUTFACT'=>$NRUTFACT, 'RUTFACT'=>$RUTFACT, 'NRUTCLIE'=>$NRUTCLIE, 
                                       'TOTNETO'=>$TOTNETO, 'FECHAMODIF'=>$FECHAMODIF, 'USERMODI'=>$USERMODI,
                      'IVA'=>$IVA, 'AFECTO'=>$TOTNETO, 'TOTIVA'=>$TOTIVA, 'TOTAL'=>$TOTAL, 'HABER'=>$TOTAL]);
				}
			
    			/* Borrar Detalle Venta */
                DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();

    			/* Graba Detalle Venta */

                /* Lee Artículo */
	    		$ART_DB    = DB::table('ART_DB')->where('NREGUIST', $nreguist)->select(DB::raw('Max(NOMBRE) NOMBRE'))->first();

                /* Nombre Producto */    
    			$DESCRIP   = $ART_DB->NOMBRE;
    			$DESCTO    = 0;
    			if ($CANTIDAD != 0)
    			{
    				$PRECUNIT  = ROUND(($TOTNETO / $CANTIDAD), 0);
    			}
    			else
	    		{
	    			$PRECUNIT  = 0;
	    		}

                $LOTE     = $idd;
			
                /* Inserta Detalle de Venta */
	    		DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$nreguist, 'DESCRIP'=>$DESCRIP, 'CANTIDAD'=>$CANTIDAD, 
	    		'PRECUNIT'=>$PRECUNIT, 'BODEGA'=>1, 'DESCTO'=>$DESCTO, 'NSERIE'=>'', 'CTACTBLE'=>993, 'CENCOSTO'=>0, 'ITEM'=>1, 
	    		'FACTSI'=>0, 'COMIS'=>0, 'SQNVDET'=>0, 'SQGDDET'=>0, 'SQOCDET'=>0, 'PRODUCCN'=>0, 'LIQDDO'=>'', 'NUMOT'=>0, 
	    		'TJ_STKAC'=> $PRECUNIT, 'TJ_VALPR'=> $PRECUNIT, 'TJ_SORT'=>1, 'TJ_SUBSORT'=> $PRECUNIT, 'TJ_COSTEAR'=>0, 
	    		'FACTORIMP'=>1, 'TJ_MTOAC'=>0, 'TAX'=>0, 'NRO_ROL'=>0, 'LOT_IDE'=>$LOTE, 'VENCE'=>NULL, 'TJ_OM'=>0, 'TIP_TAX'=>0, 
	    		'TIPOOP'=>0, 'JDD'=>0, 'PREC_CMBIO'=>'', 'PREC_LISTA'=>0, 'TIME_DET'=>'', 'TSTK_LOT'=>0, 'CAMPO_D1'=>NULL, 
	    		'CAMPO_D2'=>NULL, 'MERMA'=>0, 'numfv12'=>0, 'LETSEQ'=>'', 'SQOTDET'=>0, 'CANTOTFAC'=>0, 'SQFBDET'=>0, 'despcant'=>0, 
	    		'ingcant'=>0, 'sqvivs'=>0, 'ciclogv'=>'', 'tj_precunit'=>$PRECUNIT, 'CANTIRECEP'=>0, 'SEQDEPENDE'=>0, 'SQPKNV'=>0, 
	    		'GTO1'=>0, 'CICLOGV2'=>'', 'SQDETVGO'=>0, 'VSGDOT'=>0, 'NNUMFV'=>0, 'SQGTRDET'=>0, 'FEPPUN'=>0, 'NROITEMREFCODE'=>'', 
	    		'ID_PRODUCTO'=>0, 'TJ_PRECUNIT2'=>$PRECUNIT, 'TJ_VALPR2'=>$PRECUNIT, 'TJ_MTOAC2'=>$PRECUNIT]);

				// Actualiza Valor Costo Producto Granel
                DB::table('ART_DB')
				->where('NREGUIST', $nreguist)
				->update(['VALPROM'=>$PRECUNIT]);

                /* Valores del control de calidad */
                if (isset($data['materias_primas'])) 
	    		{
                    /* Borra detalle de preguntas*/
		    		DB::table('PRODUCCION_CONTROL_CALIDAD')->where('IDPLANIFICACION', '=', $IDFORMULA)->delete();

                    foreach($data['materias_primas'] as $ii=>$mp) 
	    			{
						$ID         = $mp["ID"];
						$RESPUESTA  = $mp["RESPUESTA"];
						$rangos_inf = $mp["rangos_inf"];
						$opcion     = $mp["opcion"];

                        /* Ingresa nuevo detalle */
    		 		    DB::table('PRODUCCION_CONTROL_CALIDAD')->INSERT(['IDPLANIFICACION'=>$idd, 'IDPREGUNTA'=>$ID, 'RESPUESTA'=>$RESPUESTA, 'rangos_inf'=>$rangos_inf, 'opcion'=>$opcion]);
                    }
                }

                /* Ingresa nueva */
				DB::table('PRODUCCION_PLANIFICACION')->where('ID', $idd)->update(array('ESTADO' => 3, 'NROGR' => $NUMFACT, 'LOTE'=> $LOTE));
				DB::statement('exec spProcesaStock');
				
                /* Mensaje de grabación */
                $message  = ['content' => 'La solicitud fue grabada. '.$idd, 'type' => 'success', 'id' => $idd];
                $response = ['status' => 200, 'message' => $message];
			}
			else
			{
                /* Valores del control de calidad */
                if (isset($data['materias_primas'])) 
	    		{
                    /* Borra detalle de preguntas*/
		    		DB::table('PRODUCCION_CONTROL_CALIDAD')->where('IDPLANIFICACION', '=', $IDFORMULA)->delete();

                    foreach($data['materias_primas'] as $ii=>$mp) 
	    			{
						$ID         = $mp["ID"];
						$RESPUESTA  = $mp["RESPUESTA"];
						$rangos_inf = $mp["rangos_inf"];
						$opcion     = $mp["opcion"];

                        /* Ingresa nuevo detalle */
    		 		    DB::table('PRODUCCION_CONTROL_CALIDAD')->INSERT(['IDPLANIFICACION'=>$idd, 'IDPREGUNTA'=>$ID, 'RESPUESTA'=>$RESPUESTA, 'rangos_inf'=>$rangos_inf, 'opcion'=>$opcion]);
                    }
                }

                /* Mensaje de grabación */
                $message  = ['content' => 'Solicitud grabada, pero debe grabar respuestas. '.$idd, 'type' => 'success', 'id' => $idd];
                $response = ['status' => 200, 'message' => $message];
			}
			
		}
		

		return Response::json($response, $response['status']);
	}
}