Exemplo n.º 1
0
        /// <summary>
        /// Metodo para Cancelar un traspaso de MP
        /// </summary>
        /// <param name="info"></param>
        public Dictionary <long, MemoryStream> CancelarTraspaso(TraspasoMpPaMedInfo info)
        {
            try
            {
                var resultado = new Dictionary <long, MemoryStream>();
                Logger.Info();
                var traspasoMateriaPrimaDAL = new TraspasoMateriaPrimaDAL();
                var almacenMovimientoBL     = new AlmacenMovimientoBL();
                var cancelacionMovimientoBL = new CancelacionMovimientoBL();
                TraspasoMateriaPrimaInfo traspasoCancelar =
                    traspasoMateriaPrimaDAL.ObtenerPorID(info.TraspasoMateriaPrimaID);

                if (traspasoCancelar == null)
                {
                    return(null);
                }
                AlmacenMovimientoInfo movimientoOrigen = almacenMovimientoBL.ObtenerPorIDCompleto(
                    traspasoCancelar.AlmacenMovimientoOrigen.AlmacenMovimientoID);
                AlmacenMovimientoInfo movimientoDestino = almacenMovimientoBL.ObtenerPorIDCompleto(
                    traspasoCancelar.AlmacenMovimientoDestino.AlmacenMovimientoID);

                AlmacenInfo almacenOrigenAux  = info.AlmacenOrigen;
                AlmacenInfo almacenDestinoAux = info.AlmacenDestino;

                AlmacenMovimientoDetalle detalleOrigen  = movimientoOrigen.ListaAlmacenMovimientoDetalle.FirstOrDefault();
                AlmacenMovimientoDetalle detalleDestino = movimientoDestino.ListaAlmacenMovimientoDetalle.FirstOrDefault();
                if (detalleOrigen == null || detalleDestino == null)
                {
                    return(null);
                }
                info.CantidadTraspasarOrigen  = detalleOrigen.Cantidad;
                info.CantidadTraspasarDestino = detalleDestino.Cantidad;
                info.PrecioTraspasoOrigen     = detalleOrigen.Precio;
                info.PrecioTraspasoDestino    = detalleDestino.Precio;
                info.ImporteTraspaso          = detalleDestino.Importe;

                info.AlmacenDestino = almacenOrigenAux;
                info.AlmacenOrigen  = almacenDestinoAux;

                using (var transaction = new TransactionScope())
                {
                    long almacenMovimientoEntradaID = 0;
                    long almacenMovimientoSalidaID  = 0;

                    if (movimientoDestino != null)
                    {
                        almacenMovimientoEntradaID = GenerarMovimientoEntradaCancelacion(movimientoDestino, info.Usuario);
                        almacenMovimientoSalidaID  = GenerarMovimientoSalidaCancelacion(movimientoOrigen, info.Usuario);
                    }

                    var cancelacionMovimientoEntrada = new CancelacionMovimientoInfo
                    {
                        TipoCancelacion = new TipoCancelacionInfo
                        {
                            TipoCancelacionId = TipoCancelacionEnum.TraspasoMpPaMed.GetHashCode()
                        },
                        Pedido = new PedidoInfo(),
                        AlmacenMovimientoOrigen = new AlmacenMovimientoInfo
                        {
                            AlmacenMovimientoID = almacenMovimientoEntradaID
                        },
                        AlmacenMovimientoCancelado = new AlmacenMovimientoInfo
                        {
                            AlmacenMovimientoID = movimientoOrigen.AlmacenMovimientoID
                        },
                        Activo            = EstatusEnum.Activo,
                        Justificacion     = traspasoCancelar.Justificacion,
                        UsuarioCreacionID = info.Usuario.UsuarioID
                    };
                    CancelacionMovimientoInfo movimientoCancelado = cancelacionMovimientoBL.Guardar(cancelacionMovimientoEntrada);


                    if (movimientoDestino != null)
                    {
                        var cancelacionMovimientoSalida = new CancelacionMovimientoInfo
                        {
                            TipoCancelacion = new TipoCancelacionInfo
                            {
                                TipoCancelacionId = TipoCancelacionEnum.TraspasoMpPaMed.GetHashCode()
                            },
                            Pedido = new PedidoInfo(),
                            AlmacenMovimientoOrigen = new AlmacenMovimientoInfo
                            {
                                AlmacenMovimientoID = almacenMovimientoSalidaID
                            },
                            AlmacenMovimientoCancelado = new AlmacenMovimientoInfo
                            {
                                AlmacenMovimientoID = movimientoDestino.AlmacenMovimientoID
                            },
                            Activo            = EstatusEnum.Activo,
                            Justificacion     = traspasoCancelar.Justificacion,
                            UsuarioCreacionID = info.Usuario.UsuarioID
                        };
                        cancelacionMovimientoBL.Guardar(cancelacionMovimientoSalida);
                    }


                    traspasoCancelar.Activo = EstatusEnum.Inactivo;
                    traspasoCancelar.UsuarioModificacionID = info.Usuario.UsuarioID;

                    traspasoMateriaPrimaDAL.Actualizar(traspasoCancelar);


                    movimientoOrigen.UsuarioModificacionID = info.Usuario.UsuarioID;
                    if (movimientoDestino != null)
                    {
                        movimientoDestino.UsuarioModificacionID = info.Usuario.UsuarioID;
                    }

                    movimientoOrigen.Status = Estatus.CanceladoInv.GetHashCode();
                    if (movimientoDestino != null)
                    {
                        movimientoDestino.Status = Estatus.CanceladoInv.GetHashCode();
                    }


                    almacenMovimientoBL.ActualizarEstatus(movimientoOrigen);
                    almacenMovimientoBL.ActualizarEstatus(movimientoDestino);

                    AlmacenMovimientoInfo movimientoCancelacion =
                        almacenMovimientoBL.ObtenerPorIDCompleto(almacenMovimientoEntradaID);
                    if (movimientoCancelacion == null)
                    {
                        return(null);
                    }

                    info.FolioTraspaso       = traspasoCancelar.FolioTraspaso;
                    info.FechaTraspaso       = movimientoCancelado.FechaCancelacion;
                    info.AlmacenMovimientoID = movimientoDestino.AlmacenMovimientoID;
                    MemoryStream pdfPoliza = null;
                    if (info.AlmacenOrigen.AlmacenID != info.AlmacenDestino.AlmacenID)
                    {
                        info.EsCancelacion = true;
                        var productoBL = new ProductoBL();
                        info.ProductoOrigen  = productoBL.ObtenerPorID(info.ProductoOrigen);
                        info.ProductoDestino = info.ProductoOrigen;
                        PolizaAbstract     poliza       = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.EntradaTraspaso);
                        IList <PolizaInfo> listaPolizas = poliza.GeneraPoliza(info);
                        pdfPoliza = poliza.ImprimePoliza(info, listaPolizas);

                        if (listaPolizas != null && listaPolizas.Any())
                        {
                            listaPolizas.ToList().ForEach(datos =>
                            {
                                datos.OrganizacionID         = info.Usuario.Organizacion.OrganizacionID;
                                datos.UsuarioCreacionID      = info.Usuario.UsuarioID;
                                datos.Activo                 = EstatusEnum.Activo;
                                datos.ArchivoEnviadoServidor = 1;
                            });
                            var polizaDAL = new PolizaDAL();
                            polizaDAL.CrearServicioPI(listaPolizas, TipoPoliza.EntradaTraspaso);
                        }
                    }
                    transaction.Complete();
                    resultado.Add(info.FolioTraspaso, pdfPoliza);
                    return(resultado);
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Se guardan las respuesta a las solicitudes de materia prima
        /// </summary>
        /// <param name="respuestaSolicitudes"></param>
        /// <param name="organizacionID"></param>
        /// <param name="tipoAutorizacionID"></param>
        /// <param name="usuarioID"></param>
        /// <returns></returns>
        public ResultadoValidacion GuardarRespuestasSolicitudes(List <AutorizacionMovimientosInfo> respuestaSolicitudes, int organizacionID, int tipoAutorizacionID, int usuarioID)
        {
            var result  = new ResultadoValidacion();
            var mensaje = new StringBuilder();

            try
            {
                Logger.Info();
                var solicitudDAL        = new SolicitudAutorizacionDAL();
                var almacenMovimientoBl = new AlmacenMovimientoBL();

                using (var transaction = new TransactionScope())
                {
                    List <DiferenciasDeInventariosInfo> listaMovimientosPendientes =
                        solicitudDAL.ObtenerMovimientosAutorizacion(respuestaSolicitudes);

                    if (listaMovimientosPendientes != null && listaMovimientosPendientes.Any())
                    {
                        foreach (var movimiento in listaMovimientosPendientes)
                        {
                            if (movimiento.AlmacenMovimiento.TipoMovimientoID == TipoMovimiento.SalidaPorAjuste.GetHashCode())
                            {
                                if (movimiento.AlmacenMovimientoDetalle.Cantidad >
                                    movimiento.AlmacenInventarioLote.Cantidad)
                                {
                                    AutorizacionMovimientosInfo autorizacionCancelar =
                                        respuestaSolicitudes.FirstOrDefault(
                                            aut =>
                                            aut.AlmacenMovimientoID == movimiento.AlmacenMovimiento.AlmacenMovimientoID);

                                    if (autorizacionCancelar != null)
                                    {
                                        autorizacionCancelar.EstatusID     = Estatus.AMPRechaza.GetHashCode();
                                        autorizacionCancelar.Observaciones =
                                            ResourceServices.SolicitudAutorizacionBL_RechazoAutomatico;
                                        mensaje.Append(string.Format(", {0}:{1}",
                                                                     movimiento.Producto.ProductoDescripcion,
                                                                     movimiento.AlmacenMovimientoDetalle.Cantidad));
                                    }
                                }
                            }
                        }
                    }

                    bool guardado = solicitudDAL.GuardarRespuestasSolicitudes(respuestaSolicitudes, organizacionID, tipoAutorizacionID, usuarioID);

                    if (guardado && tipoAutorizacionID == (int)TipoAutorizacionEnum.AjustedeInventario)
                    {
                        for (int i = 0; i < respuestaSolicitudes.Count; i++)
                        {
                            if (respuestaSolicitudes[i].EstatusID == (int)Estatus.AMPAutoriz)
                            {
                                respuestaSolicitudes[i].EstatusInventarioID = (int)Estatus.DifInvAutorizado;
                            }
                            else
                            {
                                respuestaSolicitudes[i].EstatusInventarioID = (int)Estatus.DifInvRechazado;
                            }
                        }
                        // Se realiza el proceso de afectar el inventario para los movimientos autorizados
                        List <DiferenciasDeInventariosInfo> listaAjustesPendientes;
                        var diferenciasDeInventarioBl = new DiferenciasDeInventarioBL();

                        listaAjustesPendientes = solicitudDAL.GuardarAjusteInventario(respuestaSolicitudes, organizacionID);

                        if (listaAjustesPendientes != null)
                        {
                            foreach (var diferenciasDeInventariosInfoPar in listaAjustesPendientes)
                            {
                                diferenciasDeInventariosInfoPar.DescripcionAjuste =
                                    diferenciasDeInventariosInfoPar.AlmacenMovimiento.TipoMovimientoID ==
                                    TipoMovimiento.SalidaPorAjuste.GetHashCode()
                                        ? TipoAjusteEnum.Merma.ToString()
                                        : TipoAjusteEnum.Superávit.ToString();
                                diferenciasDeInventariosInfoPar.DiferenciaInventario =
                                    diferenciasDeInventariosInfoPar.AlmacenMovimientoDetalle.Cantidad;

                                diferenciasDeInventariosInfoPar.AlmacenMovimiento.UsuarioModificacionID        = usuarioID;
                                diferenciasDeInventariosInfoPar.AlmacenMovimientoDetalle.UsuarioModificacionID = usuarioID;
                                diferenciasDeInventariosInfoPar.AlmacenInventarioLote.UsuarioModificacionId    = usuarioID;

                                diferenciasDeInventariosInfoPar.AlmacenMovimiento.Status =
                                    Estatus.DifInvAplicado.GetHashCode();
                                diferenciasDeInventariosInfoPar.TieneConfiguracion = true;

                                //Se cambia el status por aplicado
                                almacenMovimientoBl.ActualizarEstatus(diferenciasDeInventariosInfoPar.AlmacenMovimiento);
                                //Actualiza inventario y lote
                                diferenciasDeInventarioBl.ActualizarInventarioYLote(diferenciasDeInventariosInfoPar, usuarioID);
                            }

                            #region POLIZA

                            List <PolizaEntradaSalidaPorAjusteModel> salidasPorAjuste =
                                listaAjustesPendientes.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())
                            {
                                var 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;
                                    }
                                    var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(tipoPoliza);
                                    var grupo  = new List <PolizaEntradaSalidaPorAjusteModel>
                                    {
                                        agrupado[indexAjustes]
                                    };
                                    var 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)
            {
                result.Mensaje       = ex.Message;
                result.Resultado     = false;
                result.CodigoMensaje = 2;
                return(result);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            if (mensaje.Length == 0)
            {
                result.Resultado = true;
            }
            else
            {
                result.Mensaje       = String.Format(ResourceServices.SolicitudAutorizacionBL_AutorizacionRechazadas, mensaje);
                result.Resultado     = false;
                result.CodigoMensaje = 1;
            }
            return(result);
        }
        /// <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);
        }