/// <summary>
        /// Valida que los pesos de interface sean correctos
        /// </summary>
        /// <param name="entradaGanadoCosteo"></param>
        /// <param name="pesoNeto"></param>
        private void ValidarPeso(EntradaGanadoCosteoInfo entradaGanadoCosteo, int pesoNeto)
        {
            decimal pesoTotal = entradaGanadoCosteo.ListaEntradaDetalle.Sum(peso => peso.PesoOrigen);

            decimal            diferencia     = pesoNeto - pesoTotal;
            EntradaDetalleInfo entradaDetalle = entradaGanadoCosteo.ListaEntradaDetalle.FirstOrDefault();

            if (entradaDetalle == null)
            {
                entradaDetalle = new EntradaDetalleInfo();
            }
            if (diferencia >= 0)
            {
                entradaDetalle.PesoOrigen += diferencia;
            }
            else
            {
                entradaDetalle.PesoOrigen -= diferencia;
            }
        }
        /// <summary>
        /// Obtiene
        /// </summary>
        /// <param name="organizacionID"> </param>
        /// <param name="folioOrigen"> </param>
        /// <returns></returns>
        internal EntradaGanadoCosteoInfo ObtenerDatosInterfaceSalidaTraspaso(int organizacionID, int folioOrigen)
        {
            EntradaGanadoCosteoInfo entradaGanadoCosteo = null;

            try
            {
                Logger.Info();
                var interfaceSalidaTraspaspBl = new InterfaceSalidaTraspasoDAL();
                InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso =
                    interfaceSalidaTraspaspBl.ObtenerDatosInterfaceSalidaTraspaso(organizacionID, folioOrigen);
                if (interfaceSalidaTraspaso != null)
                {
                    entradaGanadoCosteo = new EntradaGanadoCosteoInfo
                    {
                        ListaCalidadGanado  = new List <EntradaGanadoCalidadInfo>(),
                        ListaCostoEntrada   = new List <EntradaGanadoCostoInfo>(),
                        ListaEntradaDetalle = new List <EntradaDetalleInfo>(),
                    };
                    var animalBL = new AnimalBL();
                    var interfaceSalidaTraspasoCostoBL = new InterfaceSalidaTraspasoCostoBL();
                    List <InterfaceSalidaTraspasoCostoInfo> interfaceSalidaTraspasoCosto =
                        interfaceSalidaTraspasoCostoBL.ObtenerCostosInterfacePorDetalle(interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle);
                    var animalesID = new HashSet <long>(interfaceSalidaTraspasoCosto.Select(id => id.AnimalID));
                    List <AnimalInfo> animalesTraspaso = animalesID.Select(ani => new AnimalInfo
                    {
                        AnimalID = ani,
                        Activo   = false
                    }).ToList();
                    List <AnimalInfo> animalesMovimientoSalidaTraspaso = animalBL.ObtenerMovimientosPorXML(animalesTraspaso);
                    if (animalesMovimientoSalidaTraspaso != null && animalesMovimientoSalidaTraspaso.Any())
                    {
                        var animalesMovimiento = new List <AnimalMovimientoInfo>();
                        animalesMovimientoSalidaTraspaso.ForEach(
                            movs => animalesMovimiento.AddRange(movs.ListaAnimalesMovimiento));

                        int     pesoNeto     = interfaceSalidaTraspaso.PesoBruto - interfaceSalidaTraspaso.PesoTara;
                        decimal pesoLote     = 0;
                        int     totalCabezas = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Sum(cab => cab.Cabezas);

                        var costoBL = new CostoBL();
                        IList <CostoInfo> costos = costoBL.ObtenerTodos(EstatusEnum.Activo);
                        int cabezas = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Sum(cabe => cabe.Cabezas);
                        entradaGanadoCosteo.ListaCalidadGanado.AddRange(
                            animalesMovimientoSalidaTraspaso.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                                calidad => new EntradaGanadoCalidadInfo
                        {
                            CalidadGanado
                                = new CalidadGanadoInfo
                                {
                                    CalidadGanadoID =
                                        calidad.Select(
                                            id =>
                                            id.CalidadGanado.CalidadGanadoID).
                                        FirstOrDefault(),
                                    Calidad     = calidad.Select(cal => cal.CalidadGanado.Calidad).FirstOrDefault(),
                                    Descripcion = calidad.Select(cal => cal.CalidadGanado.Descripcion).FirstOrDefault(),
                                    Sexo        =
                                        calidad.Select(
                                            id => id.CalidadGanado.Sexo).
                                        FirstOrDefault()
                                },
                            Valor = calidad.Count(),
                        }));
                        pesoLote = (pesoNeto * cabezas) / totalCabezas;
                        int pesoPromedio = Convert.ToInt32(pesoLote / totalCabezas);
                        entradaGanadoCosteo.ListaEntradaDetalle.AddRange(
                            interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                                detalle => new EntradaDetalleInfo
                        {
                            TipoGanado = new TipoGanadoInfo
                            {
                                TipoGanadoID = detalle.Key,
                                Descripcion  = detalle.Select(des => des.TipoGanado.Descripcion).FirstOrDefault()
                            },
                            Cabezas              = detalle.Select(des => des.Cabezas).FirstOrDefault(),
                            PesoOrigen           = detalle.Select(des => des.Cabezas).FirstOrDefault() * pesoPromedio,
                            FechaSalidaInterface = interfaceSalidaTraspaso.FechaEnvio,
                        }));
                        int pesoTotalAgrupado = Convert.ToInt32(entradaGanadoCosteo.ListaEntradaDetalle.Sum(det => det.PesoOrigen));
                        if (pesoTotalAgrupado != pesoNeto)
                        {
                            int diferencia = pesoNeto - pesoTotalAgrupado;
                            EntradaDetalleInfo primerDetalle = entradaGanadoCosteo.ListaEntradaDetalle.FirstOrDefault();
                            if (primerDetalle != null)
                            {
                                primerDetalle.PesoOrigen = primerDetalle.PesoOrigen + diferencia;
                            }
                        }
                        //entradaGanadoCosteo.ListaEntradaDetalle.AddRange(
                        //    animalesMovimientoSalidaTraspaso.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                        //        detalle => new EntradaDetalleInfo
                        //        {
                        //            TipoGanado = new TipoGanadoInfo
                        //            {
                        //                TipoGanadoID = detalle.Key,
                        //                Descripcion =
                        //                    detalle.Select(
                        //                        des =>
                        //                        des.TipoGanado.Descripcion).
                        //                    FirstOrDefault()
                        //            },
                        //            Cabezas = detalle.Count(),
                        //            PesoOrigen = pesoLote,
                        //            FechaSalidaInterface = interfaceSalidaTraspaso.FechaEnvio,
                        //        }));
                        entradaGanadoCosteo.ListaCostoEntrada.AddRange(interfaceSalidaTraspasoCosto
                                                                       .GroupBy(cos => cos.Costo.CostoID).Select(grp =>
                                                                                                                 new EntradaGanadoCostoInfo
                        {
                            Costo = new CostoInfo
                            {
                                CostoID       = grp.Key,
                                ImporteCosto  = grp.Sum(imp => imp.Importe),
                                ClaveContable = costos.Where(id => id.CostoID == grp.Key)
                                                .Select(clave => clave.ClaveContable)
                                                .FirstOrDefault(),
                                Descripcion = costos.Where(id => id.CostoID == grp.Key)
                                              .Select(desc => desc.Descripcion)
                                              .FirstOrDefault()
                            },
                            Importe = grp.Sum(imp => imp.Importe),
                        }));
                        ValidarPeso(entradaGanadoCosteo, pesoNeto);
                        AgruparValoresInterfaz(entradaGanadoCosteo, organizacionID, interfaceSalidaTraspaso, interfaceSalidaTraspasoCosto);
                        CompletarCalidadGanado(entradaGanadoCosteo);
                        AsignarProveedorSuKarne300(entradaGanadoCosteo);
                    }
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(entradaGanadoCosteo);
        }
Exemplo n.º 3
0
        /// <summary>
        ///     Obtiene una Interface de Salida por SalidaID y OrganizacionID
        /// </summary>
        /// <param name="entradaGanado"></param>
        /// <returns></returns>
        internal EntradaGanadoCosteoInfo ObtenerPorSalidaOrganizacion(EntradaGanadoInfo entradaGanado)
        {
            var entradaGanadoCosteo = new EntradaGanadoCosteoInfo();

            try
            {
                Logger.Info();
                var interfaceSalidaDAL   = new InterfaceSalidaDAL();
                var interfacesSalidaInfo = interfaceSalidaDAL.ObtenerPorSalidaOrganizacion(entradaGanado);
                entradaGanadoCosteo.ListaEntradaDetalle = new List <EntradaDetalleInfo>();
                entradaGanadoCosteo.ListaCostoEntrada   = new List <EntradaGanadoCostoInfo>();

                var diasEstancia = new List <double>();

                var listaEntradaGanadoCostoAuxiliar = new List <EntradaGanadoCostoInfo>();

                var tipoGanadoBL = new TipoGanadoBL();

                List <TipoGanadoInfo> tiposGanado = tipoGanadoBL.ObtenerTodos();

                if (interfacesSalidaInfo == null)
                {
                    return(entradaGanadoCosteo);
                }
                interfacesSalidaInfo.ListaInterfaceDetalle.ForEach(det =>
                {
                    var entradaGanadoDetalle = new EntradaDetalleInfo
                    {
                        TipoGanado           = det.TipoGanado,
                        Cabezas              = det.Cabezas,
                        Importe              = det.Importe,
                        PrecioKilo           = det.PrecioKG,
                        PesoOrigen           = det.ListaInterfaceSalidaAnimal.Sum(ani => ani.PesoOrigen),
                        ListaTiposGanado     = tiposGanado,
                        FechaSalidaInterface = interfacesSalidaInfo.FechaSalida,
                    };
                    entradaGanadoCosteo.ListaEntradaDetalle.Add(entradaGanadoDetalle);
                    if (det.ListaInterfaceSalidaAnimal != null)
                    {
                        det.ListaInterfaceSalidaAnimal.ForEach(animal =>
                        {
                            if (animal.ListaSalidaCostos != null)
                            {
                                var listaCostosAnimal = (from costo in animal.ListaSalidaCostos

                                                         select new EntradaGanadoCostoInfo
                                {
                                    Costo = costo.Costo,
                                    Importe = costo.Importe,
                                    TieneCuenta = true,
                                    //CuentaProvision = claveContable.Valor,
                                    //DescripcionCuenta = claveContable.Descripcion
                                });
                                listaEntradaGanadoCostoAuxiliar.AddRange(listaCostosAnimal);

                                var span = interfacesSalidaInfo.FechaSalida - animal.FechaCompra;
                                diasEstancia.Add(span.TotalDays);
                            }
                        });
                    }
                });

                var costosAgrupados = (from costos in listaEntradaGanadoCostoAuxiliar
                                       group costos by costos.Costo.CostoID
                                       into costoAgrupado
                                       let interfaceSalidaCostoInfo = costoAgrupado.FirstOrDefault()
                                                                      let claveContable =
                                           ObtenerCuentaInventario(interfaceSalidaCostoInfo.Costo,
                                                                   entradaGanado.
                                                                   OrganizacionOrigenID, ClaveCuenta.CuentaInventarioTransito)
                                           where interfaceSalidaCostoInfo != null
                                           select new EntradaGanadoCostoInfo
                {
                    Costo = interfaceSalidaCostoInfo.Costo,
                    TieneCuenta = true,
                    Importe = costoAgrupado.Sum(cos => cos.Importe),
                    CuentaProvision = claveContable.Valor,
                    DescripcionCuenta = claveContable.Descripcion,
                    Origen = true
                }).ToList();

                entradaGanadoCosteo.ListaCostoEntrada.AddRange(costosAgrupados);
                entradaGanadoCosteo.DiasEstancia = Convert.ToInt32(diasEstancia.Average());
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(entradaGanadoCosteo);
        }