Ejemplo n.º 1
0
        /// <summary>
        /// </summary>
        /// <remarks>Скопировано из v2</remarks>
        private decimal _GetCoefUe2Valuta()
        {
            var formula = FormulaField.ValueString;

            try
            {
                return(decimal.Parse(formula.Replace('.', ',')));
            }
            catch
            {
            }

            var f = formula.Replace(" ", "");

            f = f.Replace("ДатаОплаты", "ДатаОплаты()");
            f = f.Replace("ДатаРеализации", "ДатаРеализации()");
            f = f.Replace("ДатаСчета", "ДатаСчета()");
            f = ReplacePercent(f, "Percent");
            f = ReplaceOperator(f, "Multiply", '*');
            f = ReplaceOperator(f, "Devide", '/');
            f = ReplaceOperator(f, "Minus", '-');
            f = ReplaceOperator(f, "Plus", '+');


            return(Convert.Round((decimal)Exec(f), 8));
        }
        /// <summary>
        ///     Обработка клиентских команд
        /// </summary>
        /// <param name="cmd">Команды</param>
        /// <param name="param">Параметры</param>
        protected override void ProcessCommand(string cmd, NameValueCollection param)
        {
            switch (cmd)
            {
            case "SaveAndClose":
                SaveData(true);
                break;

            case "SaveData":
                SaveData(false);
                break;

            case "DeleteData":
                DeleteData();
                break;

            case "CloseWindow":
                JS.Write("parent.resources_Records_Close();");
                break;

            case "DialogCostRecalc_Yes":
                var d_kol = factUsl.Count > 0 && !factUsl.Count.Equals("0") ? factUsl.Count : 1;

                var     _costOutNDS  = factUsl.CostOutNDS;
                decimal _summaOutNDS = 0;
                decimal _summaNDS    = 0;
                decimal _vsego       = 0;
                var     stavka       = factUsl.StavkaNDS;
                var     prst         = (decimal)stavka.Величина * 100;
                var     scale        = Document != null && !Document.Unavailable ? Document.CurrencyScale : 2;

                _vsego       = Convert.Round((decimal)(d_kol * (double)_costOutNDS), scale);
                _summaNDS    = Convert.Round(_vsego / (100 + prst) * prst, scale);
                _summaOutNDS = _vsego - _summaNDS;
                _costOutNDS  = Convert.Round((decimal)((double)_summaOutNDS / d_kol), scale * 2);

                var maxscale =
                    factUsl.Resource.GetScale4Unit(efUnit.Value, 3, Document.PlatelschikField.Value.ToString());
                factUsl.Count = d_kol;
                efCount.Value = Convert.Decimal2Str((decimal)factUsl.Count, maxscale, false);

                factUsl.CostOutNDS  = _costOutNDS;
                efCostOutNDS.Value  = Convert.Decimal2Str(factUsl.CostOutNDS, scale * 2, false);
                factUsl.SummaOutNDS = Convert.Round(_summaOutNDS, scale);
                efSummaOutNDS.Value = Convert.Decimal2Str(factUsl.SummaOutNDS, scale, false);
                factUsl.SummaNDS    = Convert.Round(_summaNDS, scale);
                efSummaNDS.Value    = Convert.Decimal2Str(factUsl.SummaNDS, scale, false);
                factUsl.Vsego       = Convert.Round(_vsego, scale);
                efVsego.Value       = Convert.Decimal2Str(factUsl.Vsego, scale, false);

                break;

            case "DialogCostRecalc_No":
                ShowCalcMessage(factUsl.Recalc(param["value"], param["ndx"], param["name"], "0", Scale));
                break;

            case "DialogRecalc_Yes":
                ShowCalcMessage(factUsl.Recalc(param["value"], param["ndx"], param["name"], "0", Scale));
                break;

            case "DialogRecalc_Recalc":
                ShowCalcMessage(factUsl.Recalc(param["value"], param["ndx"], param["name"], "1", Scale));
                break;

            case "DialogRecalc_No":
                ShowCalcMessage(factUsl.Recalc(param["value"], param["ndx"], param["name"], "2", Scale));
                break;

            case "DialogRecalc_Change":
                ShowCalcMessage(factUsl.Recalc(param["value"], param["ndx"], param["name"], "3", Scale));
                break;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     Пересчет сумм
        /// </summary>
        /// <param name="oldValue">Старое значение поля</param>
        /// <param name="inx">Индекс</param>
        /// <param name="name">Название поля</param>
        /// <param name="whatDo">Индекс действия</param>
        /// <param name="scale">Точность</param>
        public string Recalc(string oldValue, string inx, string name, string whatDo, int scale)
        {
            var message = string.Empty;

            /*
             * Элемент = 1 - поле Товар
             *         2 - поле Цена
             *         3 - поле Количество
             *         4 - поле Сумма
             *         5 - поле НДС
             *         8 - поле Всего
             */

            if (whatDo.Equals(""))
            {
                return(message);
            }
            if (whatDo.Equals("2"))
            {
                switch (name)
                {
                case "Count":
                    Count = Convert.Str2Double(oldValue);
                    break;

                case "CostOutNDS":
                    CostOutNDS = Convert.Str2Decimal(oldValue);
                    break;

                case "StavkaNDS":
                    int number;
                    int.TryParse(oldValue, out number);
                    StavkaNDSId = number;
                    break;

                case "SummaOutNDS":
                    SummaOutNDS = Convert.Str2Decimal(oldValue);
                    break;

                case "SummaNDS":
                    SummaNDS = Convert.Str2Decimal(oldValue);
                    break;

                case "Vsego":
                    Vsego = Convert.Str2Decimal(oldValue);
                    break;
                }

                return(message);
            }

            var d_kol = Count > 0 && !Count.Equals(0) ? Count : 1;

            var _costOutNDS  = CostOutNDS > 0 ? CostOutNDS : 0;
            var _summaOutNDS = SummaOutNDS > 0 ? SummaOutNDS : 0;
            var _summaNDS    = SummaNDS > 0 ? SummaNDS : 0;
            var _vsego       = Vsego > 0 ? Vsego : 0;
            var _stavkaNDS   = StavkaNDSId > 0 ? StavkaNDS.Величина : 0;

            switch (int.Parse(inx) * 10 + int.Parse(whatDo))
            {
            case 10:
            case 20:
            case 30:     //изменение товара, изменение цены, изменение количества

                if (_costOutNDS == 0 && _summaOutNDS != 0)
                {
                    _costOutNDS = Convert.Round((decimal)((double)_summaOutNDS / d_kol), 4);
                }
                _summaOutNDS = Convert.Round((decimal)((double)_costOutNDS * d_kol), 2);
                _summaNDS    = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);

                _vsego = _summaOutNDS + _summaNDS;
                break;

            case 40:     //изменение суммы и перерасчет
                _summaOutNDS = Convert.Round(_summaOutNDS, 2);

                _costOutNDS = Convert.Round((decimal)((double)_summaOutNDS / d_kol), 4);
                _summaNDS   = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);
                _vsego      = _summaOutNDS + _summaNDS;
                break;

            case 41:     // обратный перерасчет суммы
                _summaOutNDS = Convert.Round((decimal)((double)_costOutNDS * d_kol), 2);
                _summaNDS    = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);
                _vsego       = _summaOutNDS + _summaNDS;

                break;

            case 43:     //принудительное задание суммы
                _summaOutNDS = Convert.Round(_summaOutNDS, 2);
                break;

            case 50:     // изменение НДС
                _summaNDS    = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);
                _summaOutNDS = Convert.Round(_summaOutNDS, 2);
                _vsego       = _summaOutNDS + _summaNDS;
                break;

            case 51:     //перерасчет обратно НДС
                _summaNDS = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);
                _vsego    = _summaOutNDS + _summaNDS;
                break;

            case 53:     //принудительное задание ндс
                _summaNDS = Convert.Round(_summaNDS, 2);
                break;

            case 60:     // изменение Акциза
            case 61:     // перерасчет обратно Акциза
            case 63:     // принудительное задание Акциза
                break;

            case 70:     // изменение ГСМ
            case 71:     // перерасчет обратно ГСМ
            case 73:     // принудительное задание ГСМ
                break;

            case 80:     //изменение Всего и перерасчет
                decimal oldCost = 0;
                _vsego       = Convert.Round(_vsego, 3);
                _costOutNDS  = Convert.Round((decimal)((double)_vsego / ((1 + _stavkaNDS) * d_kol)), 4);
                _summaOutNDS = Convert.Round((decimal)((double)_costOutNDS * d_kol), 3);
                _summaNDS    = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);

                do
                {
                    if (_summaOutNDS + _summaNDS < _vsego)
                    {
                        if (_stavkaNDS != 0)
                        {
                            _summaNDS = _vsego - _summaOutNDS;
                            // В результате округления были слегка завышены налоги.
                            message = "TTN_msgTaxInflated";
                        }
                        else
                        {
                            _vsego = _summaOutNDS + _summaNDS;
                            // В результате округления было изменено значение Всего.
                            message = "TTN_msgVsegoChanged";
                        }
                    }
                    else if (_summaOutNDS + _summaNDS > _vsego)
                    {
                        oldCost = _costOutNDS;
                        if (d_kol > 100)
                        {
                            _costOutNDS = _costOutNDS - Convert.Str2Decimal("0.0001");
                        }
                        else if (d_kol <= 100)
                        {
                            _summaOutNDS = _summaOutNDS - Convert.Str2Decimal("0.01");
                            _costOutNDS  = Convert.Round((decimal)((double)_summaOutNDS / d_kol), 4);
                        }

                        _summaOutNDS = Convert.Round((decimal)((double)_costOutNDS * d_kol), 2);
                        _summaNDS    = Convert.Round((decimal)((double)_summaOutNDS * _stavkaNDS), 2);
                    }
                    else
                    {
                        break;
                    }
                } while (_summaOutNDS + _summaNDS != _vsego || _costOutNDS <= Convert.Str2Decimal("0.0001"));

                if ((oldCost == _costOutNDS || _costOutNDS <= Convert.Str2Decimal("0.0001")) && _costOutNDS != 0)
                {
                    if (_costOutNDS == 0)
                    {
                        _costOutNDS = Convert.Str2Decimal("0.0001");
                    }
                    // Округление прошло не удачно.
                    message = "TTN_msgRoundingNotSuccessful.";
                }

                break;

            case 81:     // перерасчет обратно Всего
                _vsego = _summaOutNDS + _summaNDS;

                break;

            case 83:     // принудительное задание Всего
                _vsego = Convert.Round(_vsego, 2);
                break;
            }

            CostOutNDS  = Convert.Round(_costOutNDS, scale * 2);
            SummaOutNDS = Convert.Round(_summaOutNDS, scale);
            SummaNDS    = Convert.Round(_summaNDS, scale);
            Vsego       = Convert.Round(_vsego, scale);

            return(message);
        }