<?php

class etiquetasController extends \BaseController {

	public static $jqgrid_colmodel = [
		[
			'label'  => 'Id',
			'name'   => 'ID',
			'hidden' => true
		],
		[
			'label'  => 'Num.Guía',
			'name'   => 'NumFact',
		],
		[
			'label'  => 'Fecha',
			'name'   => 'Fecha',
			'searchoptions' => [
				'sopt' => ['custom']
			]
		],
		[
			'label'  => 'RUT',
			'name'   => 'Rut',
		],
		[
			'label'  => 'Nombre Proveedor',
			'name'   => 'RazSoc',
		],
		[
			'label'  => 'nreguist',
			'name'   => 'nreguist',
			'hidden' => true,
		],
		[
			'label'  => 'Código',
			'name'   => 'codigo',
		],
		[
			'label'  => 'Nombre Producto',
			'name'   => 'nombre',
		],
		[
			'label'  => 'Lote',
			'name'   => 'LOT_IDE',
		],
		[
			'label'  => 'Cantidad',
			'name'   => 'cantidad',
		],
		[
			'label'  => 'Acciones',
			'name'   => 'texto',
		],
	];
	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index() {
		$title = 'Impresión de Etiquetas';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('etiquetas', self::$jqgrid_colmodel);
		return View::make('etiquetas.index', compact('title'));
	}

	public function datagrid() {
		Jqgrid::init('vProductosConLotes', self::$jqgrid_colmodel, self::jqgrid_format(), self::jqgrid_filter_format());
		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, ['Fecha'])) {
				$result = date('d-m-Y', strtotime($value));
			} 
            if (in_array($column, ['cantidad'])) {
	              $result = number_format($value, 0, ',', '.');
			}
            if (in_array($column, ['texto'])) {
	              $result = '<button type="button" name="IMPRIMIR_' . $value . '" class="btn btn-primary btn-imprimir" title="Imprimir Barra"><i class="fa fa-barcode"></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'])) {
				$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 ingreso mercadería
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function vista_agregar() {
		$title = 'Agregar';
		Breadcrumb::append_crumb('Ingresos');
		Breadcrumb::append_crumb($title);
		return View::make('ingresos.agregar', compact('title'));
	}

	/**
	 * Guarda ingreso en base de datos
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function agregar_ingreso() {
		$data = json_decode(Input::get('datos'), true);
		//Validacion
		$vdata = [
			'NUMREG' => isset($data['numreg_oc'])?$data['numreg_oc']:'',
			'NUMGUIA' => isset($data['num_guia'])?$data['num_guia']:'',
		];
		$vrules = [
			'NUMREG' => 'required',
			'NUMGUIA' => 'required',
		];
		$vmessages = [
			'NUMREG.required' => 'El campo Nº Orden de Compra es obligatorio.',
			'NUMGUIA.required' => 'El campo Nº Guía de Recepción es obligatorio.',
		];

		$totneto = 0;
		if(isset($data['mercaderias'])) {
			foreach($data['mercaderias'] as $m) {
				$totneto += $m['cantreci'] * $m['preciounit'];
				$lote = implode(',', array_column(array_filter($data['mercaderias'], function($v) use ($m) {return $v['id'] != $m['id'] && $v['ncodart'] == $m['ncodart'];}), 'lote'));
				$cantidad = array_sum(array_column(array_filter($data['mercaderias'], function($v) use ($m) {return $v['id'] != $m['id'] && $v['ncodart'] == $m['ncodart'];}), 'cantreci'));
				$cant_restante = $m['cantres'];
				$vdata["PRECIOUNIT.{$m['id']}"] = $m['preciounit'];
				$vdata["CANTRECI.{$m['id']}"] = ($m['cantreci'] != '')?$m['cantreci'] + $cantidad:'';
				$vdata["LOTE.{$m['id']}"] = $m['lote'];
				if(Input::hasFile("ARCHIVO_{$m['id']}")) $vdata["ARCHIVO.{$m['id']}"] = Input::file("ARCHIVO_{$m['id']}");

				$cantidad ++;
				$precio_min = $m['preciounitoc'] * 0.8;
				$precio_max = $m['preciounitoc'] * 1.2;
				$vrules["PRECIOUNIT.{$m['id']}"] = "required|numeric|min:$precio_min|max:$precio_max";
				$vrules["CANTRECI.{$m['id']}"] = "required|numeric|min:$cantidad|max:$cant_restante";
				$vrules["LOTE.{$m['id']}"] = "required|not_in:$lote";
				if(Input::hasFile("ARCHIVO_{$m['id']}")) $vrules["ARCHIVO.{$m['id']}"] = 'mimes:pdf';

				$vmessages["PRECIOUNIT.{$m['id']}.required"] = 'El campo Precio Unit. es obligatorio.';
				$vmessages["PRECIOUNIT.{$m['id']}.numeric"] = 'El campo Precio Unit. debe ser numérico.';
				$vmessages["PRECIOUNIT.{$m['id']}.min"] = 'El campo Precio Unit. debe ser mayor o igual a :min.';
				$vmessages["PRECIOUNIT.{$m['id']}.max"] = 'El campo Precio Unit. no puede ser mayor que :max.';
				$vmessages["CANTRECI.{$m['id']}.required"] = 'El campo Cant. Recibida es obligatorio.';
				$vmessages["CANTRECI.{$m['id']}.numeric"] = 'El campo Cant. Recibida debe ser numérico.';
				$vmessages["CANTRECI.{$m['id']}.min"] = 'El campo Cant. Recibida debe ser mayor a 0.';
				$vmessages["CANTRECI.{$m['id']}.max"] = 'La suma del campo Cant. Recibida de estos productos no puede ser mayor que :max.';
				$vmessages["LOTE.{$m['id']}.not_in"] = 'El campo Lote no puede estar repetido en un mismo producto.';
				$vmessages["LOTE.{$m['id']}.required"] = 'El campo Lote es obligatorio.';
				if(Input::hasFile("ARCHIVO_{$m['id']}")) $vmessages["ARCHIVO.{$m['id']}.mimes"] = 'El campo Archivo deber ser .pdf';
			}
		}

		$validador = Validator::make($vdata, $vrules, $vmessages);

		if($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		} elseif(!isset($data['mercaderias'])) {
			$message = ['content' => 'Debe agregar Mercaderias.', 'type' => 'error'];
			$response = ['status' => 409, 'message' => $message];
		} else {
			//GUARDA
			DB::statement('exec dbo.spInsertaGuiaRecepcionCabecera @FECHA = ?, @NUMREG_OC = ?, @NUMGUIA = ?, @TOTNETO = ?, @USERMODI = ?', [date('Ymd H:i:s'), $data['numreg_oc'], $data['num_guia'], $totneto, Auth::id()]);

			foreach($data['mercaderias'] as $m) {
				$filename = NULL;
				if(Input::hasFile("ARCHIVO_{$m['id']}")) {
					$file = Input::file("ARCHIVO_{$m['id']}");
					$filename = 'DOC' . uniqid() . '.' . $file->getClientOriginalExtension();
					Input::file("ARCHIVO_{$m['id']}")->move(public_path('/files'), $filename);
				}
				DB::statement('exec dbo.spInsertaGuiaRecepcionDetalle @NUMGUIA = ?, @SEQOCDET = ?, @CANTIDAD = ?, @LOTE = ?, @NOM_ARCHIVO = ?, @PRECIO = ?', [$data['num_guia'], $m['seqocdet'], $m['cantreci'], $m['lote'], $filename, $m['preciounit']]);
                DB::statement('exec dbo.spInsertaLote @NREGUIST = ?, @LOTE = ?, @CANTIDAD = ?, @NUMREGOC = ?, @NUMREGGRE = ?, @IMPRESA = ?', [$m['ncodart'], $m['lote'], $m['cantreci'], $data['numreg_oc'], $data['num_guia'], 0]);
			}
			$message = ['content' => 'El ingreso fue agregado.', 'type' => 'success'];
			$response = ['status' => 200, 'message' => $message];
		}

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


	public function agregar_lote() {
//		$data     = json_decode(Input::get('datos'), true);

		$ncodart  = Input::get('ncodart');
		$lote     = Input::get('lote');
		$cantidad = Input::get('cantidad');
		$numregoc = Input::get('numregoc'); 
		$num_guia = Input::get('num_guia');

	    DB::statement('exec dbo.spInsertaLote @NREGUIST = ?, @LOTE = ?, @CANTIDAD = ?, @NUMREGOC = ?, @NUMREGGRE = ?, @IMPRESA = ?', [$ncodart, $lote, $cantidad, $numregoc, $num_guia, 0]);
		                                   
		return Response::json($response, $response['status']);
	}


	/**
	 * Obtiene listado de ordenes de compra
	 * @return mixed
	 */
	public function select_oc() {
		$query = Input::get('q', '');
		$oc = DB::table('vCabeceraOrdenCompras')
			->join('vDetalleOrdenCompras', 'vCabeceraOrdenCompras.NUMREG', '=', 'vDetalleOrdenCompras.NUMRECOR')
			->where('NUMOC', 'LIKE', "%$query%")
			->groupBy('NUMREG', 'NUMOC')
			->having(DB::raw('SUM(vDetalleOrdenCompras.CANTIDAD)-SUM(vDetalleOrdenCompras.CANTRECI)'), '>', 0)
			->select(DB::raw('NUMREG as id, NUMOC as text'))
			->paginate(10);
		return $oc;
	}

	public function obtener_oc($id) {
		$oc = DB::table('vCabeceraOrdenCompras')
			->leftJoin('vClientesyProveedores', 'vClientesyProveedores.NREGUIST', '=', 'vCabeceraOrdenCompras.NRUTPROV')
			->where('NUMREG', $id)
			->select(DB::raw('NUMREG, NUMOC, RUTPROV, RAZSOC, TOTNETO, TOTIVA, TOTAL, CONVERT(varchar(23),FECHA,105) as FECHAOC'))
			->first();
		$doc = DB::table('vDetalleOrdenCompras')
			->where('NUMRECOR', $id)
			->whereRaw('CANTRECI < CANTIDAD')
			->select(DB::raw('NUMRECOR, NCODART, DESCRIP, PRECUNIT, SEQOCDET, CAST(CANTIDAD as int) as CANTIDAD, CAST(CANTRECI as int) as CANTRECI'))
			->get();

		$result = [
			'oc' => $oc,
			'doc' => $doc
		];
		return Response::json($result, 200);
	}
}
