/// <summary>
        /// Genera la carga inicial de los inventarios
        /// </summary>
        /// <param name="cargaInventarios"></param>
        /// <returns></returns>
        public void GenerarCargaInicial(List <CargaMPPAModel> cargaInventarios)
        {
            try
            {
                var almacenInventarioBL     = new AlmacenInventarioBL();
                var almacenInventarioLoteBL = new AlmacenInventarioLoteBL();
                var fechaBL = new FechaBL();

                FechaInfo fechaActual = fechaBL.ObtenerFechaActual();

                using (var transaction = new TransactionScope())
                {
                    foreach (var cargaInventario in cargaInventarios)
                    {
                        if (cargaInventario.AlmacenInventario == null)
                        {
                            cargaInventario.AlmacenInventario = new AlmacenInventarioInfo();
                        }
                        var almacenInventarioFiltro = new AlmacenInventarioInfo
                        {
                            AlmacenID  = cargaInventario.AlmacenID,
                            ProductoID = cargaInventario.ProductoID
                        };

                        var almacenInventario = almacenInventarioBL.ObtenerPorAlmacenIdProductoId(almacenInventarioFiltro);

                        if (almacenInventario == null)
                        {
                            almacenInventario = new AlmacenInventarioInfo();
                        }

                        var almacenInventarioLote = new AlmacenInventarioLoteInfo();

                        almacenInventario.Importe        = almacenInventario.Importe + cargaInventario.ImporteActual;
                        almacenInventario.Cantidad       = almacenInventario.Cantidad + cargaInventario.CantidadActual;
                        almacenInventario.PrecioPromedio = almacenInventario.Importe /
                                                           almacenInventario.Cantidad;
                        almacenInventario.AlmacenID             = cargaInventario.Almacen.AlmacenID;
                        almacenInventario.ProductoID            = cargaInventario.Producto.ProductoId;
                        almacenInventario.UsuarioCreacionID     = 1;
                        almacenInventario.UsuarioModificacionID = 1;

                        if (almacenInventario.AlmacenInventarioID == 0)
                        {
                            int almacenInventarioID = almacenInventarioBL.Crear(almacenInventario);
                            almacenInventario.AlmacenInventarioID = almacenInventarioID;
                        }
                        else
                        {
                            almacenInventarioBL.Actualizar(almacenInventario);
                        }
                        if (cargaInventario.Producto.ManejaLote)
                        {
                            almacenInventarioLote = new AlmacenInventarioLoteInfo
                            {
                                AlmacenInventario = almacenInventario,
                                Cantidad          = cargaInventario.CantidadActual,
                                Importe           = cargaInventario.ImporteActual,
                                PrecioPromedio    =
                                    cargaInventario.ImporteActual /
                                    cargaInventario.CantidadActual,
                                Lote        = cargaInventario.Lote,
                                Piezas      = cargaInventario.Piezas,
                                FechaInicio =
                                    cargaInventario.FechaInicioLote == DateTime.MinValue
                                                                        ? fechaActual.FechaActual
                                                                        : cargaInventario.FechaInicioLote,
                                UsuarioCreacionId = 1,
                                Activo            = EstatusEnum.Activo
                            };
                            int almacenInventaroLoteID =
                                almacenInventarioLoteBL.CrearConTodosParametros(almacenInventarioLote);
                            almacenInventarioLote.AlmacenInventarioLoteId = almacenInventaroLoteID;
                        }
                        GenerarMovimientosAlmacen(cargaInventario, almacenInventarioLote);
                    }

                    transaction.Complete();
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
        /// <summary>
        /// Se actualiza inventario y lote
        /// </summary>
        /// <param name="diferenciasDeInventariosInfo"></param>
        /// <param name="usuarioId"></param>
        internal void ActualizarInventarioYLote(DiferenciasDeInventariosInfo diferenciasDeInventariosInfo, int usuarioId)
        {
            var almacenInventarioBl     = new AlmacenInventarioBL();
            var almacenInventarioLoteBl = new AlmacenInventarioLoteBL();
            //Actualiza inventario
            //Obtenemos el inventario de acuerdo al almacen y producto obtenido
            var inventarioInfo = almacenInventarioBl.ObtenerPorAlmacenIdProductoId(new AlmacenInventarioInfo()
            {
                AlmacenID = diferenciasDeInventariosInfo.Almacen.AlmacenID, ProductoID = diferenciasDeInventariosInfo.Producto.ProductoId
            });

            if (inventarioInfo != null)
            {
                if (diferenciasDeInventariosInfo.AlmacenMovimiento.TipoMovimientoID ==
                    TipoMovimiento.SalidaPorAjuste.GetHashCode())
                {
                    inventarioInfo.Cantidad = inventarioInfo.Cantidad -
                                              diferenciasDeInventariosInfo.DiferenciaInventario;
                    inventarioInfo.Importe = inventarioInfo.PrecioPromedio * inventarioInfo.Cantidad;
                }
                if (diferenciasDeInventariosInfo.AlmacenMovimiento.TipoMovimientoID ==
                    TipoMovimiento.EntradaPorAjuste.GetHashCode())
                {
                    inventarioInfo.Cantidad = inventarioInfo.Cantidad +
                                              diferenciasDeInventariosInfo.DiferenciaInventario;
                    inventarioInfo.Importe = inventarioInfo.PrecioPromedio * inventarioInfo.Cantidad;
                }
                inventarioInfo.UsuarioModificacionID = usuarioId;
                //Actualiza inventario
                almacenInventarioBl.Actualizar(inventarioInfo);
            }

            //Actualiza inventario lote
            var almacenInventarioLoteInfo =
                almacenInventarioLoteBl.ObtenerAlmacenInventarioLotePorId(
                    diferenciasDeInventariosInfo.AlmacenInventarioLote.AlmacenInventarioLoteId);

            if (almacenInventarioLoteInfo != null)
            {
                if (diferenciasDeInventariosInfo.AlmacenMovimiento.TipoMovimientoID ==
                    TipoMovimiento.SalidaPorAjuste.GetHashCode())
                {
                    almacenInventarioLoteInfo.Cantidad = almacenInventarioLoteInfo.Cantidad -
                                                         diferenciasDeInventariosInfo.DiferenciaInventario;
                    almacenInventarioLoteInfo.Importe = almacenInventarioLoteInfo.PrecioPromedio * almacenInventarioLoteInfo.Cantidad;
                }
                if (diferenciasDeInventariosInfo.AlmacenMovimiento.TipoMovimientoID ==
                    TipoMovimiento.EntradaPorAjuste.GetHashCode())
                {
                    almacenInventarioLoteInfo.Cantidad = almacenInventarioLoteInfo.Cantidad +
                                                         diferenciasDeInventariosInfo.DiferenciaInventario;
                    almacenInventarioLoteInfo.Importe = almacenInventarioLoteInfo.PrecioPromedio * almacenInventarioLoteInfo.Cantidad;
                }
                almacenInventarioLoteInfo.UsuarioModificacionId = usuarioId;
                //Actualiza inventario
                almacenInventarioLoteBl.Actualizar(almacenInventarioLoteInfo);
                //Kilogramos teoricos en 0 se desactiva el lote
                //if (diferenciasDeInventariosInfo.KilogramosFisicos == 0)
                //{
                //    //Desactivar lote
                //    almacenInventarioLoteBl.DesactivarLote(almacenInventarioLoteInfo);
                //}
            }
        }