/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKEoTelPackTgAdd
*	ソースファイル名	：JBSbatKKEoTelPackTgAdd.java
*	作成者				：富士通　
*	作成日				：2014年05月16日
*＜機能概要＞
*　ｅｏ光電話パック対象情報登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/05/16  FJ)三宅		ANK-2056-00-00
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM599;
import eo.business.util.file.JBSbatKKIFM600;
import eo.common.util.JKKStringUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKEoTelPackTgAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 電話セレクトオプションパック移行マップ リクエストキー */
	private static final String KKSV079001CC = "KKSV079001CC";

	/** 電話セレクトオプションパック移行サービス ユースケースID */
	private static final String USECASE_ID = "KKSV0790";
	
	/** 電話セレクトオプションパック移行 オペレーションID */
	private static final String OPERATION_ID = "KKSV0790OP";
	
	/** パック指定（eo光電話パック3） */
	private final String PACK_STI_PACK3 = "W00000007";
	/** パック指定（eo光電話パック7） */
	private final String PACK_STI_PACK7 = "W00000008";
	
	/** 入力チェック */
	enum InFileCheckCd {
		SVC_KEI_NO_REQ("1"), SVC_KEI_UCWK_NO_REQ("2"), PACK_STI_REQ("3"), SYSID_REQ("4"), PACK_STI_VAL("5");

		String inFileCheckCd;

		private InFileCheckCd(String inFileCheckCd) {
			this.inFileCheckCd = inFileCheckCd;
		}

		public boolean isMatch(String inFileCheckCd) {
			return this.inFileCheckCd.equals(inFileCheckCd);
		}
		
		public String getCd(){
			return inFileCheckCd;
		}
	}
	
	/** 登録結果コード */
	enum AddRsltCd {
		ADD_RSLT_CD_OK("0"), ADD_RSLT_CD_NG("1");

		String addRsltCd;

		private AddRsltCd(String addRsltCd) {
			this.addRsltCd = addRsltCd;
		}

		public boolean isMatch(String addRsltCd) {
			return this.addRsltCd.equals(addRsltCd);
		}
		
		public String getCd(){
			return addRsltCd;
		}
	}
	
	/** (出力ファイル_出力情報)ｅｏ光電話セレクトオプションパック登録結果（正常） */
	private final String ADD_RSLT_SEIJYO = "正常";
	/** (出力ファイル_出力情報)ｅｏ光電話セレクトオプションパック登録結果（エラー） */
	private final String ADD_RSLT_ERROR  = "エラー";
	/** (出力ファイル_出力情報)エラー内容（サービス契約番号_未設定） */
	private final String ERR_NAIYO_SVC_KEI_NO_REQ       = "サービス契約番号が未設定です。ログを参照指定ください。";
	/** (出力ファイル_出力情報)エラー内容（サービス契約内訳番号_未設定） */
	private final String ERR_NAIYO_SVC_KEI_UCWK_NO_REQ  = "サービス契約内訳番号が未設定です。ログを参照指定ください。";
	/** (出力ファイル_出力情報)エラー内容（パック指定_未設定） */
	private final String ERR_NAIYO_PACK_STI_REQ         = "パック指定が未設定です。ログを参照指定ください。";
	/** (出力ファイル_出力情報)エラー内容（パック指定_設定値不正） */
	private final String ERR_NAIYO_PACK_STI_VAL         = "パック指定の設定が不正です。ログを参照指定ください。";
	/** (出力ファイル_出力情報)エラー内容（ＳＹＳＩＤ_未設定） */
	private final String ERR_NAIYO_SYSID_REQ            = "ＳＹＳＩＤが未設定です。ログを参照指定ください。";

	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// ヘッダー出力
		writeHeader();
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// ファイルへ出力する情報を保持する変数
		String telno        = inMap.getString(JBSbatKKIFM600.TELNO);			// 電話番号
		String svcKeiNo     = inMap.getString(JBSbatKKIFM600.SVC_KEI_NO);		// サービス契約番号
		String svcKeiUcwkNo = inMap.getString(JBSbatKKIFM600.SVC_KEI_UCWK_NO);	// サービス契約内訳番号
		String packSti      = inMap.getString(JBSbatKKIFM600.PACK_STI);			// パック指定
		String sysid        = inMap.getString(JBSbatKKIFM600.SYSID);			// ＳＹＳＩＤ
		String rslt         = "";												// ｅｏ光電話セレクトオプションパック登録結果
		String errNaiyo     = "";												// エラー内容
		String mskmDtlNo    = "";												// 申込明細番号
		String seikyKeiNo   = "";												// 請求契約番号
		
		// 電話セレクトオプションパック登録が登録結果保持
		String rsltCd = "";
		
		// 入力チェック
		String inFileChkRslt = isSingleCheckKKIFM600_INF1(inMap.getMap());
		if(JKKStringUtil.isNullBlank(inFileChkRslt))
		{
			//---------------------------------------------------
			// 入力ファイルの情報を取得
			//---------------------------------------------------
			HashMap<String, Object> serviceMap = new HashMap<String, Object>();
			// 電話番号
			serviceMap.put("telno",           telno);
			// サービス契約番号
			serviceMap.put("svc_kei_no",      svcKeiNo);
			// サービス契約内訳番号
			serviceMap.put("svc_kei_ucwk_no", svcKeiUcwkNo);
			// パック指定
			serviceMap.put("pack_sti",        packSti);
			// ＳＹＳＩＤ
			serviceMap.put("sysid",           sysid);		
			
			// KKSV0790_電話セレクトオプションパック移行を呼出し
			HashMap<String, Object> outputMap = doExecute(serviceMap);
			
			// サービス実行後の結果を取得する
			HashMap kksv079001CCMap = (HashMap) outputMap.get("KKSV079001CC");
			// 登録結果
			rsltCd        = (String)kksv079001CCMap.get("add_rslt_cd");
			// エラー内容
			errNaiyo      = (String)kksv079001CCMap.get("err_naiyo");
			// 申込明細番号
			mskmDtlNo     = (String)kksv079001CCMap.get("mskm_dtl_no");
			// 請求契約番号
			seikyKeiNo    = (String)kksv079001CCMap.get("seiky_kei_no");
			
			// ｅｏ光電話セレクトオプションパック登録結果を設定する（登録結果に該当する内容を設定）
			if(AddRsltCd.ADD_RSLT_CD_OK.isMatch(rsltCd))
			{
				rslt = ADD_RSLT_SEIJYO;
			}
			else
			{
				rslt = ADD_RSLT_ERROR;
			}			
		}
		else
		{
			// 入力チェックエラーのため、ｅｏ光電話セレクトオプションパック登録結果には"エラー"を設定する
			rslt     = ADD_RSLT_ERROR;
			
			// 入力チェックのエラー原因に該当するエラー内容を設定する
			if(InFileCheckCd.SVC_KEI_NO_REQ.isMatch(inFileChkRslt))
			{
				// サービス契約番号_未設定
				errNaiyo = ERR_NAIYO_SVC_KEI_NO_REQ;
			}
			else if(InFileCheckCd.SVC_KEI_UCWK_NO_REQ.isMatch(inFileChkRslt))
			{
				// サービス契約内訳番号_未設定
				errNaiyo = ERR_NAIYO_SVC_KEI_UCWK_NO_REQ;
			}
			else if(InFileCheckCd.PACK_STI_REQ.isMatch(inFileChkRslt))
			{
				// パック指定_未設定
				errNaiyo = ERR_NAIYO_PACK_STI_REQ;
			}
			else if(InFileCheckCd.PACK_STI_VAL.isMatch(inFileChkRslt))
			{
				// パック指定_設定値不正
				errNaiyo = ERR_NAIYO_PACK_STI_VAL;
			}
			else if(InFileCheckCd.SYSID_REQ.isMatch(inFileChkRslt))
			{
				// ＳＹＳＩＤ_未設定
				errNaiyo = ERR_NAIYO_SYSID_REQ;
			}
		}
		
		//---------------------------------------------------
		// ファイル出力
		//---------------------------------------------------
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		// 電話番号
		outmap.setString(JBSbatKKIFM599.TELNO,           telno);
		// サービス契約番号
		outmap.setString(JBSbatKKIFM599.SVC_KEI_NO,      svcKeiNo);
		// サービス契約内訳番号
		outmap.setString(JBSbatKKIFM599.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		// 申込明細番号
		outmap.setString(JBSbatKKIFM599.MSKM_DTL_NO,     mskmDtlNo);
		// パック指定
		outmap.setString(JBSbatKKIFM599.PACKSTI,         packSti);
		// 請求契約番号
		outmap.setString(JBSbatKKIFM599.SEIKY_KEI_NO,    seikyKeiNo);
		// ＳＹＳＩＤ
		outmap.setString(JBSbatKKIFM599.SYSID,           sysid);
		// ｅｏ光電話セレクトオプションパック登録結果
		outmap.setString(JBSbatKKIFM599.RSLT,            rslt);
		// 光電話セレクトパック登録年月日
		if(AddRsltCd.ADD_RSLT_CD_OK.isMatch(rsltCd))
		{
			outmap.setString(JBSbatKKIFM599.ADD_YMD,     this.opeDate);
		}
		// エラー内容
		outmap.setString(JBSbatKKIFM599.ERR_NAIYO,       errNaiyo);
		outmap.setOutFlg(true);
		outputBean.addOutMapList(outmap);
		
		super.logPrint.printDebugLog("execute_End");
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 指示書CC呼び出し処理
	 * 
	 * @param inMap 入力電文
	 * @return HashMap<String, Object> 処理結果
	 * @throws Exception
	 */
	private HashMap<String, Object> doExecute(HashMap<String, Object> excuteMap) throws Exception
	{
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		// サービスに渡す業務データを格納するMAP
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		// サービスの処理結果が格納されるMAP
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスＩＤのセット
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID);
		
		// inputMapにCCに必要な情報をセットする
		inputMap.put(KKSV079001CC, excuteMap);
		
		// 電話セレクトオプションパック移行CCを呼び出す
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		
		// 処理結果を返却する
		return outputMap;
	}
	/**
	 * ヘッダ部の出力をします。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * ヘッダ部の出力処理をします。<br>
	 *
	 * </pre>
	 * <p>
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void writeHeader() throws Exception
	{
		JBSbatOutputFileUtil out_obj = super.commonItem.getOutPutFile();
		StringBuffer header = new StringBuffer();

		header.append("\"電話番号\",");
		header.append("\"サービス契約番号\",");
		header.append("\"サービス契約内訳番号\",");
		header.append("\"申込明細番号\",");
		header.append("\"パック指定\",");
		header.append("\"請求契約番号\",");
		header.append("\"ＳＹＳＩＤ\",");
		header.append("\"eo光電話セレクトオプションパック登録結果\",");
		header.append("\"光電話セレクトパック登録年月日\",");
		header.append("\"エラー内容\"");
		
		// ヘッダ部の出力を行います。
		out_obj.write(header.toString());
	}
	/**
	 *入力情報（ｅｏ光電話パック対象情報抽出結果ファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFM600-INF1.svc_kei_no			ｅｏ光電話パック対象情報抽出結果ファイル.サービス契約番号
	 *			 TXT-KKIFM600-INF1.svc_kei_ucwk_no			ｅｏ光電話パック対象情報抽出結果ファイル.サービス契約内訳番号
	 *			 TXT-KKIFM600-INF1.pack_sti			ｅｏ光電話パック対象情報抽出結果ファイル.パック指定
	 *			 TXT-KKIFM600-INF1.sysid			ｅｏ光電話パック対象情報抽出結果ファイル.ＳＹＳＩＤ
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	@SuppressWarnings("unchecked")
	private String isSingleCheckKKIFM600_INF1(HashMap rsMap)
	{
		// 単項目チェックを行います
		String strValue = null;
		
		super.logPrint.printDebugLog("入力チェックレコード：" + rsMap.toString());
		
		// サービス契約番号項目チェック
		strValue = (String)rsMap.get("svc_kei_no");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			super.logPrint.printDebugLog("サービス契約番号が未設定です。");
			return InFileCheckCd.SVC_KEI_NO_REQ.getCd();
		}

		// サービス契約内訳番号項目チェック
		strValue = (String)rsMap.get("svc_kei_ucwk_no");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			super.logPrint.printDebugLog("サービス契約内訳番号が未設定です。");
			return InFileCheckCd.SVC_KEI_UCWK_NO_REQ.getCd();
		}

		// パック指定項目チェック
		strValue = (String)rsMap.get("pack_sti");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			super.logPrint.printDebugLog("パック指定が未設定です。");
			return InFileCheckCd.PACK_STI_REQ.getCd();
		}
		// 規定値チェック
		if(!PACK_STI_PACK3.equals(strValue) && !PACK_STI_PACK7.equals(strValue))
		{
			super.logPrint.printDebugLog("パック指定の設定値が不正です。");
			return InFileCheckCd.PACK_STI_VAL.getCd();
		}

		// ＳＹＳＩＤ項目チェック
		strValue = (String)rsMap.get("sysid");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			super.logPrint.printDebugLog("ＳＹＳＩＤが未設定です。");
			return InFileCheckCd.SYSID_REQ.getCd();
		}
		return "";
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
