/// <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(); } }
/// <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); } }