Exemple #1
0
 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);
 }
Exemple #2
0
 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);
 }
Exemple #3
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();
        }