/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKWaoApiRnk
*	ソースファイル名	：JBSbatKKWaoApiRnk.java
*	作成者				：富士通　
*	作成日				：2025年04月09日
*＜機能概要＞
*　ＷＡＯＡＰＩ連携部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v75.00.00   2025/04/09  FJ)謝       【ANK-4640-00-00】typeN：追加要件対応
*   v75.00.01   2025/05/30  FJ)謝       【ANK-4640-09-00】【eo定期】typeN：追加要件対応【仕変09】ＷＡＯ連携ＡＰＩにおける戻り電文の文字コード変換対応
*   v75.00.00   2025/08/01  FJ)謝       【#87756】対応
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKCtrlWao;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatBusinessFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKWaoApiRnk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** WAOAPI認証ログインＩＤ */
	private static final String WAO_NS_LOGIN_ID = "WAO_NS_LOGIN_ID";
	/** WAOAPI認証ログインＰＷ */
	private static final String WAO_NS_LOGIN_PW = "WAO_NS_LOGIN_PW";
	
	/** ＷＡＯ社　API-ID KKIFE513 管理者情報認証取得(WAO) */
	private static final String WAO_API_KKIFE513 = "KKIFE513";
	/** ＷＡＯ社　API-ID KKIFE514 注文チェック(WAO) */
	private static final String WAO_API_KKIFE514 = "KKIFE514";
	/** ＷＡＯ社　API-ID KKIFE515 注文登録(WAO) */
	private static final String WAO_API_KKIFE515 = "KKIFE515";
	/** ＷＡＯ社　API名称 KKIFE513 管理者情報認証取得(WAO) */
	private static final String WAO_API_KKIFE513_NM = "管理者情報認証取得(WAO)";
// ANK-4640-09-00 ADD START
	/** ＷＡＯ社　API名称 KKIFE514 注文チェック(WAO) */
	private static final String WAO_API_KKIFE514_NM = "注文チェック(WAO)";
	/** ＷＡＯ社　API名称 KKIFE515 注文登録(WAO) */
	private static final String WAO_API_KKIFE515_NM = "注文登録(WAO)";
// ANK-4640-09-00 ADD END
	
	/** ＷＡＯＡＰＩ結果コード 正常 */
	private static final String WAO_API_RESULT_CODE_OK = "00000000";
	
	/** 処理区分コード_新規申込（電話申込なし） */
	private static final String TRAN_DIV_NEW_TEL_NON = "1";

	/** 処理区分コード_新規申込（電話申込あり） */
	private static final String TRAN_DIV_NEW_TEL_ARI = "2";

	/** 処理区分コード_コース変更 */
	private static final String TRAN_DIV_COURSE_CHG = "3";

	/** 処理区分コード_解約 */
	private static final String TRAN_DIV_DSL = "4";
	
	/** WAO注文登録結果データ お客様ID */
	private static final String SVC_KEI_NO = "SVC_KEI_NO";
	
	/** WAO注文登録結果データ 異動種類 */
	private static final String IDO_KIND = "IDO_KIND";
	
	/** WAO注文登録結果データ ID */
	private static final String ID = "ID";
	
	/** WAO注文登録結果データ 結果コード */
	private static final String RESULT_CODE = "RESULT_CODE";
	
	/** WAO注文登録結果データ 失敗対象パラメータID */
	private static final String KEY = "KEY";
	
	/** WAO注文登録結果データ 失敗理由 */
	private static final String VALUE = "VALUE";
	
	/** WAO注文登録結果データ API連携日時 */
	private static final String WAO_RENKEI_DTM = "WAO_RENKEI_DTM";
	
	/** 出力内容 データなし */
	private static final String WAO_ORDER_ADD_TRGT_NASHI = "WAO注文登録情報は０件でした";
	
	/** WAOAPI注文項目（※新規申込（電話申込なし）） 項目1:階層No2、項目2:階層No3、項目3:項目位置（入力レコード） */
	private static final String[][] REQ_NEW_TEL_NON = {
		  {"orders", "order_num", "3"} // 基本情報＞注文基本情報＞オーダー番号（注文番号）
		, {"orders", "tozai_kb", "4"} // 基本情報＞注文基本情報＞東西区分
		, {"orders", "ntt_order_type", "5"} // 基本情報＞注文基本情報＞注文種別
		, {"orders", "isp_tantosha_nm", "6"} // 基本情報＞注文基本情報＞ISP担当者名
		, {"orders", "isp_tantosha_phone_num", "7"} // 基本情報＞注文基本情報＞ISP担当者電話番号
		, {"orders", "isp_tantosha_mail", "8"} // 基本情報＞注文基本情報＞ISP担当者メールアドレス
		, {"orders", "ntt_order_status", "9"} // 基本情報＞注文基本情報＞注文ステータス
		, {"ntt_production_application_hikari_services", "contact_before_construction", "10"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事会社からエンドユーザーへの工事前連絡
		, {"ntt_production_application_construction_dates", "constructor_name_contact_type", "11"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事者情報事前連絡＞希望有無
		, {"ntt_production_application_hikari_services", "punching_not_possible", "12"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事時建物穴あけ不可の事前希望
		, {"ntt_production_application_common_infos", "kiyksh_nm_okyakusama_kb", "13"} // サービス申込情報＞契約者情報＞お客様区分
		, {"ntt_production_application_common_infos", "kiyksh_nm_kana", "14"} // サービス申込情報＞契約者情報＞契約者名＞契約者カナ名
		, {"ntt_production_application_common_infos", "kiyksh_nm_kanji", "15"} // サービス申込情報＞契約者情報＞契約者名＞契約者漢字名
		, {"ntt_production_application_common_infos", "kiyksh_info_rnrksk_kb", "16"} // サービス申込情報＞契約者情報＞契約者連絡先＞連絡先区分
		, {"ntt_production_application_common_infos", "kiyksh_info_rnrksk_1", "17"} // サービス申込情報＞契約者情報＞契約者連絡先＞連絡先電話番号
		, {"ntt_production_application_common_infos", "kiyksh_addr_zip", "18"} // サービス申込情報＞契約者情報＞契約者住所＞郵便番号
		, {"ntt_production_application_common_infos", "contractor_prefectures_city_address", "19"} // サービス申込情報＞契約者情報＞契約者住所＞都道府県・市区町村・番地
		, {"ntt_production_application_common_infos", "contractor_buildings_name_number_room", "20"} // サービス申込情報＞契約者情報＞契約者住所＞建物名・号室
		, {"ntt_offer_situation_checks", "installation_location_address_change_existence", "21"} // サービス申込情報＞設置場所住所＞変更有無
		, {"ntt_offer_situation_checks", "noki_chk_addr_addr_yubin_num", "22"} // サービス申込情報＞設置場所住所＞郵便番号
		, {"ntt_offer_situation_checks", "installation_location_address_prefectures_city_address", "23"} // サービス申込情報＞設置場所住所＞都道府県・市区町村・番地
		, {"ntt_offer_situation_checks", "installation_location_address_buildings_name_number_room", "24"} // サービス申込情報＞設置場所住所＞建物名・号室
		, {"ntt_offer_situation_checks", "fletshikari_hinmoku_type", "25"} // サービス申込情報＞光回線＞光回線品目
		, {"ntt_offer_situation_checks", "terminal_equipment_application_existence", "26"} // サービス申込情報＞端末・機器＞申込有無
		, {"ntt_offer_situation_checks", "terminal_equipment_wireless_lan_router_home_gateway_application", "27"} // サービス申込情報＞端末・機器＞無線LANルータ（ホームゲートウェイ）申込
		, {"ntt_acceptances", "kaisen_num_f_num", "28"} // 基本情報＞注文基本情報＞回線番号コード
		, {"ntt_acceptances", "tenyosyodaku_num", "29"} // サービス申込情報＞転用承諾番号入力＞転用承諾番号
		, {"ntt_acceptances", "agreement_num_input_private_corporative", "30"} // サービス申込情報＞転用承諾番号入力＞個人／法人
		, {"ntt_acceptances", "keiyakusha_nm_kanji", "31"} // サービス申込情報＞転用承諾番号入力＞契約者名
		, {"ntt_acceptances", "company_change_acceptance_number", "32"} // サービス申込情報＞事業者変更承諾番号＞事業者変更承諾番号／事業者変更後キャンセル承諾番号
		, {"ntt_acceptances", "agreement_num_private_corporative", "33"} // サービス申込情報＞事業者変更承諾番号＞個人／法人
		, {"ntt_acceptances", "agreement_num_contractor_name", "34"} // サービス申込情報＞事業者変更承諾番号＞契約者名
		, {"ntt_acceptances", "agent_remarks_1", "35"} // 連絡事項＞エージェント専用備考欄＞エージェント備考1
		, {"ntt_acceptances", "agent_remarks_2", "36"} // 連絡事項＞エージェント専用備考欄＞エージェント備考2
		, {"ntt_acceptances", "agent_remarks_3", "37"} // 連絡事項＞エージェント専用備考欄＞エージェント備考3
		, {"ntt_acceptances", "agent_to_owner_renrakujiko", "38"} // 連絡事項＞エージェント⇒オーナー＞エージェントからオーナーへの連絡事項
		, {"ntt_construction_infos", "nittei_kojibi_shitei_date", "39"} // 日程_工事日＞工事希望日時１＞日付
		, {"ntt_construction_infos", "nittei_kojibi_shitei_time_type", "40"} // 日程_工事日＞工事希望日時１＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi1_date", "41"} // 日程_工事日＞工事希望日時２＞日付
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi1_time", "42"} // 日程_工事日＞工事希望日時２＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi2_date", "43"} // 日程_工事日＞工事希望日時３＞日付
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi2_time", "44"} // 日程_工事日＞工事希望日時３＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_shitei_date", "45"} // 日程_工事日（出側）＞工事希望日時１＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_shitei_time_type", "46"} // 日程_工事日（出側）＞工事希望日時１＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi1_date", "47"} // 日程_工事日（出側）＞工事希望日時２＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi1_time", "48"} // 日程_工事日（出側）＞工事希望日時２＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi2_date", "49"} // 日程_工事日（出側）＞工事希望日時３＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi2_time", "50"} // 日程_工事日（出側）＞工事希望日時３＞時間帯
	};
	
	/** WAOAPI注文項目（※新規申込（電話申込あり）） 項目1:階層No2、項目2:階層No3、項目3:項目位置（入力レコード） */
	private static final String[][] REQ_NEW_TEL_ARI = {
		  {"orders", "order_num", "3"} // 基本情報＞注文基本情報＞オーダー番号（注文番号）
		, {"orders", "tozai_kb", "4"} // 基本情報＞注文基本情報＞東西区分
		, {"orders", "ntt_order_type", "5"} // 基本情報＞注文基本情報＞注文種別
		, {"orders", "isp_tantosha_nm", "6"} // 基本情報＞注文基本情報＞ISP担当者名
		, {"orders", "isp_tantosha_phone_num", "7"} // 基本情報＞注文基本情報＞ISP担当者電話番号
		, {"orders", "isp_tantosha_mail", "8"} // 基本情報＞注文基本情報＞ISP担当者メールアドレス
		, {"orders", "ntt_order_status", "9"} // 基本情報＞注文基本情報＞注文ステータス
		, {"ntt_production_application_hikari_services", "contact_before_construction", "10"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事会社からエンドユーザーへの工事前連絡
		, {"ntt_production_application_construction_dates", "constructor_name_contact_type", "11"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事者情報事前連絡＞希望有無
		, {"ntt_production_application_hikari_services", "punching_not_possible", "12"} // その他取次情報＞工事申込＞工事に関する情報及びその他の申込＞工事時建物穴あけ不可の事前希望
		, {"ntt_production_application_hikari_phones", "hkrphone_kihon_srvc_ryokin_plan_type", "13"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞料金プラン
		, {"ntt_production_application_common_infos", "kiyksh_nm_okyakusama_kb", "14"} // サービス申込情報＞契約者情報＞お客様区分
		, {"ntt_production_application_common_infos", "kiyksh_nm_kana", "15"} // サービス申込情報＞契約者情報＞契約者名＞契約者カナ名
		, {"ntt_production_application_common_infos", "kiyksh_nm_kanji", "16"} // サービス申込情報＞契約者情報＞契約者名＞契約者漢字名
		, {"ntt_production_application_common_infos", "kiyksh_info_rnrksk_kb", "17"} // サービス申込情報＞契約者情報＞契約者連絡先＞連絡先区分
		, {"ntt_production_application_common_infos", "kiyksh_info_rnrksk_1", "18"} // サービス申込情報＞契約者情報＞契約者連絡先＞連絡先電話番号
		, {"ntt_production_application_common_infos", "kiyksh_addr_zip", "19"} // サービス申込情報＞契約者情報＞契約者住所＞郵便番号
		, {"ntt_production_application_common_infos", "contractor_prefectures_city_address", "20"} // サービス申込情報＞契約者情報＞契約者住所＞都道府県・市区町村・番地
		, {"ntt_production_application_common_infos", "contractor_buildings_name_number_room", "21"} // サービス申込情報＞契約者情報＞契約者住所＞建物名・号室
		, {"ntt_offer_situation_checks", "installation_location_address_change_existence", "22"} // サービス申込情報＞設置場所住所＞変更有無
		, {"ntt_offer_situation_checks", "noki_chk_addr_addr_yubin_num", "23"} // サービス申込情報＞設置場所住所＞郵便番号
		, {"ntt_offer_situation_checks", "installation_location_address_prefectures_city_address", "24"} // サービス申込情報＞設置場所住所＞都道府県・市区町村・番地
		, {"ntt_offer_situation_checks", "installation_location_address_buildings_name_number_room", "25"} // サービス申込情報＞設置場所住所＞建物名・号室
		, {"ntt_offer_situation_checks", "fletshikari_hinmoku_type", "26"} // サービス申込情報＞光回線＞光回線品目
		, {"ntt_offer_situation_checks", "hikari_call_application_existence", "27"} // サービス申込情報＞ひかり電話＞申込有無
		, {"ntt_offer_situation_checks", "hkrphone_mskm_hkrphone_mskm_type", "28"} // サービス申込情報＞ひかり電話＞ひかり電話利用
		, {"ntt_offer_situation_checks", "terminal_equipment_application_existence", "29"} // サービス申込情報＞端末・機器＞申込有無
		, {"ntt_offer_situation_checks", "terminal_equipment_wireless_lan_router_home_gateway_application", "30"} // サービス申込情報＞端末・機器＞無線LANルータ（ホームゲートウェイ）申込
		, {"ntt_phone_number_new_changes", "new_phone_number_get_existence", "31"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞新電番取得有無
		, {"ntt_phone_number_new_changes", "no_portability_desired", "32"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ希望
		, {"ntt_phone_number_new_changes", "common_setting_no_display", "33"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞サービス情報＞共通設定＞ナンバー・ディスプレイ
		, {"ntt_phone_number_new_changes", "common_setting_no_request", "34"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞サービス情報＞共通設定＞ナンバー・リクエスト
		, {"ntt_phone_number_new_changes", "service_setting_outgoing_no_message_service_1", "35"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞サービス情報＞個別設定＞電話番号1（契約電話番号）＞サービス設定＞発信番号通知サービス
		, {"ntt_phone_number_new_changes", "service_setting_international_signing_1", "36"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞サービス情報＞個別設定＞電話番号1（契約電話番号）＞サービス設定＞国際締結
		, {"ntt_portability_numbers", "transfer_source_phone_number_1", "37"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞移転元電話番号
		, {"ntt_portability_numbers", "contractor_holder_kanji_name_1", "38"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞移転元契約者名義＞漢字名
		, {"ntt_portability_numbers", "installation_location_address_post_code_1", "39"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞移転元設置場所住所＞郵便番号
		, {"ntt_portability_numbers", "installation_location_prefectures_city_address_1", "40"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞移転元設置場所住所＞都道府県・市区町村・番地
		, {"ntt_portability_numbers", "installation_location_building_name_number_room_1", "41"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞移転元設置場所住所＞建物名・号室
		, {"ntt_portability_numbers", "subscription_right_existence_1", "42"} // サービス申込情報＞ひかり電話＞電話番号（新規申込／変更）＞番号ポータビリティ1＞電話加入権の有無
		, {"ntt_acceptances", "kaisen_num_f_num", "43"} // 基本情報＞注文基本情報＞回線番号コード
		, {"ntt_acceptances", "tenyosyodaku_num", "44"} // サービス申込情報＞転用承諾番号入力＞転用承諾番号
		, {"ntt_acceptances", "agreement_num_input_private_corporative", "45"} // サービス申込情報＞転用承諾番号入力＞個人／法人
		, {"ntt_acceptances", "keiyakusha_nm_kanji", "46"} // サービス申込情報＞転用承諾番号入力＞契約者名
		, {"ntt_acceptances", "company_change_acceptance_number", "47"} // サービス申込情報＞事業者変更承諾番号＞事業者変更承諾番号／事業者変更後キャンセル承諾番号
		, {"ntt_acceptances", "agreement_num_private_corporative", "48"} // サービス申込情報＞事業者変更承諾番号＞個人／法人
		, {"ntt_acceptances", "agreement_num_contractor_name", "49"} // サービス申込情報＞事業者変更承諾番号＞契約者名
		, {"ntt_acceptances", "agent_remarks_1", "50"} // 連絡事項＞エージェント専用備考欄＞エージェント備考1
		, {"ntt_acceptances", "agent_remarks_2", "51"} // 連絡事項＞エージェント専用備考欄＞エージェント備考2
		, {"ntt_acceptances", "agent_remarks_3", "52"} // 連絡事項＞エージェント専用備考欄＞エージェント備考3
		, {"ntt_acceptances", "agent_to_owner_renrakujiko", "53"} // 連絡事項＞エージェント⇒オーナー＞エージェントからオーナーへの連絡事項
		, {"ntt_construction_infos", "nittei_kojibi_shitei_date", "54"} // 日程_工事日＞工事希望日時１＞日付
		, {"ntt_construction_infos", "nittei_kojibi_shitei_time_type", "55"} // 日程_工事日＞工事希望日時１＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi1_date", "56"} // 日程_工事日＞工事希望日時２＞日付
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi1_time", "57"} // 日程_工事日＞工事希望日時２＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi2_date", "58"} // 日程_工事日＞工事希望日時３＞日付
		, {"ntt_construction_infos", "nittei_kojibi_kiboubi2_time", "59"} // 日程_工事日＞工事希望日時３＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_shitei_date", "60"} // 日程_工事日（出側）＞工事希望日時１＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_shitei_time_type", "61"} // 日程_工事日（出側）＞工事希望日時１＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi1_date", "62"} // 日程_工事日（出側）＞工事希望日時２＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi1_time", "63"} // 日程_工事日（出側）＞工事希望日時２＞時間帯
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi2_date", "64"} // 日程_工事日（出側）＞工事希望日時３＞日付
		, {"ntt_construction_infos", "nittei_kojibi_out_kiboubi2_time", "65"} // 日程_工事日（出側）＞工事希望日時３＞時間帯
	};
	
	/** WAOAPI注文項目（※コース変更） 項目1:階層No2、項目2:階層No3、項目3:項目位置（入力レコード） */
	private static final String[][] REQ_COURSE_CHG = {
		  {"orders", "order_num", "3"} // 基本情報＞注文基本情報＞オーダー番号（注文番号）
		, {"orders", "tozai_kb", "4"} // 基本情報＞注文基本情報＞東西区分
		, {"orders", "ntt_order_type", "5"} // 基本情報＞注文基本情報＞注文種別
		, {"orders", "caf_num", "6"} // 基本情報＞注文基本情報＞契約ID(CAF/COP)
		, {"orders", "isp_tantosha_nm", "7"} // 基本情報＞注文基本情報＞ISP担当者名
		, {"orders", "isp_tantosha_phone_num", "8"} // 基本情報＞注文基本情報＞ISP担当者電話番号
		, {"orders", "isp_tantosha_mail", "9"} // 基本情報＞注文基本情報＞ISP担当者メールアドレス
		, {"orders", "ntt_order_status", "10"} // 基本情報＞注文基本情報＞注文ステータス
		, {"ntt_offer_situation_checks", "hikari_change_existence", "11"} // サービス申込情報＞光回線＞変更有無
		, {"ntt_offer_situation_checks", "fletshikari_hinmoku_type", "12"} // サービス申込情報＞光回線＞光回線品目
		, {"ntt_acceptances", "kaisen_num_f_num", "13"} // 基本情報＞注文基本情報＞回線番号コード
		, {"ntt_acceptances", "agent_remarks_1", "14"} // 連絡事項＞エージェント専用備考欄＞エージェント備考1
		, {"ntt_acceptances", "agent_to_owner_renrakujiko", "15"} // 連絡事項＞エージェント⇒オーナー＞エージェントからオーナーへの連絡事項
		, {"ntt_acceptances", "before_agent_to_owner_change_detail_change", "16"} // 連絡事項＞エージェント⇒オーナー＞変更詳細＞変更前
		, {"ntt_acceptances", "after_agent_to_owner_change_detail_change", "17"} // 連絡事項＞エージェント⇒オーナー＞変更詳細＞変更後
	};
	
	/** WAOAPI注文項目（※解約） 項目1:階層No2、項目2:階層No3、項目3:項目位置（入力レコード） */
	private static final String[][] REQ_DSL = {
		  {"orders", "order_num", "3"} // 基本情報＞注文基本情報＞オーダー番号（注文番号）
		, {"orders", "tozai_kb", "4"} // 基本情報＞注文基本情報＞東西区分
		, {"orders", "ntt_order_type", "5"} // 基本情報＞注文基本情報＞注文種別
		, {"orders", "caf_num", "6"} // 基本情報＞注文基本情報＞契約ID(CAF/COP)
		, {"orders", "isp_tantosha_nm", "7"} // 基本情報＞注文基本情報＞ISP担当者名
		, {"orders", "isp_tantosha_phone_num", "8"} // 基本情報＞注文基本情報＞ISP担当者電話番号
		, {"orders", "isp_tantosha_mail", "9"} // 基本情報＞注文基本情報＞ISP担当者メールアドレス
		, {"orders", "ntt_order_status", "10"} // 基本情報＞注文基本情報＞注文ステータス
		, {"ntt_acceptances", "kaisen_num_f_num", "11"} // 基本情報＞注文基本情報＞回線番号コード
		, {"ntt_acceptances", "agent_remarks_1", "12"} // 連絡事項＞エージェント専用備考欄＞エージェント備考1
		, {"ntt_acceptances", "agent_to_owner_renrakujiko", "13"} // 連絡事項＞エージェント⇒オーナー＞エージェントからオーナーへの連絡事項

	};
	
	/** WAO注文登録結果データファイルオブジェクト */
	private JBSbatBusinessFileUtil waoOrderAddRsltFileObj = null;
	

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		
		// WAO注文登録結果データファイルパス
		String waoOrderAddRsltFilePath = freeItems[1];
		
		// WAO注文登録対象送信データファイルパス
		String waoOrderAddTrgtFilePath = freeItems[0];
		
		// WAO注文登録対象送信データファイル件数分を繰返す
		BufferedReader brWaoOrderAddTrgt = null;
		
		// WAO注文登録対象送信データ有無フラグ
		boolean waoOrderAddTrgtDataUmFlg = false;
		
		// アクターID
		String actorId = "";
		
		// WAO注文登録結果データファイルオブジェクトを生成する
		waoOrderAddRsltFileObj = JKKBatCommon.createBusinessFileUtil(waoOrderAddRsltFilePath,
				JKKBatConst.SJIS, JKKStrConst.LINE_SEPARATOR, JKKBatConst.S_SEP_CAM);
		
		// お客様ID
		String outputDataSvcKeiNo = "";
		// 異動種類
		String outputDataIdoKind = "";
		// ID
		String outputDataId = "";
		// 結果コード
		String outputDataResultCode = "";
		// 失敗対象パラメータID
		String outputDataKey = "";
		// 失敗理由
		String outputDataValue = "";
		
		try
		{
			InputStreamReader isWaoOrderAddTrg = new InputStreamReader(new FileInputStream(waoOrderAddTrgtFilePath), JKKStrConst.ENCODE_SJIS);
			brWaoOrderAddTrgt = new BufferedReader(isWaoOrderAddTrg);
			
			while (brWaoOrderAddTrgt.ready())
			{
				waoOrderAddTrgtDataUmFlg = true;
				
				// 初期化
				outputDataSvcKeiNo = "";
				outputDataIdoKind = "";
				outputDataId = "";
				outputDataResultCode = "";
				outputDataKey = "";
				outputDataValue = "";
				
				// 管理者情報認証取得(WAO)を行い、アクターIDを取得する
				if (JKKStringUtil.isNullBlank(actorId))
				{
					// ■■■管理者情報認証取得(WAO)実行■■■
					Hashtable<String, Object> responseMapNinsho = executeWaoNinsho();
					String resultCode = "";
					String message = "";
					Hashtable<String, Object> dataMapNinsho = new Hashtable<String, Object>();
					
					if (responseMapNinsho != null)
					{
						resultCode = (String)responseMapNinsho.get("result_code");
						message = (String)responseMapNinsho.get("message");
						dataMapNinsho = getRspHashtable(responseMapNinsho, "data");
					}
					
					// 認証NGの場合
					if (!WAO_API_RESULT_CODE_OK.equals(resultCode))
					{
						commonItem.getLogPrint().printBusinessErrorLog("EKKB2430CW", new String[] {WAO_API_KKIFE513_NM, resultCode, message});
						commonItem.setErrorCount(1);
						
						// WAO注文登録結果データを閉じる
						JKKBatCommon.closeBusinessFileUtil(waoOrderAddRsltFileObj);
						return null;
					}
					// 認証OKの場合
					else
					{
						if (dataMapNinsho != null)
						{
							Hashtable<String, Object> actorDataMap = getRspHashtable(dataMapNinsho, "actor");
							
							if (actorDataMap != null)
							{
								actorId = (String)actorDataMap.get("id");
							}
						}
					}
					
					// アクターIDが返却されない場合
					if (JKKStringUtil.isNullBlank(actorId))
					{
						commonItem.getLogPrint().printBusinessErrorLog("EKKB2440CW", new String[] {WAO_API_KKIFE513_NM});
						commonItem.setErrorCount(1);
						
						// WAO注文登録結果データを閉じる
						JKKBatCommon.closeBusinessFileUtil(waoOrderAddRsltFileObj);
						return null;
					}
				}
				
				// 1行読込み
// #87756 MOD START
//				String[] data = JBSbatInterface.charConverter(brWaoOrderAddTrgt.readLine()).split(JKKStrConst.COMMA);
				String line = JBSbatInterface.charConverter(brWaoOrderAddTrgt.readLine());
				String[] data = line.substring(1, line.length() - 1).split("\",\"");
// #87756 MOD END
				
				if (data.length > 1)
				{
					outputDataIdoKind = getDataDoubleQuoteNon(data[0]);
					outputDataSvcKeiNo = getDataDoubleQuoteNon(data[1]);
				}
				
				// ■■■注文チェック(WAO)実行■■■
				Hashtable<String, Object> responseMapOdrChk = executeWaoOrderChkOrAdd(WAO_API_KKIFE514, actorId, data);
				String resultCodeOdrChk = "";
// ANK-4640-09-00 MOD START
//				Hashtable<String, Object> messageMapOdrChk = new Hashtable<String, Object>();
				String messageOdrChk = "";
// ANK-4640-09-00 MOD END
				
				if (responseMapOdrChk != null)
				{
					resultCodeOdrChk = (String)responseMapOdrChk.get("result_code");
// ANK-4640-09-00 MOD START
//					messageMapOdrChk = getRspHashtable(responseMapOdrChk, "message");
					messageOdrChk = (String)responseMapOdrChk.get("message");
// ANK-4640-09-00 MOD END
				}
				
				// 注文チェックNGの場合
				if (!WAO_API_RESULT_CODE_OK.equals(resultCodeOdrChk))
				{
					outputDataResultCode = resultCodeOdrChk;
// ANK-4640-09-00 MOD START
//					if (messageMapOdrChk != null)
//					{
//						outputDataKey = (String)messageMapOdrChk.get("key");
//						outputDataValue = (String)messageMapOdrChk.get("value");
//					}
					outputDataValue = messageOdrChk;
					String logeOdrChk = WAO_API_KKIFE514_NM + "(" + resultCodeOdrChk + " :" + messageOdrChk + " )"; 
					commonItem.getLogPrint().printBusinessErrorLog("EKKB1200AI", new String[] {logeOdrChk});
// ANK-4640-09-00 MOD END
				}
				// 注文チェックOKの場合
				else
				{
					// ■■■注文登録(WAO)実行■■■
					Hashtable<String, Object> responseMapOdrAdd = executeWaoOrderChkOrAdd(WAO_API_KKIFE515, actorId, data);
					String resultCodeOdrAdd = "";
// ANK-4640-09-00 MOD START
//					Hashtable<String, Object> messageMapOdrAdd = new Hashtable<String, Object>();
					String messageOdrAdd = "";
// ANK-4640-09-00 MOD END
					Hashtable<String, Object> dataMapOdrAdd = new Hashtable<String, Object>();
					
					if (responseMapOdrAdd != null)
					{
						resultCodeOdrAdd = (String)responseMapOdrAdd.get("result_code");
// ANK-4640-09-00 MOD START
//						messageMapOdrAdd = getRspHashtable(responseMapOdrAdd, "message");
						messageOdrAdd = (String)responseMapOdrAdd.get("message");
// ANK-4640-09-00 MOD END
						dataMapOdrAdd = getRspHashtable(responseMapOdrAdd, "data");
					}
					outputDataResultCode = resultCodeOdrAdd;
					
					// 注文登録NGの場合
					if (!WAO_API_RESULT_CODE_OK.equals(resultCodeOdrAdd))
					{
// ANK-4640-09-00 MOD START
//						if (messageMapOdrAdd != null)
//						{
//							outputDataKey = (String)messageMapOdrAdd.get("key");
//							outputDataValue = (String)messageMapOdrAdd.get("value");
//						}
						outputDataValue = messageOdrAdd;
						String logOdrAdd = WAO_API_KKIFE515_NM + "(" + resultCodeOdrAdd + " :" + messageOdrAdd + " )"; 
						commonItem.getLogPrint().printBusinessErrorLog("EKKB1200AI", new String[] {logOdrAdd});
// ANK-4640-09-00 MOD END
					}
					// 注文登録OKの場合
					else
					{
						if (dataMapOdrAdd != null)
						{
							Hashtable<String, Object> orderMapOdrAdd = getRspHashtable(dataMapOdrAdd, "order");
							if (orderMapOdrAdd != null)
							{
								outputDataId = (String)orderMapOdrAdd.get("id");
							}
						}
					}
				}
				
				HashMap<String, String> rsMapData = new HashMap<String, String>();
				
				// お客様ID
				rsMapData.put(SVC_KEI_NO, outputDataSvcKeiNo);
				// 異動種類
				rsMapData.put(IDO_KIND, outputDataIdoKind);
				// ID
				rsMapData.put(ID, outputDataId);
				// 結果コード
				rsMapData.put(RESULT_CODE, outputDataResultCode);
				// 失敗対象パラメータID
				rsMapData.put(KEY, outputDataKey);
				// 失敗理由
				rsMapData.put(VALUE, outputDataValue);
				// API連携日時
				rsMapData.put(WAO_RENKEI_DTM, JKKBatCommon.getSysDateTime().substring(0, 10));
				
				createWaoOrderAddRslt(rsMapData);
			}
		}
		catch (IOException e)
		{
			// WAO注文登録対象送信データファイルがない場合０件と同様とする
		}
		finally
		{
			if (null != brWaoOrderAddTrgt)
			{
				brWaoOrderAddTrgt.close();
			}
		}
		
		// WAO注文登録対象送信データなしの場合
		if (!waoOrderAddTrgtDataUmFlg)
		{
			HashMap<String, String> rsMapDataNashi = new HashMap<String, String>();
			
			// お客様ID
			rsMapDataNashi.put(SVC_KEI_NO, WAO_ORDER_ADD_TRGT_NASHI);
			// 異動種類
			rsMapDataNashi.put(IDO_KIND, "");
			// ID
			rsMapDataNashi.put(ID, "");
			// 結果コード
			rsMapDataNashi.put(RESULT_CODE, "");
			// 失敗対象パラメータID
			rsMapDataNashi.put(KEY, "");
			// 失敗理由
			rsMapDataNashi.put(VALUE, "");
			// API連携日時
			rsMapDataNashi.put(WAO_RENKEI_DTM, "");
			
			createWaoOrderAddRslt(rsMapDataNashi);
		}
		
		// WAO注文登録結果データを閉じる
		JKKBatCommon.closeBusinessFileUtil(waoOrderAddRsltFileObj);
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null)
		{
			return "";
		}
		
		return str;
	}
	
	/**
	 * ダブルクォーテーション除外処理
	 * @param str 文字列
	 * @return str
	 */
	private String getDataDoubleQuoteNon(String str)
	{
		if (str == null)
		{
			return "";
		}
		
// #87756 DEL START
//		if (str.length() >= 2)
//		{
//			return str.substring(1, str.length() - 1);
//		}
// #87756 DEL END
		
		return str;
	}
	
	/**
	 * WAO注文登録結果データを出力する。<br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void createWaoOrderAddRslt(HashMap<String, String> rsMap) throws Exception
	{
		ArrayList<String> outputInfo = new ArrayList<String>();
		
		// お客様ID
		outputInfo.add(getNullToStr(rsMap.get(SVC_KEI_NO)));
		// 異動種類
		outputInfo.add(getNullToStr(rsMap.get(IDO_KIND)));
		// ID
		outputInfo.add(getNullToStr(rsMap.get(ID)));
		// 結果コード
		outputInfo.add(getNullToStr(rsMap.get(RESULT_CODE)));
		// 失敗対象パラメータID
		outputInfo.add(getNullToStr(rsMap.get(KEY)));
		// 失敗理由
		outputInfo.add(getNullToStr(rsMap.get(VALUE)));
		// API連携日時
		outputInfo.add(getNullToStr(rsMap.get(WAO_RENKEI_DTM)));
		
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(waoOrderAddRsltFileObj, outputInfo);
	}
	
	/**
	 * 管理者情報認証取得(WAO)実行。<br>
	 * @return レスポンス
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private Hashtable<String, Object> executeWaoNinsho() throws Exception
	{
		// コマンド発行部品のインスタンスを取得する
		JKKCtrlWao instance = JKKCtrlWao.getInstance();
		
		// 入力データ
		HashMap<String, Object> serviceMap = new HashMap<String, Object>();
		
		// API-ID
		serviceMap.put("api_id", WAO_API_KKIFE513);
		
		// リクエスト
		HashMap<String, Object> requestMap = new HashMap<String, Object>();
		HashMap<String, Object> requestDataMap = new HashMap<String, Object>();
		requestDataMap.put("login_id", JCCBatCommon.getApplicationConst(WAO_NS_LOGIN_ID));
		requestDataMap.put("password", JCCBatCommon.getApplicationConst(WAO_NS_LOGIN_PW));
		requestMap.put("data", requestDataMap);
		serviceMap.put("request", requestMap);
		
		// 実行
		Map<String, Object> resultinfo = instance.call_wao(serviceMap);
		
		// 戻り値の取得
		String reqHeader = (String)resultinfo.get("req_header");
		String requestJson = (String)resultinfo.get("request_json");
		String responseJson = (String)resultinfo.get("response_json");
		String httpStatusCd = (String)resultinfo.get("http_status_cd");
		Hashtable<String, Object> responseMap = getRspHashtable(resultinfo, "response");
		
		// リクエストとレスポンスの電文を出力する
		String log = "apiId=" + WAO_API_KKIFE513 + ", header=" + reqHeader + ", httpStatus=" + httpStatusCd + ", request=" + requestJson + ", response=" + responseJson; 
		commonItem.getLogPrint().printBusinessErrorLog("EKKB1200AI", new String[] {log});
		
		return responseMap;
	}
	
	
	/**
	 * 注文チェック(WAO)/注文登録(WAO)実行。<br>
	 * @param apiId API-ID
	 * @param actorId アクターID
	 * @param data 入力データ
	 * @return レスポンス
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private Hashtable<String, Object> executeWaoOrderChkOrAdd(String apiId, String actorId, String[] data) throws Exception
	{
		// 異動種類
		String idoKind = "";
		// サービス契約番号
		String svcKeiNo = "";
		if (data.length > 1)
		{
			idoKind = getDataDoubleQuoteNon(data[0]);
			svcKeiNo = getDataDoubleQuoteNon(data[1]);
		}
		
		// コマンド発行部品のインスタンスを取得する
		JKKCtrlWao instance = JKKCtrlWao.getInstance();
		
		// 入力データ
		HashMap<String, Object> serviceMap = new HashMap<String, Object>();
		
		// API-ID
		serviceMap.put("api_id", apiId);
		// サービス契約番号
		serviceMap.put("svc_kei_no", svcKeiNo);
		// リクエスト
		HashMap<String, Object> requestMap = new HashMap<String, Object>();
		String[][] reqDataMapKey = new String[][]{};
		
		// 新規申込（電話申込なし）の場合
		if (TRAN_DIV_NEW_TEL_NON.equals(idoKind))
		{
			reqDataMapKey = REQ_NEW_TEL_NON;
		}
		// 新規申込（電話申込あり）の場合
		else if (TRAN_DIV_NEW_TEL_ARI.equals(idoKind))
		{
			reqDataMapKey = REQ_NEW_TEL_ARI;
		}
		// コース変更の場合
		else if (TRAN_DIV_COURSE_CHG.equals(idoKind))
		{
			reqDataMapKey = REQ_COURSE_CHG;
		}
		// 解約の場合
		else if (TRAN_DIV_DSL.equals(idoKind))
		{
			reqDataMapKey = REQ_DSL;
		}
		
		requestMap = setWaoOrderReqMap(actorId, reqDataMapKey, data);
		serviceMap.put("request", requestMap);
		
		// 実行
		Map<String, Object> resultinfo = instance.call_wao(serviceMap);
		
		// 戻り値の取得
		String reqHeader = (String)resultinfo.get("req_header");
		String requestJson = (String)resultinfo.get("request_json");
		String responseJson = (String)resultinfo.get("response_json");
		String httpStatusCd = (String)resultinfo.get("http_status_cd");
		Hashtable<String, Object> responseMap = getRspHashtable(resultinfo, "response");
		
		// リクエストとレスポンスの電文を出力する
		String log = "apiId=" + apiId + ", header=" + reqHeader + ", httpStatus=" + httpStatusCd + ", request=" + requestJson + ", response=" + responseJson; 
		commonItem.getLogPrint().printBusinessErrorLog("EKKB1200AI", new String[] {log});
		
		return responseMap;
	}
	
	/**
	 * 注文チェック(WAO)/注文登録(WAO)実行。<br>
	 * @param actorId アクターID
	 * @param reqDataMapKey リクエストデータマップKEY
	 * @param data 入力データ
	 * @return リクエスト
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> setWaoOrderReqMap(String actorId, String[][] reqDataMapKey, String[] data) throws Exception
	{
		HashMap<String, Object> requestMap = new HashMap<String, Object>();
		HashMap<String, Object> requestDataMap = new HashMap<String, Object>();
		requestDataMap.put("actor_id", actorId);
		
		for (int i = 0; i < reqDataMapKey.length; i++)
		{
			String parentkey = reqDataMapKey[i][0];
			String childkey = reqDataMapKey[i][1];
			String value = "";
			if (data.length > Integer.parseInt(reqDataMapKey[i][2]))
			{
				value = getDataDoubleQuoteNon(data[Integer.parseInt(reqDataMapKey[i][2])]);
			}
			
			HashMap<String, Object> childMap = new HashMap<String, Object>();
			if (requestDataMap.containsKey(parentkey))
			{
				childMap = (HashMap<String, Object>)requestDataMap.get(parentkey);
			}
			
			childMap.put(childkey, value);
			requestDataMap.put(parentkey, childMap);
		}
		
		requestMap.put("data", requestDataMap);
		
		return requestMap;
	}
	
	/**
	 * 対象データを取得する。<br>
	 * @param obj 対象データ
	 * @param key 入力データ
	 * @return Hashtable
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private Hashtable<String, Object> getRspHashtable(Map obj, String key) throws Exception
	{
		if (obj == null)
		{
			return null;
		}
		
		Object value = obj.get(key);
		
		if (value == null)
		{
			return null;
		}
		else if (value instanceof Hashtable)
		{
			return (Hashtable<String, Object>)value;
		}
		else
		{
			return null;
		}
	}
}
