【UiPath】カスタムアクティビティを作成してみた_祝日判定①

#概要#
uipathのカスタムアクティビティを作成してみました。
uipathの画面で入力した日付を祝日判定し、祝日だったら
祝日名を返すだけのアクティビティ
※カスタムアクティビティ：uipathで使用できる拡張機能
#アクティビティ：祝日判定#
思った以上に簡単にアクティビティの作成ができました。uipath特有の
処理が画面から入力された値の受け取りと値をuipathに返すだけだったので...

①"2019/05/03"を入力して実行すると...
![uipath_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487273/3f033fea-736b-be74-3a0a-dd04ad0267ba.png)
②入力された日付に対応する祝日名を返します。
![uipath_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487273/2bf0e295-fc96-78ea-d7d2-e20f9b55d479.png)
3年分(去年・当年・来年)の祝日一覧を取得するapiがありそれを使用
 [Holidays JP API](https://holidays-jp.github.io/ "Holidays JP API")
apiで取得した祝日一覧をjson形式に変換しており、ライブラリをVSに
いれる必要があります。
 [C#でJSONを扱うライブラリ「Json.NET」を使ってみました](https://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76 "C#でJSONを扱うライブラリ「Json.NET」を使ってみました")

			//3年間分の祝日一覧を取得(当年・去年・来年)
			string url = "https://holidays-jp.github.io/api/v1/date.json";
			var req = WebRequest.Create(url);
			req.Headers.Add("Accept-Language:ja,en-us;q=0.7,en;q=0.3");
			var res = req.GetResponse();
			string responseFromServer = "";

			using (Stream dataStream = res.GetResponseStream())
			{

				StreamReader reader = new StreamReader(dataStream);
				responseFromServer = reader.ReadToEnd();

			}

			//取得した祝日一覧をjson形式に変換
			var jsonValues = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseFromServer);
			ArrayList dayList = new ArrayList();
			ArrayList dayListName = new ArrayList();

一致する場合：祝日名を返す。
一致しない場合：平日、土日を判定して返す。
			
			int flg = 1;
			string outputDay = "";
			string outputDayName = "";

			for (int i = 0; i <= (dayList.Count - 1); i++)
			{
				flg = date.CompareTo(DateTime.Parse(dayList[i].ToString()));

				if (0 == flg)
				{
					outputDay = DateTime.Parse(dayList[i].ToString()).ToString("yyyy/MM/dd");
					outputDayName = dayListName[i].ToString();
					break;
				}
			}

			if (0 != flg)
			{

				int number = ((int)date.DayOfWeek);
				string[] week = { "Su", "M", "Tu", "W", "Th", "F", "Sa", };
				string dayOfWeek = week[(int)number];

				string result = date.ToString("yyyy/MM/dd");
				outputDay = result;

				if (dayOfWeek == "Su" || dayOfWeek == "Sa")
				{
					outputDayName = "土日";
				}
				else
				{
					outputDayName = "平日";
				}
			}
			return outputDayName;

#参考#
###カスタムアクティビティ作成環境###
結構簡単に環境作成ができました。
[【UiPath】カスタムアクティビティの作成（事前準備と実践初級）](https://qiita.com/UmegayaRollcake/items/c9ff9a01b101ba9193fc/ "【UiPath】カスタムアクティビティの作成（事前準備と実践初級）")
#ソースコード#
```C#:Class1.cs
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Collections;
using System.IO;
using System.Net;
using System.Activities;
using System.ComponentModel;

namespace ClassLibrary1
{
	public class Class1 : CodeActivity
	{

		[Category("Input")]
		[RequiredArgument]
		public InArgument<String> inputDay { get; set; }

		[Category("Output")]
		public OutArgument<String> outputDay { get; set; }

		protected override void Execute(CodeActivityContext context)
		{

			//画面入力された日付取得
			var Arg = inputDay.Get(context);
			DateTime date = DateTime.Parse(Arg.ToString());
			var result = outputMethod(date);

			//祝日判定結果をuipathに渡す
			outputDay.Set(context, result);
		}

		public string outputMethod(DateTime date)
		{
			//3年間分の祝日一覧を取得(当年・去年・来年)
			string url = "https://holidays-jp.github.io/api/v1/date.json";
			var req = WebRequest.Create(url);
			req.Headers.Add("Accept-Language:ja,en-us;q=0.7,en;q=0.3");
			var res = req.GetResponse();
			string responseFromServer = "";

			using (Stream dataStream = res.GetResponseStream())
			{

				StreamReader reader = new StreamReader(dataStream);
				responseFromServer = reader.ReadToEnd();

			}

			//取得した祝日一覧をjson形式に変換
			var jsonValues = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseFromServer);
			ArrayList dayList = new ArrayList();
			ArrayList dayListName = new ArrayList();

			//祝日一覧を配列に設定
			foreach (var key in jsonValues.Keys)
			{

				dayList.Add(key);
				dayListName.Add(jsonValues[key]);

			}

			/*入力された日付が祝日一覧に存在するか確認
			一致する場合は祝日名を呼び出し元に渡す
			一致しない場合は入力された日付が平日、土日を
			渡す			
			 */
			int flg = 1;
			string outputDay = "";
			string outputDayName = "";

			for (int i = 0; i <= (dayList.Count - 1); i++)
			{
				flg = date.CompareTo(DateTime.Parse(dayList[i].ToString()));

				if (0 == flg)
				{

					outputDay = DateTime.Parse(dayList[i].ToString()).ToString("yyyy/MM/dd");
					outputDayName = dayListName[i].ToString();
					break;

				}
			}

			if (0 != flg)
			{

				int number = ((int)date.DayOfWeek);
				string[] week = { "Su", "M", "Tu", "W", "Th", "F", "Sa", };
				string dayOfWeek = week[(int)number];

				string result = date.ToString("yyyy/MM/dd");
				outputDay = result;

				if (dayOfWeek == "Su" || dayOfWeek == "Sa")
				{
					outputDayName = "土日";
				}
				else
				{
					outputDayName = "平日";

				}
			}
			return outputDayName;
		}

	}
}
 ```