using System; using System.Collections.Generic; using System.ComponentModel; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace CubesLib { public enum DateOperationType { Прибавить, Вычесть } #region CubeDescription [System.Obsolete] [HandlerCategory("Ganov Cubes. DateTime")] [HandlerName("AddSubtractDate", Language = "ru-ru")] [Description("Кубик принимает на вход дату формата ТСЛаб и число дней, которые надо вычесть или прибавить от/к указанной дате. Если на вход в качестве даты поступает число" + " больше 6-ти или меньше 5-ти цифр, либо имеющее дробную часть, либо число меньше 10101 то кубик вернет значение \"10101\". Также в случае если при вычитание числа итоговая дата" + " становится меньше 01.01.2001, то кубик вернет значение \"10101\". Кубик производит как операцию сложения, так и операцию вычитания в зависимости от выбранного типа операции. Выбранная" + " операция производится для каждого бара, то есть если на входе будут на каждом баре меняться значения, то выходная коллекция значений также будет изменяться на каждом баре, при этом" + " если какие-либо значения не соответствуют выше описанным правилам, то на этом баре кубик вернет значение \"10101\"" + "\nКубик имеет следующие входы: " + "\n======================" + "\nДата - дата, над которой будет производиться операция сложения или вычитания" + "\nДни - количество дней, которые надо прибавить или вычесть из даты")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87152&page=1", "Описание на форуме ТСлаб", "ru-ru")] [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, Name = "Дата")] [Input(1, TemplateTypes.DOUBLE, Name = "Дни")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class AddSubtractDate : IContextUses, IStreamHandler, IDoubleInput0, IDoubleInput1, IDoubleReturns { public IContext Context { get; set; } /// /// Тип операции /// [HandlerParameter(true, "Вычесть", NotOptimized = true, Name = "Тип операции", IsVisibleInBlock = true)] [Description("Тип операции: Прибавить, Вычесть")] public DateOperationType OperType { get; set; } public IList Execute(IList dates, IList days) { var retCollection = new double[dates.Count]; if (dates.Count != 0 && days.Count != 0) for (int i = 0; i < dates.Count; i++) { var date = dates[i]; retCollection[i] = date / 100000 >= 10 || date / 10000 < 1 || date < 10101 || date % 1 != 0 ? 10101 : GetDate(date, days[i]); } return retCollection; } /// /// Метод возвращает дате в формате ТСЛаб с вычетом или добавление /// указанного количества дней /// /// /// /// int GetDate(double date, double days) { var strDate = date.ToString(); var dtDate = DateTime.Parse($"{strDate.Substring(strDate.Length - 2, 2)}.{strDate.Substring(strDate.Length - 4, 2)}." + $"20{(strDate.Length == 5 ? "0" : "")}{strDate.Substring(0, strDate.Length == 5 ? 1 : 2)}").AddDays(OperType == DateOperationType.Прибавить ? days : -days); return int.Parse(dtDate.ToString("yyMMdd")); } } }