<?php

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

class FabricacionController 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'
			]
		],
		[
			'label' => 'Días',
			'name' => 'DIFERENCIA',
		],
	];

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

	public function datagrid() {
		Jqgrid::init('vPlanificacion', self::$jqgrid_colmodel, self::jqgrid_format(), self::jqgrid_filter_format());
		Jqgrid::get_query()->where('ESTADO', '1');
		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 == 1) 
			   {
                 $archivo = asset('img/candadoAbierto.png');
				 $result  = "<center><img src='$archivo' width='20' height='25'></center>";
			   }
			   else
			   {
                 $archivo = asset('img/candadoCerrado.png');
				 $result  = "<center><img src='$archivo' width='20' height='25'></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>";
			   }
			}
			if (in_array($column, ['texto'])) {
				$result = '<button type="button" id="REAGENDAR' . $value . '" name="REAGENDAR_' . $value . '" class="btn btn-primary" title="Reagendar formula"><i class="fa fa-calendar"></i></button>';
            }

			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;

		$formula           = DB::table('vFormulas')->where('NOMBRE', '=',$producto)->first();
		if(empty($formula)) {
			App::abort(404);
		}
		$volumen_formula   = $formula->LITROS;
        $volumen_fabricar  = $planificacion->CANTIDAD;
		$formula->VOLUMEN  = $planificacion->CANTIDAD;
		$porcentaje_fab    = ($volumen_fabricar / $volumen_formula) * 100;

//		$detalles_formula  = DB::table('vDetallesReserva')->where('NREGUIST', '=', $formula->NREGUIST)->get();
//		$detalles_formula  = DB::table('vDetallesFormula')->get();

		$agua = DB::table('vProductos')
			->where('NREGUIST', Config::get('settings.agua_id'))
			->first();

        /* Lee Detalle de la formula */
		$detalles_formula  = DB::table('vDetallesFormula')
			->where('vDetallesFormula.NREGUIST', '=', $formula->NREGUIST)
			->where('NREGUIST_MP', '<>', $agua->NREGUIST)
            ->join('ART_DB', 'ART_DB.NREGUIST', '=', 'vDetallesFormula.NREGUIST_MP')
			->select(DB::raw("vDetallesFormula.NREGUIST, rtrim(ltrim(vDetallesFormula.CODIGO)) CODIGO, NREGUIST_MP, rtrim(ltrim(vDetallesFormula.NOMBRE)) NOMBRE, DENSIDAD, PESO, PESO VOLUMEN, COSTO_UNIDAD, COSTO, 0 CANTIDAD, CASE WHEN vDetallesFormula.UNIDMED='Kilos' THEN vDetallesFormula.PESO/1000 ELSE vDetallesFormula.VOLUMEN/1000 END CantNecesaria, ORDEN ITEM, '' LOT_IDE"))
			->get();

		return View::make('fabricacion.editar', compact('id', 'title', 'planificacion', 'formula', 'detalles_formula', 'porcentaje_fab', 'agua'));
	}

	/**
	* Obtiene datos del Lote
	* @param $id
	* @return mixed
	*/
	 
	public function checkeaLote($codBarra) 
	{
        /* Lee ID planificacion */
        $formula          = array();
        $id               = Input::get('id');

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

		$formula           = DB::table('vFormulas')->where('NOMBRE', '=',$producto)->first();

        $NREGUIST_PROD     = $formula->NREGUIST;
		$volumen_formula   = $formula->LITROS;
        $volumen_fabricar  = $planificacion->CANTIDAD;
		$formula->VOLUMEN  = $planificacion->CANTIDAD;
		$porcentaje_fab    = ($volumen_fabricar / $volumen_formula) * 100;
		

        /* Construye código de barras */
        $necuentraGuion   = strrpos($codBarra, '-', 0);
		$nreguist         = substr($codBarra, 0, $necuentraGuion);
		$lote             = substr($codBarra, $necuentraGuion+1);

        /* Lee Detalle de la formula */
		$detalleFormula   = DB::table('vDetallesFormula')
			->where('NREGUIST', '=', $NREGUIST_PROD)
			->where('NREGUIST_MP', '=', $nreguist)
            ->select(DB::raw('Max(UNIDMED) UNIDMED, Max(PESO/1000) PESO, MAX(VOLUMEN/1000) VOLUMEN'))
			->first();
			
		if ($detalleFormula->UNIDMED=='Kilos')
		{
			$volumen_aFabricar = ($detalleFormula->PESO    * ($porcentaje_fab / 100));
		}
		else
		{
			$volumen_aFabricar = ($detalleFormula->VOLUMEN * ($porcentaje_fab / 100));
		}

        /* Lee código de barras */	
        $result = DB::table('vProductosConLotesSaldo')
            ->where('nreguist', '=', $nreguist)
            ->where('LOT_IDE', '=', $lote)
            ->select(DB::raw('CONVERT(DECIMAL(10,0), nreguist) nreguist, rtrim(ltrim(codigo)) codigo, rtrim(ltrim(nombre)) nombre, LOT_IDE, Cantidad'))	
            ->first();

        if (empty($result)) 
        {
            // Crea a nuevo Object stdClass Factura
            $result                = new stdClass;
            $result->nreguist      = 0; 
            $result->codigo        = '';
            $result->nombre        = '';
            $result->LOT_IDE       = '';
			$result->Cantidad      = 0;
			$result->CantNecesaria = 0;
			$result->aFabricar     = 0;

            $result->status        = 300;
        }
        else
        {
			/* Volumen necesario */	
			$volumen_disponible    = $result->Cantidad;
			$result->CantNecesaria = round($volumen_aFabricar, 3); 
			
            $result->status        = 200;
        }

		return Response::json($result);
	}


	/**
	* Obtiene código de barras desde la tabla de equivalencias
	*/
	 
	public function recuperaCodigo($codBarra) 
	{
        /* Lee Tabla de Lotes con el ID */

		$PRODUCCION_LOTES  = DB::table('PRODUCCION_LOTES')
		->select(DB::raw('NREGUIST, LOTE'))	
		->where('ID', '=',$codBarra)->first();

        if (empty($PRODUCCION_LOTES)) 
        {
            // Crea a nuevo Object stdClass Factura
            $PRODUCCION_LOTES           = new stdClass;
            $PRODUCCION_LOTES->NREGUIST = 0; 
            $PRODUCCION_LOTES->LOTE     = '';
//            $result->status        = 300;
        }
        else
        {
			/* Volumen necesario */	
//            $result->status        = 200;
		}

		$codBarraLote = $PRODUCCION_LOTES->NREGUIST.'-'.$PRODUCCION_LOTES->LOTE;

		return $codBarraLote;
	}

	public function recuperaCodigo2($codBarra) 
	{
        /* Lee Tabla de Lotes con el ID */

		$PRODUCCION_LOTES  = DB::table('PRODUCCION_LOTES')
		->select(DB::raw('NREGUIST, LOTE'))	
		->where('ID', '=',$codBarra)->first();

        if (empty($PRODUCCION_LOTES)) 
        {
            // Crea a nuevo Object stdClass Factura
            $PRODUCCION_LOTES           = new stdClass;
            $PRODUCCION_LOTES->NREGUIST = 0; 
            $PRODUCCION_LOTES->LOTE     = '';
//            $result->status        = 300;
        }
        else
        {
			/* Volumen necesario */	
//            $result->status        = 200;
		}

		$codBarraLote = $PRODUCCION_LOTES->NREGUIST.'-'.$PRODUCCION_LOTES->LOTE;

		return $codBarraLote;
	}


	/**
	 * Guarda fórmula en base de datos
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function editar_fabricacion() {
		$data      = json_decode(Input::get('data'), true);
		$nrovale   = Input::get('nrovale');
		$idd       = Input::get('id');

		$arreglo   = array();
		$vdata     = array();
		$vrules    = array();
		$vmessages = array();
		if (isset($data['materias_primas'])) 
        {
			/* Recorre para validación */			
			/*
		    foreach($data['materias_primas'] as $ii=>$mp) 
            {
				$id                 = $ii;
				if ($mp["codBarra"] != '')
                {
                    $vdata              = 
                    [
					   "CANTIDAD$id"  => isset($mp["cantidad"])?$mp["cantidad"]:'',
                    ];			
                    $vrules    = 
                    [
                       "CANTIDAD$id"  => 'required|numeric|min:1',
                    ];
                    $vmessages = 
                    [
                       "CANTIDAD$id.required" => 'El campo Cantidad debe ser meyor a 0.',
                       "CANTIDAD$id.min"      => 'El campo Cantidad debe ser meyor a 0.',
					];
				}
			}
			*/
		}

		$validador    = Validator::make($vdata, $vrules, $vmessages);
		if ($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		} elseif(!isset($data['materias_primas'])) {
			$message = ['content' => 'Debe agregar Materias Primas.', 'type' => 'error'];
			$response = ['status' => 409, 'message' => $message];
		}
        else {
                $FECHA       = date("d-m-Y");
                $USERMODI    = '';

				/* Vale de Salida de Materias Primas */
                if ($nrovale == 0 || $nrovale == mull)
                {
                   /* Campos */    
                   $TOTNETO     = 0;
                   $noDuplicado = false;
                   $i           = 0;

                   do 
				   {
                      $noDuplicado  = true; 

                      /* Lee Número Docto mayor */
                      $Docu_db = DB::table('DOCU_DB')
                      ->where('TIPODOC', 6)
                      ->select(DB::raw('Max(NumFact) NumFact'))
                      ->first();
					   
                      $NUMFACT      = $Docu_db->NumFact + 1;

                      /* Lee Número Reg mayor */
                      $Docu_db = DB::table('DOCU_DB')
                      ->select(DB::raw('Max(NumReg) NumReg'))
                      ->first();
					   
                      $NUMREG       = $Docu_db->NumReg  + 1;

                      try
                      {
                           /* Ingresa nueva */
                           DB::table('DOCU_DB')->insert(['NUMFACT'=>$NUMFACT, 'FECHA'=>$FECHA, 'NRUTFACT'=>0, 'RUTFACT'=>'','NRUTCLIE'=>0,
                              'PROFORMA'=>0, 'NUMREG'=>$NUMREG, 'CODVEND'=>0, 'GLOSACON'=>'Consumo m.Primas para fabricación', 
                              'NUMORDEN'=>0,'NUMGUIAF'=>'', 'FORMPAGO'=>'', 'VENCIMIE'=>null, 'MONEDA'=>'', 'DCTOTIPO'=>1,
                              'DCTOPJE'=>0, 'GARANTIA'=>0,'STOCK'=>1,'NULA'=>0,'CANCELA'=>0,'TOTNETO'=>0,
                              'TASACBIO'=>0,'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'=>19,
                              'TIPODOC'=>6,'ENTR_DIR'=>'','ENTR_COMU'=>'','ENTR_CIUD'=>'','ENTREGAR'=>'',
                              'CENTRZADO'=>0,'TRASPASO'=>0,'VALE'=>0,'FACTURAD'=>0,'BODEGATR'=>0,
                              'VENTA'=>0,'COMISION'=>0,'IMPRESA'=>0,'NOTAOBS'=>'','NOTAFACT'=>'',
                              'NDIASF'=>0,'NUMEMPDO'=>1,'NUMOTS'=>0,'NUMCORR'=>0,'FECHCONT'=>NULL,
                              'AFECTO'=>0,'EXENTO'=>0,'TOTIVA'=>0,'IMP1'=>0,'IMP2'=>0,'TOTAL'=>0,
                              'GASTO'=>0,'DOCPAGO'=>0,'SUCUR'=>1,'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'=>6,
                              'ABONO'=>0,'PGITEM'=>0,'CTA'=>0,'CC'=>0,'GTO'=>0,'DEBE'=>0,'HABER'=>0,'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'=>0,
                              '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);
				   $nrovale           = $NUMFACT;
                }

                if (isset($data['materias_primas'])) {
                   $ITEM              = 0;
                   foreach($data['materias_primas'] as $ii=>$mp) 
				   {
	
					   if ($mp["codBarra"] != '')
                       {
   	 				       $NCODART   = $mp["nreguist"];
					       $DESCRIP   = $mp["nombre"];
					       $CANTIDAD  = $mp["cantidad"];
					       $PRECUNIT  = 0;
					       $LOT_IDE   = $mp["LOT_IDE"];
                           $ITEM      = $ITEM + 1;

                           /* Lee PRECIO producto */
                           $ART_DB    = DB::table('ART_DB')
                           ->where('NREGUIST', $NCODART)
                           ->select(DB::raw('Max(VALPROM) VALPROM'))
                           ->first();
						   $PRECUNIT  = $ART_DB->VALPROM;

						   /*
						   $texto = '01';
						   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
                           */
						   
                           /* Lee PRECIO desde la Guia de Recepción */
						   $DOCDE_DB  = DB::table('DOCDE_DB')
						   ->join('DOCU_DB','DOCU_DB.NUMREG','=','DOCDE_DB.NUMRECOR')						   
                           ->where('NCODART', $NCODART)
                           ->where('LOT_IDE', $LOT_IDE)
                           ->where('TIPODOC', 9)
						   ->select(DB::raw('Max(ROUND(PRECUNIT,0)) VALPROM'))
                           ->first();

						   $PRECUNIT  = $DOCDE_DB->VALPROM;

						   /*
						   $texto = '02' . $NCODART ; //. ' __ ' . $PRECUNIT;
						   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
*/
						   
						   /* Lee PPP Código producto */
						   $valor     = DB::select("SET NOCOUNT ON; exec dbo.spPrecioPonderado @NCODART=$NCODART");
						   $PRECUNIT  = $valor[0]->PPP;									   

                           /* Ingresa nuevo detalle */
                           DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$NCODART, 'DESCRIP'=> "$DESCRIP", 'CANTIDAD'=>$CANTIDAD, 
                                                   'PRECUNIT'=>$PRECUNIT, 'BODEGA'=>1, 'DESCTO'=>0, 'NSERIE'=> $LOT_IDE, 'CTACTBLE'=>994, 'CENCOSTO'=>0, 
                                                              'ITEM'=>$ITEM, 'FACTSI'=>0, 'COMIS'=>0, 'SQNVDET'=>0, 'SQGDDET'=>0, 'SQOCDET'=>0, 
                                                          'PRODUCCN'=>0, 'LIQDDO'=>'', 'NUMOT'=>1, 'TJ_STKAC'=>0, 'TJ_VALPR'=>$PRECUNIT, 'TJ_SORT'=>13, 
                                                                 'TJ_SUBSORT'=>$ITEM, 'TJ_COSTEAR'=>1, 'FACTORIMP'=>0, 'TJ_MTOAC'=>0, 'TAX'=>0, 
                                                       'NRO_ROL'=>0, 'LOT_IDE'=>$LOT_IDE, 'VENCE'=>NULL, 'TJ_OM'=>0, 'TIP_TAX'=>0, 'TIPOOP'=>2, 
                                                                    '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'=>0, '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'=>0, 'TJ_VALPR2'=>0, 'TJ_MTOAC2'=>0]);

																		 /*
						   $texto = '22';
						   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
						   */
											  
                       }
                   }
               }

               /* Fecha Vencimiento  */
			   $fecha_actual      = date("d-m-Y");

			   /* Sumar 1 año */
               $fecha_vencimiento = date("d-m-Y",strtotime($fecha_actual."+ 1 year"));
  
/*
			   $texto = $idd . ' ' . $nrovale . ' ' . $fecha_vencimiento;
			   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
*/
               /* Ingresa nueva */
               DB::table('PRODUCCION_PLANIFICACION')->where('ID', $idd)->update(array('ESTADO' => 2, 'NROVALE' => $nrovale, 'FECHA_ELABORACION' => date('Ymd H:i'), 'FECHA_VENCIMIENTO' => $fecha_vencimiento));
/*
			   $texto = '2';
			   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
*/
			   DB::statement('exec spProcesaStock');
/*
			   $texto = '3';
			   DB::table('TEXTO')->insert(['TEXTO'=>$texto]);
*/
               /* Mensaje de grabación */
               $message  = ['content' => 'La solicitud fue grabada. '.$idd, 'type' => 'success', 'id' => $idd];
               $response = ['status' => 200, 'message' => $message];
		}

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

	/**
	 * Elimina planificación de base de datos
	 * @return mixed
	 */
	public function eliminar() {
		$success = DB::table('PRODUCCION_PLANIFICACION')
			->where('ID', Input::get('id'))
			->delete();

		if($success) {
			$message = ['content' => 'La fabricación fue eliminada.', 'type' => 'success'];
			$response = ['status' => 200, 'message' => $message];
		} else {
			$message = ['content' => 'La fabricación no pudo ser eliminada.', 'type' => 'error'];
			$response = ['status' => 409, 'message' => $message];
		}

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