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