private bool IsCalculable() { if (Waybill.Status == DocStatus.Posted) { return(false); } if (SupplierCost.GetValueOrDefault() == 0) { return(false); } if (GetMarkupType() == MarkupType.VitallyImportant && ProducerCost.GetValueOrDefault() == 0) { return(false); } return(true); }
private bool IsCalculable() { if (SupplierCost.GetValueOrDefault() == 0) { return(false); } if (GetMarkupType() == MarkupType.VitallyImportant) { if (ProducerCost.GetValueOrDefault() == 0) { return(false); } } else if (SupplierCostWithoutNds.GetValueOrDefault() == 0) { return(false); } return(true); }
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(); }