示例#1
0
        public virtual void AcceptTrade(Entity entity, Trade trade)
        {
            var side = trade.GetTradeSide(entity);

            if (side == TradeSideEnum.Destination)
            {
                trade.DestinationAccepted = true;
            }
            else
            {
                trade.SourceAccepted = true;
            }

            MethodResult result = CanFinishTrade(trade);

            if (result.isSuccess)
            {
                FinishTrade(trade);
            }
            else if (trade.DestinationAccepted && trade.SourceAccepted)
            {
                using (NoSaveChanges)
                {
                    var tradeLink = TradeLinkCreator.Create(trade);
                    var msg       = $"{tradeLink} could not be finished due to : {result.Errors[0]}.";
                    warningService.AddWarning(trade.SourceEntityID.Value, msg);
                    warningService.AddWarning(trade.DestinationEntityID.Value, msg);
                    trade.DestinationAccepted = trade.SourceAccepted = false;
                }
            }

            ConditionalSaveChanges(tradeRepository);
        }
示例#2
0
        public virtual Trade StartTrade(Entity source, Entity destination)
        {
            Trade trade = new Trade()
            {
                DateTime                  = DateTime.Now,
                Day                       = GameHelper.CurrentDay,
                DestinationAccepted       = false,
                DestinationEntityID       = destination.EntityID,
                DestinationUsedFuelAmount = null,
                SourceAccepted            = false,
                SourceUsedFuelAmount      = null,
                SourceEntityID            = source.EntityID,
                TradeStatusID             = (int)TradeStatusEnum.Ongoing,
                UpdatedDate               = DateTime.Now,
            };



            tradeRepository.Add(trade);
            ConditionalSaveChanges(tradeRepository);

            var sourceLink = EntityLinkCreator.Create(source);
            var tradeLink  = TradeLinkCreator.Create(trade);
            var msg        = $"{sourceLink} started {tradeLink} with you.";

            warningService.AddWarning(destination.EntityID, msg);

            return(trade);
        }
示例#3
0
        public virtual void FinishTrade(Trade trade)
        {
            using (var trs = transactionScopeProvider.CreateTransactionScope())
            {
                trade.Set(TradeStatusEnum.Success);
                Entity destination = trade.Destination;
                Entity source      = trade.Source;
                using (NoSaveChanges)
                {
                    foreach (var money in trade.TradeMoneys.ToList())
                    {
                        var secondSide = GetSecondSide(trade, money.Entity);
                        walletService.AddMoney(secondSide.WalletID, new Money(money.CurrencyID, money.Amount));

                        if (secondSide.Is(EntityTypeEnum.Company))
                        {
                            var company = secondSide.Company;
                            companyFinanceSummaryService.AddFinances(company, new TradeBalanceFinance(money.Amount, money.CurrencyID));
                        }

                        if (money.Entity.Is(EntityTypeEnum.Company))
                        {
                            var company = money.Entity.Company;
                            companyFinanceSummaryService.AddFinances(company, new TradeBalanceFinance(-money.Amount, money.CurrencyID));
                        }
                    }

                    foreach (var product in trade.TradeProducts.ToList())
                    {
                        var secondSide = GetSecondSide(trade, product.Entity);
                        equipmentService.GiveItem((ProductTypeEnum)product.ProductID, product.Amount, product.Quality, secondSide.Equipment);
                    }

                    var sourceFuelCost      = GetNeededFuel(trade.Source, trade);
                    var destinationFuelCost = GetNeededFuel(trade.Destination, trade);

                    trade.DestinationUsedFuelAmount = destinationFuelCost;
                    trade.SourceUsedFuelAmount      = sourceFuelCost;

                    if (sourceFuelCost > 0)
                    {
                        equipmentService.RemoveProductsFromEquipment(ProductTypeEnum.Fuel, sourceFuelCost.Value, 1, trade.Source.Equipment);
                    }
                    if (destinationFuelCost > 0)
                    {
                        equipmentService.RemoveProductsFromEquipment(ProductTypeEnum.Fuel, destinationFuelCost.Value, 1, trade.Destination.Equipment);
                    }

                    var    tradeLink = TradeLinkCreator.Create(trade);
                    string msg       = $"{tradeLink} has been successfully finished";

                    warningService.AddWarning(destination.EntityID, msg);
                    warningService.AddWarning(source.EntityID, msg);
                }

                ConditionalSaveChanges(tradeRepository);

                trs.Complete();
            }
        }
示例#4
0
        public virtual void CancelTrade(Trade trade, Entity who)
        {
            using (NoSaveChanges)
            {
                returnProductAndMoneyFromTrade(trade);
                trade.Set(TradeStatusEnum.Cancel);
                if (trade.GetTradeSide(who) == TradeSideEnum.Destination)
                {
                    trade.DestinationAccepted = false;
                }
                else
                {
                    trade.SourceAccepted = false;
                }

                var entityLink = EntityLinkCreator.Create(who);
                var tradeLink  = TradeLinkCreator.Create(trade);
                var msg        = $"{entityLink} cancelled {tradeLink}.";
                var secondSide = GetSecondSide(trade, who);
                warningService.AddWarning(secondSide.EntityID, msg);
            }



            tradeRepository.SaveChanges();
        }
示例#5
0
        public virtual void AbortTrade(Trade trade, string reason)
        {
            using (NoSaveChanges)
            {
                returnProductAndMoneyFromTrade(trade);
                trade.Set(TradeStatusEnum.Abort);

                var tradeLink = TradeLinkCreator.Create(trade);
                var msg       = $"{tradeLink} was aborted due to {reason}.";
                warningService.AddWarning(trade.SourceEntityID.Value, msg);
                warningService.AddWarning(trade.DestinationEntityID.Value, msg);
            }
            tradeRepository.SaveChanges();
        }