/// <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; } }
/// <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); }