示例#1
0
        /// <summary>
        /// Se obtienen los datos de la solicitud de autorización para el folio
        /// </summary>
        /// <param name="autorizacionInfo"></param>
        /// <returns></returns>
        internal AutorizacionMateriaPrimaInfo ObtenerSolicitudAutorizacion(AutorizacionMateriaPrimaInfo autorizacionInfo)
        {
            AutorizacionMateriaPrimaInfo resultado = null;

            try
            {
                Logger.Info();
                var     parameters = AuxSolicitudAutorizacionDAL.ObtenerParametrosObtenerSolicitudAutorizacion(autorizacionInfo);
                DataSet ds         = Retrieve("AutorizacionMateriaPrima_ObtenerPorFolioTipoAutorizacion", parameters);
                if (ValidateDataSet(ds))
                {
                    resultado = MapSolicitudAutorizacionDAL.ObtenerDatosSolicitudAutorizacionProgramacionMP(ds);
                }
            }
            catch (SqlException ex)
            {
                Logger.Error(ex);
                throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
            }
            catch (DataException ex)
            {
                Logger.Error(ex);
                throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(resultado);
        }
 /// <summary>
 /// Obtener datos de solicitud
 /// </summary>
 /// <param name="ds"></param>
 /// <returns></returns>
 internal static AutorizacionMateriaPrimaInfo ObtenerDatosSolicitudAutorizacionProgramacionMP(DataSet ds)
 {
     try
     {
         Logger.Info();
         DataTable dt = ds.Tables[ConstantesDAL.DtDatos];
         AutorizacionMateriaPrimaInfo datosAutorizacionInfo =
             (from info in dt.AsEnumerable()
              select
              new AutorizacionMateriaPrimaInfo
         {
             AutorizacionMateriaPrimaID = info.Field <int>("AutorizacionMateriaPrimaID"),
             OrganizacionID = info.Field <int>("OrganizacionID"),
             TipoAutorizacionID = info.Field <int>("TipoAutorizacionID"),
             Folio = info.Field <long>("Folio"),
             Justificacion = info.Field <string>("Justificacion"),
             Lote = info.Field <int>("Lote"),
             Precio = info.Field <decimal>("Precio"),
             Cantidad = info.Field <decimal>("Cantidad"),
             ProductoID = info.Field <int>("ProductoID"),
             EstatusID = info.Field <int>("EstatusID"),
             AlmacenID = info.Field <int>("AlmacenId"),
             CantidadProgramada = info.Field <decimal>("CantidadProgramada"),
         }).First();
         return(datosAutorizacionInfo);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 internal int GuardarAutorizacionMateriaPrimaProgramacion(AutorizacionMateriaPrimaInfo autorizacionMateriaPrimaInfo, ProgramacionMateriaPrimaInfo programacionMateriaPrimaInfo)
 {
     try
     {
         Logger.Info();
         Dictionary <string, object> parameters = AuxDiferenciasDeInventarioDAL.ObtenerParametrosAutorizacionMateriaPrima(autorizacionMateriaPrimaInfo);
         var ds     = Retrieve("AutorizacionMateriaPrima_Registro", parameters);
         int result = 0;
         if (ValidateDataSet(ds))
         {
             result = MapAlmacenInventarioDAL.ObtenerAutorizacionMateriaPrimaID(ds);
         }
         return(result);
     }
     catch (SqlException ex)
     {
         Logger.Error(ex);
         throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
     }
     catch (DataException ex)
     {
         Logger.Error(ex);
         throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Existe autorizacion para lote y folio seleccionado
        /// </summary>
        /// <returns></returns>
        private bool ExisteAutorizacion()
        {
            bool regreso = false;

            try
            {
                var solicitudAutorizacionPl = new SolicitudAutorizacionPL();
                var autorizacionInfo        = new AutorizacionMateriaPrimaInfo
                {
                    OrganizacionID     = organizacionID,
                    Lote               = Convert.ToInt32(skAyudaLote.Clave),
                    TipoAutorizacionID = TipoAutorizacionEnum.UsoLote.GetHashCode(),
                    Folio              = pedido.FolioPedido
                };
                AutorizacionMateriaPrimaInfo resultado = solicitudAutorizacionPl.ObtenerDatosSolicitudAutorizacionProgramacionMP(autorizacionInfo);
                if (resultado != null)
                {
                    if (resultado.EstatusID == Estatus.AMPAutoriz.GetHashCode())
                    {
                        regreso    = true;
                        Autorizado = true;
                    }
                    else if (resultado.EstatusID == Estatus.AMPPendien.GetHashCode())
                    {
                        SkMessageBox.Show(Application.Current.Windows[ConstantesVista.WindowPrincipal],
                                          string.Format(Properties.Resources.SolicitudProgramacionMateriaPrima_MsjSolicitudPendiente,
                                                        pedido.FolioPedido), MessageBoxButton.OK,
                                          MessageImage.Warning);
                        skAyudaLote.Focus();
                    }
                    else if (resultado.EstatusID == Estatus.AMPRechaza.GetHashCode())
                    {
                        SkMessageBox.Show(Application.Current.Windows[ConstantesVista.WindowPrincipal],
                                          string.Format(Properties.Resources.SolicitudProgramacionMateriaPrima_MsjSolicitudRechazado,
                                                        skAyudaLote.Clave, pedido.FolioPedido), MessageBoxButton.OK,
                                          MessageImage.Warning);
                        skAyudaLote.Focus();
                    }
                }
                else
                {
                    regreso = true;
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                SkMessageBox.Show(Application.Current.Windows[ConstantesVista.WindowPrincipal],
                                  Properties.Resources.SolicitudProgramacionMateriaPrima_errorEnviarSolicitud,
                                  MessageBoxButton.OK, MessageImage.Error);
            }
            return(regreso);
        }
        /// <summary>
        /// Existe solicitud autorizada para folio seleccionado
        /// </summary>
        private void ExisteSolicitudAutorizada()
        {
            bool loteProgramacion        = false;
            var  solicitudAutorizacionPl = new SolicitudAutorizacionPL();
            var  autorizacionInfo        = new AutorizacionMateriaPrimaInfo
            {
                OrganizacionID     = organizacionID,
                TipoAutorizacionID = TipoAutorizacionEnum.UsoLote.GetHashCode(),
                Folio     = pedido.FolioPedido,
                EstatusID = Estatus.AMPAutoriz.GetHashCode()
            };
            AutorizacionMateriaPrimaInfo resultado =
                solicitudAutorizacionPl.ObtenerDatosSolicitudAutorizada(autorizacionInfo);

            if (resultado != null)
            {
                if (detallePedido.ProgramacionMateriaPrima != null && detallePedido.ProgramacionMateriaPrima.Count > 0)
                {
                    loteProgramacion =
                        detallePedido.ProgramacionMateriaPrima.Any(
                            programacionMateriaPrimaInfo =>
                            programacionMateriaPrimaInfo.InventarioLoteOrigen.Lote == resultado.Lote);
                }
                if (!loteProgramacion)
                {
                    skAyudaLote.Clave          = resultado.Lote.ToString(CultureInfo.InvariantCulture);
                    skAyudaLote.Descripcion    = resultado.Lote.ToString(CultureInfo.InvariantCulture);
                    txtCantidadProgramada.Text = Convert.ToString(resultado.CantidadProgramada);
                    var almacenInventarioLoteInfo = new AlmacenInventarioLoteInfo
                    {
                        ProductoId     = producto.ProductoId,
                        OrganizacionId = pedido.Organizacion.OrganizacionID,
                        TipoAlmacenId  = (int)TipoAlmacenEnum.MateriasPrimas,
                        Activo         = EstatusEnum.Activo,
                        Lote           = resultado.Lote
                    };
                    var almacenInventarioLotePL             = new AlmacenInventarioLotePL();
                    AlmacenInventarioLoteInfo resultadoInfo =
                        almacenInventarioLotePL.ObtenerAlmacenInventarioLotePorFolio(almacenInventarioLoteInfo);
                    almacenInventarioLote                = resultadoInfo;
                    almacenInventarioLote.ProductoId     = almacenInventarioLoteInfo.ProductoId;
                    almacenInventarioLote.OrganizacionId = almacenInventarioLoteInfo.OrganizacionId;
                    almacenInventarioLote.TipoAlmacenId  = almacenInventarioLoteInfo.TipoAlmacenId;
                    almacenInventarioLote.Activo         = almacenInventarioLoteInfo.Activo;
                    almacenInventarioLote.Lote           = almacenInventarioLoteInfo.Lote;
                    skAyudaLote.Info = resultadoInfo;
                }
            }
        }
示例#6
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="autorizacionMateriaPrimaInfo"></param>
 /// <param name="programacionMateriaPrimaInfo"></param>
 public void GuardarAutorizacionMateriaPrimaProgramacion(AutorizacionMateriaPrimaInfo autorizacionMateriaPrimaInfo, ProgramacionMateriaPrimaInfo programacionMateriaPrimaInfo)
 {
     try
     {
         Logger.Info();
         var almacenInventarioLoteBl = new AlmacenInventarioLoteBL();
         almacenInventarioLoteBl.GuardarAutorizacionMateriaPrimaProgramacion(autorizacionMateriaPrimaInfo, programacionMateriaPrimaInfo);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
示例#7
0
        public AutorizacionMateriaPrimaInfo ObtenerDatosSolicitudAutorizacionProgramacionMP(AutorizacionMateriaPrimaInfo autorizacionInfo)
        {
            try
            {
                Logger.Info();
                var solicitudDAL = new SolicitudAutorizacionDAL();
                AutorizacionMateriaPrimaInfo result = solicitudDAL.ObtenerDatosSolicitudAutorizacionProgramacionMP(autorizacionInfo);

                return(result);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
 /// <summary>
 /// Guardar autorizacion materia prima
 /// </summary>
 /// <param name="autorizacionMateriaPrimaInfo"></param>
 internal void GuardarAutorizacionMateriaPrima(AutorizacionMateriaPrimaInfo autorizacionMateriaPrimaInfo)
 {
     try
     {
         Logger.Info();
         Dictionary <string, object> parameters = AuxDiferenciasDeInventarioDAL.ObtenerParametrosAutorizacionMateriaPrima(autorizacionMateriaPrimaInfo);
         Create("AutorizacionMateriaPrima_Registro", parameters);
     }
     catch (SqlException ex)
     {
         Logger.Error(ex);
         throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
     }
     catch (DataException ex)
     {
         Logger.Error(ex);
         throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
示例#9
0
 /// <summary>
 /// Obtener parametros de autorizacion de materia prima
 /// </summary>
 /// <param name="autorizacionMateriaPrimaInfo"></param>
 /// <returns></returns>
 public static Dictionary <string, object> ObtenerParametrosAutorizacionMateriaPrima(AutorizacionMateriaPrimaInfo autorizacionMateriaPrimaInfo)
 {
     try
     {
         Logger.Info();
         var parametros =
             new Dictionary <string, object>
         {
             { "@OrganizacionID", autorizacionMateriaPrimaInfo.OrganizacionID },
             { "@TipoAutorizacionID", autorizacionMateriaPrimaInfo.TipoAutorizacionID },
             { "@Folio", autorizacionMateriaPrimaInfo.Folio },
             { "@Justificacion", autorizacionMateriaPrimaInfo.Justificacion },
             { "@Lote", autorizacionMateriaPrimaInfo.Lote },
             { "@Precio", autorizacionMateriaPrimaInfo.Precio },
             { "@Cantidad", autorizacionMateriaPrimaInfo.Cantidad },
             { "@ProductoID", autorizacionMateriaPrimaInfo.ProductoID },
             { "@AlmacenID", autorizacionMateriaPrimaInfo.AlmacenID },
             { "@EstatusID", autorizacionMateriaPrimaInfo.EstatusID },
             { "@UsuarioCreacion", autorizacionMateriaPrimaInfo.UsuarioCreacion },
             { "@Activo", autorizacionMateriaPrimaInfo.Activo }
         };
         return(parametros);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtener parametros para solicitud autorizacion de programacion de MP
 /// </summary>
 /// <param name="autorizacionInfo"></param>
 /// <returns></returns>
 internal static Dictionary <string, object> ObtenerParametrosObtenerDatosSolicitudAutorizacionProgramacionMP(AutorizacionMateriaPrimaInfo autorizacionInfo)
 {
     try
     {
         Logger.Info();
         var parametros =
             new Dictionary <string, object>
         {
             { "@OrganizacionID", autorizacionInfo.OrganizacionID },
             { "@TipoAutorizacionID", autorizacionInfo.TipoAutorizacionID },
             { "@Folio", autorizacionInfo.Folio },
             { "@Lote", autorizacionInfo.Lote },
             { "@Activo", EstatusEnum.Activo }
         };
         return(parametros);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Guarda los ajustes
        /// </summary>
        /// <param name="listaDiferenciasInventario"></param>
        /// <param name="usuarioInfo"></param>
        internal IList <MemoryStream> Guardar(List <DiferenciasDeInventariosInfo> listaDiferenciasInventario, UsuarioInfo usuarioInfo)
        {
            int                usuarioId = usuarioInfo.UsuarioID;
            PolizaAbstract     poliza    = null;
            IList <PolizaInfo> polizas   = null;
            int                organizacionID;
            //var contratoCreado = new ContratoInfo();
            IList <MemoryStream> streams = null;

            try
            {
                using (var transaction = new TransactionScope())
                {
                    var almacenMovimientoBl        = new AlmacenMovimientoBL();
                    var almacenMovimientoDetalleBl = new AlmacenMovimientoDetalleBL();
                    organizacionID = usuarioInfo.OrganizacionID;
                    foreach (var diferenciasDeInventariosInfo in listaDiferenciasInventario)
                    {
                        if (diferenciasDeInventariosInfo.DescripcionAjuste.Equals(TipoAjusteEnum.CerrarLote.ToString(), StringComparison.InvariantCultureIgnoreCase))
                        {
                            var almacenInventarioLoteBl   = new AlmacenInventarioLoteBL();
                            var almacenInventarioLoteInfo = almacenInventarioLoteBl.ObtenerAlmacenInventarioLotePorId(
                                diferenciasDeInventariosInfo.AlmacenInventarioLote.AlmacenInventarioLoteId);
                            if (almacenInventarioLoteInfo != null)
                            {
                                almacenInventarioLoteInfo.UsuarioModificacionId = usuarioInfo.UsuarioID;
                                //Kilogramos teoricos en 0 se desactiva el lote
                                if (diferenciasDeInventariosInfo.KilogramosFisicos == 0)
                                {
                                    //Desactivar lote
                                    almacenInventarioLoteBl.DesactivarLote(almacenInventarioLoteInfo);
                                }
                            }
                            continue;
                        }

                        diferenciasDeInventariosInfo.DiferenciaInventario =
                            Math.Abs(diferenciasDeInventariosInfo.KilogramosFisicos -
                                     diferenciasDeInventariosInfo.KilogramosTeoricos);
                        ////Se le quita el signo para que no guarde en negativos
                        //diferenciasDeInventariosInfo.KilogramosTeoricos =
                        //    Math.Abs(diferenciasDeInventariosInfo.KilogramosTeoricos);
                        //organizacionID = diferenciasDeInventariosInfo.AlmacenMovimiento.OrganizacionID;
                        //Si no esta guardado se actualiza
                        if (!diferenciasDeInventariosInfo.Guardado)
                        {
                            AlmacenMovimientoInfo almacen = new AlmacenMovimientoInfo();
                            //Estatus aplicado guarda y actualiza inventario
                            if (diferenciasDeInventariosInfo.AlmacenMovimiento.Status ==
                                Estatus.DifInvAplicado.GetHashCode())
                            {
                                //Insertar movimiento
                                diferenciasDeInventariosInfo.AlmacenMovimiento.AlmacenID =
                                    diferenciasDeInventariosInfo.Almacen.AlmacenID;
                                var almacenMovimientoId =
                                    almacenMovimientoBl.Crear(diferenciasDeInventariosInfo.AlmacenMovimiento);

                                //Insertar detalle
                                var almacenMovimientoDetalleInfo = new AlmacenMovimientoDetalle
                                {
                                    AlmacenMovimientoID     = almacenMovimientoId,
                                    AlmacenInventarioLoteId =
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.
                                        AlmacenInventarioLoteId,
                                    Piezas     = 0,
                                    ProductoID =
                                        diferenciasDeInventariosInfo.Producto.
                                        ProductoId,
                                    Precio =
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.PrecioPromedio,
                                    Cantidad =
                                        diferenciasDeInventariosInfo.
                                        DiferenciaInventario,
                                    Importe =
                                        diferenciasDeInventariosInfo.
                                        DiferenciaInventario *
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.PrecioPromedio,
                                    UsuarioCreacionID = usuarioInfo.UsuarioID
                                };
                                long almacenMovimientoDetalleID =
                                    almacenMovimientoDetalleBl.Crear(almacenMovimientoDetalleInfo);


                                //SE AGREGA DETALLE
                                almacenMovimientoDetalleInfo.AlmacenMovimientoDetalleID = almacenMovimientoDetalleID;



                                //var almacenmovimientoBl1 = new AlmacenMovimientoDetalleBL();

                                //var d =
                                //    almacenmovimientoBl1.ObtenerPorAlmacenMovimientoDetalleId(almacenMovimientoDetalleInfo);


                                diferenciasDeInventariosInfo.AlmacenMovimientoDetalle = almacenMovimientoDetalleInfo;
                                //SE AGREGA DETALLE
                                //Actualizamos inventario y lote
                                ActualizarInventarioYLote(diferenciasDeInventariosInfo, usuarioInfo.UsuarioID);
                            }

                            //Si es pendiente solo guarda el movimiento y detalle
                            if (diferenciasDeInventariosInfo.AlmacenMovimiento.Status ==
                                Estatus.DifInvPendiente.GetHashCode())
                            {
                                //Insertar movimiento
                                diferenciasDeInventariosInfo.AlmacenMovimiento.AlmacenID =
                                    diferenciasDeInventariosInfo.Almacen.AlmacenID;
                                var almacenMovimientoId =
                                    almacenMovimientoBl.Crear(diferenciasDeInventariosInfo.AlmacenMovimiento);

                                //Insertar detalle
                                var almacenMovimientoDetalleInfo = new AlmacenMovimientoDetalle()
                                {
                                    AlmacenMovimientoID     = almacenMovimientoId,
                                    AlmacenInventarioLoteId =
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.
                                        AlmacenInventarioLoteId,
                                    Piezas     = 0,
                                    ProductoID =
                                        diferenciasDeInventariosInfo.Producto.
                                        ProductoId,
                                    Precio =
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.PrecioPromedio,
                                    Cantidad =
                                        diferenciasDeInventariosInfo.
                                        DiferenciaInventario,
                                    Importe =
                                        diferenciasDeInventariosInfo.
                                        DiferenciaInventario *
                                        diferenciasDeInventariosInfo.
                                        AlmacenInventarioLote.PrecioPromedio,
                                    UsuarioCreacionID = usuarioInfo.UsuarioID
                                };
                                long almacenMovimientoDetalleID =
                                    almacenMovimientoDetalleBl.Crear(almacenMovimientoDetalleInfo);


                                //Se valida si requiere autorizacion
                                if (diferenciasDeInventariosInfo.RequiereAutorizacion)
                                {
                                    var almacenBl = new AlmacenBL();
                                    AlmacenMovimientoInfo almacenMovimientoInfo = new AlmacenMovimientoInfo
                                    {
                                        AlmacenID           = diferenciasDeInventariosInfo.Almacen.AlmacenID,
                                        AlmacenMovimientoID = almacenMovimientoId
                                    };
                                    almacen = almacenBl.ObtenerAlmacenMovimiento(almacenMovimientoInfo);

                                    var autorizacionMateriaPrimaInfo = new AutorizacionMateriaPrimaInfo
                                    {
                                        OrganizacionID     = usuarioInfo.OrganizacionID,
                                        TipoAutorizacionID = TipoAutorizacionEnum.AjustedeInventario.GetHashCode(),
                                        Folio           = almacen.FolioMovimiento,
                                        Justificacion   = almacen.Observaciones,
                                        Lote            = diferenciasDeInventariosInfo.AlmacenInventarioLote.Lote,
                                        Precio          = almacenMovimientoDetalleInfo.Precio,
                                        Cantidad        = almacenMovimientoDetalleInfo.Cantidad,
                                        ProductoID      = almacenMovimientoDetalleInfo.ProductoID,
                                        AlmacenID       = almacen.AlmacenID,
                                        EstatusID       = Estatus.AMPPendien.GetHashCode(),
                                        UsuarioCreacion = usuarioInfo.UsuarioID,
                                        Activo          = EstatusEnum.Activo.GetHashCode()
                                    };

                                    var almacenInventarioLoteBL = new AlmacenInventarioLoteBL();
                                    almacenInventarioLoteBL.GuardarAutorizacionMateriaPrima(
                                        autorizacionMateriaPrimaInfo);
                                }
                                //SE AGREGA DETALLE
                                almacenMovimientoDetalleInfo.AlmacenMovimientoDetalleID = almacenMovimientoDetalleID;
                                diferenciasDeInventariosInfo.AlmacenMovimientoDetalle   = almacenMovimientoDetalleInfo;
                                //SE AGREGA DETALLE
                            }
                        }
                        else
                        {
                            if (diferenciasDeInventariosInfo.AlmacenMovimiento.Status ==
                                Estatus.DifInvAplicado.GetHashCode())
                            {
                                //Actualizar estatus a regitro
                                //Agregar observaciones
                                almacenMovimientoBl.ActualizarEstatus(diferenciasDeInventariosInfo.AlmacenMovimiento);

                                //Actualizar detalle movimiento
                                var almacenMovimientoDetalleInfo =
                                    almacenMovimientoDetalleBl.ObtenerPorAlmacenMovimientoDetalleId(
                                        diferenciasDeInventariosInfo.AlmacenMovimientoDetalle);
                                almacenMovimientoDetalleInfo.Cantidad =
                                    diferenciasDeInventariosInfo.DiferenciaInventario;
                                almacenMovimientoDetalleInfo.Importe = almacenMovimientoDetalleInfo.Cantidad *
                                                                       almacenMovimientoDetalleInfo.Precio;
                                almacenMovimientoDetalleInfo.UsuarioModificacionID = usuarioInfo.UsuarioID;
                                almacenMovimientoDetalleBl.ActualizarAlmacenMovimientoDetalle(
                                    almacenMovimientoDetalleInfo);
                                //Actualizamos inventario y lote
                                ActualizarInventarioYLote(diferenciasDeInventariosInfo, usuarioInfo.UsuarioID);
                                //SE AGREGA DETALLE
                                diferenciasDeInventariosInfo.AlmacenMovimientoDetalle = almacenMovimientoDetalleInfo;
                                //SE AGREGA DETALLE
                            }

                            //Guardado con estatus pendiente se actualiza almacen movimiento y almacen movimiento detalle
                            if (diferenciasDeInventariosInfo.AlmacenMovimiento.Status ==
                                Estatus.DifInvPendiente.GetHashCode())
                            {
                                //Actualizar almacen movimiento
                                almacenMovimientoBl.ActualizarEstatus(diferenciasDeInventariosInfo.AlmacenMovimiento);

                                //Actualizar movimiento detalle
                                //Verificar si se ocupa obtenerlo
                                var almacenMovimientoDetalleInfo =
                                    almacenMovimientoDetalleBl.ObtenerPorAlmacenMovimientoDetalleId(
                                        diferenciasDeInventariosInfo.AlmacenMovimientoDetalle);
                                almacenMovimientoDetalleInfo.Cantidad =
                                    diferenciasDeInventariosInfo.DiferenciaInventario;
                                almacenMovimientoDetalleInfo.Importe = almacenMovimientoDetalleInfo.Cantidad *
                                                                       almacenMovimientoDetalleInfo.Precio;
                                //Pendiente usuario modificacion
                                almacenMovimientoDetalleInfo.UsuarioModificacionID = usuarioInfo.UsuarioID;
                                almacenMovimientoDetalleBl.ActualizarAlmacenMovimientoDetalle(
                                    almacenMovimientoDetalleInfo);
                                //SE AGREGA DETALLE
                                diferenciasDeInventariosInfo.AlmacenMovimientoDetalle = almacenMovimientoDetalleInfo;
                                //SE AGREGA DETALLE
                            }
                        }
                    }

                    #region POLIZA

                    var listaDiferenciasInventarioAplicados =
                        listaDiferenciasInventario.Where(dif => dif.AlmacenMovimiento.Status == Estatus.DifInvAplicado.GetHashCode()).ToList();

                    List <PolizaEntradaSalidaPorAjusteModel> salidasPorAjuste =
                        listaDiferenciasInventarioAplicados.Where(dif => !dif.DescripcionAjuste.Trim().Equals(TipoAjusteEnum.CerrarLote.ToString().Trim(), StringComparison.InvariantCultureIgnoreCase)).Select(ajuste => new PolizaEntradaSalidaPorAjusteModel
                    {
                        Importe =
                            ajuste.DiferenciaInventario *
                            ajuste.AlmacenInventarioLote.
                            PrecioPromedio,
                        Cantidad   = ajuste.DiferenciaInventario,
                        TipoAjuste =
                            ajuste.DescripcionAjuste.Equals(
                                TipoAjusteEnum.Merma.ToString(),
                                StringComparison.
                                CurrentCultureIgnoreCase)
                                    ? TipoAjusteEnum.Merma
                                    : TipoAjusteEnum.Superávit,
                        Precio = ajuste.AlmacenInventarioLote.
                                 PrecioPromedio,
                        AlmacenInventarioID =
                            ajuste.AlmacenInventarioLote.
                            AlmacenInventario.AlmacenInventarioID,
                        AlmacenMovimientoDetalleID =
                            ajuste.AlmacenMovimientoDetalle.
                            AlmacenMovimientoDetalleID,
                        ProductoID = ajuste.Producto.ProductoId,
                        CantidadInventarioFisico =
                            ajuste.KilogramosFisicos,
                        CantidadInventarioTeorico =
                            ajuste.KilogramosTeoricos,
                        Observaciones =
                            ajuste.AlmacenMovimiento.Observaciones
                    }).ToList();
                    var agrupado =
                        salidasPorAjuste.GroupBy(tipo => new { tipo.TipoAjuste, tipo.AlmacenMovimientoDetalleID }).Select(
                            ajuste => new PolizaEntradaSalidaPorAjusteModel
                    {
                        TipoAjuste                 = ajuste.Key.TipoAjuste,
                        AlmacenInventarioID        = ajuste.First().AlmacenInventarioID,
                        AlmacenMovimientoDetalleID = ajuste.Key.AlmacenMovimientoDetalleID,
                        Cantidad = ajuste.First().Cantidad,
                        CantidadInventarioFisico  = ajuste.First().CantidadInventarioFisico,
                        CantidadInventarioTeorico = ajuste.First().CantidadInventarioTeorico,
                        Importe                 = ajuste.First().Importe,
                        Observaciones           = ajuste.First().Observaciones,
                        Precio                  = ajuste.First().Precio,
                        PrecioInventarioFisico  = ajuste.First().PrecioInventarioFisico,
                        PrecioInventarioTeorico = ajuste.First().PrecioInventarioTeorico,
                        ProductoID              = ajuste.First().ProductoID
                    }).ToList();
                    if (agrupado != null && agrupado.Any())
                    {
                        streams = new List <MemoryStream>();
                        for (int indexAjustes = 0; indexAjustes < agrupado.Count; indexAjustes++)
                        {
                            var tipoPoliza = TipoPoliza.SalidaAjuste;
                            switch (agrupado[indexAjustes].TipoAjuste)
                            {
                            case TipoAjusteEnum.Superávit:
                                tipoPoliza = TipoPoliza.EntradaAjuste;
                                break;
                            }
                            poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(tipoPoliza);
                            var grupo = new List <PolizaEntradaSalidaPorAjusteModel>
                            {
                                agrupado[indexAjustes]
                            };
                            polizas = poliza.GeneraPoliza(grupo);
                            if (polizas != null && polizas.Any())
                            {
                                MemoryStream stream = poliza.ImprimePoliza(grupo, polizas);
                                if (stream != null)
                                {
                                    streams.Add(stream);
                                }
                                var polizaBL = new PolizaBL();
                                polizas.ToList().ForEach(datos =>
                                {
                                    datos.OrganizacionID         = organizacionID;
                                    datos.UsuarioCreacionID      = usuarioId;
                                    datos.ArchivoEnviadoServidor = 1;
                                });
                                polizaBL.GuardarServicioPI(polizas, tipoPoliza);
                            }
                        }
                    }

                    #endregion POLIZA


                    transaction.Complete();
                }
            }
            catch (ExcepcionServicio ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(streams);
        }