<?php

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

class EnvasadoController extends \BaseController {

	public static $jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'NUMREG',
			'hidden' => true
		],
		[
			'label' => 'Num Nota',
			'name' => 'NUMNOTA',
		],
		[
			'label' => 'Fecha',
			'name' => 'FECHA',
		],
		[
			'label' => 'RUT',
			'name' => 'RUTFACT',
		],
		[
			'label' => 'Nombre Cliente',
			'name' => 'RAZSOC',
		],
		[
			'label' => 'Neto',
			'name' => 'TOTNETO',
		],
		[
			'label' => 'O/C',
			'name' => 'NUMORDC',
		],
		[
			'label' => 'Tipo Docto',
			'name' => 'TIPODOC',
		],
		[
			'label' => 'Nro Docto',
			'name' => 'NUMFACT',
		],
	];

	public static $jqgrid_detalles_colmodel = [
		[
			'label' => 'Id',
			'name' => 'OTSEQ',
			'hidden' => true
		],
		[
			'label' => 'Ítem',
			'name' => 'ITEM',
			'hidden' => true
		],
		[
			'label' => 'Código Producto',
			'name' => 'NREGUIST',
		],
		[
			'label' => 'Lote',
			'name' => 'LOTE',
		],
		[
			'label' => 'Materia Prima',
			'name' => 'DESCRIP',
		],
		[
			'label' => 'Cantidad',
			'name' => 'CANTIDAD',
		],
		[
			'label' => 'Costo',
			'name' => 'Precio',
		],
	];

	public static $estados = [
		0 => 'Pendiente',
		1 => 'Finalizada'
	];

	/**
	 * Muestra grilla de fórmulas
	 *
	 * @return Response
	 */
	public function index($id = false)
	{
		$rowid = $id;
		$title = 'Envasado';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('fabricacion', self::$jqgrid_colmodel);
		Jqgrid::add_js_colmodel('detalles_fabricacion', self::$jqgrid_detalles_colmodel);
		return View::make('envasado.index', compact('title', 'rowid'));
	}

	/**
	 * Genera el json para cargar los datos en jqgrid
	 * @return string
	 */
	public function datagrid() {
		Jqgrid::init('vNotasVentas', self::$jqgrid_colmodel, self::jqgrid_format());
		return Jqgrid::datagrid();
	}

	/**
	 * Genera el json para cargar los datos en jqgrid
	 * @return string
	 */
	public function detalles_datagrid() 
	{
		Jqgrid::init('vDetallesOrdenTrabajo', self::$jqgrid_detalles_colmodel,  self::jqgrid_format());
		Jqgrid::get_query()->where('OTSEQ', Input::get('OTSEQ'));
		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, ['CANTIDAD', 'CANTIDAD_FABRICADA'])) {
				$result = number_format($value, 2, ',', '.');
			} else if(in_array($column, ['TOTNETO'])) {
				$result = moneda($value);
			} else if(in_array($column, ['TERMINO'])) {
				$result = self::$estados[$value];
			} else if(in_array($column, ['TIPODOC'])) {
				if ($value != null && $value != '')
				{
					$result = "<div style='background: green; color:white;'>$value</div>";
				}
				else
				{
					$result = "<div style='background: white; color:black;'>$value</div>";
				}
			} else if(in_array($column, ['NUMFACT'])) {
				if ($value != null && $value != 0 && $value != '')
				{
					$result = "<div style='background: green; color:white;'>$value</div>";
				}
				else
				{
					$result = "<div style='background: white; color:black;'>$value</div>";
				}
			}
			return $result;
		};
	}

	/**
	 * Muestra Vista de agregar fórmula
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function vista_agregar($id = "") 
	{
		$title                  = 'Agregar';
		Breadcrumb::append_crumb('Fabricación', url('fabricacion'));
		Breadcrumb::append_crumb($title);
		$notasDeVentas          = DB::table('vNotasVentas')->where('NUMREG', $id)->first();
		$detalles_nota          = DB::table('vNotasVentasDetalle')->where('NUMRECOR', $id)->get();

		foreach($detalles_nota as $df) 
		{
			$CODIGO[]           = $df->NCODART;
		}

        /* Detalle de Nota de Ventas */
		$detalles_solicitar     = DB::table('vPRODUCCION_ENVASES')->whereIn('NREGUIST_PROD', $CODIGO)->first();
		if (empty($detalles_solicitar)) 
        {
			// Crea a nuevo Object stdClass Factura
            $detalles_solicitar                = new stdClass;
			$detalles_solicitar->NREGUIST_PROD = 0; 
			$detalles_solicitar->NREGUIST_MPRI = 0;
            $detalles_solicitar->CODIGO        = '';
			$detalles_solicitar->NOMBRE        = '';
		}

		return View::make('envasado.agregar', compact('title', 'notasDeVentas', 'detalles_solicitar'));
	}

	/**
	 * Muestra Vista de agregar fórmula
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function vista_editar($id = "") 
	{
		$title = 'Editar';
		Breadcrumb::append_crumb('Fabricación', url('fabricacion'));
		Breadcrumb::append_crumb($title);
		$vendedores     = DB::table('vVendedor')->lists("Nombre", 'NUMREG');
		$notasDeVentas  = DB::table('vNotasVentas')
		->where('NUMREG', $id)
		->select(DB::raw('NUMREG, NUMNOTA, CONVERT(VARCHAR, FECHA, 103) FECHA, NRUTCLIE, NRUTFACT, RUTFACT, RAZSOC, ISNULL(DCTOPJE, 0) DCTOPJE, NUMORDC, 0 SUBNETO, CONVERT(INT, TOTNETO) TOTNETO, Isnull(TOTIVA, 0) TOTIVA, TOTAL, CODVEND, NUMFACT'))
		->first();

		if (empty($notasDeVentas)) 
        {
			App::abort(404);
		}
		$detalles_nota  = DB::table('vNotasVentasDetalle')->where('NUMRECOR', $id)->get();

		/* Detalles de la Nota de Ventas */
		foreach ($detalles_nota as $key => $linea) 
		{	
			 /* Detalle de Nota de Ventas */
			 $estado                 = 0;
			 $detalles_solicitar     = DB::table('vProductosEnvasar')
			 ->where('NREGUIST_PROD', '=', $linea->NCODART, 'and', 'NUMRECOR', '=', $id)
			 ->select(DB::raw("NREGUIST_PROD, NREGUIST_MPRI, CODIGO, NOMBRE, TIPO, 0 SEQNVDET, CANTIDAD, LOTE, CODBARRA"))
			 ->get();
	
			 if (empty($detalles_solicitar2)) 
			 {
				$estado                             = 1;
				$detalles_solicitar                = new stdClass;
				$detalles_solicitar->NREGUIST_PROD = 0; 
				$detalles_solicitar->NREGUIST_MPRI = 0;
				$detalles_solicitar->CODIGO        = '';
				$detalles_solicitar->NOMBRE        = '';
				$detalles_solicitar->TIPO          = 0; 
				$detalles_solicitar->SEQNVDET      = 0;
				$detalles_solicitar->CANTIDAD      = 0;
				$detalles_solicitar->LOTE          = '';
				$detalles_solicitar->CODBARRA      = '';
			 } 
        }
		
//		$detalles_solicitar = (object) ['NREGUIST_PROD'=>1, 'NREGUIST_MPRI'=>1, 'CODIGO'=>'1111', 'NOMBRE'=>'NOMBRES', 'TIPO'=>'1', 'SEQNVDET'=>'SEQNVDET', 'CANTIDAD'=>'0', 'LOTE'=>'AAAA', 'CODBARRA'=>'AAAA'];

		return View::make('envasado.editar', compact('title', 'id', 'notasDeVentas', 'detalles_nota', 'vendedores',  'estado', 'detalles_solicitar'));
	}



	public function ve($id = "") 
	{
		$title = 'Editar';
		Breadcrumb::append_crumb('Fabricación', url('fabricacion'));
		Breadcrumb::append_crumb($title);
		$vendedores     = DB::table('vVendedor')->lists("Nombre", 'NUMREG');
		$notasDeVentas  = DB::table('vNotasVentas')
		->where('NUMREG', $id)
		->select(DB::raw('NUMREG, NUMNOTA, CONVERT(VARCHAR, FECHA, 103) FECHA, NRUTCLIE, NRUTFACT, RUTFACT, RAZSOC, ISNULL(DCTOPJE, 0) DCTOPJE, NUMORDC, 0 SUBNETO, CONVERT(INT, TOTNETO) TOTNETO, Isnull(TOTIVA, 0) TOTIVA, TOTAL, CODVEND, NUMFACT'))
		->first();

		if (empty($notasDeVentas)) 
        {
			App::abort(404);
		}
		$detalles_nota  = DB::table('vNotasVentasDetalle')->where('NUMRECOR', $id)->get();
		$detalles_solicitar                = new stdClass;

		/* Detalles de la Nota de Ventas */
		foreach ($detalles_nota as $key => $linea) 
		{	
			/* Cantidad de la cada línea de detalle de Nota de Ventas */

            $CANTIDAD_DETALLE       = $linea->CANTIDAD;

			/* Detalle de Nota de Ventas */
			$estado                 = 0;

			/* Detalle de Nota de Ventas */
			$estado                 = 0;
			$detalles_solicitar     = DB::table('vProductosEnvasar')
			->where('NREGUIST_PROD', '=', $linea->NCODART, 'and', 'NUMRECOR', '=', $id)
			->select(DB::raw("NREGUIST_PROD, NREGUIST_MPRI, CODIGO, NOMBRE, TIPO, 0 SEQNVDET, CANTIDAD, LOTE, CODBARRA"))
			->get();
	
			if (empty($detalles_solicitar2)) 
			{
				$estado                             = 1;
				$detalles_solicitar2                = new stdClass;
				$detalles_solicitar2->NREGUIST_PROD = 0; 
				$detalles_solicitar2->NREGUIST_MPRI = 0;
				$detalles_solicitar2->CODIGO        = '';
				$detalles_solicitar2->NOMBRE        = '';
				$detalles_solicitar2->TIPO          = 0; 
				$detalles_solicitar2->SEQNVDET      = 0;
				$detalles_solicitar2->CANTIDAD      = 0;
				$detalles_solicitar2->LOTE          = '';
				$detalles_solicitar2->CODBARRA      = '';
			} 
			else
			{
			foreach ($detalles_solicitar2 as $key2 => $linea2) 
			{
				/* Cantidad de la cada línea de detalle de Nota de Ventas */
				$detalles_solicitar                = new stdClass;
				$detalles_solicitar->NREGUIST_PROD = $linea2->NREGUIST_PROD;
				$detalles_solicitar->NREGUIST_MPRI = $linea2->NREGUIST_MPRI;
				$detalles_solicitar->CODIGO        = $linea2->CODIGO;
				$detalles_solicitar->NOMBRE        = $linea2->NOMBRE;
				$detalles_solicitar->TIPO          = $linea2->TIPO;
				$detalles_solicitar->SEQNVDET      = $linea2->SEQNVDET;
				$detalles_solicitar->CANTIDAD      = $linea2->CANTIDAD;
				$detalles_solicitar->LOTE          = $linea2->LOTE;
				$detalles_solicitar->CODBARRA      = $linea2->CODBARRA;
			}
		    }
        }

		return Response::json($detalles_solicitar2);
	}


	/**
	 * Guarda Orden de Trabjo
	 */
	public function agregar() 
	{
		$id       = Input::get('id');
		$NUMNOTA  = Input::get('NUMNOTA');
		$data     = json_decode(Input::get('data'), true);

		$vdata    = [
			'NUMNOTA' => $NUMNOTA,
		];

		$vrules       = [
			'NUMNOTA' => 'required',
		];

		$vmessages    = [
			'NUMNOTA.required' => 'Debe seleccionar un Producto a Embazado.',
		];

		// Reglas Validación Detalle de Ventas
		if (isset($data['materias_primas'])) {
			foreach($data['materias_primas'] as $id=>$mp) 
			{
				$vdata["CANTIDAD$id"]                        = isset($mp["cantidad"])?$mp["cantidad"]:'';
				
				$vrules["CANTIDAD$id"]                       = 'required|numeric|min:1|max:99999999';

				$vmessages["CANTIDAD$id.required|numeric"]   = 'El campo Cantidad no debe ser menor a 1.';
				$vmessages["CANTIDAD$id.min"]                = 'El campo Cantidad no debe ser menor a 1.';
				$vmessages["CANTIDAD$id.max"]                = 'El campo Cantidad no debe ser mayor a 9999999.';
			}
		}

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

		if ($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		}
        else 
		{				 
            /* Asignación de los campos */            
			$FECHA           = DATE('d-m-Y');
			$NRUTFACT        = 9956;
			$RUTFACT         = '82321000-0';
			$NRUTCLIE        = 9956;
			$TOTNETO         = 0;
			$TASACBIO        = 1;
			$FECHAMODIF      = DATE('d-m-Y');
			$USERMODI        = 'ADM';
			$IVA             = 19;
			$FECHCONT        = DATE('d-m-Y');
			$SUCUR           = 1;			

			$NUMORDEN        = 0;
			$CODVEND         = 1;  
			$VENCIMIE        = $FECHA;

			$TOTNETO         = 0;
			$TOTIVA          = round((($TOTNETO * $IVA) / 100), 1);
			$TOTAL           = ($TOTNETO + $TOTIVA);

            /* Lee Número de NOTA DE VENTAS */
		    $NOTV_DB          = DB::table('NOTV_DB')
			->select(DB::raw('Max(NUMREG) NUMREG'))
			->where('NUMNOTA', '=', $NUMNOTA)
			->first();

            /* Campos NOTA DE VENTAS */
			$NUMREG_NOTA     = $NOTV_DB->NUMREG;

			// Insert DOCU_DB WHERE TIPODOC=9 (Guia de Recepción)
            /* Lee Número de GUIA DESPACHO */
		    $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'=>1927, 'RUTFACT'=>'76107759-7', 'NRUTCLIE'=>1927, 
						   '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'=>NULL, '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'=>1252, 'CC'=>0, 'GTO'=>0, 'DEBE'=>0, 'HABER'=>$TOTNETO, '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'=>1, 
						   '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);

		   /* Borrar Ingreso de Producto terminado */
           DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();

		   /* Ingreso de Producto terminado a bodega */
           if (isset($data['materias_primas'])) 
		   {
                /* Borra detalle de preguntas*/
				DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();
				$ITEM     = 0;
				$TOTNETO  = 0;
				$COSTO    = 0;

                foreach($data['materias_primas'] as $ii=>$mp) 
				{
                   $nreguist      = $mp["nreguist"];
                   $nreguist2     = $mp["nreguist2"];
				   $CantNecesaria = $mp["CantNecesaria"];
				   $CantNecesaria = $mp["cantidad"];

				   $SQNVDET       = $mp["SEQNVDET"];
				   
				   if ($nreguist2 != '' && $nreguist2 != 0)
				   {

                       /* Lee Envases */
//					   $ENVASES       = DB::table('vCostoEnvases')->where('NREGUIST_PROD', $nreguist)->select(DB::raw('Sum(COSTO) COSTO'))->first();
                       /* Lee PPP Código producto */						   
					   $ENVASES       = DB::select("SET NOCOUNT ON; EXEC spCostoEnvasado @NREGUIST_PROD = $nreguist");

                       /* Ingresa nuevo detalle */
                       /* Graba Detalle Venta */
                       /* Lee Artículo */
					   $ART_DB        = DB::table('ART_DB')->join('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')->where('ART_DB.NREGUIST', $nreguist)->select(DB::raw('Max(NOMBRE)  NOMBRE, Max(CONVERT(INT, PRECVTA)) PRECVTA, Max(CONVERT(INT, VALPROM)) VALPROM, MAX(PRODUCCION_PRODUCTOS_CAMPOS.TIPO) TIPO'))->first();
					   $ART_DB2       = DB::table('ART_DB')->join('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')->where('ART_DB.NREGUIST', $nreguist2)->select(DB::raw('Max(NOMBRE) NOMBRE, Max(CONVERT(INT, PRECVTA)) PRECVTA, Max(CONVERT(INT, VALPROM)) VALPROM, MAX(PRODUCCION_PRODUCTOS_CAMPOS.TIPO) TIPO'))->first();
							  
                       /* Nombre Producto */    
					   $DESCRIP       = $ART_DB->NOMBRE;
                       $PRECUNIT      = $ART_DB->PRECVTA;
					   $VALPROM       = $ART_DB->VALPROM;

					   if ($ART_DB2->TIPO == 7)
					   {

                          /* Lee Cantidad de producto a granel por envase */
	                      $PRODUCCION_ENVASES = DB::table('PRODUCCION_ENVASES')->where('NREGUIST_PROD', '=' , $nreguist, 'and', 'NREGUIST_MPRI', '=' , $nreguist2)->select(DB::raw('Max(CANTIDAD) CANTIDADENVASE'))->first();

					      if (empty($PRODUCCION_ENVASES)) 
					      {
							  $PRODUCCION_ENVASES->CANTIDADENVASE = 1;
					      }
   					      $CANTIDADENVASE     = $PRODUCCION_ENVASES->CANTIDADENVASE; 	

  // 					      $CantNecesaria      = $CantNecesaria / $CANTIDADENVASE;

    					  if (!empty($ENVASES)) 
						  {
//									  $COSTO     = $ENVASES->COSTO;
								  $COSTO     = $ENVASES[0]->PPP;								  
						  }
 
						  if (empty($ART_DB)) 
						  {
						  	  $DESCRIP   = '';
							  $PRECUNIT  = 0;
							  $VALPROM   = 0;
						  }
 
						  if ($PRECUNIT === NULL || is_null($PRECUNIT))
						  {
							  $PRECUNIT  = 0;
						  }
						  if ($VALPROM  === NULL || is_null($VALPROM))
						  {
							  $VALPROM   = 0;
						  }
						  $TOTNETO       = ROUND(($TOTNETO + ($CantNecesaria * $COSTO)), 1);
						
						  $DESCTO        = 0;
 
						  $LOTE          = $mp["LOT_IDE"];
						  $ITEM          = $ITEM + 1;
						
						  /* Inserta Detalle de Venta */
						  DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$nreguist, 'DESCRIP'=>$DESCRIP, 'CANTIDAD'=>$CantNecesaria, 
						  'PRECUNIT'=>$COSTO, 'BODEGA'=>1, 'DESCTO'=>$DESCTO, 'NSERIE'=>'', 'CTACTBLE'=>993, 'CENCOSTO'=>0, 'ITEM'=>$ITEM, 
						  'FACTSI'=>0, 'COMIS'=>0, 'SQNVDET'=>0, 'SQGDDET'=>0, 'SQOCDET'=>0, 'PRODUCCN'=>0, 'LIQDDO'=>'', 'NUMOT'=>0, 
						  'TJ_STKAC'=> $COSTO, 'TJ_VALPR'=> $COSTO, 'TJ_SORT'=>1, 'TJ_SUBSORT'=> 1, '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'=>$COSTO, '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'=>$COSTO, 'TJ_VALPR2'=>$COSTO, 'TJ_MTOAC2'=>$COSTO]);
					   }
				    }
				}
                /* Actualiza Nro de Lote Detalle de Venta */
				$TOTIVA          = round((($TOTNETO * $IVA) / 100), 1);
				$TOTAL           = ($TOTNETO + $TOTIVA);

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

				// Actualiza Modificar
                DB::table('DOCU_DB')
				->where('NUMREG', $NUMREG)
				->update(['TOTNETO'=>$TOTNETO, 'IVA'=>$IVA, 'AFECTO'=>$TOTNETO, 'TOTIVA'=>$TOTIVA, 'TOTAL'=>$TOTAL, 'HABER'=>$TOTNETO]);				
            }

			// Insert DOCU_DB WHERE TIPODOC=2 (Guia de Despacho)
            /* Lee Número de GUIA DESPACHO */
		//    $DOCU_DB = DB::table('DOCU_DB')
		//	->select(DB::raw('Max(NUMFACT) NUMFACT'))
		//	->where('TIPODOC', '=', 2)
		//	->first();
            /* Campos */    
		//	$NUMFACT     = $DOCU_DB->NUMFACT;

			// Insert DOCU_DB WHERE TIPODOC=2 (Guia de Despacho)
            /* Lee Número de GUIA DESPACHO */
		    $CORR_DB = DB::table('CORR_DB')
			->select(DB::raw('Max(NUM) NUM'))
			->where('doc', '=', 'e-GV')
			->first();

            /* Campos */    
			$NUMFACT     = $CORR_DB->NUM + 1;

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

			// Actualiza Modificar Correlativo
            DB::table('CORR_DB')
			->where('doc', '=', 'e-GV')
			->update(['NUM'=>$NUMFACT]);				

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

			    try
				{
//					   DB::table('DOCU_DB')->insert([
					   DB::table('DOCU_DB')->insert([
						   'NUMFACT'=>$NUMFACT, 'FECHA'=>$FECHA, 'NRUTFACT'=>5396, 'RUTFACT'=>$RUTFACT, 'NRUTCLIE'=>5396, 
						   'PROFORMA'=>0, 'NUMREG'=>$NUMREG, 'CODVEND'=>$CODVEND, 'GLOSACON'=>'', 'NUMORDEN'=>$NUMORDEN, 'NUMGUIAF'=>'', 
						   'FORMPAGO'=>'', 'VENCIMIE'=>$VENCIMIE, 'MONEDA'=>'$', 'DCTOTIPO'=>1, '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'=>2, 
						   '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'=>0, 'FECHCONT'=>NULL, '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'=>2, 'ABONO'=>0, 
						   'PGITEM'=>0, 'CTA'=>0, 'CC'=>0, 'GTO'=>0, 'DEBE'=>$TOTAL, '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'=>1, 'EMITEPACK'=>1, 'BODEGA'=>1, 
						   'LETSEQ'=>'', 'ESELECTR'=>1, '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);

		   /* Borrar Detalle Venta */
           DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();

           /* Detalle de productos a despachar */ 
           if (isset($data['materias_primas'])) 
		   {
                /* Borra detalle de preguntas*/
				DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();
				$ITEM     = 0;
				$TOTNETO  = 0;

                foreach($data['materias_primas'] as $ii=>$mp) 
				{
                   $nreguist      = $mp["nreguist"];
                   $nreguist2     = $mp["nreguist2"];
				   $CantNecesaria = $mp["CantNecesaria"];
				   $CantNecesaria = $mp["cantidad"];

				   $SQNVDET       = $mp["SEQNVDET"];
				   
				   if ($nreguist2 != '' && $nreguist2 != 0)
				   {
                       /* Ingresa nuevo detalle */
                       /* Graba Detalle Venta */
                       /* Lee Artículo */
					   $ART_DB2       = DB::table('ART_DB')->join('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')->where('ART_DB.NREGUIST', $nreguist2)->select(DB::raw('Max(NOMBRE) NOMBRE, Max(PRECVTA) PRECVTA, Max(VALPROM) VALPROM, MAX(PRODUCCION_PRODUCTOS_CAMPOS.TIPO) TIPO'))->first();
					   $ART_DB        = DB::table('ART_DB')->join('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')->where('ART_DB.NREGUIST', $nreguist)->select(DB::raw('Max(NOMBRE) NOMBRE, Max(PRECVTA) PRECVTA, Max(VALPROM) VALPROM, MAX(PRODUCCION_PRODUCTOS_CAMPOS.TIPO) TIPO'))->first();
							  
                       /* Nombre Producto */    
					   $DESCRIP       = $ART_DB->NOMBRE;
                       $PRECUNIT      = $ART_DB->PRECVTA;
					   $VALPROM       = $ART_DB->VALPROM;

					   if (empty($ART_DB)) 
					   {
                           $DESCRIP       = '';
                           $PRECUNIT      = 0;
                           $VALPROM       = 0;
					   }

					   if ($ART_DB2->TIPO == 7)
					   {
                           /* Lee Cantidad de producto a granel por envase */
	                       $PRODUCCION_ENVASES = DB::table('PRODUCCION_ENVASES')->where('NREGUIST_PROD', '=' , $nreguist, 'and', 'NREGUIST_MPRI', '=' , $nreguist2)->select(DB::raw('Max(CANTIDAD) CANTIDADENVASE'))->first();

						   if (empty($PRODUCCION_ENVASES)) 
						   {
   							   $PRODUCCION_ENVASES->CANTIDADENVASE = 1;
						   }
						   $CANTIDADENVASE     = $PRODUCCION_ENVASES->CANTIDADENVASE; 	

//						   $CantNecesaria      = $CantNecesaria / $CANTIDADENVASE;

                           /* Precio y Costos */
    					   if ($PRECUNIT === NULL || is_null($PRECUNIT))
	    				   {
		    				   $PRECUNIT  = 0;
			    		   }
    					   if ($VALPROM  === NULL || is_null($VALPROM))
	    				   {
    						   $VALPROM   = 0;
	    				   }
		    			   $TOTNETO       = $TOTNETO + ($CantNecesaria * $PRECUNIT);
					   
                           $DESCTO        = 0;

				    	   $LOTE          = $mp["LOT_IDE"];
    					   $ITEM          = $ITEM + 1;

                           /* Lee Número Secuencia de NOTA DE VENTAS */
		                   $NOTDE_DB      = DB::table('NOTDE_DB')
						   ->where('NUMRECOR', '=', $NUMREG_NOTA, 'and', 'NCODART', '=', $nreguist)
						   ->select(DB::raw('Max(SEQNVDET) SEQNVDET'))
						   ->get();
			   
                           /* Campos NOTA DE VENTAS */
                		   $SEQNVDET      = $NOTDE_DB[0]->SEQNVDET;

	    				   /* Inserta Detalle de Venta */
					   
                           DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$nreguist, 'DESCRIP'=>$DESCRIP, 'CANTIDAD'=>$CantNecesaria, 
                           'PRECUNIT'=>$PRECUNIT, 'BODEGA'=>1, 'DESCTO'=>$DESCTO, 'NSERIE'=>'', 'CTACTBLE'=>993, 'CENCOSTO'=>0, 'ITEM'=>$ITEM, 
                           'FACTSI'=>0, 'COMIS'=>0, 'SQNVDET'=>$SEQNVDET, 'SQGDDET'=>0, 'SQOCDET'=>0, 'PRODUCCN'=>0, 'LIQDDO'=>'', 'NUMOT'=>0, 
                           'TJ_STKAC'=> $CantNecesaria, 'TJ_VALPR'=> $VALPROM, 'TJ_SORT'=>1, 'TJ_SUBSORT'=> 0, 'TJ_COSTEAR'=>0, 
                           'FACTORIMP'=>0, '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'=>$VALPROM, 'TJ_MTOAC2'=>$PRECUNIT]);
						   
                           // Actualiza Modificar
                           DB::table('ART_DB')
                           ->where('NREGUIST', $nreguist)
                           ->update(['VALPROM'=>$PRECUNIT]);
					   }
				    }
				}
                /* Actualiza Nro de Lote Detalle de Venta */
				$TOTIVA          = round((($TOTNETO * $IVA) / 100), 1);
				$TOTAL           = ($TOTNETO + $TOTIVA);

				// Actualiza Stock
				DB::statement('exec spProcesaStock');

				// Actualiza Modificar
                DB::table('DOCU_DB')
				->where('NUMREG', $NUMREG)
				->update(['TOTNETO'=>$TOTNETO, 'IVA'=>$IVA, 'AFECTO'=>$TOTNETO, 'TOTIVA'=>$TOTIVA, 'TOTAL'=>$TOTAL, 'HABER'=>$TOTAL]);				
           }


		   // Insert DOCU_DB WHERE TIPODOC=6 (Ajuste de Salida)
           /* Lee Número de GUIA Ajuste de Salida */
		   $DOCU_DB = DB::table('DOCU_DB')
		   ->select(DB::raw('Max(NUMFACT) NUMFACT'))
		   ->where('TIPODOC', '=', 6)
		   ->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
               {
				   /* Ingresa nueva */
				   DB::table('DOCU_DB')->insert(['NUMFACT'=>$NUMFACT, 'FECHA'=>$FECHA, 'NRUTFACT'=>0, 'RUTFACT'=>'','NRUTCLIE'=>0,
				   'PROFORMA'=>0, 'NUMREG'=>$NUMREG, 'CODVEND'=>0, 'GLOSACON'=>'Consumo producto a granel para envasado', 
				   '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);


    	   /* Borrar Detalle Salida de Mercaderías */
           DB::table('DOCDE_DB')->where('NUMRECOR', '=', $NUMREG)->delete();

	       if (isset($data['materias_primas'])) 
    	   {
               /* Borra detalle de preguntas*/
     	       $ITEM     = 0;
               $TOTNETO  = 0;

	    	   foreach($data['materias_primas'] as $ii=>$mp) 
    		   {
                   /* Producto a Fabricado */
                   $nreguist      = $mp["nreguist"];

				   /* Producto a Granel */
                   $CANTIDAD_DETALLE = 0;
   	    		   $nreguist2        = $mp["nreguist2"];
		           if ($nreguist2   != '' && $nreguist2 != 0)
     			   {
                       /* Lee Detalle de bodones y tapas */
                       $PRODUCCION_ENVASES = DB::table('PRODUCCION_ENVASES')
                       ->select(DB::raw('NREGUIST_MPRI, ISNULL(RTRIM(LTRIM(NOMBRE)), 0) NOMBRE, ISNULL(CANTIDAD, 0) CANTIDAD, ISNULL(VALPROM, 0) VALPROM'))
					   ->leftjoin('ART_DB', 'ART_DB.NREGUIST', '=', 'NREGUIST_MPRI')
					   ->leftjoin('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')
                       ->where('NREGUIST_PROD', '=', $nreguist)
                       ->where('PRODUCCION_PRODUCTOS_CAMPOS.TIPO', '=', 3)
     	               ->get();

    				   /* Ingresa nuevo detalle */
                       /* Lee Artículo Granel */
     				   $ART_DB        = DB::table('ART_DB')->leftjoin('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'ART_DB.NREGUIST')->where('ART_DB.NREGUIST', $nreguist2)->select(DB::raw('Max(NOMBRE) NOMBRE, Max(PRECVTA) PRECVTA, Max(VALPROM) VALPROM, MAX(PRODUCCION_PRODUCTOS_CAMPOS.TIPO) TIPO'))->first();

                       /* Nombre Producto */    
    				   $DESCRIP       = $ART_DB->NOMBRE;
                       $PRECUNIT      = $ART_DB->PRECVTA;
     				   $VALPROM       = $ART_DB->VALPROM;
     				   $TIPO          = $ART_DB->TIPO;

 
    				   if (empty($ART_DB)) 
    				   {
                           $DESCRIP    = '';
                           $PRECUNIT   = 0;
                           $VALPROM    = 0;
					   }
					   
    				   if ($PRECUNIT === NULL || is_null($PRECUNIT))
    				   {
    					   $PRECUNIT  = 0;
    				   }

					   if ($VALPROM  === NULL || is_null($VALPROM))
					   {
						   $VALPROM   = 0;
					   }

                       /* Lee PPP Código producto */
                       $valor     = DB::select("SET NOCOUNT ON; exec dbo.spPrecioPonderado @NCODART=$nreguist2");

					   $CANTIDAD         = $mp["CantNecesaria"];
					   $CANTIDAD         = $mp["cantidad"];
					   $CANTIDAD_DETALLE = $mp["cantidad"];
					   
                       /* Lee Cantidad de producto a granel por envase */
	                   $PRODUCCION_GRANEL  = DB::table('PRODUCCION_ENVASES')->where('NREGUIST_PROD', '=' , $nreguist, 'and', 'NREGUIST_MPRI', '=' , $nreguist2)->select(DB::raw('Max(CANTIDAD) CANTIDADENVASE'))->first();

					   if (empty($PRODUCCION_ENVASES)) 
					   {
                           $PRODUCCION_GRANEL->CANTIDADENVASE = 1;
					   }

					   $CANTIDADENVASE     = $PRODUCCION_GRANEL->CANTIDADENVASE; 	

					   $CANTIDAD           = $CANTIDAD * $CANTIDADENVASE;


    				   $TOTNETO       = $TOTNETO + ($CANTIDAD * $PRECUNIT);
				   
	    			   $DESCTO        = 0;

    				   $LOTE          = '';
    				   $ITEM          = $ITEM + 1;
	
   					   /* Lee PPP Código producto */
					   $valor         = DB::select("SET NOCOUNT ON; exec dbo.spPrecioPonderado @NCODART=$nreguist2");
					   
	    			   $PRECUNIT      = $ART_DB->VALPROM;
					   $PRECUNIT      = $valor[0]->PPP; //$mp->VALPROM;

    				   $LOT_IDE       = $mp["LOT_IDE"];
    				   if ($TIPO     == 3)
                       {
                           $LOT_IDE       = '1';
                       }

					   /* Ingresa nuevo detalle */
     		    	   DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$nreguist2, 'DESCRIP'=> "$DESCRIP", 'CANTIDAD'=>$CANTIDAD, 
										   'PRECUNIT'=>$PRECUNIT, 'BODEGA'=>1, 'DESCTO'=>0, 'NSERIE'=> $LOT_IDE, 'CTACTBLE'=>1205, '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]);

    				   /* Recorre detalle de envases */
	    			   foreach ($PRODUCCION_ENVASES as $ii=>$mp) 
		    		   {


    						$ITEM       = $ITEM + 1;

							$nreguist2  = $mp->NREGUIST_MPRI;
							

                            /* Lee costo producto */
							 
							$COSTO_PRODUCTO  = DB::table('DOCDE_DB')
							 ->join('DOCU_DB','DOCU_DB.NUMREG','=','DOCDE_DB.NUMRECOR')						   
							 ->where('NCODART', $nreguist2)
							 ->where('TIPODOC', 9)
							 ->select(DB::raw('Max(PRECUNIT) PRECUNIT'))
							 ->first();							 

				       	    if (empty($COSTO_PRODUCTO)) 
      					    {
    							$COSTO_PRODUCTO->PRECUNIT = 0;
     					    }

   						    /* Lee PPP Código producto */
						    $valor     = DB::select("SET NOCOUNT ON; exec dbo.spPrecioPonderado @NCODART=$nreguist2");

                            $DESCRIP    = $mp->NOMBRE;
                            $CANTIDAD   = $mp->CANTIDAD * $CANTIDAD_DETALLE;
//							$PRECUNIT   = $COSTO_PRODUCTO->PRECUNIT; //$mp->VALPROM;
                            $PRECUNIT  = $valor[0]->PPP; //$mp->VALPROM;
							
                            $LOT_IDE    = '';
							
                            /* Ingresa nuevo detalle */
                            DB::table('DOCDE_DB')->insert(['NUMRECOR'=>$NUMREG, 'NCODART'=>$nreguist2, 'DESCRIP'=> "$DESCRIP", 'CANTIDAD'=>$CANTIDAD,
                            'PRECUNIT'=>$PRECUNIT, 'BODEGA'=>1, 'DESCTO'=>0, 'NSERIE'=> $LOT_IDE, 'CTACTBLE'=>1205, '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]);
					   }
				   }
			   }
           }

	       /* Recalcula Saldo */
		   DB::statement('exec spProcesaStock');

           /* Mensaje de grabación */
           $message  = ['content' => 'La solicitud fue grabada. ', 'type' => 'success', 'id' => $id];
           $response = ['status' => 200, 'message' => $message];
		}

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

	public function leeBidones($NUMNOTA) 
	{
        /* Asignación de los campos */
        /* Lee Número de NOTA DE VENTAS */
        $NOTV_DB          = DB::table('NOTV_DB')
        ->select(DB::raw('Max(NUMREG) NUMREG'))
        ->where('NUMNOTA', '=', $NUMNOTA)
        ->first();

        /* Campos NOTA DE VENTAS */
		$NUMREG_NOTA     = $NOTV_DB->NUMREG;

        /* Lee Número Detalle de NOTA DE VENTAS */
        $DETALLE_NOTV_DB = DB::table('NOTDE_DB')
		->select(DB::raw('NCODART, SUM(CANTIDAD) AS CANTIDAD'))
		->leftjoin('ART_DB', 'NREGUIST', '=', 'NCODART')		
		->where('NUMRECOR', '=', $NUMREG_NOTA)
		->groupBy('NCODART')
        ->get();

        // Crea a nuevo Object stdClass Detalle Envases
		$DETALLE_ENVASES       = new stdClass;
        $INDICE                = 0;

        /* Lee Número Detalle de NOTA DE VENTAS */
        foreach ($DETALLE_NOTV_DB as $ii=>$mp) {
			 $NCODART         = $mp->NCODART;
             $CANTIDAD        = $mp->CANTIDAD;

             /* Lee Detalle de bodones y tapas */
             $PRODUCCION_ENVASES = DB::table('PRODUCCION_ENVASES')
             ->select(DB::raw('NREGUIST_MPRI, ISNULL(RTRIM(LTRIM(NOMBRE)), 0) NOMBRE, ISNULL(CANTIDAD, 0) CANTIDAD, ISNULL(VALPROM, 0) VALPROM'))
             ->leftjoin('ART_DB', 'ART_DB.NREGUIST', '=', 'NREGUIST_MPRI')
             ->leftjoin('PRODUCCION_PRODUCTOS_CAMPOS', 'PRODUCCION_PRODUCTOS_CAMPOS.NREGUIST', '=', 'NREGUIST_MPRI')
			 ->where('NREGUIST_PROD', '=', $NCODART)
             ->where('PRODUCCION_PRODUCTOS_CAMPOS.TIPO', '=', 3)
			 ->get();

			 // Detalle Envases
             /* Lee Número Detalle de NOTA DE VENTAS */
             foreach ($PRODUCCION_ENVASES as $jj=>$mp2) {
				 $mp2->CANTIDAD = $mp2->CANTIDAD * $CANTIDAD;				 
				 $DETALLE_ENVASES->$jj = $mp2;
				 
                 $INDICE ++;
             }
		}	

		return Response::json($DETALLE_ENVASES);
    }
		
	/**
	 * Obtiene listado de productos terminados
	 * @return mixedS
	 */
	public function select_productos() {
		$query = Input::get('q', '');
		$productos = DB::table('vFormulas')
			->where('NOMBRE', 'LIKE', "%$query%")
			->select(DB::raw('NREGUIST as id, NOMBRE as text, VOLUMEN as volumen'))
			->paginate(10);
		return $productos;
	}

	/**
	 * Obtiene composición fórmula
	 * @param $id
	 * @return mixed
	 */
	public function obtener_formula($id) {
		$title = 'Editar';
		Breadcrumb::append_crumb('Fabricación', url('fabricacion'));
		Breadcrumb::append_crumb($title);
		$vendedores     = DB::table('vVendedor')->lists("Nombre", 'NUMREG');
		$notasDeVentas  = DB::table('vNotasVentas')
		->where('NUMREG', $id)
		->select(DB::raw('NUMREG, NUMNOTA, CONVERT(VARCHAR, FECHA, 103) FECHA, NRUTCLIE, NRUTFACT, RUTFACT, RAZSOC, ISNULL(DCTOPJE, 0) DCTOPJE, NUMORDC, 0 SUBNETO, CONVERT(INT, TOTNETO) TOTNETO, Isnull(TOTIVA, 0) TOTIVA, TOTAL, CODVEND, NUMFACT'))
		->first();

		if (empty($notasDeVentas)) 
        {
			App::abort(404);
		}
		$detalles_nota  = DB::table('vNotasVentasDetalle')->where('NUMRECOR', $id)->get();

        $CODIGOIN       = '[999999';
		foreach($detalles_nota as $df) 
		{
			$CODIGO[]   = $df->NCODART;
            $CODIGOIN   = $CODIGOIN . ', ' . $df->NCODART;
		}
		$CODIGOIN       = $CODIGOIN . ']';

		/* Detalle de Nota de Ventas */
		$estado                 = 0;

		$detalles_solicitar     = DB::table('vPRODUCCION_ENVASES')
		->whereIn('NREGUIST_PROD', $CODIGO)
        ->select(DB::raw("NREGUIST_PROD, NREGUIST_MPRI, CODIGO, NOMBRE, TIPO, 0 SEQNVDET"))
		->get();

 		if (empty($detalles_solicitar)) 
        {
			$estado                            = 1;
            $detalles_solicitar                = new stdClass;
			$detalles_solicitar->NREGUIST_PROD = 0; 
			$detalles_solicitar->NREGUIST_MPRI = 0;
            $detalles_solicitar->CODIGO        = '';
			$detalles_solicitar->NOMBRE        = '';
			$detalles_solicitar->TIPO          = 0; 
			$detalles_solicitar->SEQNVDET      = 0;
		}

		return View::make('envasado.editar', compact('title', 'id', 'notasDeVentas', 'detalles_nota', 'vendedores',  'estado', 'CODIGOIN', 'detalles_solicitar'));

	}

	/**
	 * Obtiene datos detalle fórmula
	 * @param $id
	 * @return mixed
	 */
	public function obtener_detalle_formula($id_mp, $id_prod) {
		$result = DB::table('vDetallesFormula')
			->where('NREGUIST_MP', $id_mp)
			->where('NREGUIST', $id_prod)
			->orderBy('ORDEN')
			->first();

		return Response::json($result, 200);
	}
	public function generar_lote($lote) {
		$formato = '0000';
		$indice = strval($lote);
		$cantidad_digitos = strlen($indice);
		$codigo = substr($formato, 0, strlen($formato) - $cantidad_digitos) . $indice;
		return $codigo;
	}

	/**
	 * Elimina fabricacion de base de datos
	 * @return mixed
	 */
	public function eliminar() {
		$id = Input::get('id');
		$result = DB::transaction(function() use ($id) {
			$success = DB::table('ORDTR_DB')
				->where('NSEQ', $id)
				->where('TERMINO', 0)
				->delete();
			if($success) {
				DB::table('OTDET_DB')
					->where('OTSEQ', $id)
					->delete();
			}
			return true;
		});

		if($result) {
			$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']);
	}

	public function checkeaLote($codBarra) 
	{
        /* Lee ID planificacion */
        $formula            = array();
		$id                 = Input::get('id');
        $id_mp              = Input::get('id_mp');

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

        /* Detalle de Nota de Ventas */
		$detalles_solicitar = DB::table('PRODUCCION_ENVASES')->where('NREGUIST_PROD', '=', $id_mp)->where('NREGUIST_MPRI', '=', $nreguist)->first();
		if (empty($detalles_solicitar)) 
        {
			$CANTIDAD_ITEM         = 1;			
            // 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->TIPO          = 0;

            $result->status        = 300;
        }
		else
        {
		   $CANTIDAD_ITEM         = $detalles_solicitar->CANTIDAD;
           /* Detalle de Nota de Ventas */
	       $detalles_nota      = DB::table('vNotasVentasDetalle')->where('numrecor', '=', $id)->where('NCODART', '=', $id_mp)->first();

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

           $CANTIDAD_ENVASAR = $detalles_nota->CANTIDAD;

           /* 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, TIPO'))	
               ->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->TIPO          = 0;

               $result->status        = 300;
           }
           else
           {
               /* Volumen necesario */	
               $volumen_disponible    = $result->Cantidad;
               $result->CantNecesaria = $CANTIDAD_ENVASAR * $detalles_solicitar->CANTIDAD; 
			
               $result->status        = 200;
		   }
		}

		return Response::json($result);
	}

	public function chequeaInventario() 
	{
		$idnreguist      = Input::get('idnreguist', '');
		$CANTIDAD        = Input::get('cantidad', '');
		$ERROR_STOCK     = 0;
		
		$NREGUIST        = $idnreguist; 

        /* Valida existencia de inventarios */
	    $STK_FISICO      = DB::table('STOCK_DB')
		->where('ARTICULO', '=', $NREGUIST)
		->whereIn('COD_BODEG', [1])
		->select(DB::raw('SUM(CONVERT(REAL, STK_FISICO)) as STOCK'))
		->first();
			 
    	if (empty($STK_FISICO)) 
	    {
    		$STK_FISICO           = new stdClass;
    		$STK_FISICO[0]->STOCK = 0;
    	}
    	$STOCK                    = $STK_FISICO->STOCK;
    	if (($CANTIDAD) > $STOCK)
    	{
     		$ERROR_STOCK          = 1;
    	}
	
		return $NREGUIST;
	}


	public function costoEnvase() 
	{
		$nreguist      = Input::get('idnreguist', '');

        /* Lee Envases */
		$ENVASES       = DB::table('vCostoEnvases')->where('NREGUIST_PROD', $nreguist)->select(DB::raw('Sum(COSTO) COSTO'))->first();
		$COSTO         = $ENVASES->COSTO;
		return $COSTO;
	}

}
