/// <summary>
        /// guardar cierre dia inventario
        /// </summary>
        /// <param name="datosGrid"></param>
        /// <param name="almacenCierreDiaInventario"></param>
        /// <returns></returns>
        public int GuardarCierreDiaInventario(IList <AlmacenCierreDiaInventarioInfo> datosGrid, AlmacenCierreDiaInventarioInfo almacenCierreDiaInventario)
        {
            try
            {
                int result = 0;

                int usuarioCreacionID  = almacenCierreDiaInventario.UsuarioCreacionId;
                var almacenCierreFolio = new AlmacenCierreDiaInventarioInfo
                {
                    Almacen           = almacenCierreDiaInventario.Almacen,
                    TipoMovimiento    = TipoMovimiento.InventarioFisico.GetHashCode(),
                    FolioAlmacen      = almacenCierreDiaInventario.FolioAlmacen,
                    Observaciones     = almacenCierreDiaInventario.Observaciones,
                    Estatus           = EstatusInventario.Pendiente.GetHashCode(),
                    UsuarioCreacionId = usuarioCreacionID,
                };

                int organizacionID = almacenCierreDiaInventario.OrganizacionId;

                List <AnimalMovimientoInfo>       animalesNoReimplantados = null;
                List <ProgramacionReinplanteInfo> corralesProgramados     = null;
                List <LoteInfo> lotesDestino = null;
                List <LoteInfo> lotesOrigen  = null;

                var animalMovimientoBL = new AnimalMovimientoBL();
                var loteBL             = new LoteBL();
                if (almacenCierreFolio.Almacen != null &&
                    almacenCierreFolio.Almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ReimplanteGanado.GetHashCode())
                {
                    var reimplanteBL = new ReimplanteBL();
                    corralesProgramados = reimplanteBL.ObtenerCorralesParaAjuste(organizacionID);
                    if (corralesProgramados != null && corralesProgramados.Any())
                    {
                        corralesProgramados.ForEach(dato =>
                        {
                            dato.OrganizacionID        = organizacionID;
                            dato.UsuarioModificacionID = usuarioCreacionID;
                        });
                        List <LoteInfo> lotes = corralesProgramados.Select(id => new LoteInfo
                        {
                            LoteID = id.LoteID
                        }).ToList();
                        animalesNoReimplantados =
                            animalMovimientoBL.ObtenerAnimalesNoReimplantadosXML(organizacionID, lotes);
                        if (animalesNoReimplantados != null && animalesNoReimplantados.Any())
                        {
                            animalesNoReimplantados.ForEach(dato =>
                            {
                                dato.TipoMovimientoID  = TipoMovimiento.EntradaPorAjusteAnimal.GetHashCode();
                                dato.UsuarioCreacionID = usuarioCreacionID;
                            });
                            lotesDestino = animalesNoReimplantados.Select(lote => new LoteInfo
                            {
                                LoteID = lote.LoteID
                            }).ToList();
                            lotesOrigen = animalesNoReimplantados.Select(lote => new LoteInfo
                            {
                                LoteID = lote.LoteIDOrigen
                            }).ToList();
                            IEnumerable <LoteInfo> lotesEnumerable = loteBL.ObtenerPorLoteXML(lotesDestino);
                            if (lotesEnumerable != null)
                            {
                                lotesDestino = lotesEnumerable.ToList();
                            }
                            lotesEnumerable = loteBL.ObtenerPorLoteXML(lotesOrigen);
                            if (lotesEnumerable != null)
                            {
                                lotesOrigen = lotesEnumerable.ToList();
                            }
                            List <AnimalMovimientoInfo> animalesPorLoteDestino = animalesNoReimplantados
                                                                                 .Select(ani => new AnimalMovimientoInfo
                            {
                                LoteID = ani.LoteID
                            }).ToList();
                            List <AnimalMovimientoInfo> animalesPorLoteOrigen = animalesNoReimplantados
                                                                                .Select(ani => new AnimalMovimientoInfo
                            {
                                LoteID = ani.LoteID
                            }).ToList();
                            lotesDestino.ForEach(id =>
                            {
                                int cabezas              = animalesPorLoteDestino.Count(loteID => loteID.LoteID == id.LoteID);
                                id.Cabezas              += cabezas;
                                id.CabezasInicio        += cabezas;
                                id.UsuarioModificacionID = usuarioCreacionID;
                            });
                            lotesOrigen.ForEach(id =>
                            {
                                int cabezas = animalesPorLoteOrigen.Count(loteID => loteID.LoteID == id.LoteID);
                                id.Cabezas -= cabezas;
                                id.UsuarioModificacionID = usuarioCreacionID;
                            });
                        }
                    }
                }

                var transactionOption = new TransactionOptions();
                transactionOption.IsolationLevel = IsolationLevel.ReadUncommitted;
                using (var transaction = new TransactionScope(TransactionScopeOption.Required, transactionOption))
                {
                    Logger.Info();
                    var cierreDiaInventarioDAL   = new CierreDiaInventarioDAL();
                    var programacionReimplanteBl = new ProgramacionReimplanteBL();
                    #region AjusteDeCorralesReimplante

                    if (animalesNoReimplantados != null && animalesNoReimplantados.Any())
                    {
                        animalMovimientoBL.GuardarAnimalMovimientoXML(animalesNoReimplantados);
                        ////Se actualizan las cabezas que tiene el lote
                        loteBL.ActualizaNoCabezasEnLoteXML(lotesDestino, lotesOrigen);

                        //Se elimina la programacin reimplante del lote

                        programacionReimplanteBl.EliminarProgramacionReimplanteXML(corralesProgramados);
                    }

                    if (almacenCierreFolio.Almacen != null &&
                        almacenCierreFolio.Almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ReimplanteGanado.GetHashCode())
                    {
                        programacionReimplanteBl.CerrarProgramacionReimplante(organizacionID, usuarioCreacionID);
                    }

                    #endregion AjusteDeCorralesReimplante

                    #region GuardarCierreDeDia

                    AlmacenCierreDiaInventarioInfo resultadoAlmacenMovimiento =
                        cierreDiaInventarioDAL.GuardarAlmacenMovimiento(almacenCierreFolio);

                    almacenCierreFolio.UsuarioCreacionId   = resultadoAlmacenMovimiento.UsuarioCreacionId;
                    almacenCierreFolio.AlmacenMovimientoID = resultadoAlmacenMovimiento.AlmacenMovimientoID;

                    result = cierreDiaInventarioDAL.GuardarProductosCierreDiaInventario(datosGrid,
                                                                                        almacenCierreFolio);

                    #endregion GuardarCierreDeDia

                    #region POLIZA
                    var almacenMovimientoInventarioBL = new AlmacenMovimientoBL();
                    List <ContenedorAlmacenMovimientoCierreDia> contenedorMovimientoCierreDia =
                        almacenMovimientoInventarioBL.ObtenerMovimientosInventario(almacenCierreDiaInventario.Almacen.AlmacenID,
                                                                                   almacenCierreDiaInventario.OrganizacionId);
                    if (contenedorMovimientoCierreDia != null && contenedorMovimientoCierreDia.Any())
                    {
                        contenedorMovimientoCierreDia.ForEach(
                            x => x.FolioAlmacen       = almacenCierreDiaInventario.FolioAlmacen);
                        contenedorMovimientoCierreDia =
                            contenedorMovimientoCierreDia.Join(datosGrid, contenedor => contenedor.Producto.ProductoId,
                                                               grid => grid.ProductoID, (con, grd) => con).ToList();
                        var             poliza       = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.ConsumoProducto);
                        List <DateTime> foliosFechas =
                            contenedorMovimientoCierreDia.Select(
                                x => Convert.ToDateTime(x.AlmacenMovimiento.FechaMovimiento.ToShortDateString())).
                            Distinct().OrderBy(
                                fecha => fecha).ToList();
                        List <ContenedorAlmacenMovimientoCierreDia> movimientosPorDia;
                        var cierreDiaFechas = new List <ContenedorAlmacenMovimientoCierreDia>();
                        for (var indexFecha = 0; indexFecha < foliosFechas.Count; indexFecha++)
                        {
                            movimientosPorDia =
                                contenedorMovimientoCierreDia.Where(
                                    x =>
                                    Convert.ToDateTime(x.AlmacenMovimiento.FechaMovimiento.ToShortDateString()).Equals(
                                        foliosFechas[indexFecha])).ToList();
                            IList <PolizaInfo> polizaConsumo = poliza.GeneraPoliza(movimientosPorDia);
                            if (polizaConsumo != null && polizaConsumo.Any())
                            {
                                var polizaBL = new PolizaBL();
                                polizaConsumo.ToList().ForEach(datos =>
                                {
                                    datos.UsuarioCreacionID =
                                        almacenCierreDiaInventario.UsuarioCreacionId;
                                    datos.OrganizacionID =
                                        almacenCierreDiaInventario.OrganizacionId;
                                    datos.ArchivoEnviadoServidor = 1;
                                });
                                polizaBL.GuardarServicioPI(polizaConsumo, TipoPoliza.ConsumoProducto);
                                cierreDiaFechas.AddRange(movimientosPorDia);
                            }
                        }
                        var almacenMovimientoBL = new AlmacenMovimientoBL();
                        cierreDiaFechas.ForEach(
                            datos => datos.Almacen.UsuarioModificacionID = almacenCierreDiaInventario.UsuarioCreacionId);
                        almacenMovimientoBL.ActualizarGeneracionPoliza(cierreDiaFechas);
                    }
                    #endregion POLIZA

                    transaction.Complete();
                }
                return(result);
            }
            catch (ExcepcionServicio ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
示例#2
0
        internal MemoryStream Guardar(MuertesEnTransitoInfo muerteEnTransito, List <AnimalInfo> animales)
        {
            MemoryStream retorno = null;

            try
            {
                Logger.Info();
                PolizaAbstract     poliza;
                IList <PolizaInfo> polizaMuerteEnTransito;
                var entradaGanadoMuerteLista = new List <EntradaGanadoMuerteInfo>();

                using (var transaction = new TransactionScope())
                {
                    var fecha             = DateTime.Now;
                    int organizacionID    = muerteEnTransito.OrganizacionID;
                    int usuarioCreacionID = muerteEnTransito.UsuarioCreacionID;
                    int pesoAnimal        = 0;
                    int corralID          = 0;
                    int loteID            = 0;

                    var datosInterface = false;
                    List <InterfaceSalidaAnimalInfo> interfaceSalidaAnimal = null;
                    var entradaGanadoBL             = new EntradaGanadoBL();
                    EntradaGanadoInfo entradaGanado = entradaGanadoBL.ObtenerPorID(muerteEnTransito.EntradaGanadoID);
                    if (entradaGanado != null)
                    {
                        loteID   = entradaGanado.LoteID;
                        corralID = entradaGanado.CorralID;
                        if (entradaGanado.FolioOrigen > 0)
                        {
                            var interfaceSalidaBL = new InterfaceSalidaAnimalBL();
                            interfaceSalidaAnimal =
                                interfaceSalidaBL.ObtenerInterfazSalidaAnimal(entradaGanado.FolioOrigen,
                                                                              entradaGanado.OrganizacionOrigenID);
                            if (interfaceSalidaAnimal == null || interfaceSalidaAnimal.Count <= 0)
                            {
                                fecha      = entradaGanado.FechaEntrada;
                                pesoAnimal = Convert.ToInt32((entradaGanado.PesoBruto - entradaGanado.PesoTara) /
                                                             entradaGanado.CabezasRecibidas);
                            }
                            else
                            {
                                datosInterface = true;
                            }
                        }
                        else
                        {
                            pesoAnimal = Convert.ToInt32((entradaGanado.PesoBruto - entradaGanado.PesoTara) /
                                                         entradaGanado.CabezasRecibidas);
                        }
                    }
                    // Generamos el Folio

                    FolioBL folioBL     = new FolioBL();
                    var     folioMuerte = folioBL.ObtenerFolio(organizacionID, TipoFolio.MuertesEnTransito);

                    foreach (var animal in animales)
                    {
                        if (datosInterface)
                        {
                            pesoAnimal = interfaceSalidaAnimal.Where(
                                are => are.Arete.Equals(animal.Arete)).Select(
                                peso => Convert.ToInt32(peso.PesoCompra)).FirstOrDefault();
                        }

                        if (datosInterface)
                        {
                            fecha =
                                interfaceSalidaAnimal.Where(arete => arete.Arete.Equals(animal.Arete)).Select(
                                    fechaItz => fechaItz.FechaCompra).FirstOrDefault();
                        }

                        if (fecha == new DateTime(1, 1, 1))
                        {
                            fecha = DateTime.Now;
                        }

                        animal.OrganizacionIDEntrada = organizacionID;
                        animal.FolioEntrada          = muerteEnTransito.FolioEntrada;
                        animal.UsuarioCreacionID     = usuarioCreacionID;
                        animal.ClasificacionGanadoID = 1;
                        animal.CalidadGanadoID       = 1;
                        animal.TipoGanadoID          = 1;
                        animal.FechaCompra           = fecha;
                        animal.PesoCompra            = pesoAnimal;
                        animal.Activo = false;
                    }

                    //Guardamos los Animales
                    var animalBL = new AnimalBL();
                    animalBL.GuardarAnimal(animales);

                    //Obtenemos los animales almacenados con su
                    animales = animalBL.ObtenerPorArete(animales);

                    foreach (AnimalInfo animal in animales)
                    {
                        animal.UsuarioCreacionID = usuarioCreacionID;
                    }

                    //Genera los costos por animal
                    animales = animalBL.ProcesoGenerarCostos(animales);

                    foreach (AnimalInfo animal in animales)
                    {
                        var entradaGanadoMuerte = new EntradaGanadoMuerteInfo
                        {
                            EntradaGanado =
                                new EntradaGanadoInfo
                            {
                                EntradaGanadoID =
                                    muerteEnTransito.EntradaGanadoID,
                            },
                            Animal = new AnimalInfo {
                                Arete = animal.Arete
                            },
                            FolioMuerte       = folioMuerte,
                            Activo            = EstatusEnum.Activo,
                            UsuarioCreacionID = usuarioCreacionID,
                            Peso = animal.PesoCompra,
                            EntradaGanadMuerteDetalle = new List <EntradaGanadoMuerteDetalleInfo>(),
                            ProveedorFletes           = new ProveedorInfo()
                            {
                                CodigoSAP = muerteEnTransito.CodigoProveedor
                            },
                            Cliente = new ClienteInfo()
                            {
                                CodigoSAP = muerteEnTransito.Cliente.CodigoSAP, Descripcion = muerteEnTransito.Cliente.Descripcion
                            },
                            OrganizacionDestinoID = entradaGanado.OrganizacionID
                        };

                        if (animal.ListaCostosAnimal != null)
                        {
                            entradaGanadoMuerte.EntradaGanadMuerteDetalle =
                                animal.ListaCostosAnimal.Select(im => new EntradaGanadoMuerteDetalleInfo
                            {
                                Costo = new CostoInfo
                                {
                                    CostoID = im.CostoID
                                },
                                Importe             = im.Importe,
                                EntradaGanadoMuerte = entradaGanadoMuerte
                            }).ToList();
                        }
                        entradaGanadoMuerteLista.Add(entradaGanadoMuerte);
                    }

                    if (interfaceSalidaAnimal != null && interfaceSalidaAnimal.Count > 0 && animales != null && animales.Count > 0)
                    {
                        var interfaceSalidaBL = new InterfaceSalidaAnimalBL();
                        foreach (AnimalInfo animal in animales)
                        {
                            InterfaceSalidaAnimalInfo interfaceSalidaAnimalIndividual = interfaceSalidaAnimal.FirstOrDefault(animalInfo => animalInfo.Arete.Equals(animal.Arete));
                            interfaceSalidaBL.GuardarAnimalID(interfaceSalidaAnimalIndividual, animal.AnimalID);
                        }
                    }

                    //Asignamos el AnimalID en la lista de muertes ante sde guardar.
                    foreach (EntradaGanadoMuerteInfo muerte in entradaGanadoMuerteLista)
                    {
                        muerte.Animal.AnimalID = animales.Where(animal => animal.Arete.Equals(muerte.Animal.Arete))
                                                 .Select(animal => animal.AnimalID).FirstOrDefault();
                        muerte.Peso = animales.Where(animal => animal.Arete.Equals(muerte.Animal.Arete))
                                      .Select(animal => animal.PesoCompra).FirstOrDefault();
                    }
                    //Guardamos las muertes en transito
                    var muertesEnTransitoDal = new MuertesEnTransitoDAL();
                    muertesEnTransitoDal.Guardar(entradaGanadoMuerteLista, muerteEnTransito.Cliente);


                    //Creamos los movimientos para el animal
                    if (animales != null && animales.Any())
                    {
                        fecha = DateTime.Now;
                        var animalMovimientoBL = new AnimalMovimientoBL();
                        List <AnimalMovimientoInfo> movimientosAnimal = animales.Select(ani =>
                                                                                        new AnimalMovimientoInfo
                        {
                            AnimalID          = ani.AnimalID,
                            Activo            = EstatusEnum.Activo,
                            CorralID          = corralID,
                            LoteID            = loteID,
                            FechaMovimiento   = fecha,
                            OrganizacionID    = organizacionID,
                            TipoMovimientoID  = TipoMovimiento.MuerteTransito.GetHashCode(),
                            OperadorID        = 1,
                            TrampaID          = 1,
                            Peso              = ani.PesoCompra,
                            UsuarioCreacionID = usuarioCreacionID,
                        }).ToList();
                        animalMovimientoBL.GuardarAnimalMovimientoXML(movimientosAnimal);
                    }
                    //Afectamos el lote correspondiente.
                    var loteBl   = new LoteBL();
                    var loteInfo = loteBl.ObtenerPorID(muerteEnTransito.LoteID);
                    loteInfo.UsuarioModificacionID = muerteEnTransito.UsuarioCreacionID;
                    loteInfo.Cabezas -= muerteEnTransito.MuertesTransito;

                    var filtro = new FiltroActualizarCabezasLote
                    {
                        CabezasProcesadas     = muerteEnTransito.MuertesTransito,
                        LoteIDDestino         = 0,
                        LoteIDOrigen          = loteInfo.LoteID,
                        UsuarioModificacionID = usuarioCreacionID
                    };

                    var cabezasActualizadas = loteBl.ActualizarCabezasProcesadas(filtro);

                    //Executamos el SP CorteGanado_CierrePartidaPesoOrigenLLegada(Antes-->CorteGanado_PesoCompraDirecta), si se inactiva el lote.
                    if (cabezasActualizadas.CabezasOrigen <= 0)
                    {
                        //muertesEnTransitoDal.CorteGanado_PesoCompraDirecta(muerteEnTransito.OrganizacionID, muerteEnTransito.CorralID, muerteEnTransito.LoteID);
                        var corteGanadoBl = new CorteGanadoBL();
                        corteGanadoBl.ObtenerPesosOrigenLlegada(muerteEnTransito.OrganizacionID,
                                                                muerteEnTransito.CorralID,
                                                                muerteEnTransito.LoteID);
                    }

                    #region Poliza
                    //VentaGanadoBL ventaGanadoBL = new VentaGanadoBL();
                    //List<EntradaGanadoMuerteInfo> ventasGanado = ventaGanadoBL.ObtenerVentaGanadoPorTicketPoliza(folio, organizacionID);
                    //if (ventasGanado != null && ventasGanado.Any())

                    if (entradaGanadoMuerteLista != null && entradaGanadoMuerteLista.Any())
                    {
                        poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.PolizaMuerteTransito);
                        polizaMuerteEnTransito = poliza.GeneraPoliza(entradaGanadoMuerteLista);
                        if (polizaMuerteEnTransito != null && polizaMuerteEnTransito.Any())
                        {
                            polizaMuerteEnTransito.ToList().ForEach(
                                org =>
                            {
                                org.OrganizacionID         = organizacionID;
                                org.UsuarioCreacionID      = usuarioCreacionID;
                                org.ArchivoEnviadoServidor = 1;
                            });

                            entradaGanadoMuerteLista.ToList().ForEach(org =>
                            {
                                org.EntradaGanado.Lote         = entradaGanado.Lote;
                                org.EntradaGanado.CodigoCorral = entradaGanado.CodigoCorral;
                            });
                            retorno = poliza.ImprimePoliza(entradaGanadoMuerteLista, polizaMuerteEnTransito);
                            var polizaBL = new PolizaBL();
                            polizaBL.GuardarServicioPI(polizaMuerteEnTransito, TipoPoliza.PolizaMuerteTransito);
                        }
                    }

                    // Genera el xml y lo guarda en la ruta especificada en la configuración
                    var facturaBl = new FacturaBL();
                    facturaBl.GenerarDatosFacturaMuertesEnTransito(folioMuerte, organizacionID);

                    #endregion Poliza

                    animalBL.EnviarAHistorico(animales);

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