protected void RecalculateRenta(Renta renta, string qrDecoded, SIN newsin) { renta.SinId = newsin.Id; var anon = GetAnon(newsin.Character.Model); renta.CurrentScoring = newsin.Scoring.CurerentRelative + newsin.Scoring.CurrentFix; var gmdescript = BillingHelper.GetGmDescription(newsin.Passport, renta.Sku, anon); _ereminService.UpdateQR(qrDecoded, renta.BasePrice, BillingHelper.GetFinalPrice(renta), gmdescript, renta.Id, BillingHelper.GetLifestyle(renta.LifeStyle)).GetAwaiter().GetResult(); SaveContext(); }
protected Renta CreateRenta(int modelId, int priceId, int beat, int count = 1) { var sin = BillingBlocked(modelId, s => s.Wallet, s => s.Character, s => s.Passport, s => s.Scoring); if (count == 0) { count = 1; } var price = Get <Price>(p => p.Id == priceId, p => p.Sku.Nomenklatura.Specialisation.ProductType, p => p.Sku.Corporation.Wallet, s => s.Shop.Wallet, s => s.Sin.Character); if (price == null) { throw new BillingException("Персональное предложение не найдено"); } if (price.Confirmed) { throw new Exception("Персональным предложением уже воспользовались"); } if (price.Sin.Character.Model != modelId) { throw new Exception("Персональное предложение заведено на другого персонажа"); } var dateTill = price.DateCreated.AddMinutes(_settings.GetIntValue(SystemSettingsEnum.price_minutes)); if (dateTill < DateTime.Now.ToUniversalTime()) { throw new BillingException($"Персональное предложение больше не действительно, оно истекло {dateTill:HH:mm:ss}"); } var allowed = SkuAllowed(price.ShopId, price.SkuId); if (allowed == null) { throw new BillingException("Sku недоступно для продажи в данный момент"); } price.FinalPrice *= count; if (sin.Wallet.Balance - price.FinalPrice < 0) { throw new BillingException("Недостаточно средств"); } price.Sku.Count -= count; var instantConsume = price.Sku.Nomenklatura.Specialisation.ProductType.InstantConsume; var anon = GetAnon(sin.Character.Model); var gmdescript = BillingHelper.GetGmDescription(sin.Passport, price.Sku, anon); var renta = new Renta { BasePrice = price.BasePrice, Sin = sin, CurrentScoring = price.CurrentScoring, Sku = price.Sku, DateCreated = DateTime.Now.ToUniversalTime(), Discount = price.Discount, ShopComission = price.ShopComission, ShopPrice = price.ShopPrice, ShopId = price.ShopId, Shop = price.Shop, HasQRWrite = instantConsume ? false : BillingHelper.HasQrWrite(price.Sku.Nomenklatura.Code), PriceId = priceId, Secret = gmdescript, LifeStyle = price.Sku.Nomenklatura.Lifestyle, Count = count, FullPrice = price.Sku.Nomenklatura.Specialisation.ProductType.Alias == ProductTypeEnum.Charity.ToString(), BeatId = beat }; Add(renta); price.Confirmed = true; SaveContext(); ProcessBuyScoring(sin, price.Sku, price.Shop); var mir = GetMIR(); ProcessRenta(renta, mir, sin, true); SaveContext(); if (instantConsume) { var erService = new EreminService(); erService.ConsumeFood(renta.Id, (Lifestyles)renta.LifeStyle, modelId).GetAwaiter().GetResult(); } return(renta); }