Пример #1
0
        /// <summary>
        /// Obtiene los movimientos pendientes pro autorizar del cierre de dia de inventario de planta de alimentos
        /// </summary>
        /// <returns></returns>
        internal List <MovimientosAutorizarCierreDiaPAModel> ObtenerMovimientosPendientesAutorizar(
            FiltrosAutorizarCierreDiaInventarioPA filtrosAutorizarCierreDia)
        {
            List <MovimientosAutorizarCierreDiaPAModel> result;

            try
            {
                Logger.Info();
                var mermaSuperavitDAL    = new MermaSuperavitDAL();
                var listaMermas          = mermaSuperavitDAL.ObtenerPorAlmacenID(filtrosAutorizarCierreDia.AlmacenID);
                var almacenMovimientoDal = new AlmacenMovimientoDAL();

                filtrosAutorizarCierreDia.TipoMovimientoID  = TipoMovimiento.InventarioFisico.GetHashCode();
                filtrosAutorizarCierreDia.EstatusMovimiento = Estatus.PendienteInv.GetHashCode();
                filtrosAutorizarCierreDia.FechaMovimiento   = DateTime.Now;

                List <MovimientosAutorizarCierreDiaPAModel> listaMovimientosPendientes = almacenMovimientoDal.ObtenerMovimientosPendientesAutorizar(filtrosAutorizarCierreDia);
                if (listaMovimientosPendientes == null)
                {
                    return(null);
                }
                foreach (var movimiento in listaMovimientosPendientes)
                {
                    if (movimiento.InventarioTeorico == 0)
                    {
                        continue;
                    }
                    movimiento.PorcentajeMermaSuperavit = Math.Round((Convert.ToDecimal(movimiento.InventarioTeorico - movimiento.InventarioFisico) /
                                                                      movimiento.InventarioTeorico) * 100, 2);
                    movimiento.PorcentajeLote = movimiento.ManejaLote ? Math.Round(Convert.ToDecimal(movimiento.InventarioFisico) / Convert.ToDecimal(movimiento.InventarioTeorico) * 100, 2) : 0;
                    var merma = listaMermas.FirstOrDefault(mer => mer.Producto.ProductoId == movimiento.ProductoID);
                    if (merma == null)
                    {
                        continue;
                    }
                    movimiento.PorcentajePermitido = movimiento.PorcentajeMermaSuperavit > 0 ? merma.Merma : merma.Superavit;
                }
                result = listaMovimientosPendientes;
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #2
0
 /// <summary>
 /// Actualizar estatus del movimiento
 /// </summary>
 /// <param name="almacenMovimientoInfo"></param>
 /// <returns></returns>
 internal void ActualizarEstatus(AlmacenMovimientoInfo almacenMovimientoInfo)
 {
     try
     {
         Logger.Info();
         var almacenMovimientoDal = new AlmacenMovimientoDAL();
         almacenMovimientoDal.ActualizarEstatus(almacenMovimientoInfo);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
Пример #3
0
 /// <summary>
 /// Actualiza el estatus para indicar si ya se genero ó no poliza
 /// </summary>
 /// <param name="movimientos"></param>
 /// <returns></returns>
 internal void ActualizarGeneracionPoliza(List <ContenedorAlmacenMovimientoCierreDia> movimientos)
 {
     try
     {
         Logger.Info();
         var almacenMovimientoDal = new AlmacenMovimientoDAL();
         almacenMovimientoDal.ActualizarGeneracionPoliza(movimientos);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
Пример #4
0
 /// <summary>
 /// Crear un registro en almacen movimiento
 /// </summary>
 /// <param name="almacenMovimientoInfo"></param>
 /// <returns></returns>
 internal long Crear(AlmacenMovimientoInfo almacenMovimientoInfo)
 {
     try
     {
         Logger.Info();
         var  almacenMovimientoDal = new AlmacenMovimientoDAL();
         long result = almacenMovimientoDal.Crear(almacenMovimientoInfo);
         return(result);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
Пример #5
0
        /// <summary>
        /// Obtiene todos los movimientos de un Contrato
        /// </summary>
        /// <param name="contrato"></param>
        /// <returns></returns>
        internal List <AlmacenMovimientoInfo> ObtenerMovimientosPorContrato(ContratoInfo contrato)
        {
            List <AlmacenMovimientoInfo> result;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                result = almacenMovimientoDal.ObtenerMovimientosPorContrato(contrato);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #6
0
        /// <summary>
        /// Obtiene los movimientos de los subproductos de premezcla
        /// </summary>
        /// <param name="productosPremezcla"></param>
        /// <returns></returns>
        internal IEnumerable <AlmacenMovimientoSubProductosModel> ObtenerMovimientosSubProductos(IEnumerable <AlmacenMovimientoSubProductosModel> productosPremezcla)
        {
            IEnumerable <AlmacenMovimientoSubProductosModel> result;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                result = almacenMovimientoDal.ObtenerMovimientosSubProductos(productosPremezcla);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #7
0
        /// <summary>
        /// Obtiene los movimientos de inventario para generar
        /// poliza de consumo de producto
        /// </summary>
        /// <param name="almacenID"></param>
        /// <param name="organizacionID"></param>
        /// <param name="fecha"> </param>
        /// <returns></returns>
        internal List <ContenedorAlmacenMovimientoCierreDia> ObtenerMovimientosInventario(int almacenID, int organizacionID, DateTime fecha)
        {
            List <ContenedorAlmacenMovimientoCierreDia> result;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                result = almacenMovimientoDal.ObtenerMovimientosInventario(almacenID, organizacionID, fecha);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #8
0
        /// <summary>
        /// Obtiene un registro por id
        /// </summary>
        /// <param name="almacenMovimientoId"></param>
        /// <returns></returns>
        internal AlmacenMovimientoInfo ObtenerPorIDCompleto(long almacenMovimientoId)
        {
            AlmacenMovimientoInfo result;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                result = almacenMovimientoDal.ObtenerPorIDCompleto(almacenMovimientoId);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #9
0
        /// <summary>
        /// Obtiene el Almacen Movimiento por su Detalle
        /// </summary>
        /// <param name="almancenMovimientosDetalle"></param>
        /// <returns></returns>
        internal AlmacenMovimientoInfo ObtenerMovimientoPorClaveDetalle(List <AlmacenMovimientoDetalle> almancenMovimientosDetalle)
        {
            AlmacenMovimientoInfo almacenMovimiento;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                almacenMovimiento = almacenMovimientoDal.ObtenerMovimientoPorClaveDetalle(almancenMovimientosDetalle);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(almacenMovimiento);
        }
Пример #10
0
        /// <summary>
        /// Obtiene un registro por id
        /// </summary>
        /// <param name="almacenID"></param>
        /// <returns></returns>
        internal bool ValidarEjecucionCierreDia(int almacenID)
        {
            bool result;

            try
            {
                Logger.Info();
                var almacenMovimientoDal = new AlmacenMovimientoDAL();
                result = almacenMovimientoDal.ValidarEjecucionCierreDia(almacenID);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(result);
        }
Пример #11
0
        private IList <ResultadoPolizaModel> GenerarPolizaCierreDiaPA(CierreDiaInventarioPAInfo cierreDiaInventarioPA, List <EstatusInfo> listaEstatusInventario, bool imprimePoliza)
        {
            EstatusInfo estatusAplicado =
                listaEstatusInventario.FirstOrDefault(
                    esta => esta.DescripcionCorta.Trim().Equals(ConstantesBL.MovimientoAplicado.Trim()));

            if (estatusAplicado == null)
            {
                return(null);
            }
            var filtros = new FiltroAlmacenMovimientoInfo
            {
                AlmacenID        = cierreDiaInventarioPA.AlmacenID,
                OrganizacionID   = cierreDiaInventarioPA.OrganizacionID,
                TipoMovimientoID = TipoMovimiento.InventarioFisico.GetHashCode(),
                EstatusID        = estatusAplicado.EstatusId,
                FolioMovimiento  = cierreDiaInventarioPA.FolioMovimiento
            };

            var almacenMovimientoDAL = new AlmacenMovimientoDAL();
            List <ContenedorAlmacenMovimientoCierreDia> movimientos = almacenMovimientoDAL.ObtenerMovimientosInventarioFiltros(filtros);

            if (movimientos == null || !movimientos.Any())
            {
                return(null);
            }
            var resultadosPolizaModel   = new List <ResultadoPolizaModel>();
            var listaDatosPolizaEntrada = new List <PolizaEntradaSalidaPorAjusteModel>();
            var listaDatosPolizaSalida  = new List <PolizaEntradaSalidaPorAjusteModel>();

            foreach (var detalles in cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Where(det => (det.InventarioFisico - det.InventarioTeorico > 0)))
            {
                ContenedorAlmacenMovimientoCierreDia almacenMovimientoDetalle;
                if (detalles.ManejaLote)
                {
                    almacenMovimientoDetalle =
                        movimientos.FirstOrDefault(
                            mov => mov.Producto.ProductoId == detalles.ProductoID &&
                            mov.AlmacenMovimientoDetalle.AlmacenInventarioLoteId ==
                            detalles.AlmacenInventarioLoteID);
                }
                else
                {
                    almacenMovimientoDetalle =
                        movimientos.FirstOrDefault(
                            mov => mov.Producto.ProductoId == detalles.ProductoID);
                }
                if (almacenMovimientoDetalle == null)
                {
                    continue;
                }
                int cantidadEntrada = Math.Abs(detalles.InventarioFisico - detalles.InventarioTeorico);
                var polizaDetalle   = new PolizaEntradaSalidaPorAjusteModel
                {
                    Importe  = detalles.CostoUnitario * cantidadEntrada,
                    Cantidad = cantidadEntrada,
                    Precio   = almacenMovimientoDetalle.AlmacenMovimientoDetalle.Precio,
                    AlmacenMovimientoDetalleID =
                        almacenMovimientoDetalle.AlmacenMovimientoDetalle.AlmacenMovimientoDetalleID,
                    ProductoID = detalles.ProductoID,
                    CantidadInventarioFisico  = detalles.InventarioFisico,
                    CantidadInventarioTeorico = detalles.InventarioTeorico,
                    Observaciones             = almacenMovimientoDetalle.AlmacenMovimiento.Observaciones,
                    Lote = detalles.Lote
                };
                listaDatosPolizaEntrada.Add(polizaDetalle);
            }

            foreach (var detalles in cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Where(det => (det.InventarioFisico - det.InventarioTeorico < 0)))
            {
                ContenedorAlmacenMovimientoCierreDia almacenMovimientoDetalle;
                if (detalles.ManejaLote)
                {
                    almacenMovimientoDetalle =
                        movimientos.FirstOrDefault(
                            mov => mov.Producto.ProductoId == detalles.ProductoID &&
                            mov.AlmacenMovimientoDetalle.AlmacenInventarioLoteId ==
                            detalles.AlmacenInventarioLoteID);
                }
                else
                {
                    almacenMovimientoDetalle =
                        movimientos.FirstOrDefault(
                            mov => mov.Producto.ProductoId == detalles.ProductoID);
                }
                if (almacenMovimientoDetalle == null)
                {
                    continue;
                }
                int cantidadSalida = Math.Abs(detalles.InventarioFisico - detalles.InventarioTeorico);
                var polizaDetalle  = new PolizaEntradaSalidaPorAjusteModel
                {
                    Importe  = detalles.CostoUnitario * cantidadSalida,
                    Cantidad = cantidadSalida,
                    Precio   = almacenMovimientoDetalle.AlmacenMovimientoDetalle.Precio,
                    AlmacenMovimientoDetalleID =
                        almacenMovimientoDetalle.AlmacenMovimientoDetalle.AlmacenMovimientoDetalleID,
                    ProductoID = detalles.ProductoID,
                    CantidadInventarioFisico  = detalles.InventarioFisico,
                    CantidadInventarioTeorico = detalles.InventarioTeorico,
                    Observaciones             = almacenMovimientoDetalle.AlmacenMovimiento.Observaciones,
                    Lote = detalles.Lote
                };
                listaDatosPolizaSalida.Add(polizaDetalle);
            }
            if (listaDatosPolizaSalida.Any())
            {
                var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.SalidaAjuste);

                IList <PolizaInfo> polizas = poliza.GeneraPoliza(listaDatosPolizaSalida);
                if (polizas != null)
                {
                    MemoryStream stream = null;
                    if (imprimePoliza)
                    {
                        stream = poliza.ImprimePoliza(listaDatosPolizaSalida, polizas);
                    }
                    var polizaBL = new PolizaBL();
                    polizas.ToList().ForEach(datos =>
                    {
                        datos.UsuarioCreacionID =
                            cierreDiaInventarioPA.UsuarioCreacionID;
                        datos.OrganizacionID         = cierreDiaInventarioPA.OrganizacionID;
                        datos.ArchivoEnviadoServidor = 1;
                    });
                    polizaBL.GuardarServicioPI(polizas, TipoPoliza.SalidaAjuste);
                    var resultadoPolizaModel = new ResultadoPolizaModel
                    {
                        Polizas = polizas,
                        PDFs    =
                            new Dictionary <TipoPoliza, MemoryStream>
                        {
                            { TipoPoliza.SalidaAjuste, stream }
                        }
                    };
                    resultadosPolizaModel.Add(resultadoPolizaModel);
                }
            }
            if (listaDatosPolizaEntrada.Any())
            {
                var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.EntradaAjuste);

                IList <PolizaInfo> polizas = poliza.GeneraPoliza(listaDatosPolizaEntrada);
                if (polizas != null)
                {
                    MemoryStream stream = null;
                    if (imprimePoliza)
                    {
                        stream = poliza.ImprimePoliza(listaDatosPolizaEntrada, polizas);
                    }
                    var polizaBL = new PolizaBL();
                    polizas.ToList().ForEach(datos =>
                    {
                        datos.UsuarioCreacionID =
                            cierreDiaInventarioPA.UsuarioCreacionID;
                        datos.OrganizacionID         = cierreDiaInventarioPA.OrganizacionID;
                        datos.ArchivoEnviadoServidor = 1;
                    });
                    polizaBL.GuardarServicioPI(polizas, TipoPoliza.EntradaAjuste);
                    var resultadoPolizaModel = new ResultadoPolizaModel
                    {
                        Polizas = polizas,
                        PDFs    =
                            new Dictionary <TipoPoliza, MemoryStream> {
                            { TipoPoliza.EntradaAjuste, stream }
                        }
                    };
                    resultadosPolizaModel.Add(resultadoPolizaModel);
                }
            }
            return(resultadosPolizaModel);
        }
Пример #12
0
        /// <summary>
        /// Genera el Cierre de Dia de Inventario
        /// </summary>
        /// <param name="cierreDiaInventarioPA"></param>
        internal void GuardarAutorizarCierreDiaInventarioPA(CierreDiaInventarioPAInfo cierreDiaInventarioPA)
        {
            var listaMovimientosFinal        = new List <AlmacenMovimientoInfo>();
            var listaMovimientosDetalleFinal = new List <AlmacenMovimientoDetalle>();
            var listaAlmacenInventario       = new List <AlmacenInventarioInfo>();
            var listaAlmacenInventarioLote   = new List <AlmacenInventarioLoteInfo>();

            var listaOriginalDetalles = new List <CierreDiaInventarioPADetalleInfo>();

            listaOriginalDetalles.AddRange(cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle);

            GenerarAjustesInventario(listaAlmacenInventarioLote, listaAlmacenInventario, cierreDiaInventarioPA);

            var estatusDAL = new EstatusDAL();
            List <EstatusInfo> listaEstatusInventario =
                estatusDAL.ObtenerEstatusTipoEstatus(TipoEstatus.Inventario.GetHashCode());

            //Toma los registros a los que se le van a generar los Movimientos de Entrada de Almacen
            cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                listaOriginalDetalles.Where(
                    det => !det.RequiereAutorizacion && (det.InventarioFisico - det.InventarioTeorico) > 0).ToList();
            if (cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Any())
            {
                ArmarAlmacenMovimientoEntradaSalidaAlmacen(listaMovimientosFinal, cierreDiaInventarioPA,
                                                           listaEstatusInventario, true);
            }

            //Toma los registros a los que se le van a generar los Movimientos de Salida de Almacen
            cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                listaOriginalDetalles.Where(
                    det => !det.RequiereAutorizacion && (det.InventarioFisico - det.InventarioTeorico) < 0).ToList();
            if (cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Any())
            {
                ArmarAlmacenMovimientoEntradaSalidaAlmacen(listaMovimientosFinal, cierreDiaInventarioPA,
                                                           listaEstatusInventario, false);
            }


            EstatusInfo estatusAplicado =
                listaEstatusInventario.FirstOrDefault(
                    esta => esta.DescripcionCorta.Trim().Equals(ConstantesBL.MovimientoAplicado.Trim()));

            EstatusInfo estatusPendiente =
                listaEstatusInventario.FirstOrDefault(
                    esta => esta.DescripcionCorta.Trim().Equals(ConstantesBL.MovimientoPendiente.Trim()));

            EstatusInfo estatusCancelado =
                listaEstatusInventario.FirstOrDefault(
                    esta => esta.DescripcionCorta.Trim().Equals(ConstantesBL.MovimientoCancelado.Trim()));

            if (estatusAplicado == null || estatusPendiente == null || estatusCancelado == null)
            {
                return;
            }

            var filtrosActualizar = new FiltroCambiarEstatusInfo
            {
                AlmacenID             = cierreDiaInventarioPA.AlmacenID,
                FolioMovimiento       = cierreDiaInventarioPA.FolioMovimiento,
                EstatusAnterior       = estatusPendiente.EstatusId,
                EstatusNuevo          = cierreDiaInventarioPA.EsCancelacion ? estatusCancelado.EstatusId : estatusAplicado.EstatusId,
                UsuarioModificacionID = cierreDiaInventarioPA.UsuarioCreacionID
            };

            if (cierreDiaInventarioPA.EsCancelacion)
            {
                var almacenMovimientoDAL = new AlmacenMovimientoDAL();
                almacenMovimientoDAL.ActualizarEstatusAlmacenMovimiento(filtrosActualizar);
                return;
            }

            using (var transaction = new TransactionScope())
            {
                var almacenMovimientoDAL        = new AlmacenMovimientoDAL();
                var almacenMovimientoDetalleDAL = new AlmacenMovimientoDetalleDAL();
                var almacenInventarioDAL        = new AlmacenInventarioDAL();
                var almacenInventarioLoteDAL    = new AlmacenInventarioLoteDAL();

                foreach (var almacenMovimiento in listaMovimientosFinal)
                {
                    long almacenMovimientoID = almacenMovimientoDAL.GuardarMovimientoCierreDiaPA(almacenMovimiento);
                    almacenMovimientoDAL.ActualizarEstatusAlmacenMovimiento(filtrosActualizar);
                    almacenMovimiento.ListaAlmacenMovimientoDetalle.ForEach(
                        det => det.AlmacenMovimientoID = almacenMovimientoID);
                    listaMovimientosDetalleFinal.AddRange(almacenMovimiento.ListaAlmacenMovimientoDetalle);
                }
                almacenMovimientoDetalleDAL.GuardarDetalleCierreDiaInventarioPA(listaMovimientosDetalleFinal);
                if (listaAlmacenInventario.Any())
                {
                    almacenInventarioDAL.AjustarAlmacenInventario(listaAlmacenInventario);
                }
                if (listaAlmacenInventarioLote.Any())
                {
                    almacenInventarioLoteDAL.AjustarAlmacenInventarioLote(listaAlmacenInventarioLote);
                }
                cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle = listaOriginalDetalles;
                GenerarPolizaCierreDiaPA(cierreDiaInventarioPA, listaEstatusInventario, false);
                transaction.Complete();
            }
        }
Пример #13
0
        /// <summary>
        /// Genera el Cierre de Dia de Inventario
        /// </summary>
        /// <param name="cierreDiaInventarioPA"></param>
        internal IList <ResultadoPolizaModel> GuardarCierreDiaInventarioPA(CierreDiaInventarioPAInfo cierreDiaInventarioPA)
        {
            try
            {
                var listaMovimientosFinal        = new List <AlmacenMovimientoInfo>();
                var listaMovimientosDetalleFinal = new List <AlmacenMovimientoDetalle>();
                var listaOriginalDetalles        = new List <CierreDiaInventarioPADetalleInfo>();
                var listaAlmacenInventario       = new List <AlmacenInventarioInfo>();
                var listaAlmacenInventarioLote   = new List <AlmacenInventarioLoteInfo>();

                GenerarAjustesInventario(listaAlmacenInventarioLote, listaAlmacenInventario, cierreDiaInventarioPA);

                listaOriginalDetalles.AddRange(cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle);
                var estatusDAL = new EstatusDAL();
                List <EstatusInfo> listaEstatusInventario =
                    estatusDAL.ObtenerEstatusTipoEstatus(TipoEstatus.Inventario.GetHashCode());

                //Toma los registros que no necesitan autorización para generar sus movimientos Fisicos
                cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                    listaOriginalDetalles.Where(det => !det.RequiereAutorizacion).ToList();
                ArmarAlmacenMovimientoInventarioFisico(listaMovimientosFinal, cierreDiaInventarioPA, listaEstatusInventario);

                //Toma los registros a los que se le van a generar los Movimientos de Entrada de Almacen
                cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                    listaOriginalDetalles.Where(
                        det => !det.RequiereAutorizacion && (det.InventarioFisico - det.InventarioTeorico) > 0).ToList();
                if (cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Any())
                {
                    ArmarAlmacenMovimientoEntradaSalidaAlmacen(listaMovimientosFinal, cierreDiaInventarioPA,
                                                               listaEstatusInventario, true);
                }

                //Toma los registros a los que se le van a generar los Movimientos de Salida de Almacen
                cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                    listaOriginalDetalles.Where(
                        det => !det.RequiereAutorizacion && (det.InventarioFisico - det.InventarioTeorico) < 0).ToList();
                if (cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Any())
                {
                    ArmarAlmacenMovimientoEntradaSalidaAlmacen(listaMovimientosFinal, cierreDiaInventarioPA,
                                                               listaEstatusInventario, false);
                }

                //Toma los registros a los que se le van a generar los Fisicos como estatus de Pendientes
                cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle =
                    listaOriginalDetalles.Where(det => det.RequiereAutorizacion).ToList();
                if (cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Any())
                {
                    ArmarAlmacenMovimientoInventarioFisicoPendiente(listaMovimientosFinal, cierreDiaInventarioPA,
                                                                    listaEstatusInventario);
                }
                IList <ResultadoPolizaModel> pdfs = null;
                using (var transaction = new TransactionScope())
                {
                    var almacenMovimientoDAL        = new AlmacenMovimientoDAL();
                    var almacenMovimientoDetalleDAL = new AlmacenMovimientoDetalleDAL();
                    var almacenInventarioDAL        = new AlmacenInventarioDAL();
                    var almacenInventarioLoteDAL    = new AlmacenInventarioLoteDAL();

                    foreach (var almacenMovimiento in listaMovimientosFinal)
                    {
                        long almacenMovimientoID = almacenMovimientoDAL.GuardarMovimientoCierreDiaPA(almacenMovimiento);
                        almacenMovimiento.ListaAlmacenMovimientoDetalle.ForEach(
                            det => det.AlmacenMovimientoID = almacenMovimientoID);
                        listaMovimientosDetalleFinal.AddRange(almacenMovimiento.ListaAlmacenMovimientoDetalle);
                    }
                    almacenMovimientoDetalleDAL.GuardarDetalleCierreDiaInventarioPA(listaMovimientosDetalleFinal);
                    if (listaAlmacenInventario.Any())
                    {
                        almacenInventarioDAL.AjustarAlmacenInventario(listaAlmacenInventario);
                    }
                    if (listaAlmacenInventarioLote.Any())
                    {
                        almacenInventarioLoteDAL.AjustarAlmacenInventarioLote(listaAlmacenInventarioLote);
                    }
                    ActualizarFolioAlmacen(cierreDiaInventarioPA.AlmacenID);

                    cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle = listaOriginalDetalles;
                    pdfs = GenerarPolizaCierreDiaPA(cierreDiaInventarioPA, listaEstatusInventario, true);
                    transaction.Complete();
                }
                return(pdfs);
            }
            catch (ExcepcionServicio)
            {
                throw;
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }