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