diff --git a/CSVDownloader/Program.cs b/CSVDownloader/Program.cs index 0856ddb..40667b0 100644 --- a/CSVDownloader/Program.cs +++ b/CSVDownloader/Program.cs @@ -13,6 +13,8 @@ using CSVDownloader.File; using CSVDownloader.Store; using CSVDownloader.Store.CreditCSVData; using CSVDownloader.Store.QRCSVData; +using CSVDownloader.Store.ElectronicMoneyDataStore; + using CSVDownloader.Web; using CSVDownloader.Exceptions; @@ -68,6 +70,10 @@ namespace CSVDownloader { private DaitoQRDataStore daito_qr_store_; + private CreditCSVDataGMOStore gmo_credit_store_; + + private GMOElectronicMoneyDataStore gmo_electronic_money_store_; + private ParkingCreditCardAgenciesSpotIDErrorDAO parking_credit_card_agencies_spotID_error_dao_; private IConfigReader config_; @@ -82,6 +88,8 @@ namespace CSVDownloader { private Dictionary qr_datastore_map_ = new Dictionary(); + private Dictionary electronic_money_datastore_map_ = new Dictionary(); + private int save_chunk_num_ = 100; @@ -119,6 +127,8 @@ namespace CSVDownloader { itec_credit_store_ = new ItecCreditDataStore(conn_); hello_techno_credit_store_ = new HelloTechnoCreditDataStore(conn_); daito_qr_store_ = new DaitoQRDataStore(conn_); + gmo_credit_store_ = new CreditCSVDataGMOStore(conn_); + gmo_electronic_money_store_ = new GMOElectronicMoneyDataStore(conn_); } catch (Exception e) { logger_.Error("DB接続失敗"); @@ -185,11 +195,20 @@ namespace CSVDownloader { // HelloTechno { - var controller = new HelloTechnoController(driver_); + //var controller = new HelloTechnoController(driver_); + //var dic = parking_credit_card_agencies_spotID_dao_.GetDictionary(controller.GetCreditAgent()); + //controller.SetParkingDic(dic); + //web_controller_list_.Add(controller); + //credit_datastore_map_.Add(controller.GetCreditAgent(), hello_techno_credit_store_); + } + // HelloTechno(GMO) + { + var controller = new GMOController(driver_); var dic = parking_credit_card_agencies_spotID_dao_.GetDictionary(controller.GetCreditAgent()); controller.SetParkingDic(dic); web_controller_list_.Add(controller); - credit_datastore_map_.Add(controller.GetCreditAgent(), hello_techno_credit_store_); + credit_datastore_map_.Add(controller.GetCreditAgent(), gmo_credit_store_); + electronic_money_datastore_map_.Add(controller.GetCreditAgent(), gmo_electronic_money_store_); } @@ -250,6 +269,7 @@ namespace CSVDownloader { bool list_get_success = true; List credit_info_list = null; List qr_info_list = null; + List electronic_money_info_list = null; try { credit_info_list = web_controller.GetCreditCSVDataList(); @@ -266,6 +286,13 @@ namespace CSVDownloader { parking_credit_card_agencies_spotID_error_dao_.Save(e.GetList()); } + try { + electronic_money_info_list = web_controller.GetElectronicMoneyCSVDataList(); + } catch (SpotNameNotMatchException e) { + list_get_success = false; + parking_credit_card_agencies_spotID_error_dao_.Save(e.GetList()); + } + if (!list_get_success) { throw new Exception("データリスト取得失敗"); @@ -274,6 +301,7 @@ namespace CSVDownloader { // データ保存 int delete_count_credit = 0; int delete_count_qr = 0; + int delete_count_electronic_money = 0; transaction_ = conn_.BeginTransaction(); // クレジット @@ -310,14 +338,33 @@ namespace CSVDownloader { ShowCurrentCount(current_count); } } + // 電子マネー + if (0 < electronic_money_info_list.Count) { + ShowTotalCount(electronic_money_info_list.Count); + var store = electronic_money_datastore_map_[agent]; + delete_count_electronic_money = store.Delete(from, to); + var current_count = 0; + ShowCurrentCount(current_count); + var chunk_data_list = electronic_money_info_list.Select((ElectronicMoneyCSVData data, int index) => new { data, index }) + .GroupBy(x => x.index / save_chunk_num_) + .Select(g => g.Select(r => r.data)); + foreach (var data_list in chunk_data_list) { + var list = data_list.ToList(); + store.Save(list); + current_count += list.Count; + ShowCurrentCount(current_count); + } + } // コミット処理 transaction_.Commit(); - logger_.Info($"削除件数 CREDIT:{delete_count_credit}"); - logger_.Info($"削除件数 QR: {delete_count_qr}"); - logger_.Info($"登録件数 CREDIT:{credit_info_list.Count}"); - logger_.Info($"登録件数 QR :{qr_info_list.Count}"); + logger_.Info($"削除件数 CREDIT :{delete_count_credit}"); + logger_.Info($"削除件数 QR :{delete_count_qr}"); + logger_.Info($"削除件数 電子マネー :{delete_count_electronic_money}"); + logger_.Info($"登録件数 CREDIT :{credit_info_list.Count}"); + logger_.Info($"登録件数 QR :{qr_info_list.Count}"); + logger_.Info($"登録件数 電子マネー :{electronic_money_info_list.Count}"); web_controller.Archive(GetArchiveFilename(agent, DateTime.Now)); // 履歴の登録 @@ -327,6 +374,7 @@ namespace CSVDownloader { } catch (Exception e) { // ロールバック処理 logger_.Error(e.Message); + logger_.Error(e.StackTrace); if (transaction_ != null) { transaction_.Rollback(); } @@ -394,6 +442,9 @@ namespace CSVDownloader { throw new Exception($"ログイン情報不足 password {agent.ToString()}"); } + login_info.company_name = config_.Read(sesction, "company"); + + return login_info; } diff --git a/CSVDownloader/Store/CreditCSVData/GMOCreditDataStore.cs b/CSVDownloader/Store/CreditCSVData/GMOCreditDataStore.cs new file mode 100644 index 0000000..7e87beb --- /dev/null +++ b/CSVDownloader/Store/CreditCSVData/GMOCreditDataStore.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Linq; +using MySql.Data.MySqlClient; + + +namespace CSVDownloader.Store.CreditCSVData { + + + class CreditCSVDataGMO : CreditCSVData { + + public String customer_code = ""; + public String output_datetime = ""; + public String processing_code = ""; + public String operation_code = ""; + public String return_code = ""; + public String device_no = ""; + public String target_company_code = ""; + public String target_company_sub_code = ""; + public String device_trade_no = ""; + public DateTime processing_date = DateTime.Today; + public String approval_no = ""; + public int amount = 0; + public int tax_send_amount = 0; + public String customer_name = ""; + public String shop_name = ""; + public String cancel_receipt_no = ""; + public String split_count_info = ""; + public String paying_type = ""; + + public enum ColName { + SpotID = 100, + CustomerCode = 0, + OutputDatetime, + ProcessingCode, + OperationCode, + ReturnCode, + DeviceNo, + TargetCompanyCode, + TargetCompanySubCode, + DeviceTradeNo, + ProcessingDate, + ApprovalNo, + Amount, + TaxSendAmount, + CustomerName, + ShopName, + CancelReceiptNo, + SplitCountInfo, + PayingType, + UpdDate, + UpdStaff, + RegDate, + RegStaff, + + }; + } + + class CreditCSVDataGMOStore : CreditCSVDataStore { + + private static readonly String table_name_ = "creditcard_download_data_gmo"; + private String delete_sql_ = $"delete from {table_name_} where " + + $"{CreditCSVDataGMO.ColName.ProcessingDate} between " + + $"@From{CreditCSVDataGMO.ColName.ProcessingDate} and " + + $"@To{CreditCSVDataGMO.ColName.ProcessingDate};"; + + + public CreditCSVDataGMOStore(MySqlConnection conn) : base(conn) { + + } + + public override void Save(List list) { + Code.ResultCode ret; + var table = new DataTable(); + + table.Columns.Add(CreditCSVDataGMO.ColName.SpotID.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.CustomerCode.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.OutputDatetime.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.ProcessingCode.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.OperationCode.ToString()); + + + + table.Columns.Add(CreditCSVDataGMO.ColName.ReturnCode.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.DeviceNo.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.TargetCompanyCode.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.TargetCompanySubCode.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.DeviceTradeNo.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.ProcessingDate.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.ApprovalNo.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.Amount.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.TaxSendAmount.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.CustomerName.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.ShopName.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.CancelReceiptNo.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.SplitCountInfo.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.PayingType.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.UpdStaff.ToString()); + table.Columns.Add(CreditCSVDataGMO.ColName.RegStaff.ToString()); + + foreach (CreditCSVDataGMO data in list) { + var row = table.NewRow(); + row[CreditCSVDataGMO.ColName.SpotID.ToString()] = data.spot_id; + row[CreditCSVDataGMO.ColName.CustomerCode.ToString()] = data.customer_code; + + + row[CreditCSVDataGMO.ColName.OutputDatetime.ToString()] = data.output_datetime; + row[CreditCSVDataGMO.ColName.ProcessingCode.ToString()] = data.processing_code; + row[CreditCSVDataGMO.ColName.OperationCode.ToString()] = data.operation_code; + row[CreditCSVDataGMO.ColName.ReturnCode.ToString()] = data.return_code; + row[CreditCSVDataGMO.ColName.DeviceNo.ToString()] = data.device_no; + row[CreditCSVDataGMO.ColName.TargetCompanyCode.ToString()] = data.target_company_code; + row[CreditCSVDataGMO.ColName.TargetCompanySubCode.ToString()] = data.target_company_sub_code; + row[CreditCSVDataGMO.ColName.DeviceTradeNo.ToString()] = data.device_trade_no; + row[CreditCSVDataGMO.ColName.ProcessingDate.ToString()] = data.processing_date; + row[CreditCSVDataGMO.ColName.ApprovalNo.ToString()] = data.approval_no; + row[CreditCSVDataGMO.ColName.Amount.ToString()] = data.amount; + row[CreditCSVDataGMO.ColName.TaxSendAmount.ToString()] = data.tax_send_amount; + row[CreditCSVDataGMO.ColName.CustomerName.ToString()] = data.customer_name; + row[CreditCSVDataGMO.ColName.ShopName.ToString()] = data.shop_name; + row[CreditCSVDataGMO.ColName.CancelReceiptNo.ToString()] = data.cancel_receipt_no; + row[CreditCSVDataGMO.ColName.SplitCountInfo.ToString()] = data.split_count_info; + row[CreditCSVDataGMO.ColName.PayingType.ToString()] = data.paying_type; + row[CreditCSVDataGMO.ColName.UpdStaff.ToString()] = data.upd_staff; + row[CreditCSVDataGMO.ColName.RegStaff.ToString()] = data.reg_staff; + + table.Rows.Add(row); + } + + + ret = BulkInsertData(table_name_, table); + + if (ret != Code.ResultCode.OK) { + throw new Exception("登録失敗 GMOクレジット"); + } + + } + + public override int Delete(DateTime from, DateTime to) { + + var bindlist = new List<(String, object)> { + ("From"+CreditCSVDataGMO.ColName.ProcessingDate.ToString(), from.ToString("yyyy-MM-dd")), + ("To"+CreditCSVDataGMO.ColName.ProcessingDate.ToString(), to.AddDays(1).ToString("yyyy-MM-dd")) + }; + + var delete_count = DeleteData(delete_sql_, bindlist); + if (delete_count == -1) { + throw new Exception("削除失敗 GMOクレジット"); + } + return delete_count; + } + } +} diff --git a/CSVDownloader/Store/ElectricMoneyCSVData/ElectronicMoneyDataStore.cs b/CSVDownloader/Store/ElectricMoneyCSVData/ElectronicMoneyDataStore.cs new file mode 100644 index 0000000..3e12ed8 --- /dev/null +++ b/CSVDownloader/Store/ElectricMoneyCSVData/ElectronicMoneyDataStore.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using MySql.Data.MySqlClient; + +namespace CSVDownloader.Store.ElectronicMoneyDataStore { + + class ElectronicMoneyCSVData { + public String spot_id = ""; + public DateTime upd_date = DateTime.Now; + public String upd_staff = "auto_tool"; + public DateTime reg_date = DateTime.Now; + public String reg_staff = "auto_tool"; + } + abstract class ElectronicMoneyCSVDataStore : MySQL { + + public ElectronicMoneyCSVDataStore(MySqlConnection conn) : base(conn) { + + } + + abstract public void Save(List list); + + abstract public int Delete(DateTime from, DateTime to); + } +} diff --git a/CSVDownloader/Store/ElectricMoneyCSVData/GMOElectronicMoneyDataStore.cs b/CSVDownloader/Store/ElectricMoneyCSVData/GMOElectronicMoneyDataStore.cs new file mode 100644 index 0000000..cd33c10 --- /dev/null +++ b/CSVDownloader/Store/ElectricMoneyCSVData/GMOElectronicMoneyDataStore.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Data; + +using MySql.Data.MySqlClient; + + +namespace CSVDownloader.Store.ElectronicMoneyDataStore { + + + class GMOElectronicMoneyData : ElectronicMoneyCSVData { + + public String customer_code = ""; + public String acquirer_id = ""; + public String acquirer_name = ""; + public String customer_id = ""; + public String customer_name = ""; + public String shop_name = ""; + public String device_id = ""; + public String host_device_id = ""; + public String device_no = ""; + public DateTime adjust_datetime = DateTime.Now; + public String trade_code = ""; + public int amount = 0; + public int auto_charge_amount = 0; + public int before_deposit = 0; + public String brand = ""; + public String card_id = ""; + public String trade_status = ""; + public String last_proccesing_datetime = ""; + public String point = ""; + public String trade_no = ""; + public String origin_trade_no = ""; + + + public enum ColName { + SpotID = 100, + CustomerCode = 0, + AcquirerID, + AcquirerName, + CustomerID, CustomerName, + ShopName, + DeviceID, + HostDeviceID, + DeviceNo, + AdjustDatetime, + TradeCode, + Amount, + AutoChargeAmount, + BeforeDeposit, + Brand, + CardID, + TradeStatus, + LastProccesingDatetime, + Point, + TradeNo, + OriginTradeNo, + UpdDate, + UpdStaff, + RegDate, + RegStaff + }; + } + + class GMOElectronicMoneyDataStore : ElectronicMoneyCSVDataStore { + + private static readonly String table_name_ = "electronic_money_download_data_gmo"; + + private String delete_sql_ = $"delete from {table_name_} where " + + $"{GMOElectronicMoneyData.ColName.AdjustDatetime.ToString()} between " + + $"@From{GMOElectronicMoneyData.ColName.AdjustDatetime.ToString()} and " + + $"@To{GMOElectronicMoneyData.ColName.AdjustDatetime.ToString()};"; + + + public GMOElectronicMoneyDataStore(MySqlConnection conn) : base(conn) { + + } + + + public override void Save(List list) { + Code.ResultCode ret; + var table = new DataTable(); + + table.Columns.Add($"{GMOElectronicMoneyData.ColName.SpotID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.CustomerCode}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.AcquirerID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.AcquirerName}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.CustomerID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.CustomerName}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.ShopName}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.DeviceID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.HostDeviceID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.DeviceNo}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.AdjustDatetime}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.TradeCode}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.Amount}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.AutoChargeAmount}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.BeforeDeposit}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.Brand}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.CardID}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.TradeStatus}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.LastProccesingDatetime}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.Point}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.TradeNo}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.OriginTradeNo}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.UpdDate}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.UpdStaff}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.RegDate}"); + table.Columns.Add($"{GMOElectronicMoneyData.ColName.RegStaff}"); + + + foreach (GMOElectronicMoneyData data in list) { + var row = table.NewRow(); + + row[$"{GMOElectronicMoneyData.ColName.SpotID}"] = data.spot_id; + row[$"{GMOElectronicMoneyData.ColName.CustomerCode}"] = data.customer_code; + row[$"{GMOElectronicMoneyData.ColName.AcquirerID}"] = data.acquirer_id; + row[$"{GMOElectronicMoneyData.ColName.AcquirerName}"] = data.acquirer_name; + row[$"{GMOElectronicMoneyData.ColName.CustomerID}"] = data.customer_id; + row[$"{GMOElectronicMoneyData.ColName.CustomerName}"] = data.customer_name; + row[$"{GMOElectronicMoneyData.ColName.ShopName}"] = data.shop_name; + row[$"{GMOElectronicMoneyData.ColName.DeviceID}"] = data.device_id; + row[$"{GMOElectronicMoneyData.ColName.HostDeviceID}"] = data.host_device_id; + row[$"{GMOElectronicMoneyData.ColName.DeviceNo}"] = data.device_no; + row[$"{GMOElectronicMoneyData.ColName.AdjustDatetime}"] = data.adjust_datetime; + row[$"{GMOElectronicMoneyData.ColName.TradeCode}"] = data.trade_code; + row[$"{GMOElectronicMoneyData.ColName.Amount}"] = data.amount; + row[$"{GMOElectronicMoneyData.ColName.AutoChargeAmount}"] = data.auto_charge_amount; + row[$"{GMOElectronicMoneyData.ColName.BeforeDeposit}"] = data.before_deposit; + row[$"{GMOElectronicMoneyData.ColName.Brand}"] = data.brand; + row[$"{GMOElectronicMoneyData.ColName.CardID}"] = data.card_id; + row[$"{GMOElectronicMoneyData.ColName.TradeStatus}"] = data.trade_status; + row[$"{GMOElectronicMoneyData.ColName.LastProccesingDatetime}"] = data.last_proccesing_datetime; + row[$"{GMOElectronicMoneyData.ColName.Point}"] = data.point; + row[$"{GMOElectronicMoneyData.ColName.TradeNo}"] = data.trade_no; + row[$"{GMOElectronicMoneyData.ColName.OriginTradeNo}"] = data.origin_trade_no; + row[$"{GMOElectronicMoneyData.ColName.UpdDate}"] = data.upd_date; + row[$"{GMOElectronicMoneyData.ColName.UpdStaff}"] = data.upd_staff; + row[$"{GMOElectronicMoneyData.ColName.RegDate}"] = data.reg_date; + row[$"{GMOElectronicMoneyData.ColName.RegStaff}"] = data.reg_staff; + + + table.Rows.Add(row); + } + + + ret = BulkInsertData(table_name_, table); + + if (ret != Code.ResultCode.OK) { + throw new Exception("登録失敗 GMO 電子マネー"); + } + } + public override int Delete(DateTime from, DateTime to) { + + var bindlist = new List<(String, object)> { + ("From"+GMOElectronicMoneyData.ColName.AdjustDatetime.ToString(), from.ToString("yyyy-MM-dd")), + ("To"+GMOElectronicMoneyData.ColName.AdjustDatetime.ToString(), to.AddDays(1).ToString("yyyy-MM-dd")) + }; + + var delete_count = DeleteData(delete_sql_, bindlist); + if (delete_count == -1) { + throw new Exception("削除失敗 大都QR"); + } + return delete_count; + } + + } +} diff --git a/CSVDownloader/Web/GMOController.cs b/CSVDownloader/Web/GMOController.cs new file mode 100644 index 0000000..1cc75a6 --- /dev/null +++ b/CSVDownloader/Web/GMOController.cs @@ -0,0 +1,345 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Threading; +using System.Text; +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; +using OpenQA.Selenium.Support.UI; + +using CSVDownloader.Code; +using CSVDownloader.Store.ElectronicMoneyDataStore; +using CSVDownloader.Store.CreditCSVData; +using CSVDownloader.Exceptions; + +using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions; +using System.Globalization; + +namespace CSVDownloader.Web { + class GMOController : WebController { + + private readonly String url_ = "https://webinq.gmo-fg.net/KessaisyoukaiGUI/#no-back"; + + + private readonly String filename_zip = "gmo.zip"; + private readonly String filename_credit = "gmo_credit.csv"; + private readonly String filename_electronic_money = "gmo_electronic_money.csv"; + + private enum XpathKey { + INPUT_LOGIN_CUSTOMER_CODE, + INPUT_LOGIN_USERNAME, + INPUT_LOGIN_PASSWORD, + + BUTTON_LOGIN, + + FRAME_MAIN, + + + LOADING, + PROGRESS, + + INPUT_FROM_DATE, + INPUT_TO_DATE, + BUTTON_SEARCH, + BUTTON_DOWNLOAD_ZIP, + + BUTTON_LOGOUT, + }; + + private IDictionary xpath_map_ = new Dictionary() + { + {XpathKey.INPUT_LOGIN_CUSTOMER_CODE,@"//*[@id='companyCode']"}, + {XpathKey.INPUT_LOGIN_USERNAME,@"//*[@id='userName']"}, + {XpathKey.INPUT_LOGIN_PASSWORD,@"//*[@id='password']"}, + + {XpathKey.BUTTON_LOGIN,@"//*[@id='loginForm']//input[@type='submit']"}, + + {XpathKey.FRAME_MAIN,@"//*[@id='main']"}, + + + + {XpathKey.INPUT_FROM_DATE,@"//*[@id='_searchDateFrom']"}, + {XpathKey.INPUT_TO_DATE,@"//*[@id='_searchDateTo']"}, + + + {XpathKey.BUTTON_SEARCH,$"//*[@id='Content']//input[@value='検索']" }, + {XpathKey.BUTTON_DOWNLOAD_ZIP,$"//*[@id='Content']//input[@value='実売上取引出力']" }, + + {XpathKey.BUTTON_LOGOUT,@"//a[@href='javascript:logout();']" }, + + {XpathKey.LOADING,@"//*[@id='loadingFont']"}, + {XpathKey.PROGRESS,@"//*[@id='progress']"}, + + }; + + public GMOController(ChromeDriver driver) : base(driver) { + agent_ = CreditAgent.HT; + } + + public override ResultCode Login(LoginInfo info) { + + try { + driver_.Navigate().GoToUrl(url_); + Send(xpath_map_[XpathKey.INPUT_LOGIN_CUSTOMER_CODE], info.company_name); + Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name); + Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password); + + Click(xpath_map_[XpathKey.BUTTON_LOGIN]); + + CloseAlert(); + + // ログイン後の「端末決済データダウンロード」が表示されることを確認する。 + SwitchToMainFrame(); + wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_DOWNLOAD_ZIP]))); + SwitchToFrame(); + + + } catch (Exception e) { + logger_.Error(e.Message); + return ResultCode.NG; + } + return ResultCode.OK; + } + + public override ResultCode Download(DateTime from, DateTime to) { + + + SwitchToMainFrame(); + + // 承認処理日のFrom-Toを入力 + Clear(xpath_map_[XpathKey.INPUT_FROM_DATE]); + Clear(xpath_map_[XpathKey.INPUT_TO_DATE]); + Send(xpath_map_[XpathKey.INPUT_FROM_DATE], from.ToString("yyyy/MM/dd")); + Send(xpath_map_[XpathKey.INPUT_TO_DATE], to.ToString("yyyy/MM/dd")); + + + // ダウンロード開始 + + Click(xpath_map_[XpathKey.BUTTON_SEARCH]); + wait_.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath(xpath_map_[XpathKey.LOADING]))); + Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_ZIP]); + CloseAlert(); + + + var long_wait = new WebDriverWait(driver_, TimeSpan.FromSeconds(360)); + long_wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath(xpath_map_[XpathKey.PROGRESS]))); + + + WaitForDownload(filename_zip); + + + + // 解凍 + ArchiveExtract(); + + SwitchToFrame(); + + return ResultCode.OK; + } + + public override ResultCode Logout() { + + try { + Click(xpath_map_[XpathKey.BUTTON_LOGOUT]); + + } catch (Exception e) { + logger_.Error(e.Message); + return ResultCode.NG; + } + + return ResultCode.OK; + } + + + public override List GetCreditCSVDataList() { + + var result_list = new List(); + + + var list = GetFileContents(filename_credit); + + bool failed_flg = false; + var failed_parking_name_hs_table = new HashSet(); + + foreach (var line in list) { + var parking_name = line[(int)CreditCSVDataGMO.ColName.ShopName]; + try { + + + int amount = 0; + int.TryParse(line[(int)CreditCSVDataGMO.ColName.Amount], out amount); + + int tax_send_amount = 0; + int.TryParse(line[(int)CreditCSVDataGMO.ColName.TaxSendAmount], out tax_send_amount); + + DateTime processing_date; + DateTime.TryParseExact(line[(int)CreditCSVDataGMO.ColName.ProcessingDate], "yyMMdd", null, DateTimeStyles.None, out processing_date); + + result_list.Add(new CreditCSVDataGMO() { + spot_id = GetSpotID(parking_name), + customer_code = line[(int)CreditCSVDataGMO.ColName.CustomerCode], + output_datetime = line[(int)CreditCSVDataGMO.ColName.OutputDatetime], + processing_code = line[(int)CreditCSVDataGMO.ColName.ProcessingCode], + operation_code = line[(int)CreditCSVDataGMO.ColName.OperationCode], + return_code = line[(int)CreditCSVDataGMO.ColName.ReturnCode], + device_no = line[(int)CreditCSVDataGMO.ColName.DeviceNo], + target_company_code = line[(int)CreditCSVDataGMO.ColName.TargetCompanyCode], + target_company_sub_code = line[(int)CreditCSVDataGMO.ColName.TargetCompanySubCode], + device_trade_no = line[(int)CreditCSVDataGMO.ColName.DeviceTradeNo], + processing_date = processing_date, + approval_no = line[(int)CreditCSVDataGMO.ColName.ApprovalNo], + amount = amount, + tax_send_amount = tax_send_amount, + customer_name = line[(int)CreditCSVDataGMO.ColName.CustomerName], + shop_name = line[(int)CreditCSVDataGMO.ColName.ShopName], + cancel_receipt_no = line[(int)CreditCSVDataGMO.ColName.CancelReceiptNo], + split_count_info = line[(int)CreditCSVDataGMO.ColName.SplitCountInfo], + paying_type = line[(int)CreditCSVDataGMO.ColName.PayingType], + }); + + } catch (ArgumentException) { + + failed_parking_name_hs_table.Add(parking_name); + failed_flg = true; + continue; + } + } + + if (failed_flg) { + var error_list = new List(); + logger_.Error("失敗駐車場名"); + foreach (var ele in failed_parking_name_hs_table) { + error_list.Add(new Store.ParkingCreditCardAgenciesSpotIDError() { + creditcard_agencies_id = CreditAgenciesMap.GetID(agent_), + creditcard_agencies_spot_name = ele + }); + logger_.Error($"駐車場 \"{ele}\""); + } + + throw new SpotNameNotMatchException(error_list); + } + + + return result_list; + } + + public override List GetElectronicMoneyCSVDataList() { + var result_list = new List(); + + + var list = GetFileContents(filename_electronic_money); + + bool failed_flg = false; + var failed_parking_name_hs_table = new HashSet(); + + foreach (var line in list) { + var parking_name = line[(int)GMOElectronicMoneyData.ColName.ShopName]; + try { + + + int amount = 0; + int.TryParse(line[(int)GMOElectronicMoneyData.ColName.Amount], out amount); + + int auto_charge_amount = 0; + int.TryParse(line[(int)GMOElectronicMoneyData.ColName.AutoChargeAmount], out auto_charge_amount); + + int before_deposit = 0; + int.TryParse(line[(int)GMOElectronicMoneyData.ColName.BeforeDeposit], out before_deposit); + + //DateTime adjust_datetime; + //DateTime.TryParseExact(line[(int)GMOElectronicMoneyData.ColName.AdjustDatetime], "yyMMdd", null, DateTimeStyles.None, out adjust_datetime); + + + result_list.Add(new GMOElectronicMoneyData() { + spot_id = GetSpotID(parking_name), + customer_code = line[(int)GMOElectronicMoneyData.ColName.CustomerCode], + acquirer_id = line[(int)GMOElectronicMoneyData.ColName.AcquirerID], + acquirer_name = line[(int)GMOElectronicMoneyData.ColName.AcquirerName], + customer_id = line[(int)GMOElectronicMoneyData.ColName.CustomerID], + customer_name = line[(int)GMOElectronicMoneyData.ColName.CustomerName], + shop_name = line[(int)GMOElectronicMoneyData.ColName.ShopName], + device_id = line[(int)GMOElectronicMoneyData.ColName.DeviceID], + host_device_id = line[(int)GMOElectronicMoneyData.ColName.HostDeviceID], + device_no = line[(int)GMOElectronicMoneyData.ColName.DeviceNo], + adjust_datetime = DateTime.Parse(line[(int)GMOElectronicMoneyData.ColName.AdjustDatetime]), + trade_code = line[(int)GMOElectronicMoneyData.ColName.TradeCode], + amount = amount, + auto_charge_amount = auto_charge_amount, + before_deposit = before_deposit, + brand = line[(int)GMOElectronicMoneyData.ColName.Brand], + card_id = line[(int)GMOElectronicMoneyData.ColName.CardID], + trade_status = line[(int)GMOElectronicMoneyData.ColName.TradeStatus], + last_proccesing_datetime = line[(int)GMOElectronicMoneyData.ColName.LastProccesingDatetime], + point = line[(int)GMOElectronicMoneyData.ColName.Point], + trade_no = line[(int)GMOElectronicMoneyData.ColName.TradeNo], + origin_trade_no = line[(int)GMOElectronicMoneyData.ColName.OriginTradeNo], + + }); + + } catch (ArgumentException) { + + failed_parking_name_hs_table.Add(parking_name); + failed_flg = true; + continue; + } + } + + if (failed_flg) { + var error_list = new List(); + logger_.Error("失敗駐車場名"); + foreach (var ele in failed_parking_name_hs_table) { + error_list.Add(new Store.ParkingCreditCardAgenciesSpotIDError() { + creditcard_agencies_id = CreditAgenciesMap.GetID(agent_), + creditcard_agencies_spot_name = ele + }); + logger_.Error($"駐車場 \"{ele}\""); + } + + throw new SpotNameNotMatchException(error_list); + } + + + return result_list; + } + + + private List GetFileContents(String filename) { + var list = new List(); + var dir = new DirectoryInfo(DriverFactory.GetDownloadDir()); + var config = new CSVConfig() { + header = true, + }; + config.remove_char.Add("\""); + var sjis_enc = Encoding.GetEncoding("Shift-JIS"); + + foreach (var file in dir.GetFiles()) { + if (file.Name.Contains(filename)) { + var result = ReadCsv(file.FullName, config, sjis_enc); + list.AddRange(result); + } + } + + return list; + } + + + private void ArchiveExtract() { + using (ZipArchive archive = ZipFile.OpenRead(Path.Combine(DriverFactory.GetDownloadDir(), filename_zip))) { + foreach (ZipArchiveEntry entry in archive.Entries) { + if (entry.FullName.Contains("FEP")) { + entry.ExtractToFile(Path.Combine(DriverFactory.GetDownloadDir(), filename_credit)); + } + if (entry.FullName.Contains("DEN")) { + entry.ExtractToFile(Path.Combine(DriverFactory.GetDownloadDir(), filename_electronic_money)); + } + } + } + + } + + private void SwitchToMainFrame() { + SwitchToFrame(xpath_map_[XpathKey.FRAME_MAIN]); + } + } +} diff --git a/CSVDownloader/Web/LoginInfo.cs b/CSVDownloader/Web/LoginInfo.cs index bad7c2d..c757997 100644 --- a/CSVDownloader/Web/LoginInfo.cs +++ b/CSVDownloader/Web/LoginInfo.cs @@ -2,6 +2,7 @@ namespace CSVDownloader.Web { class LoginInfo { + public String company_name = ""; public String user_name = ""; public String password = ""; } diff --git a/CSVDownloader/Web/WebController.cs b/CSVDownloader/Web/WebController.cs index d729f05..78a816f 100644 --- a/CSVDownloader/Web/WebController.cs +++ b/CSVDownloader/Web/WebController.cs @@ -12,6 +12,8 @@ using OpenQA.Selenium.Support.UI; using CSVDownloader.Code; using CSVDownloader.Store.CreditCSVData; using CSVDownloader.Store.QRCSVData; +using CSVDownloader.Store.ElectronicMoneyDataStore; + using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions; namespace CSVDownloader.Web { @@ -85,6 +87,10 @@ namespace CSVDownloader.Web { return new List(); } + public virtual List GetElectronicMoneyCSVDataList() { + return new List(); + } + protected void Click(String xpath, bool wait = true) { if (wait) { @@ -116,6 +122,14 @@ namespace CSVDownloader.Web { Wait(interval_milisec_); } + protected void Clear(String xpath) { + var ele = wait_.Until(ExpectedConditions.ElementExists(By.XPath(xpath))); + + ele.Clear(); + + Wait(interval_milisec_); + } + protected void Select(String xpath, String value) { try { @@ -293,5 +307,19 @@ namespace CSVDownloader.Web { } } + + + protected void CloseAlert() { + try { + + var alert = wait_.Until(ExpectedConditions.AlertIsPresent()); + alert.Accept(); + + + } catch (Exception) { + logger_.Info("アラート表示なし"); + return; + } + } } } diff --git a/CSVDownloader/chromedriver.exe b/CSVDownloader/chromedriver.exe index 10036f1..f6cf40f 100644 Binary files a/CSVDownloader/chromedriver.exe and b/CSVDownloader/chromedriver.exe differ diff --git a/chromedriver.exe b/chromedriver.exe index 10036f1..f6cf40f 100644 Binary files a/chromedriver.exe and b/chromedriver.exe differ