<?php

class IngresosController extends \BaseController {

	public static $jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'NUMREG',
			'hidden' => true
		],
		[
			'label' => 'Nº Guía Recepción',
			'name' => 'NUMEROGUIARECEPCION',
		],
		[
			'label' => 'Rut Proveedor',
			'name' => 'RUT',
		],
		[
			'label' => 'Nombre Proveedor',
			'name' => 'RAZSOC',
		],
		[
			'label' => 'Fecha',
			'name' => 'FECHA',
			'searchoptions' => [
				'sopt' => ['custom']
			]
		],
		[
			'label' => 'Total Neto',
			'name' => 'TOTNETO',
		],
	];

	public static $detalles_jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'NUMRECORGUIARECEPCION',
			'hidden' => true
		],
		[
			'label' => 'Código',
			'name' => 'CODIGO',
		],
		[
			'label' => 'Nombre Artículo',
			'name' => 'NOMBRE',
		],
		[
			'label' => 'Envase',
			'name' => 'ENVASE',
		],
		[
			'label' => 'Precio Unit.',
			'name' => 'PRECUNIT',
		],
		[
			'label' => 'Unidades Recibidas',
			'name' => 'CANTIDAD',
		],
		[
			'label' => 'Lote Prov.',
			'name' => 'LOT_IDE',
		],
		[
			'label' => 'Nombre archivo',
			'name' => 'NOM_ARCHIVO',
		],
	];

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index() {
		$title = 'Ingresos Mercadería';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('ingresos', self::$jqgrid_colmodel);
		Jqgrid::add_js_colmodel('detalles_ingreso', self::$detalles_jqgrid_colmodel);
		return View::make('ingresos.index', compact('title'));
	}

	public function datagrid() {
		Jqgrid::init('vCabeceraGuiaRecepcion', self::$jqgrid_colmodel, self::jqgrid_format(), self::jqgrid_filter_format());
		return Jqgrid::datagrid();
	}

	public function detalles_datagrid() {
		Jqgrid::init('vLineasGuiaRecepcion', self::$detalles_jqgrid_colmodel, self::jqgrid_format());
		Jqgrid::get_query()->where('NUMRECORGUIARECEPCION', Input::get('NUMRECORGUIARECEPCION'));
		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));
			} else if(in_array($column, ['TOTNETO', 'PRECUNIT'])) {
				$result = moneda($value);
			} else if(in_array($column, ['CANTIDAD'])) {
				$result = number_format($value, 0, ',', '.');
			} else if($column == 'NOM_ARCHIVO') {
				$url = asset('files/' . $value);
				$result = !empty($value)? "<a href='$url' target='_blank'><i class='fa fa-file'></i> Ver archivo</a>" : 'Sin archivo';
			}
			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'              => 'numeric|required|min:1|max:99999999',
		];
		$vmessages = [
			'NUMREG.required'      => 'El campo Nº Orden de Compra es obligatorio.',
			'NUMGUIA.numeric'      => 'El campo Nº Guía de Recepción es obligatorio.',
			'NUMGUIA.min:1'        => 'El campo Nº Guía de Recepción es obligatorio.',
			'NUMGUIA.max:99999999' => 'El campo Nº Guía de Recepción no puede ser mayor a 99999999.',
		];

		$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'));
				$vencim   = implode(',', array_column(array_filter($data['mercaderias'], function($v) use ($m) {return $v['id'] != $m['id'] && $v['vencim']  == $m['vencim'];}),  'vencim'));
				$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'), $data['numreg_oc'], $data['num_guia'], $totneto, Auth::id()]);

			//NUMERO DE REGISTRO DE LA ORDEN DE COMPRA
            $REGISTRO_ORDEN = DB::table("OC_DB")
            ->selectRaw("RUTPROV")
            ->Where("NUMREG", '=', $data['numreg_oc'])
			->first();
			
            $RUTPROV       = $REGISTRO_ORDEN->RUTPROV;

			//NUMERO DE REGISTRO DE LA GUIA 
            $REGISTRO_GUIA = DB::table("DOCU_DB")
            ->selectRaw("NUMREG")
            ->Where("TIPODOC", '=', 9)
            ->Where("NUMFACT", '=', $data['num_guia'])
            ->Where("RUTFACT", '=', $RUTPROV)
			->first();

            $NUMREG_GUIA  = $REGISTRO_GUIA->NUMREG;
			
			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);
				}
				/* Manejo de string */
				$VENCIM       = $m['vencim'];
				$anno         = substr($VENCIM, 0, 4);
				$mes          = substr($VENCIM, 5, 2);
				$dia          = substr($VENCIM, 8, 2);
				$VENCIM       = $dia.'/'.$mes.'/'.$anno;

				/* Grabación */
				DB::statement('exec dbo.spInsertaGuiaRecepcionDetalle @NCODART = ?, @NUMGUIA = ?, @SEQOCDET = ?, @CANTIDAD = ?, @LOTE = ?, @NOM_ARCHIVO = ?, @PRECIO = ?, @VENCIM = ?', [$m['ncodart'], $data['num_guia'], $m['seqocdet'], $m['cantreci'], $m['lote'], $filename, $m['preciounit'], $VENCIM]);
				DB::statement('exec dbo.spInsertaLote @NREGUIST = ?, @LOTE = ?, @CANTIDAD = ?, @NUMREGOC = ?, @NUMREGGRE = ?, @IMPRESA = ?', [$m['ncodart'], $m['lote'], $m['cantreci'], $data['numreg_oc'], $NUMREG_GUIA, 0]);
			}

			// Lee los lotes sin LOTE_DIKEN
			$LOTE_DIKEN = '';
            $REGISTRO_LOTES = DB::table("PRODUCCION_LOTES")
            ->selectRaw("ID")
            ->whereNull("LOTE_DIKEN")
            ->orWhere("LOTE_DIKEN", '=', $LOTE_DIKEN)
            ->get();
			
			/* Calcula Saldo de la materia prima recepcionada */
			DB::statement('exec spProcesaStock');

			$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');
		$LOTE_DIKEN = '';


		//NUMERO DE REGISTRO DE LA ORDEN DE COMPRA
        $REGISTRO_ORDEN = DB::table("OC_DB")
        ->selectRaw("RUTPROV")
        ->Where("NUMREG", '=', $numregoc)
		->first();
			
        $RUTPROV       = $REGISTRO_ORDEN->RUTPROV;

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

		// Lee los lotes sin LOTE_DIKEN
        $REGISTRO_LOTES = DB::table("PRODUCCION_LOTES")
        ->selectRaw("ID")
		->whereNull("LOTE_DIKEN")
        ->orWhere("LOTE_DIKEN", '=', $LOTE_DIKEN)
		->get();

        // Loop que recorre los registros que no tienen LOTE_DIKEN
        foreach($REGISTRO_LOTES as $key => $LOTES_VACIOS){
			/* ID en Hexadecimal*/
            $LOTE_DIKEN   = $lote;

			/* Actualiza los lotes*/
            DB::table('PRODUCCION_LOTES')
 			->where('ID', $LOTES_VACIOS->ID)
			->update(['LOTE_DIKEN'=>$LOTE_DIKEN]);
		}

		// Lee el último codigo del lote
        $REGISTRO_LOTES = DB::table("PRODUCCION_LOTES")
        ->selectRaw("max(ID) ID, max(LOTE_DIKEN) LOTE_DIKEN")
        ->Where("NREGUIST", '=', $ncodart, 'and', "LOTE", '=', $lote, 'and', "NUMREGOC", '=', $numregoc, 'and', "NUMREGGRE", '=', $num_guia)
		->get();

		$ID         = $REGISTRO_LOTES[0]->ID;
		$LOTE_DIKEN = $lote;

		return array($ID, $LOTE_DIKEN);
	}


	/**
	 * 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;
	}

	/**
	 * Obtiene listado de ordenes de compra
	 * @return mixed
	 */
	public function leeProducto() {
		$query   = Input::get('codigo', '');
		$producto = DB::table('art_db')
			->where('NREGUIST', '=', "$query")
			->select(DB::raw('rtrim(ltrim(codigo)) as codigo'))
			->first();

		$result = [
			'producto' => $producto
		];

		return Response::json($result, 200);
	}

	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);
	}

	public function validaGuiaRecepcion() {
		$RUT     = Input::get('RUT');
		$NGR     = Input::get('NGR');
		$TIPODOC = 9;

		$gr  = DB::table('DOCU_DB')
    		->whereIn('TIPODOC', [9])
			->where('NUMFACT', '=', $NGR, 'and', 'RUTFACT', '=', $RUT)
			->select('NUMFACT')
			->first();

		if (empty($gr)) 
		{
			// Crea a nuevo Object stdClass Factura
			$gr                = new stdClass;
			$gr->NUMFACT       = 0;
		}

		return $gr->NUMFACT;
	}
}