/// <summary> /// Guarda una lista de interface salida traspaso. /// </summary> /// <param name="interfaceSalidaTraspaso"></param> internal Dictionary <long, decimal> CrearLista(InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso) { decimal costoGanado = 0; try { var interfaceSalidaTraspasoDal = new InterfaceSalidaTraspasoDAL(); using (var scope = new TransactionScope()) { interfaceSalidaTraspaso.TraspasoGanado = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Select(det => det.TraspasoGanado). FirstOrDefault(); interfaceSalidaTraspaso.SacrificioGanado = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Select(det => det.SacrificioGanado). FirstOrDefault(); InterfaceSalidaTraspasoInfo interfaceSalidaTraspasoGuardado; if (interfaceSalidaTraspaso.InterfaceSalidaTraspasoId > 0) { Actualizar(interfaceSalidaTraspaso); interfaceSalidaTraspasoGuardado = interfaceSalidaTraspaso; } else { var folioBL = new FolioBL(); interfaceSalidaTraspaso.FolioTraspaso = folioBL.ObtenerFolio(interfaceSalidaTraspaso.OrganizacionId , TipoFolio.TraspasoGanado); interfaceSalidaTraspasoGuardado = Crear(interfaceSalidaTraspaso); } var loteBL = new LoteBL(); if (interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Any()) { interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.ForEach( det => det.InterfaceSalidaTraspasoID = interfaceSalidaTraspasoGuardado.InterfaceSalidaTraspasoId); interfaceSalidaTraspasoDal.CrearLista(interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle); List <LoteInfo> lotes = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle .Select(lote => new LoteInfo { LoteID = lote.Lote.LoteID, Cabezas = lote.Cabezas, UsuarioModificacionID = lote.UsuarioCreacionID }).ToList(); loteBL.AcutalizaCabezasLoteXML(lotes); List <LoteInfo> lotesCabezas = lotes.GroupBy(lote => lote.LoteID).Select(x => new LoteInfo { LoteID = x.Key, Cabezas = x.Sum(cab => cab.Cabezas), UsuarioModificacionID = x.Select(usu => usu.UsuarioModificacionID).FirstOrDefault() }).ToList(); List <LoteInfo> lotesDesactivar = (from ist in interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle from lote in lotesCabezas where ist.Lote.Cabezas - lote.Cabezas == 0 select lote).ToList(); if (lotesDesactivar.Any()) { loteBL.DesactivarLoteXML(lotesDesactivar); } } #region POLIZA if (interfaceSalidaTraspasoGuardado.PesoBruto > 0 && interfaceSalidaTraspasoGuardado.PesoTara > 0) { var polizaBL = new PolizaBL(); int organizacionID = interfaceSalidaTraspasoGuardado.OrganizacionId; DateTime fechaEnvio = interfaceSalidaTraspasoGuardado.FechaEnvio; long folio = interfaceSalidaTraspasoGuardado.FolioTraspaso; IList <PolizaInfo> polizasGanado = polizaBL.ObtenerPolizaConDocumentoSAPPendientes(TipoPoliza.SalidaGanado, organizacionID, fechaEnvio); if (polizasGanado != null) { polizasGanado = polizasGanado.Where(con => con.Concepto.StartsWith(string.Format("ST-{0} ", folio))).ToList(); } if (polizasGanado == null || !polizasGanado.Any()) { InterfaceSalidaTraspasoInfo interfaceSalidaTraspasoSacarDetalle = ObtenerInterfaceSalidaTraspasoPorFolioOrganizacion(interfaceSalidaTraspasoGuardado); if (interfaceSalidaTraspasoSacarDetalle != null) { interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle = interfaceSalidaTraspasoSacarDetalle.ListaInterfaceSalidaTraspasoDetalle; } List <LoteInfo> lotesAnimal = interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle .Select(lote => new LoteInfo { LoteID = lote.Lote.LoteID }).ToList(); var animalBL = new AnimalBL(); List <AnimalInfo> animales = animalBL.ObtenerAnimalesPorLoteXML(lotesAnimal, interfaceSalidaTraspaso.OrganizacionId); int cabezas = interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle .Sum(cab => cab.Cabezas); if (cabezas > animales.Count) { throw new ExcepcionServicio("No existe suficiente inventario para realizar el traspaso."); } var polizaSalidaGanado = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.SalidaGanado); polizasGanado = polizaSalidaGanado.GeneraPoliza(interfaceSalidaTraspasoGuardado); if (polizasGanado != null && polizasGanado.Any()) { polizasGanado.ToList().ForEach(datos => { datos.OrganizacionID = interfaceSalidaTraspaso.OrganizacionId; datos.UsuarioCreacionID = interfaceSalidaTraspaso.UsuarioModificacionID ?? 0; datos.ArchivoEnviadoServidor = 1; }); polizaBL.GuardarServicioPI(polizasGanado, TipoPoliza.SalidaGanado); } } if (polizasGanado != null) { costoGanado = polizasGanado.Where(imp => imp.Importe.IndexOf('-') < 0).Sum( imp => Convert.ToDecimal(imp.Importe)); } } #endregion POLIZA scope.Complete(); } } catch (ExcepcionServicio ex) { Logger.Error(ex); throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex); } catch (Exception ex) { Logger.Error(ex); throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex); } return(new Dictionary <long, decimal> { { interfaceSalidaTraspaso.FolioTraspaso, costoGanado } }); }