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

                FechaInfo fechaActual = fechaBL.ObtenerFechaActual();

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

                        var almacenInventario = almacenInventarioBL.ObtenerPorAlmacenIdProductoId(almacenInventarioFiltro);

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

                        var almacenInventarioLote = new AlmacenInventarioLoteInfo();

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

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

                    transaction.Complete();
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
        //Metodo que guarda el movimiento
        private void GuardarMovimientoTraspasoGanadoCorrales(List <AnimalInfo> aretesTotal, CorralInfo corralInfo, UsuarioInfo usuarioInfo)
        {
            //var animalInfo = new AnimalInfo();
            int loteOrigenID       = 0;
            int loteDestinoID      = 0;
            var loteBl             = new LoteBL();
            var animalBL           = new AnimalBL();
            var animalMovimientoBL = new AnimalMovimientoBL();
            var tipoProcesoBl      = new TipoProcesoBL();
            var fechaBL            = new FechaBL();
            var loteProyeccionBL   = new LoteProyeccionBL();

            List <AnimalMovimientoInfo> ultimosMovimientos = animalBL.ObtenerUltimoMovimientoAnimalXML(aretesTotal,
                                                                                                       usuarioInfo.
                                                                                                       Organizacion.
                                                                                                       OrganizacionID);

            if (ultimosMovimientos == null)
            {
                ultimosMovimientos = new List <AnimalMovimientoInfo>();
            }

            var resultadoLoteBl = loteBl.ObtenerLotesActivos(usuarioInfo.Organizacion.OrganizacionID,
                                                             Convert.ToInt32(corralInfo.CorralID));

            var tipoProcesoResult =
                tipoProcesoBl.ObtenerPorOrganizacion(usuarioInfo.Organizacion.OrganizacionID);

            var fechaServidor = fechaBL.ObtenerFechaActual();

            IList <LoteInfo> lotesCorrales = loteBl.ObtenerPorOrganizacionEstatus(
                usuarioInfo.Organizacion.OrganizacionID, EstatusEnum.Activo);

            if (lotesCorrales == null)
            {
                lotesCorrales = new List <LoteInfo>();
            }

            IList <LoteProyeccionInfo> lotesProyeccion =
                loteProyeccionBL.ObtenerPorLoteXML(usuarioInfo.Organizacion.OrganizacionID, lotesCorrales);


            var resultadoLote = -1;

            using (var transaction = new TransactionScope())
            {
                if (resultadoLoteBl == null)
                {
                    var loteCrear    = new LoteBL();
                    var loteInfoLote = new LoteInfo
                    {
                        Activo               = EstatusEnum.Activo,
                        Cabezas              = Convert.ToInt32(0),
                        CabezasInicio        = Convert.ToInt32(0),
                        CorralID             = corralInfo.CorralID,
                        DisponibilidadManual = false,
                        OrganizacionID       = usuarioInfo.Organizacion.OrganizacionID,
                        TipoCorralID         = corralInfo.TipoCorral.TipoCorralID,
                        TipoProcesoID        = tipoProcesoResult,
                        UsuarioCreacionID    = usuarioInfo.UsuarioID
                    };
                    resultadoLote = loteCrear.GuardaLote(loteInfoLote);
                    if ((corralInfo.TipoCorral != null &&
                         corralInfo.TipoCorral.TipoCorralID != TipoCorral.Enfermeria.GetHashCode()) ||
                        (corralInfo.TipoCorralId > 0 &&
                         corralInfo.TipoCorralId != TipoCorral.Enfermeria.GetHashCode()))
                    {
                        loteBl.ActualizaFechaCierre(resultadoLote, usuarioInfo.UsuarioID);
                    }
                }

                foreach (var animalInfo in aretesTotal)
                {
                    var animalMovimientoInfo = new AnimalMovimientoInfo();

                    animalInfo.OrganizacionIDEntrada = usuarioInfo.Organizacion.OrganizacionID;
                    //Obtener ultimo movimiento del animal
                    var ultimoMovimientoInfo =
                        ultimosMovimientos.FirstOrDefault(ani => ani.AnimalID == animalInfo.AnimalID);
                    if (ultimoMovimientoInfo != null)
                    {
                        animalMovimientoInfo.OrganizacionID = usuarioInfo.Organizacion.OrganizacionID;
                        animalMovimientoInfo.AnimalID       = animalInfo.AnimalID;

                        animalMovimientoInfo.CorralID = corralInfo.CorralID;
                        animalMovimientoInfo.LoteID   = resultadoLoteBl != null ? resultadoLoteBl.LoteID : resultadoLote;
                        DateTime diaHoy = fechaServidor.FechaActual.Date;
                        animalMovimientoInfo.FechaMovimiento   = diaHoy.Date;
                        animalMovimientoInfo.Peso              = ultimoMovimientoInfo.Peso;
                        animalMovimientoInfo.Temperatura       = ultimoMovimientoInfo.Temperatura;
                        animalMovimientoInfo.TipoMovimientoID  = (int)TipoMovimiento.TraspasoDeGanado;
                        animalMovimientoInfo.TrampaID          = ultimoMovimientoInfo.TrampaID;
                        animalMovimientoInfo.OperadorID        = ultimoMovimientoInfo.OperadorID;
                        animalMovimientoInfo.Observaciones     = String.Empty;
                        animalMovimientoInfo.Activo            = EstatusEnum.Activo;
                        animalMovimientoInfo.UsuarioCreacionID = usuarioInfo.UsuarioID;

                        //Se manda a guardar el registro en base de datos
                        animalMovimientoInfo = animalMovimientoBL.GuardarAnimalMovimiento(animalMovimientoInfo);
                        if (animalMovimientoInfo == null || animalMovimientoInfo.AnimalMovimientoID <= 0)
                        {
                            return;
                        }

                        var resultadoLoteOrigen  = loteBl.ObtenerPorID(ultimoMovimientoInfo.LoteID);
                        var resultadoLoteDestino = loteBl.ObtenerPorID(animalMovimientoInfo.LoteID);

                        if (resultadoLoteDestino != null)
                        {
                            resultadoLoteDestino.UsuarioModificacionID = usuarioInfo.UsuarioID;
                        }

                        //Incrementar y Decrementar cabezas
                        if (resultadoLoteOrigen != null && resultadoLoteDestino != null)
                        {
                            loteOrigenID  = resultadoLoteOrigen.LoteID;
                            loteDestinoID = resultadoLoteDestino.LoteID;

                            resultadoLoteDestino.Cabezas       = resultadoLoteDestino.Cabezas + 1;
                            resultadoLoteDestino.CabezasInicio = resultadoLoteDestino.CabezasInicio + 1;
                            resultadoLoteOrigen.Cabezas        = resultadoLoteOrigen.Cabezas - 1;

                            //Verificar si el Lote tiene cabezas en 0 para inactivarlo
                            resultadoLoteOrigen = loteBl.ObtenerPorID(ultimoMovimientoInfo.LoteID);
                            if (resultadoLoteOrigen.Cabezas != 0)
                            {
                                continue;
                            }
                        }
                    }
                }

                var loteOrigenInfo  = loteBl.ObtenerPorID(loteOrigenID);
                var loteDestinoInfo = loteBl.ObtenerPorID(loteDestinoID);

                if (lotesProyeccion != null && lotesProyeccion.Any())
                {
                    LoteProyeccionInfo proyeccionOrigen =
                        lotesProyeccion.FirstOrDefault(lote => lote.LoteID == loteOrigenInfo.LoteID);
                    LoteProyeccionInfo proyeccionDestino =
                        lotesProyeccion.FirstOrDefault(lote => lote.LoteID == loteDestinoInfo.LoteID);
                    if (proyeccionOrigen != null && proyeccionDestino == null)
                    {
                        proyeccionOrigen.LoteProyeccionID = 0;
                        int      diasEngordaOrigen = proyeccionOrigen.DiasEngorda;
                        DateTime fechaInicioLote   = loteOrigenInfo.FechaInicio;
                        int      diasEngordaReales =
                            new TimeSpan(DateTime.Now.Ticks - fechaInicioLote.Ticks).Days;

                        if ((diasEngordaOrigen - diasEngordaReales) <= 0)
                        {
                            proyeccionOrigen.DiasEngorda = 0;
                        }
                        else
                        {
                            proyeccionOrigen.DiasEngorda = diasEngordaOrigen - diasEngordaReales;
                        }

                        proyeccionOrigen.LoteID            = loteDestinoInfo.LoteID;
                        proyeccionOrigen.UsuarioCreacionID = usuarioInfo.UsuarioID;
                        loteProyeccionBL.Guardar(proyeccionOrigen);

                        var loteDAL = new LoteDAL();
                        var filtroDisponibilidad = new FiltroDisponilidadInfo
                        {
                            UsuarioId = usuarioInfo.UsuarioID,
                            ListaLoteDisponibilidad =
                                new List <DisponibilidadLoteInfo>
                            {
                                new DisponibilidadLoteInfo
                                {
                                    LoteId = loteDestinoInfo.LoteID,
                                    FechaDisponibilidad  = loteOrigenInfo.FechaDisponibilidad,
                                    DisponibilidadManual = loteOrigenInfo.DisponibilidadManual
                                }
                            }
                        };
                        loteDAL.ActualizarLoteDisponibilidad(filtroDisponibilidad);
                    }
                }


                List <AnimalInfo> animalesOrigen =
                    animalBL.ObtenerAnimalesPorLote(usuarioInfo.Organizacion.OrganizacionID,
                                                    loteOrigenID);
                if (animalesOrigen != null && animalesOrigen.Any())
                {
                    loteOrigenInfo.Cabezas = animalesOrigen.Count;
                }

                List <AnimalInfo> animalesDestino =
                    animalBL.ObtenerAnimalesPorLote(usuarioInfo.Organizacion.OrganizacionID,
                                                    loteDestinoID);
                if (animalesDestino != null && animalesDestino.Any())
                {
                    loteDestinoInfo.Cabezas = animalesDestino.Count;
                }
                //Se actualizan las cabezas que tiene el lote
                var filtro = new FiltroActualizarCabezasLote
                {
                    CabezasProcesadas     = aretesTotal.Count,
                    LoteIDDestino         = loteDestinoInfo.LoteID,
                    LoteIDOrigen          = loteOrigenInfo.LoteID,
                    UsuarioModificacionID = usuarioInfo.UsuarioID
                };

                loteBl.ActualizarCabezasProcesadas(filtro);

                transaction.Complete();
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Registra el envio de alimento de una organizacion a otra
        /// </summary>
        /// <param name="envioAlimento">Información del envio de alimento a guardar</param>
        /// <returns>Regresa una confirmación de registro del envio de alimento</returns>
        internal EnvioAlimentoInfo RegistrarEnvioAlimento(EnvioAlimentoInfo envioAlimento)
        {
            EnvioAlimentoInfo confirmacion = new EnvioAlimentoInfo();

            try
            {
                Logger.Info();
                AlmacenMovimientoBL almacenMovimientoBL = new AlmacenMovimientoBL();

                EnvioAlimentoDAL           salidaAlimentoDAL          = new EnvioAlimentoDAL();
                AlmacenMovimientoDetalleBL almacenMovimientoDetalleBl = new AlmacenMovimientoDetalleBL();
                AlmacenMovimientoDetalle   detalleMovimiento          = new AlmacenMovimientoDetalle();
                AlmacenInventarioBL        inventario = new AlmacenInventarioBL();
                AlmacenInventarioLoteBL    loteBl     = new AlmacenInventarioLoteBL();

                AlmacenMovimientoInfo almacenMovimiento = new AlmacenMovimientoInfo();
                almacenMovimiento.AlmacenID        = envioAlimento.Almacen.AlmacenID;
                almacenMovimiento.TipoMovimientoID = TipoMovimiento.ProductoSalidaTraspaso.GetHashCode();

                almacenMovimiento.Status                = Estatus.AplicadoInv.GetHashCode();
                almacenMovimiento.UsuarioCreacionID     = envioAlimento.UsuarioCreacionID;
                almacenMovimiento.UsuarioModificacionID = envioAlimento.UsuarioCreacionID;
                almacenMovimiento.EsEnvioAlimento       = true;
                almacenMovimiento.OrganizacionID        = envioAlimento.Origen.OrganizacionID;

                PolizaAbstract     poliza       = null;
                IList <PolizaInfo> listaPolizas = null;

                using (var transaccion = new TransactionScope())
                {
                    //registrar en TB AlmacenMovimiento
                    long almacenMovimientoID = almacenMovimientoBL.Crear(almacenMovimiento);
                    almacenMovimiento.AlmacenMovimientoID = almacenMovimientoID;
                    envioAlimento.AlmacenMovimientoId     = almacenMovimientoID;

                    if (envioAlimento.AlmacenMovimientoId == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    //registrar en TB AlmacenMovimientoDetalle
                    detalleMovimiento.AlmacenMovimientoID = almacenMovimiento.AlmacenMovimientoID;
                    almacenMovimiento = almacenMovimientoBL.ObtenerPorId(almacenMovimiento.AlmacenMovimientoID);

                    if (almacenMovimiento.AlmacenMovimientoID == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    envioAlimento.Folio        = almacenMovimiento.FolioMovimiento;
                    detalleMovimiento.Producto = envioAlimento.Producto;

                    if (detalleMovimiento.Producto.ManejaLote)
                    {
                        detalleMovimiento.AlmacenInventarioLoteId = envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().AlmacenInventarioLoteId;

                        detalleMovimiento.Precio = envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().PrecioPromedio;
                    }
                    else
                    {
                        detalleMovimiento.Precio = envioAlimento.AlmacenInventario.PrecioPromedio;
                    }

                    detalleMovimiento.ProductoID        = envioAlimento.Producto.ProductoId;
                    detalleMovimiento.Cantidad          = envioAlimento.Cantidad;
                    detalleMovimiento.Importe           = envioAlimento.Importe;
                    detalleMovimiento.UsuarioCreacionID = envioAlimento.UsuarioCreacionID;
                    detalleMovimiento.Piezas            = envioAlimento.Piezas;
                    int almacenMovimientoDetalleid = almacenMovimientoDetalleBl.Crear(detalleMovimiento);
                    if (almacenMovimientoDetalleid == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    //registrar en TB EnvioProducto
                    confirmacion = salidaAlimentoDAL.RegistrarEnvioAlimento(envioAlimento);

                    if (confirmacion.EnvioId == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    envioAlimento.EnvioId    = confirmacion.EnvioId;
                    envioAlimento.FechaEnvio = confirmacion.FechaEnvio;

                    envioAlimento.AlmacenInventario.Cantidad -= envioAlimento.Cantidad;
                    envioAlimento.AlmacenInventario.Importe  -= envioAlimento.Importe;
                    decimal precioPromedioInicial = 0M;
                    if (envioAlimento.Producto.ManejaLote)
                    {
                        precioPromedioInicial = envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().PrecioPromedio;
                    }
                    else
                    {
                        precioPromedioInicial = envioAlimento.AlmacenInventario.PrecioPromedio;
                    }
                    if (envioAlimento.AlmacenInventario.Cantidad == 0)
                    {
                        envioAlimento.AlmacenInventario.PrecioPromedio = 0M;
                    }

                    if (envioAlimento.AlmacenInventario.Cantidad < 0)
                    {
                        envioAlimento.AlmacenInventario.Cantidad = 0;
                    }

                    if (envioAlimento.AlmacenInventario.Importe < 0)
                    {
                        envioAlimento.AlmacenInventario.Importe = 0;
                    }

                    if (envioAlimento.AlmacenInventario.Cantidad > 0 && envioAlimento.AlmacenInventario.Importe > 0)
                    {
                        envioAlimento.AlmacenInventario.PrecioPromedio = envioAlimento.AlmacenInventario.Importe / envioAlimento.AlmacenInventario.Cantidad;
                    }

                    envioAlimento.AlmacenInventario.UsuarioModificacionID = envioAlimento.UsuarioCreacionID;
                    inventario.ActualizarPorProductoId(envioAlimento.AlmacenInventario);

                    if (envioAlimento.Producto.ManejaLote)
                    {
                        FechaInfo fechaInfo = new FechaBL().ObtenerFechaActual();
                        envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Cantidad -= envioAlimento.Cantidad;
                        envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Importe  -= envioAlimento.Importe;

                        if (envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Cantidad <= 0)
                        {
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().PrecioPromedio = 0M;
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Cantidad       = 0;
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Importe        = 0;

                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().FechaInicio = fechaInfo.FechaActual;
                        }

                        if (envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Importe > 0 && envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Cantidad > 0)
                        {
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().PrecioPromedio = envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Importe / envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Cantidad;
                        }
                        else
                        {
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Activo   = EstatusEnum.Inactivo;
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().FechaFin = fechaInfo.FechaActual;
                        }

                        if (envioAlimento.Producto.SubfamiliaId == SubFamiliasEnum.Forrajes.GetHashCode())
                        {
                            envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Piezas -= envioAlimento.Piezas;
                            if (envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Piezas < 0)
                            {
                                envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().Piezas = 0;
                            }
                        }

                        envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().UsuarioModificacionId = envioAlimento.UsuarioCreacionID;
                        loteBl.ActualizarEnvioAlimento(envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault());
                    }

                    if (salidaAlimentoDAL.RegistrarRecepcionProductoEnc(envioAlimento, TipoMovimiento.ProductoSalidaTraspaso) == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    if (salidaAlimentoDAL.RegistrarRecepcionProductoDet(envioAlimento, TipoMovimiento.ProductoSalidaTraspaso) == 0)
                    {
                        return new EnvioAlimentoInfo {
                                   EnvioId = 0
                        }
                    }
                    ;

                    poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.SalidaTraspaso);

                    SolicitudProductoInfo oSolicitud = new SolicitudProductoInfo();
                    oSolicitud.FolioSolicitud    = envioAlimento.Folio;
                    oSolicitud.OrganizacionID    = envioAlimento.Origen.OrganizacionID;
                    oSolicitud.AlmacenGeneralID  = envioAlimento.Almacen.AlmacenID;
                    oSolicitud.Almacen           = new AlmacenBL().ObtenerAlmacenPorOrganizacion(envioAlimento.Destino.OrganizacionID).FirstOrDefault();
                    oSolicitud.FechaEntrega      = envioAlimento.FechaEnvio;
                    oSolicitud.UsuarioCreacionID = envioAlimento.UsuarioCreacionID;
                    oSolicitud.Detalle           = new List <SolicitudProductoDetalleInfo>();
                    SolicitudProductoDetalleInfo detalle = new SolicitudProductoDetalleInfo()
                    {
                        Cantidad       = envioAlimento.Cantidad,
                        PrecioPromedio = envioAlimento.Producto.ManejaLote ? envioAlimento.AlmacenInventario.ListaAlmacenInventarioLote.FirstOrDefault().PrecioPromedio: envioAlimento.AlmacenInventario.PrecioPromedio,
                        Producto       = envioAlimento.Producto
                    };
                    detalle.PrecioPromedio = decimal.Round(detalle.PrecioPromedio, 2);
                    if (detalle.PrecioPromedio == 0)
                    {
                        detalle.PrecioPromedio = precioPromedioInicial;
                    }
                    oSolicitud.Detalle.Add(detalle);

                    listaPolizas = poliza.GeneraPoliza(oSolicitud);
                    var polizaDAL = new PolizaDAL();
                    if (listaPolizas != null && listaPolizas.Any())
                    {
                        string Referencia = "03  " + envioAlimento.Folio.ToString() + new Random().Next(10, 20).ToString() + new Random().Next(30, 40) + DateTime.Now.Millisecond.ToString() + listaPolizas.ToList().FirstOrDefault().ClaseDocumento;
                        listaPolizas.ToList().ForEach(datos =>
                        {
                            datos.NumeroReferencia       = envioAlimento.Folio.ToString();
                            datos.OrganizacionID         = oSolicitud.OrganizacionID;
                            datos.UsuarioCreacionID      = envioAlimento.UsuarioCreacionID;
                            datos.Activo                 = EstatusEnum.Activo;
                            datos.ArchivoEnviadoServidor = 1;
                            datos.Referencia3            = Referencia;
                        });

                        ParametroOrganizacionInfo oParametroOrg = new ParametroOrganizacionBL().ObtenerPorOrganizacionIDClaveParametro(oSolicitud.OrganizacionID, ParametrosEnum.CuentaInventarioTransito.ToString());
                        if (oParametroOrg != null)
                        {
                            listaPolizas[listaPolizas.ToList().FindIndex(datos => datos.NumeroLinea.Trim() == "1")].Cuenta = oParametroOrg.Valor;
                        }

                        envioAlimento.Poliza = poliza.ImprimePoliza(oSolicitud, listaPolizas);
                        polizaDAL.CrearServicioPI(listaPolizas, TipoPoliza.SalidaTraspaso);

                        transaccion.Complete();
                    }
                }

                return(envioAlimento);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }