예제 #1
0
 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);
 }
예제 #2
0
        public virtual void AddMarkup(MarkupConfig markup)
        {
            if (Markups.Contains(markup))
            {
                return;
            }

            markup.Settings = this;
            Markups.Add(markup);
            Validate();
        }
예제 #3
0
 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;
 }
예제 #4
0
        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);
        }
예제 #5
0
 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);
 }
예제 #6
0
        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();
        }