public virtual void CalculateRetailCost(IEnumerable <MarkupConfig> markups, IList <uint> specialMarkupProducts, User user, Address address) { Configure(user); IsSpecialMarkup = specialMarkupProducts.Contains(ProductId); RetailMarkup = MarkupConfig.Calculate(markups, this, user, address); RetailCost = GetRetailCost(RetailMarkup.Value, address); }
public virtual void AddMarkup(MarkupConfig markup) { if (Markups.Contains(markup)) { return; } markup.Settings = this; Markups.Add(markup); Validate(); }
public MarkupConfig(MarkupConfig config, Address address) { Begin = config.Begin; End = config.End; Type = config.Type; Markup = config.Markup; MaxMarkup = config.MaxMarkup; MaxSupplierMarkup = config.MaxSupplierMarkup; Address = address; Settings = config.Settings; }
public virtual List <string[]> Validate(bool validateMarkups = true) { if (JunkPeriod < 6) { var error = new List <string[]>(); error.Add(new string[] { "JunkPeriod", "Срок уценки не может быть менее 6 месяцев" }); return(error); } if (validateMarkups) { return(MarkupConfig.Validate(Markups)); } return(null); }
public virtual void CalculateRetailCost(IEnumerable <MarkupConfig> markups, IList <uint> specialMarkupProducts, User user) { Configure(user); IsSpecialMarkup = specialMarkupProducts.Contains(ProductId); if (IsEditByUser) { return; } if (!Order.IsAddressExists()) { return; } RetailMarkup = MarkupConfig.Calculate(markups, this, user, Order.Address); RetailCost = GetRetailCost(RetailMarkup.Value, Order.Address); }
public virtual void Calculate(Settings settings) { if (Waybill.Status == DocStatus.Posted) { return; } if (ServerRetailCost != null) { RetailCost = ServerRetailCost; if (ServerRetailMarkup != null) { _retailMarkup = ServerRetailMarkup; _realRetailMarkup = ServerRetailMarkup; } else { UpdateMarkups(ServerRetailMarkup); } NotifyRetailCostChanged(); return; } if (!IsCalculable()) { _retailCost = null; _retailMarkup = null; _realRetailMarkup = null; _maxSupplierMarkup = null; MaxRetailMarkup = null; NotifyRetailCostChanged(); return; } var markupType = GetMarkupType(); var sourceCost = markupType == MarkupType.Over || markupType == MarkupType.Nds18 ? SupplierCost.GetValueOrDefault() : SupplierCostWithoutNds.GetValueOrDefault(); if (markupType == MarkupType.VitallyImportant) { sourceCost = ProducerCost.GetValueOrDefault(); if (RegistryCost.GetValueOrDefault() > 0 && (sourceCost == 0 || sourceCost > RegistryCost.GetValueOrDefault())) { sourceCost = RegistryCost.GetValueOrDefault(); } if (settings.UseSupplierPriceWithNdsForMarkup) { sourceCost = sourceCost * (1 + (decimal)Nds.GetValueOrDefault() / 100); } } if (sourceCost == 0) { return; } if (!Waybill.IsAddressExists()) { return; } if (!(SupplierCost != 0 && TaxFactor != 0 && (markupType == MarkupType.VitallyImportant && ProducerCost != 0 || markupType != MarkupType.VitallyImportant && SupplierCostWithoutNds != 0))) { return; } var markup = MarkupConfig.Calculate(settings.Markups, markupType, sourceCost, Waybill.Address); if (markup == null) { return; } MaxRetailMarkup = markup.MaxMarkup; _maxSupplierMarkup = markup.MaxSupplierMarkup; //пересчет производится при каждом входе в накладную что бы отобразить актуальные данные если наценки были изменены //для позиций которые редактировал пользователь пересчитывать ничего не нужно иначе данные могут измениться //в результате ошибок округления if (Edited && !Waybill.IsCreatedByUser) { return; } _retailMarkup = markup.Markup; decimal?rawCost; _retailCost = CalculateRetailCost(RetailMarkup, out rawCost); //это лишено смысла но тем не менее analitf считает наценку от не округленной цены //что бы получить все выглядело идентично делаем тоже самое //тк RetailCost может быть округлена до большего то и наценка может увеличиться и превысить значение наценки которое //применялась в расчетах //наверное правильно всегда округлять до меньшего но analitf делает не так, делаем тоже что analitf UpdateMarkups(rawCost); NotifyRetailCostChanged(); }