public Boolean guardarTrasladoIngreso(int idDocumento,
            List<int> listaProductos,
            int idbodegaDest,
            List<int> listacantidad,
            List<int> listalote,
            List<String> listaTallas,
            int falta,
            List<EquipoTraslado> listaEquiposTraslado)
        {
            int transaccion = 0;
            Boolean retorno = true;
            Decimal idLote = 0;
            String estado;
            Decimal id_inventario = 0;

            Conexion conexion = new Conexion(Empresa);
            conexion.IniciarTransaccion();

            lote _lote = new lote(Empresa, Usuario);

            try
            {
                for (int i = 0; i < listaProductos.Count; i++)
                {
                    _lote.MensajeError = null;
                    DataTable tablalote = _lote.ObtenerAlmLotePorId(listalote[i], conexion);

                    if (_lote.MensajeError != null)
                    {
                        retorno = false;
                        MensajeError = _lote.MensajeError;
                        conexion.DeshacerTransaccion();
                        break;
                    }
                    else
                    {
                        DataRow filalote = tablalote.Rows[0];
                        Decimal costo = Convert.ToDecimal(filalote["COSTO"]);
                        DateTime fecha = System.DateTime.Today;

                        idLote = _lote.AdicionarAlmLote(Convert.ToInt32(filalote["ID_DOCUMENTO"]), listaProductos[i], idbodegaDest, fecha, listacantidad[i], 0, costo, listaTallas[i], "S", conexion, filalote["REEMBOLSO"].ToString());
                        if (idLote <= 0)
                        {
                            retorno = false;
                            conexion.DeshacerTransaccion();
                            MensajeError += "No fue posible crear el lote por: " + _lote.MensajeError;
                            break;
                        }
                        else
                        {
                            id_inventario = AdicionarAlmInventario(idDocumento, listaProductos[i], idbodegaDest, listacantidad[i], costo, fecha, "ENTRADA", conexion, Convert.ToInt32(idLote), listaTallas[i], 0, 0, null, filalote["REEMBOLSO"].ToString());

                            if (id_inventario <= 0)
                            {
                                retorno = false;
                                conexion.DeshacerTransaccion();
                                break;
                            }
                            else
                            {
                                transaccion++;
                            }
                        }
                    }
                }

                if (retorno == true)
                {
                    foreach (EquipoTraslado equipo in listaEquiposTraslado)
                    {
                        _lote.MensajeError = null;
                        DataTable tablalote = _lote.ObtenerAlmLotePorId(Convert.ToInt32(equipo.ID_LOTE), conexion);

                        if (_lote.MensajeError != null)
                        {
                            retorno = false;
                            MensajeError = _lote.MensajeError;
                            conexion.DeshacerTransaccion();
                            break;
                        }
                        else
                        {
                            DataRow filalote = tablalote.Rows[0];
                            Decimal costo = Convert.ToDecimal(filalote["COSTO"]);
                            DateTime fecha = System.DateTime.Today;

                            idLote = _lote.AdicionarAlmLote(Convert.ToInt32(filalote["ID_DOCUMENTO"]), Convert.ToInt32(equipo.ID_PRODUCTO), idbodegaDest, fecha, 1, 0, costo, filalote["TALLA"].ToString(), "S", conexion, filalote["REEMBOLSO"].ToString());
                            if (idLote <= 0)
                            {
                                retorno = false;
                                conexion.DeshacerTransaccion();
                                MensajeError += "No fue posible crear el lote por: " + _lote.MensajeError;
                                break;
                            }
                            else
                            {
                                id_inventario = AdicionarAlmInventario(idDocumento, Convert.ToInt32(equipo.ID_PRODUCTO), idbodegaDest, 1, costo, fecha, "ENTRADA", conexion, Convert.ToInt32(idLote), filalote["TALLA"].ToString(), Convert.ToInt32(equipo.ID_EQUIPO), 0, null, filalote["REEMBOLSO"].ToString());

                                if (id_inventario <= 0)
                                {
                                    retorno = false;
                                    conexion.DeshacerTransaccion();
                                    break;
                                }
                                else
                                {
                                    if (_lote.ActualizarLoteActualDeUnEquipo(equipo.ID_EQUIPO, idLote, Convert.ToDecimal(idDocumento), conexion) == false)
                                    {
                                        retorno = false;
                                        conexion.DeshacerTransaccion();
                                        MensajeError = _lote.MensajeError;
                                        break;
                                    }
                                    else
                                    {
                                        transaccion++;
                                    }
                                }
                            }
                        }
                    }
                }

                if (retorno == true)
                {
                    if (falta > 0)
                    {
                        estado = "RECIBIDO";
                    }
                    else
                    {
                        estado = "COMPLETO";
                    }

                    if (transaccion == (listaProductos.Count + listaEquiposTraslado.Count))
                    {
                        documento _doc = new documento(Empresa, Usuario);
                        DataTable tablaDoc = _doc.ObtenerAlmRegDocumentoPorId(idDocumento);
                        DataRow filaDoc = tablaDoc.Rows[0];

                        if (_doc.ActualizarAlmDocumento(idDocumento, 0, 0, "TRASLADO", "", "", Convert.ToDateTime(filaDoc["FECHA_DOCUMENTO"]), new DateTime(), idbodegaDest, 0, 0, estado, filaDoc["OBSERVACION_JUSTIFICACION"].ToString(), 0, conexion) == false)
                        {
                            retorno = false;
                            MensajeError = _doc.MensajeError;
                            conexion.DeshacerTransaccion();
                        }
                    }
                    else
                    {
                        MensajeError = "la transaccion arrojó un resultado inconcistente en cuanto a los productos que se tenian que procesar.";
                        retorno = false;
                        conexion.DeshacerTransaccion();
                    }
                }

                if (retorno == true)
                {
                    conexion.AceptarTransaccion();
                }
            }
            catch (Exception ex)
            {
                retorno = false;
                conexion.DeshacerTransaccion();
                MensajeError = ex.Message;
            }
            finally
            {
                conexion.Desconectar();
            }

            return retorno;
        }
        public Decimal guardarTraslado(Decimal id_bodega_origen,
            List<int> lista_productos,
            List<int> lista_Cantidades,
            List<int> lista_lotes,
            Decimal id_bodega_destino,
            String Observaciones,
            List<String> talla,
            List<EquipoTraslado> listaEquiposTraslado)
        {
            int cantidadRegistrosActualizados = 0;
            int ConteLo;

            DateTime fecha = System.DateTime.Today;
            Decimal idInventario = 0;
            Decimal idDOC = 0;

            Boolean correcto = true;

            Conexion conexion = new Conexion(Empresa);
            conexion.IniciarTransaccion();

            try
            {
                lote _lote = new lote(Empresa, Usuario);

                documento _doc = new documento(Empresa, Usuario);
                idDOC = _doc.AdicionarAlmDocumentos(0, 0, "TRASLADO", "", "", fecha, new DateTime(), Convert.ToInt32(id_bodega_destino), 0, 0, "ELABORADO", Observaciones, conexion, 0, null);

                if (idDOC == 0)
                {
                    conexion.DeshacerTransaccion();
                    correcto = false;
                    MensajeError = _doc.MensajeError;
                }
                else
                {
                    for (int i = 0; i < lista_productos.Count; i++)
                    {
                        _lote.MensajeError = null;
                        DataTable tablalo = _lote.ObtenerAlmLotePorId(lista_lotes[i], conexion);

                        if (_lote.MensajeError != null)
                        {
                            conexion.DeshacerTransaccion();
                            correcto = false;
                            break;
                        }
                        else
                        {
                            DataRow filalo = tablalo.Rows[0];
                            ConteLo = Convert.ToInt32(filalo["ENTRADAS"]) - Convert.ToInt32(filalo["SALIDAS"]);

                            if (lista_Cantidades[i] <= ConteLo)
                            {
                                idInventario = AdicionarAlmInventario(Convert.ToInt32(idDOC), lista_productos[i], Convert.ToInt32(id_bodega_origen), lista_Cantidades[i], Convert.ToDecimal(filalo["COSTO"]), fecha, "SALIDA", conexion, lista_lotes[i], talla[i], 0, 0, null, filalo["REEMBOLSO"].ToString());

                                if (idInventario == 0)
                                {
                                    conexion.DeshacerTransaccion();
                                    MensajeError += "ADVERTENCIA: El registro de inventario no pudo ser creado. Valide Por favor.";
                                    correcto = false;
                                    break;
                                }
                                else
                                {
                                    String activo = "S";
                                    if (ConteLo - lista_Cantidades[i] <= 0)
                                    {
                                        activo = "N";
                                    }

                                    if (_lote.ActualizarAlmLote(lista_lotes[i], Convert.ToInt32(filalo["ID_DOCUMENTO"]), lista_productos[i], Convert.ToInt32(id_bodega_origen), Convert.ToDateTime(filalo["FECHA_REGISTRO"]), Convert.ToInt32(filalo["ENTRADAS"]), Convert.ToInt32(filalo["SALIDAS"]) + lista_Cantidades[i], Convert.ToDecimal(filalo["COSTO"]), filalo["TALLA"].ToString(), activo, conexion) == false)
                                    {
                                        conexion.DeshacerTransaccion();
                                        correcto = false;
                                        MensajeError += "ADVERTENCIA: El registro del lote no pudo ser actualizado. Verifique Por Favor";
                                        break;
                                    }
                                    else
                                    {
                                        cantidadRegistrosActualizados++;
                                    }
                                }
                            }
                            else
                            {
                                conexion.DeshacerTransaccion();
                                correcto = false;
                                MensajeError += "ADVERTENCIA: La cantidad de producto (" + lista_productos[i].ToString() + ") solicitada no puede ser sacada del lote (" + lista_lotes[i].ToString() + ") seleccionado, cambie la cantidad o haga varios registros con cantidades posibles.";
                                break;
                            }
                        }
                    }

                    foreach (EquipoTraslado equipo in listaEquiposTraslado)
                    {
                        _lote.MensajeError = null;
                        DataTable tablalo = _lote.ObtenerAlmLotePorId(Convert.ToInt32(equipo.ID_LOTE), conexion);

                        if (_lote.MensajeError != null)
                        {
                            conexion.DeshacerTransaccion();
                            correcto = false;
                            break;
                        }
                        else
                        {
                            DataRow filalo = tablalo.Rows[0];
                            ConteLo = Convert.ToInt32(filalo["ENTRADAS"]) - Convert.ToInt32(filalo["SALIDAS"]);

                            if (1 <= ConteLo)
                            {
                                idInventario = AdicionarAlmInventario(Convert.ToInt32(idDOC), Convert.ToInt32(equipo.ID_PRODUCTO), Convert.ToInt32(id_bodega_origen), 1, Convert.ToDecimal(filalo["COSTO"]), fecha, "SALIDA", conexion, Convert.ToInt32(equipo.ID_LOTE), filalo["TALLA"].ToString(), Convert.ToInt32(equipo.ID_EQUIPO), 0, null, filalo["REEMBOLSO"].ToString());

                                if (idInventario == 0)
                                {
                                    conexion.DeshacerTransaccion();
                                    MensajeError += "ADVERTENCIA: El registro de inventario no pudo ser creado. Valide Por favor.";
                                    correcto = false;
                                    break;
                                }
                                else
                                {
                                    String activo = "S";
                                    if (ConteLo - 1 <= 0)
                                    {
                                        activo = "N";
                                    }

                                    if (_lote.ActualizarAlmLote(Convert.ToInt32(equipo.ID_LOTE), Convert.ToInt32(filalo["ID_DOCUMENTO"]), Convert.ToInt32(equipo.ID_PRODUCTO), Convert.ToInt32(filalo["ID_BODEGA"]), Convert.ToDateTime(filalo["FECHA_REGISTRO"]), Convert.ToInt32(filalo["ENTRADAS"]), Convert.ToInt32(filalo["SALIDAS"]) + 1, Convert.ToDecimal(filalo["COSTO"]), filalo["TALLA"].ToString(), activo, conexion) == false)
                                    {
                                        conexion.DeshacerTransaccion();
                                        correcto = false;
                                        MensajeError += "ADVERTENCIA: El registro del lote no pudo ser actualizado. Verifique Por Favor";
                                        break;
                                    }
                                    else
                                    {
                                        _lote.MensajeError = null;
                                        if (_lote.ActualizarLoteActualDeUnEquipo(equipo.ID_EQUIPO, 0, 0, conexion) == false)
                                        {
                                            conexion.DeshacerTransaccion();
                                            correcto = false;
                                            MensajeError = _lote.MensajeError;
                                            break;
                                        }
                                        else
                                        {
                                            cantidadRegistrosActualizados++;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                conexion.DeshacerTransaccion();
                                correcto = false;
                                MensajeError += "ADVERTENCIA: La cantidad de (equipo(s)) solicitada no puede ser sacada del lote (" + equipo.ID_LOTE.ToString() + ") seleccionado, cambie la cantidad o haga varios registros con cantidades posibles.";
                                break;
                            }
                        }
                    }
                }

                if (correcto == true)
                {
                    conexion.AceptarTransaccion();
                }
            }
            catch (Exception ex)
            {
                conexion.DeshacerTransaccion();
                correcto = false;
                MensajeError = ex.Message;
            }
            finally
            {
                conexion.Desconectar();
            }

            if (correcto == true)
            {
                return idDOC;
            }
            else
            {
                return 0;
            }
        }