<?php

class ProductosController extends \BaseController {

	public static $jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'NREGUIST',
			'hidden' => true
		],
		[
			'label' => 'Codigo Diken',
			'name' => 'CODIGO',
		],
		[
			'label' => 'Codigo Bañados',
			'name' => 'CODIGO_BANADOS',
		],
		[
			'label' => 'Nombre',
			'name' => 'NOMBRE',
		],
		/*
		[
			'label' => 'Tipo',
			'name' => 'TIPO',
			'stype' => 'select',
			'searchoptions' => [
				'value' => ':;1:Producto Terminado; 2:Materia Prima; 3:Envases; 7:Productos Granel'
			]
		],
		*/
		[
			'label' => 'Familia',
			'name' => 'CLASE2',
		],
		[
			'label' => 'Proveedor',
			'name' => 'NOM_PROV',
		],
		[
			'label' => 'Unid.Med',
			'name' => 'UNIDMED',
		],
		[
			'label' => 'Precio Venta',
			'name' => 'PRECVTA',
		],
		[
			'label' => 'Estado',
			'name' => 'ELIMINADO',
			'stype' => 'select',
			'searchoptions' => [
				'value' => ':;0:Habilitado;1:Eliminado',
			]
		]
	];

	public static $tipo_productos = [
		1 => 'Producto Terminado',
		2 => 'Materia Prima',
		3 => 'Envases',
		7 => 'Productos Granel'
	];

	public static $estado_productos = [
		0 => 'Habilitado',
		1 => 'Eliminado'
	];

	/**
	 * Muestra grilla de Productos
	 * @return mixed
	 */
	public function index($tipoprod) {
		$title         = '';
        $TIPOPROD      = '';
		/* Producto Terminado */
		if ($tipoprod == 1)
		{
			$title     = 'Productos Envasados';
			$TIPOPROD  = 'PRODUCTOS ENVASADOS';
		}
		/* Materia Prima */
		if ($tipoprod == 2)
		{
			$title     = 'Materias Primas';
			$TIPOPROD  = 'MATERIAS PRIMAS';
		}
		/* Envases */
		if ($tipoprod == 3)
		{
			$title     = 'Envases';
			$TIPOPROD  = 'ENVASES';
		}
		/* Productos Granel */
		if ($tipoprod == 7)
		{
			$title     = 'Productos Granel';
			$TIPOPROD  = 'PRODUCTOS GRANEL';			
		}

		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('productos', self::$jqgrid_colmodel);
		$clase1   = DB::table('vFamilias')->lists('DESCRIP', 'DESCRIP');
		$clase2   = DB::table('vSubFamilias')->lists('DESCRIP', 'DESCRIP');
		$clase3   = DB::table('vSubSubFamilias')->lists('DESCRIP', 'DESCRIP');
		$prodban  = DB::table('vListaProductosBanados')->lists('NOMBRE', 'NREGUIST');
		$unidmed  = DB::table('PRODUCCION_UNIMED')->lists('UNIMED', 'UNIMED');
		$TIPOGRAN = DB::table('tipogranel')->lists('nombregranel', 'id');

		$tipo    = self::$tipo_productos;
		$estado  = self::$estado_productos;
		return View::make('productos.index', compact('title', 'clase1', 'clase2', 'clase3', 'tipo', 'estado', 'tipoprod', 'TIPOPROD', 'prodban', 'unidmed', 'TIPOGRAN'));
	}

	/**
	 * Genera el json para cargar los datos en jqgrid
	 * @return string
	 */
	public function datagrid($tipoprod) {
		Jqgrid::init('vProductos', self::$jqgrid_colmodel, self::jqgrid_format());
		Jqgrid::get_query()->where('TIPO', $tipoprod);
		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, ['PRECVTA'])) {
				$result = moneda($value);
			} else if($column == 'TIPO') {
				$result = self::$tipo_productos[$value];
			} else if($column == 'ELIMINADO') {
				if ($value == 0)
				{
					$result = "<div style='color: green;'><b>".self::$estado_productos[$value]."</b></div>";
				}
				else
				{
					$result = "<div style='color: red;'><b>".self::$estado_productos[$value]."</b></div>";
				}
			}
			return $result;
		};
	}

	/**
	 * Agrega un nuevo producto
	 *
	 * @return Response
	 */
	public function agregar()
	{
		$vdata = [
			'CODIGO'      => \Input::get('CODIGO'),
			'NOMBRE'      => \Input::get('NOMBRE'),
			'TIPO'        => \Input::get('TIPO'),
			'TIPOGRAN'    => \Input::get('TIPOGRAN'),
			'DENSIDAD'    => \Input::get('DENSIDAD')?:0,
			'CLASE1'      => \Input::get('CLASE1'),
			'CLASE2'      => \Input::get('CLASE2'),
			'CLASE3'      => \Input::get('CLASE3'),
			'CLASE4'      => \Input::get('CLASE4'),
			'NOM_PROV'    => \Input::get('NOM_PROV'), //PROVEEDOR
			'PRECVTA'     => \Input::get('PRECVTA'), //PRECIO VENTA
			'UNIDMED'     => \Input::get('UNIDMED'), //UNIDMED
			'TIPOGRAN'    => \Input::get('TIPOGRAN') //TIPOGRAN
		];

        /* Agregar valor al arreglo */
        if (Input::get('TIPO') == 1)
		{
			$vrules = [
	    	    'CODIGO'            => 'required',
		        'NOMBRE'            => 'required',
				'TIPOGRAN'          => 'required',
				'CLASE2'            => 'required',
				'PRECVTA'           => 'required',        //PRECIO VENTA
    		    'NOM_PROV'          => 'required|max:45', //PROVEEDOR
    		];
    		$vmessages = [
				'CODIGO.required'   => 'El valor del campo Codigo ya existe.',
     		    'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
     		    'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
     		    'NOMBRE.unique'     => 'El campo Nombre es obligatorio.',
     		    'TIPOGRAN.unique'   => 'El campo Tipo es obligatorio.',
				'CLASE2.required'   => 'El campo Familia es obligatorio.',
				'PRECVTA.required'  => 'El campo Precio Unitario es obligatorio.', //PRECIO VENTA
     		    'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.',
			    'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
    		];
		}
        /* Agregar valor al arreglo */
        if (Input::get('TIPO') == 2)
	    {
     	    $vrules = [
      	        'CODIGO'            => 'required',
    		    'NOMBRE'            => 'required|max:45',
				'TIPOGRAN'          => 'required',
				'NOM_PROV'          => 'required|max:45', //PROVEEDOR
				'UNIDMED'           => 'required',
        	];
        	$vmessages = [
         	    'CODIGO.required'   => 'El campo Código es obligatorio.',
         	    'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
         	    'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
				'TIPOGRAN.required' => 'El campo Tipo es obligatorio.', //TIPOGRAN,
        	    'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
				'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
        	    'UNIDMED.required'  => 'El campo Unidade de Medida es obligatorio.', //PROVEEDOR,
        	];
    	}
        /* Agregar valor al arreglo */
		if (Input::get('TIPO') != 1 && Input::get('TIPO') != 2)
		{
     		$vrules = [
	    	    'CODIGO'            => 'required',
		        'NOMBRE'            => 'required',
		        'TIPOGRAN'          => 'required',
    		    'CLASE2'            => 'required',
    		    'NOM_PROV'          => 'required|max:45', //PROVEEDOR
    		];
    		$vmessages = [
     		    'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
     		    'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
     		    'NOMBRE.unique'     => 'El campo Nombre es obligatorio.',
				'TIPOGRAN.required' => 'El campo Tipo es obligatorio.', //TIPOGRAN,
     		    'CLASE2.required'   => 'El campo Familia es obligatorio.',
     		    'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.',
			    'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
    		];
		}

		$CLASE1                 = 'QUIMICOS';
		$CLASE2                 = $vdata['CLASE2'];
		$PRECVTA                = $vdata['PRECVTA'];

		$vdata['CLASE4']        = ''; 
		if (Input::get('TIPO') != 1)
		{
			$PRECVTA            = 0;
		}
		if (Input::get('TIPO') == 2)
		{
			$CLASE2             = 'MATERIAS PRIMAS';
			$vdata['UNIDMED']   = '';
		}
		if (Input::get('TIPO') == 3)
		{
			$CLASE3             = '';
			$CLASE4             = '';
			$vdata['UNIDMED']   = '';
		}

//		$validador    = Validator::make($vdata, $vrules, $vmessages);
//		if($validador->fails()) {
//			$response = $validador->messages();
//			return Response::json($response, 422);
//		} else {
            /* Graba */
			DB::statement('exec dbo.spGrabaProductos @NREGUIST = ?, @CODIGO = ?, @NOMBRE = ?, @TIPO = ?, @NOMBRE2 = ?, @CLASE1 = ?, @CLASE2 = ?, @CLASE3 = ?, @CLASE4 = ?, @PRECVTA = ?, @DENSIDAD = ?, @ELIMINADO = ?, @UNIDMED = ?, @TIPOGRAN = ?', [0, $vdata['CODIGO'], $vdata['NOMBRE'], $vdata['TIPO'], $vdata['NOM_PROV'], $CLASE1, $CLASE2, $vdata['CLASE3'], $vdata['CLASE4'], $PRECVTA, $vdata['DENSIDAD'], 0, $vdata['UNIDMED'], $vdata['TIPOGRAN']]);
			$message = ['content' => 'El Producto fue agregado.', 'type' => 'success'];
			$response = ['status' => 200, 'message' => $message];
//		}

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

	/**
	 * Obtiene producto a partir de id
	 *
	 * @param int $id
	 * @return mixed
	 */
	public function obtener($id) {
		$producto = DB::table('vProductos')
			->where('NREGUIST', $id)
			->select('CODIGO', 'NOMBRE',  'NREGUIST_PROD_BANADOS', 'TIPO', 'TIPOPROD', 'CLASE1', 'TIPOPROD1', 'CLASE2', 'CLASE3', 'CLASE4', 'NOM_PROV', 'PRECVTA', 'DENSIDAD','ELIMINADO', 'NOMBRE_BANADOS', 'UNIDMED', 'TIPOGRAN')
			->first();
	
		if (empty($producto)) 
		{
   		    $producto                        = new stdClass;
		    $producto->CODIGO                = '';
			$producto->NOMBRE                = '';
			$producto->NREGUIST_PROD_BANADOS = 0;			
		    $producto->TIPO                  = 0;
		    $producto->TIPOPROD              = '';
     		$producto->CLASE1                = '';
    		$producto->TIPOPROD1             = '';
			$producto->CLASE2                = 'MATERIAS PRIMAS';
    		$producto->CLASE3                = '';
    		$producto->CLASE4                = '';
    		$producto->NOM_PROV              = '';
    		$producto->PRECVTA               = 0;
    		$producto->DENSIDAD              = 1;
    		$producto->ELIMINADO             = 0;
			$producto->NOMBRE_BANADOS        = '';
			$producto->UNIMED                = '';
			$producto->TIPOGRAN              = '';
		}
		
		return Response::json($producto, 200);
	}

	/**
	 * Editar un nuevo producto
	 *
	 * @return Response
	 */
	public function editar()
	{
		$vdata = [
			'id'                    => \Input::get('id'),
			'CODIGO'                => \Input::get('CODIGO'),
			'NREGUIST_PROD_BANADOS' => \Input::get('NREGUIST_PROD_BANADOS'),
			'NOMBRE'                => \Input::get('NOMBRE'),
			'TIPO'                  => \Input::get('TIPO'),
			'DENSIDAD'              => \Input::get('DENSIDAD')?:0,
			'CLASE1'                => \Input::get('CLASE1'),
			'CLASE2'                => \Input::get('CLASE2'),
			'CLASE3'                => \Input::get('CLASE3'),
			'CLASE4'                => \Input::get('CLASE4'),
			'NOM_PROV'              => \Input::get('NOM_PROV'), //PROVEEDOR
			'PRECVTA'               => \Input::get('PRECVTA'), //PRECIO VENTA
			'ELIMINADO'             => \Input::get('ELIMINADO'), //ELIMINADO
			'UNIDMED'               => \Input::get('UNIDMED'), //UNIDMED
			'TIPOGRAN'              => \Input::get('TIPOGRAN'), //TIPOGRAN
		];

        /* Agregar valor al arreglo */
		if (Input::get('TIPO')      == 1)
		{
            /* Validaciones*/
			if ($vdata['id'] == 0)
            {
                /* Reglas */
	    		$vrules = [
	        		'CODIGO'            => 'required|unique:ART_DB',
		        	'NOMBRE'            => 'required',
    				'CLASE2'            => 'required',
    				'PRECVTA'           => 'required', //PRECIO VENTA
        			'NOM_PROV'          => 'required|max:45', //PROVEEDOR
        		];

        		$vmessages = [
					'CODIGO.required'   => 'El campo Código es obligatorio.',
					'CODIGO.unique'     => 'El campo Código ya está ingresado.',
         			'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
         			'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
    				'CLASE2.required'   => 'El campo Familia es obligatorio.',
         			'PRECVTA.required'  => 'El campo Familia es obligatorio.',
         			'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
    				'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
        		];
            }
			else
            {
                /* Reglas */
	    		$vrules = [
	        		'CODIGO'            => 'required',
		        	'NOMBRE'            => 'required',
    				'CLASE2'            => 'required',
    				'PRECVTA'           => 'required', //PRECIO VENTA
        			'NOM_PROV'          => 'required|max:45', //PROVEEDOR
        		];

        		$vmessages = [
        			'CODIGO.required'   => 'El campo Código es obligatorio.',
         			'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
         			'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
    				'CLASE2.required'   => 'El campo Familia es obligatorio.',
         			'PRECVTA.required'  => 'El campo Familia es obligatorio.',
         			'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
    				'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
        		];
            }

		}

        /* Agregar valor al arreglo */
		if (Input::get('TIPO')      == 2)
		{
            /* Validaciones*/
			if ($vdata['id'] == 0)
            {
                /* Reglas */
         		$vrules = [
	        		'CODIGO'            => 'required|unique:ART_DB',
		        	'NOMBRE'            => 'required',
        			'CLASE2'            => 'required',
					'NOM_PROV'          => 'required|max:45', //PROVEEDOR
        			'UNIDMED'           => 'required|max:6',
        		];
        		$vmessages = [
					'CODIGO.required'   => 'El campo Código es obligatorio.',
					'CODIGO.unique'     => 'El campo Código ya está ingresado.',
         			'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
         			'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
         			'CLASE2.required'   => 'El campo Familia es obligatorio.',
         			'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
					'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',				
					'UNIDMED.required'  => 'El campo Unidad de Medida es obligatorio.', //UNIDMED,
					'UNIDMED.max'       => 'El valor del campo Unidad de Medida debe tener máximo 6 caracteres.',
				];
			}
			else
            {
                /* Reglas */
         		$vrules = [
	        		'CODIGO'            => 'required',
		        	'NOMBRE'            => 'required',
        			'CLASE2'            => 'required',
					'NOM_PROV'          => 'required|max:45', //PROVEEDOR
        			'UNIDMED'           => 'required|max:6',					
        		];
        		$vmessages = [
    	    		'CODIGO.required'   => 'El campo Código es obligatorio.',
         			'NOMBRE.required'   => 'El valor del campo Nombre ya existe.',
         			'NOMBRE.max'        => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
         			'CLASE2.required'   => 'El campo Familia es obligatorio.',
         			'NOM_PROV.required' => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
					'NOM_PROV.max'      => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',
					'UNIDMED.required'  => 'El campo Unidad de Medida es obligatorio.', //UNIDMED,					
					'UNIDMED.max'       => 'El valor del campo Unidad de Medida debe tener máximo 6 caracteres.',
				];
			}
		}
        /* Agregar valor al arreglo */
		if (Input::get('TIPO') != 1 && Input::get('TIPO') != 2)
		{
            /* Validaciones*/
			if ($vdata['id'] == 0)
            {
    			$vrules = [
	    	        'CODIGO'            => 'required|unique:ART_DB',
		    	    'NOMBRE'            => 'required|max:45',
    			    'CLASE2'            => 'required',
    			    'NOM_PROV'          => 'required|max:45', //PROVEEDOR
    		    ];

     		    $vmessages = [
     			   'CODIGO.required'    => 'El campo Código es obligatorio.',
    			   'NOMBRE.required'    => 'El valor del campo Nombre ya existe.',
    			   'NOMBRE.max'         => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
    			   'CLASE2.required'    => 'El campo Familia es obligatorio.',
    			   'NOM_PROV.required'  => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
    			   'NOM_PROV.max'       => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',
				 ];
			}
			else
            {
    			$vrules = [
	    	        'CODIGO'            => 'required',
		    	    'NOMBRE'            => 'required|max:45',
    			    'CLASE2'            => 'required',
    			    'NOM_PROV'          => 'required|max:45', //PROVEEDOR
    		    ];

     		    $vmessages = [
					'CODIGO.required'    => 'El campo Código es obligatorio.',
					'CODIGO.unique'     => 'El campo Código ya está ingresado.',
    			    'NOMBRE.required'    => 'El valor del campo Nombre ya existe.',
    			    'NOMBRE.max'         => 'El valor del campo Nombre debe tener máximo 45 caracteres.',
    			    'CLASE2.required'    => 'El campo Familia es obligatorio.',
    			    'NOM_PROV.required'  => 'El campo Nombre Proveedor es obligatorio.', //PROVEEDOR,
    			    'NOM_PROV.max'       => 'El valor del campo Nombre Proveedor debe tener máximo 45 caracteres.',
				 ];
			}
	    }
		
		$validador = Validator::make($vdata, $vrules, $vmessages);
		$CLASE1    = 'QUIMICOS';

		$vdata['CLASE3'] = ''; 
		$vdata['CLASE4'] = ''; 
		if (Input::get('TIPO') != 1)
		{
			$vdata['PRECVTA']               = 0;
			$vdata['NREGUIST_PROD_BANADOS'] = 0;
		}
		if (Input::get('TIPO') != 2)
		{
			$vdata['UNIDMED']               = '';
		}
		if (Input::get('TIPO') == 3)
		{
			$vdata['CLASE3']    = '';
			$vdata['CLASE4']    = '';
			$vdata['UNIDMED']   = '';
		}

		if($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		} else {
			DB::statement('exec dbo.spGrabaProductos @NREGUIST = ?, @CODIGO = ?, @NOMBRE = ?, @TIPO = ?, @NOMBRE2 = ?, @CLASE1 = ?, @CLASE2 = ?, @CLASE3 = ?, @CLASE4 = ?, @PRECVTA = ?, @DENSIDAD = ?, @ELIMINADO = ?, @NREGUIST_BANADOS = ?, @UNIDMED = ?, @TIPOGRAN = ?', [$vdata['id'], $vdata['CODIGO'], $vdata['NOMBRE'], $vdata['TIPO'], $vdata['NOM_PROV'], $CLASE1, $vdata['CLASE2'], $vdata['CLASE3'], $vdata['CLASE4'], $vdata['PRECVTA'], $vdata['DENSIDAD'], $vdata['ELIMINADO'], $vdata['NREGUIST_PROD_BANADOS'], $vdata['UNIDMED'], $vdata['TIPOGRAN']]);
			$message = ['content' => 'El Producto fue agregado.', 'type' => 'success'];
			$response = ['status' => 200, 'message' => $message];


			DB::table('TEXTO')->insert(['TEXTO'=>$vdata['TIPOGRAN']]);

		}

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

	public function eliminar()
	{
		$id = Input::get('id');

		/* Elimina Producto si es que no tiene transacciones asociadas */
		$productos = DB::table('vDetalleProductos')
			->where('NCODART', '=', "$id")
			->select(DB::raw('CANTIDAD'))
			->first();

		if (empty($productos)) 
		{
            /* Elimina Producto si es que no tiene transacciones asociadas */
            DB::statement("delete art_db where NREGUIST = $id");
            $message = ['content' => 'El Producto fue Eliminada.', 'type' => 'success'];
            $response = ['status' => 200, 'message' => $message];
		}
		else
        {
    		/* No puede Eliminar Producto si es que tiene transacciones asociadas */
		    $message = ['content' => 'Este Producto no puede borrarse, tiene transacciones asociadas.', 'type' => 'error'];
		    $response = ['status' => 404, 'message' => $message];
		}	

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

	public function select_productos_banados() {
		$query = Input::get('q', '');
		$productos = DB::table('vListaProductosBanados')
			->where('NOMBRE', 'LIKE', "%$query%")
			->select(DB::raw('NREGUIST as id, NOMBRE as text, PRECVTA as precio_venta'))
			->paginate(10);
		return $productos;
	}
}
