public object EliminarPredespacho(string lista, Sam3_Usuario usuario)
        {
            JavaScriptSerializer ser = new JavaScriptSerializer();

            int[] ids = ser.Deserialize <int[]>(lista);
            using (SamContext ctx = new SamContext()) {
                foreach (int id in ids)
                {
                    Sam3_PreDespacho pred = ctx.Sam3_PreDespacho.Where(x => x.PreDespachoID == id).FirstOrDefault();
                    pred.Activo              = false;
                    pred.FechaModificacion   = DateTime.Now;
                    pred.UsuarioModificacion = usuario.UsuarioID;
                    ctx.SaveChanges();
                }
            }
            TransactionalInformation result = new TransactionalInformation();

            //result.ReturnMessage.Add(preDespacho.PreDespachoID.ToString());
            result.ReturnCode     = 200;
            result.ReturnStatus   = true;
            result.IsAuthenicated = true;

            return(result);
        }
        /// <summary>
        /// Funcion para obtener los datos del grid de pre despacho
        /// </summary>
        /// <param name="spoolID"></param>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public object ObtenerGridPreDespacho(int odtID, Sam3_Usuario usuario)
        {
            try
            {
                List <int> proyectos = new List <int>();
                List <int> patios    = new List <int>();
                UsuarioBd.Instance.ObtenerPatiosYProyectosDeUsuario(usuario.UsuarioID, out proyectos, out patios);
                using (SamContext ctx = new SamContext())
                {
                    proyectos = (from eqp in ctx.Sam3_EquivalenciaProyecto
                                 where eqp.Activo &&
                                 proyectos.Contains(eqp.Sam3_ProyectoID)
                                 select eqp.Sam2_ProyectoID).Distinct().AsParallel().ToList();

                    proyectos = proyectos.Where(x => x > 0).ToList();

                    patios = (from p in ctx.Sam3_Proyecto
                              join pa in ctx.Sam3_Patio on p.PatioID equals pa.PatioID
                              join eq in ctx.Sam3_EquivalenciaPatio on pa.PatioID equals eq.Sam2_PatioID
                              where p.Activo && pa.Activo && eq.Activo &&
                              proyectos.Contains(p.ProyectoID)
                              select eq.Sam2_PatioID).Distinct().AsParallel().ToList();

                    patios = patios.Where(x => x > 0).ToList();

                    List <int> numerosUnicosAprobadosSam3 = (from nu in ctx.Sam3_NumeroUnico
                                                             where nu.Activo && nu.EstatusDocumental == "Aprobado" && nu.EstatusFisico == "Aprobado"
                                                             select nu.NumeroUnicoID).AsParallel().ToList();

                    List <int> numerosUnicosAprobadosSam2 = (from eq in ctx.Sam3_EquivalenciaNumeroUnico
                                                             where eq.Activo && numerosUnicosAprobadosSam3.Contains(eq.Sam3_NumeroUnicoID)
                                                             select eq.Sam2_NumeroUnicoID).AsParallel().ToList();

                    using (Sam2Context ctx2 = new Sam2Context())
                    {
                        List <PreDespacho> listado = (from ots in ctx2.OrdenTrabajoSpool
                                                      join ot in ctx2.OrdenTrabajo on ots.OrdenTrabajoID equals ot.OrdenTrabajoID
                                                      join otm in ctx2.OrdenTrabajoMaterial on ots.OrdenTrabajoSpoolID equals otm.OrdenTrabajoSpoolID
                                                      join ms in ctx2.MaterialSpool on otm.MaterialSpoolID equals ms.MaterialSpoolID
                                                      join nu in ctx2.NumeroUnico on otm.NumeroUnicoCongeladoID equals nu.NumeroUnicoID
                                                      join ic in ctx2.ItemCode on ms.ItemCodeID equals ic.ItemCodeID
                                                      where ot.OrdenTrabajoID == odtID &&
                                                      proyectos.Contains(ot.ProyectoID) &&
                                                      ic.TipoMaterialID == 2
                                                      //&& !otm.TieneDespacho && numerosUnicosAprobadosSam2.Contains(nu.NumeroUnicoID)
                                                      select new PreDespacho
                        {
                            ItemCodeID = ic.ItemCodeID.ToString(),
                            ItemCode = ic.Codigo,
                            NumeroControlID = ots.OrdenTrabajoSpoolID.ToString(),
                            NumeroControl = ots.NumeroControl,
                            //NumeroUnico = nu.Codigo,
                            Descripcion = ic.DescripcionEspanol,
                            Etiqueta = ms.Etiqueta,
                            MaterialSpoolID = otm.MaterialSpoolID
                        }).AsParallel().ToList();

                        foreach (PreDespacho item in listado)
                        {
                            int sam3_ItemCodeID = (from eqn in ctx.Sam3_EquivalenciaItemCode
                                                   where eqn.Activo &&
                                                   eqn.Sam2_ItemCodeID.ToString() == item.ItemCodeID
                                                   select eqn.Sam3_ItemCodeID).AsParallel().SingleOrDefault();

                            if (ctx.Sam3_PreDespacho
                                .Where(x => x.OrdenTrabajoSpoolID.ToString() == item.NumeroControlID &&
                                       x.ItemCodeID == sam3_ItemCodeID &&
                                       x.MaterialSpoolID == item.MaterialSpoolID).Any())
                            {
                                Sam3_PreDespacho preDespacho = ctx.Sam3_PreDespacho
                                                               .Where(x => x.OrdenTrabajoSpoolID.ToString() == item.NumeroControlID &&
                                                                      x.ItemCodeID == sam3_ItemCodeID &&
                                                                      x.MaterialSpoolID == item.MaterialSpoolID &&
                                                                      x.Activo).AsParallel().SingleOrDefault();

                                if (preDespacho != null)
                                {
                                    item.PreDespachoID = preDespacho.PreDespachoID.ToString();

                                    int sam3_NumeroUnicoID = preDespacho.NumeroUnicoID; //(from pre in ctx.Sam3_PreDespacho
                                    //                          where pre.Activo
                                    //                          && pre.OrdenTrabajoSpoolID.ToString() == item.NumeroControlID
                                    //                          && pre.ItemCodeID == sam3_ItemCodeID
                                    //                          && pre.MaterialSpoolID == item.MaterialSpoolID
                                    //                          select pre.NumeroUnicoID).AsParallel().SingleOrDefault();

                                    int sam2_numeroUnicoID = (from eqn in ctx.Sam3_EquivalenciaNumeroUnico
                                                              where eqn.Activo && eqn.Sam3_NumeroUnicoID == sam3_NumeroUnicoID
                                                              select eqn.Sam2_NumeroUnicoID).AsParallel().SingleOrDefault();

                                    NumeroUnico SAM2NumUnico = ctx2.NumeroUnico.Where(x => x.NumeroUnicoID == sam2_numeroUnicoID).AsParallel().SingleOrDefault();

                                    item.NumeroUnico   = SAM2NumUnico.Codigo;
                                    item.NumeroUnicoID = SAM2NumUnico.NumeroUnicoID.ToString();
                                }
                            }
                        }

                        return(listado.OrderBy(x => x.NumeroControlID).ToList());
                    }
                }
            }
            catch (Exception ex)
            {
                //-----------------Agregar mensaje al Log -----------------------------------------------
                LoggerBd.Instance.EscribirLog(ex);
                //-----------------Agregar mensaje al Log -----------------------------------------------
                TransactionalInformation result = new TransactionalInformation();
                result.ReturnMessage.Add(ex.Message);
                result.ReturnCode     = 500;
                result.ReturnStatus   = false;
                result.IsAuthenicated = true;

                return(result);
            }
        }
        /// <summary>
        /// Funcion para el boton Predespachar
        /// Pantalla pre despacho
        /// </summary>
        /// <param name="lista"></param>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public object Predespachar(List <PreDespachoItems> lista, Sam3_Usuario usuario)
        {
            try
            {
                int preDespachoID = 0;
                using (SamContext ctx = new SamContext())
                {
                    using (var ctx_tran = ctx.Database.BeginTransaction())
                    {
                        using (Sam2Context ctx2 = new Sam2Context())
                        {
                            foreach (PreDespachoItems item in lista)
                            {
                                preDespachoID = item.PreDespachoID != "" ? Convert.ToInt32(item.PreDespachoID) : 0;
                                bool tieneHold = (from sh in ctx2.SpoolHold
                                                  where sh.SpoolID == (from odts in ctx2.OrdenTrabajoSpool
                                                                       where odts.OrdenTrabajoSpoolID.ToString() == item.NumeroControl
                                                                       select odts.SpoolID).FirstOrDefault() &&
                                                  (sh.TieneHoldCalidad || sh.TieneHoldIngenieria || sh.Confinado)
                                                  select sh).AsParallel().Any();

                                if (!tieneHold)
                                {
                                    DatabaseManager.Sam2.ItemCode itemCode = (from it in ctx2.ItemCode
                                                                              where it.ItemCodeID.ToString() == item.ItemCode
                                                                              select it).AsParallel().SingleOrDefault();

                                    int proyectoID      = itemCode.ProyectoID;
                                    int sam3_ProyectoID = (from eqp in ctx.Sam3_EquivalenciaProyecto
                                                           where eqp.Activo && eqp.Sam2_ProyectoID == proyectoID
                                                           select eqp.Sam3_ProyectoID).AsParallel().SingleOrDefault();

                                    int sam3_ItemCodeID = (from eqi in ctx.Sam3_EquivalenciaItemCode
                                                           where eqi.Activo && eqi.Sam2_ItemCodeID == itemCode.ItemCodeID
                                                           select eqi.Sam3_ItemCodeID).AsParallel().SingleOrDefault();

                                    //Dividimos el codigo del numero para buscarlo en sam3
                                    string[] elementosCodigo        = item.NumeroUnico.Split('-').ToArray();
                                    int      consecutivoNumeroUnico = Convert.ToInt32(elementosCodigo[1]);
                                    string   prefijoNumeroUnico     = elementosCodigo[0];

                                    //int sam3_ProyectoID = (from nueq in ctx.Sam3_EquivalenciaProyecto
                                    //                       where nueq.Activo && nueq.Sam2_ProyectoID == proyectoID
                                    //                       select nueq.Sam3_ProyectoID).AsParallel().SingleOrDefault();

                                    //traemos los datos de la orden de trabajo spool de Sam2
                                    OrdenTrabajoSpool odtSpool = (from odts in ctx2.OrdenTrabajoSpool
                                                                  join odt in ctx2.OrdenTrabajo on odts.OrdenTrabajoID equals odt.OrdenTrabajoID
                                                                  where odts.OrdenTrabajoSpoolID.ToString() == item.NumeroControl &&
                                                                  odt.ProyectoID == proyectoID
                                                                  select odts).AsParallel().SingleOrDefault();

                                    //traemos los datos del material de Sam 2
                                    MaterialSpool materialSpool = (from ms in ctx2.MaterialSpool
                                                                   join odts in ctx2.OrdenTrabajoSpool on ms.SpoolID equals odts.SpoolID
                                                                   where odts.OrdenTrabajoSpoolID == odtSpool.OrdenTrabajoSpoolID &&
                                                                   ms.Etiqueta == item.Etiqueta
                                                                   select ms).AsParallel().SingleOrDefault();

                                    //traemos los datos de la orden de trabajo material de Sam 2
                                    OrdenTrabajoMaterial odtMaterial = (from odtm in ctx2.OrdenTrabajoMaterial
                                                                        where odtm.OrdenTrabajoSpoolID == odtSpool.OrdenTrabajoSpoolID &&
                                                                        odtm.MaterialSpoolID == materialSpool.MaterialSpoolID
                                                                        select odtm).AsParallel().SingleOrDefault();

                                    //buscamos el numero unico en SAM 3
                                    if (ctx.Sam3_NumeroUnico.Where(x => x.Prefijo == prefijoNumeroUnico &&
                                                                   x.Consecutivo == consecutivoNumeroUnico && x.ProyectoID == sam3_ProyectoID).AsParallel().Any())
                                    {
                                        //int sam2_numeroUnicoID = 0;
                                        // numero unico seleccionado en el grid
                                        Sam3_NumeroUnico numeroUnico = ctx.Sam3_NumeroUnico.Where(x => x.Prefijo == prefijoNumeroUnico &&
                                                                                                  x.Consecutivo == consecutivoNumeroUnico && x.ProyectoID == sam3_ProyectoID).AsParallel().SingleOrDefault();


                                        if (preDespachoID > 0) // existe el predespacho
                                        {
                                            Sam3_PreDespacho preDespacho = (from pre in ctx.Sam3_PreDespacho
                                                                            where pre.Activo &&
                                                                            pre.PreDespachoID == preDespachoID
                                                                            select pre).AsParallel().SingleOrDefault();

                                            // si el numero Unico seleccionado es diferente del numero unico que se encuentra registrado en el predespacho
                                            if (preDespachoID > 0 && preDespacho.NumeroUnicoID != numeroUnico.NumeroUnicoID)
                                            {
                                                preDespacho.Activo              = true;
                                                preDespacho.FechaModificacion   = DateTime.Now;
                                                preDespacho.FechaPreDespacho    = DateTime.Now;
                                                preDespacho.UsuarioModificacion = usuario.UsuarioID;
                                                preDespacho.ProyectoID          = sam3_ProyectoID;
                                                preDespacho.NumeroUnicoID       = numeroUnico.NumeroUnicoID;
                                                preDespacho.Cantidad            = (int)odtMaterial.CantidadCongelada;
                                                ctx.SaveChanges();
                                            }
                                        }
                                        else
                                        {
                                            Sam3_PreDespacho preDespacho = new Sam3_PreDespacho();
                                            preDespacho.Activo              = true;
                                            preDespacho.FechaModificacion   = DateTime.Now;
                                            preDespacho.FechaPreDespacho    = DateTime.Now;
                                            preDespacho.UsuarioModificacion = usuario.UsuarioID;
                                            preDespacho.ProyectoID          = sam3_ProyectoID;
                                            preDespacho.OrdenTrabajoSpoolID = Convert.ToInt32(item.NumeroControl);
                                            preDespacho.NumeroUnicoID       = numeroUnico.NumeroUnicoID;
                                            preDespacho.MaterialSpoolID     = odtMaterial.MaterialSpoolID;
                                            preDespacho.ItemCodeID          = sam3_ItemCodeID;
                                            preDespacho.Cantidad            = (int)odtMaterial.CantidadCongelada;
                                            ctx.Sam3_PreDespacho.Add(preDespacho);
                                            ctx.SaveChanges();
                                        }
                                    }
                                }
                                else
                                {
                                    throw new Exception("El Spool cuenta con Hold, no se puede Pre-Despachar");
                                }
                            }

                            ctx_tran.Commit();

                            TransactionalInformation result = new TransactionalInformation();
                            //result.ReturnMessage.Add(preDespacho.PreDespachoID.ToString());
                            result.ReturnCode     = 200;
                            result.ReturnStatus   = true;
                            result.IsAuthenicated = true;

                            return(result);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //-----------------Agregar mensaje al Log -----------------------------------------------
                LoggerBd.Instance.EscribirLog(ex);
                //-----------------Agregar mensaje al Log -----------------------------------------------
                TransactionalInformation result = new TransactionalInformation();
                result.ReturnMessage.Add(ex.Message);
                result.ReturnCode     = 500;
                result.ReturnStatus   = false;
                result.IsAuthenicated = true;

                return(result);
            }
        }