Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

215 lignes
9.0KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using OpenQA.Selenium;
  6. using OpenQA.Selenium.Chrome;
  7. using CSVDownloader.Code;
  8. using CSVDownloader.Store.CreditCSVData;
  9. using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions;
  10. namespace CSVDownloader.Web {
  11. class ZeusController : WebController {
  12. private readonly String url_ = "https://linkpt.cardservice.co.jp/merchant/";
  13. private readonly int max_download_num_ = 20;
  14. private enum XpathKey {
  15. INPUT_LOGIN_USERNAME,
  16. INPUT_LOGIN_PASSWORD,
  17. BUTTON_CREDIT_KESSAI,
  18. CHECK_PARKING,
  19. RADIO_TARGET_SPAN,
  20. SELECT_TARGET_FROM_YYYY,
  21. SELECT_TARGET_FROM_MM,
  22. SELECT_TARGET_FROM_DD,
  23. SELECT_TARGET_TO_YYYY,
  24. SELECT_TARGET_TO_MM,
  25. SELECT_TARGET_TO_DD,
  26. BUTTON_DOWNLOAD_CSV,
  27. BUTTON_LOGOUT,
  28. SUBJECT,
  29. FRAME_MENU,
  30. FRAME_CONTENTS,
  31. };
  32. private static String search_form_xpath = "//*[@id='deny_double_click']";
  33. private IDictionary<XpathKey, string> xpath_map_ = new Dictionary<XpathKey, string>()
  34. {
  35. {XpathKey.INPUT_LOGIN_USERNAME,"//form[@name='loginForm']//input[@name='ID']" },
  36. {XpathKey.INPUT_LOGIN_PASSWORD,"//*[@id='password']"},
  37. {XpathKey.BUTTON_CREDIT_KESSAI,"//a[contains(@href,'batch_download_face')]" },
  38. {XpathKey.CHECK_PARKING,$"{search_form_xpath}//input[@name='bang_list']" },
  39. {XpathKey.RADIO_TARGET_SPAN,$"{search_form_xpath}//input[@name='date' and @value='period']" },
  40. {XpathKey.SELECT_TARGET_FROM_YYYY,$"{search_form_xpath}//select[@name='spfy']" },
  41. {XpathKey.SELECT_TARGET_FROM_MM,$"{search_form_xpath}//select[@name='spfm']" },
  42. {XpathKey.SELECT_TARGET_FROM_DD,$"{search_form_xpath}//select[@name='spfd']" },
  43. {XpathKey.SELECT_TARGET_TO_YYYY,$"{search_form_xpath}//select[@name='epfy']" },
  44. {XpathKey.SELECT_TARGET_TO_MM,$"{search_form_xpath}//select[@name='epfm']" },
  45. {XpathKey.SELECT_TARGET_TO_DD,$"{search_form_xpath}//select[@name='epfd']" },
  46. {XpathKey.BUTTON_DOWNLOAD_CSV,$"{search_form_xpath}//input[@type='submit']" },
  47. {XpathKey.BUTTON_LOGOUT,"//a[contains(@href,'logout')]" },
  48. {XpathKey.FRAME_MENU,"//frame[@name='MENULIST']" },
  49. {XpathKey.FRAME_CONTENTS,"//frame[@name='CONTENTS']" },
  50. };
  51. public ZeusController(ChromeDriver driver) : base(driver) {
  52. agent_ = CreditAgent.Zeus;
  53. }
  54. public override void SetParkingDic(IDictionary<String, String> dic) {
  55. dic_ = new Dictionary<String, String>();
  56. // IPコードと駐車場名を分離。プログラムではIPコードのみ利用する。
  57. foreach (var ele in dic) {
  58. String parking_name = ele.Key.Split(" ")[0].Trim();
  59. dic_.Add(parking_name, ele.Value);
  60. }
  61. }
  62. public override ResultCode Login(LoginInfo info) {
  63. bool enter = true;
  64. try {
  65. driver_.Navigate().GoToUrl(url_);
  66. Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name);
  67. Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password, enter);
  68. // ログイン後の「端末決済データダウンロード」が表示されることを確認する。
  69. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  70. wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI])));
  71. SwitchToFrame();
  72. } catch (Exception e) {
  73. logger_.Error(e.Message);
  74. return ResultCode.NG;
  75. }
  76. return ResultCode.OK;
  77. }
  78. public override ResultCode Download(DateTime from, DateTime to) {
  79. // クレジットカード承認結果一覧画面に移行
  80. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  81. Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]);
  82. SwitchToFrame();
  83. //期間のFrom-Toを入力
  84. SwitchToFrame(xpath_map_[XpathKey.FRAME_CONTENTS]);
  85. Click(xpath_map_[XpathKey.RADIO_TARGET_SPAN]);
  86. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_YYYY], from.ToString("yyyy"));
  87. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_MM], from.ToString("MMM"));
  88. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_DD], from.ToString("dd"));
  89. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_YYYY], to.ToString("yyyy"));
  90. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_MM], to.ToString("MMM"));
  91. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_DD], to.ToString("dd"));
  92. // 駐車場一覧を取得
  93. var parking_list = driver_.FindElementsByXPath(xpath_map_[XpathKey.CHECK_PARKING]);
  94. var tmp_list = new List<IWebElement>();
  95. int count = 0;
  96. // 一定件数ごとにダウンロード
  97. foreach (var parking in parking_list) {
  98. tmp_list.Add(parking);
  99. if (!parking.Selected) {
  100. parking.Click();
  101. }
  102. if (tmp_list.Count == max_download_num_) {
  103. // ダウンロード処理
  104. String filename = $"zeus_{count}.csv";
  105. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  106. WaitForDownload(filename);
  107. // チェックを戻す
  108. foreach (var check in tmp_list) {
  109. if (check.Selected) {
  110. check.Click();
  111. }
  112. }
  113. // クリアー処理
  114. count++;
  115. tmp_list.Clear();
  116. }
  117. }
  118. if (tmp_list.Count != 0) {
  119. String filename = $"zeus_{count}.csv";
  120. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  121. WaitForDownload(filename);
  122. tmp_list.Clear();
  123. }
  124. SwitchToFrame();
  125. return ResultCode.OK;
  126. }
  127. public override ResultCode Logout() {
  128. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  129. Click(xpath_map_[XpathKey.BUTTON_LOGOUT]);
  130. return ResultCode.OK;
  131. }
  132. public override List<CreditCSVData> GetCreditCSVDataList() {
  133. var result_list = new List<CreditCSVData>();
  134. // csvファイルパスの取得
  135. var config = new CSVConfig() {
  136. header = true,
  137. };
  138. var dir = new DirectoryInfo(DriverFactory.GetDownloadDir());
  139. var sjis_enc = Encoding.GetEncoding("Shift-JIS");
  140. var list = new List<String[]>();
  141. foreach (var file in dir.GetFiles()) {
  142. var result = ReadCsv(file.FullName, config, sjis_enc);
  143. list.AddRange(result);
  144. }
  145. foreach (var line in list) {
  146. // 決済金額は「-」でセットされている場合があるので
  147. // その際は0とする。
  148. int amount = 0;
  149. int.TryParse(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Amount], out amount);
  150. result_list.Add(new Store.CreditCSVData.CreditCSVDataZeus() {
  151. spot_id = GetSpotID(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.IP]),
  152. use_datetime = DateTime.Parse(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.UseDatetime]),
  153. ip = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.IP],
  154. device_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.DeviceNo],
  155. receipt_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ReceiptNo],
  156. certificate_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.CertificateNo],
  157. status = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Status],
  158. error_message = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ErrorMessage],
  159. amount = amount,
  160. card_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.CardNo],
  161. expiration_date = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ExpirationDate],
  162. brand = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Brand],
  163. payment_type = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.PaymentType],
  164. jis_info = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.JISInfo],
  165. test = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Test],
  166. order_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.OrderNo],
  167. });
  168. }
  169. return result_list;
  170. }
  171. }
  172. }