/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCTITlnContentCst
*	ソースファイル名	：JBSbatKKCTITlnContentCst.java
*	作成者				：富士通　
*	作成日				：2013年02月12日
*＜機能概要＞
*　０５０番ＩＰ電話情報受信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00		2013/02/12  FJ)井熊		新規作成
*	v29.00.00	2017/02/13	 FJ)和田	【ANK-2886-00-00】	CTI連携の連携条件見直し
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM327;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCTITlnContentCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** コンテンツ決済レコード一時保持用リスト */
	private ArrayList<JBSbatServiceInterfaceMap> mList_050map = null;
	/** 一時保持中コンテンツ決済レコード サービス契約番号 */
	private String mSVC_KEI_NO = null;
	/** 件数ファイル用カウンター変数 */
	private int counter = 0;
	
	/** 改行コード */
	private static final String CRLF  = "CR+LF";
	/** ファイル括り文字 */
	private static final String SCOPE  = "\"";
	/** ファイル区切り文字 */
	private static final String CONM = JKKBatConst.CONMA;
	// 2017/02/13 ANK-2886-00-00 MDD START
//	/** 電番区分 固定電話 */
//	private static final String S_TEL_NO_KOTEI = "00";
//	/** 電番区分 携帯電話 */
//	private static final String S_TEL_NO_KEITAI = "01";
	/** 電番区分 固定電話/問合せ客 */
	private static final String S_TEL_NO_KOTEI_30 = "30";
	/** 電番区分 携帯電話/問合せ客 */
	private static final String S_TEL_NO_KEITAI_31 = "31";
	/** 電番区分 固定電話/お客様(オープン/ファミリー会員 */
	private static final String S_TEL_NO_KOTEI_40 = "40";
	/** 電番区分 携帯電話/お客様(オープン/ファミリー会員 */
	private static final String S_TEL_NO_KEITAI_41 = "41";
	// 2017/02/13 ANK-2886-00-00 MDD END
	/** 電番区分 050電話_21 */
	private static final String S_TEL_NO_050_21 = "21";
	/** 電番区分 050電話_99 */
	private static final String S_TEL_NO_050_99 = "99";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// コンテンツ決済レコード一時保持用リスト初期化
		this.mList_050map = new ArrayList<JBSbatServiceInterfaceMap>();
		// サービス契約番号一時保持用変数初期化
		this.mSVC_KEI_NO = "";
		// 件数ファイル用カウンター変数初期化
		this.counter = 0;
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 単項目チェック
		if(!isSingleCheckKKIFM327_INF1(inMap.getMap(), this.getItemvalueMap()))
		{
			// 抽出レコードが不正
			super.commonItem.setErrFlg(true);
			return null;
		}
		
		// 出力共通電文を生成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		// 出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap mapKKIFE025 = new JBSbatServiceInterfaceMap();
		// 出力フラグを設定
		mapKKIFE025.setOutFlg(true);
		
		// 電番区分取得
		String den_ban_cbn = inMap.getString(JBSbatKKIFM327.TELNODIV);
		// 電番区分が固定電話、もしくは携帯電話かチェック
		// 2017/02/13 ANK-2886-00-00 MDD START
//		if(S_TEL_NO_KOTEI.equals(den_ban_cbn) || S_TEL_NO_KEITAI.equals(den_ban_cbn))
		if(S_TEL_NO_KOTEI_30.equals(den_ban_cbn) || S_TEL_NO_KEITAI_31.equals(den_ban_cbn)
				|| S_TEL_NO_KOTEI_40.equals(den_ban_cbn) || S_TEL_NO_KEITAI_41.equals(den_ban_cbn))
		// 2017/02/13 ANK-2886-00-00 MDD EMD
		{
			// 固定電話、携帯電話はそのまま出力する
			mapKKIFE025.setMap(inMap.getMap());
			// 出力共通電文入出力インターフェイスを設定する
			outputBean.addOutMapList(mapKKIFE025);
			// カウンターをインクリメント
			this.counter++;
		}
		
		// 電番区分が０５０番号（コンテンツ決済Ｓ連携）かチェック
		if(S_TEL_NO_050_21.equals(den_ban_cbn))
		{
			// サービス契約番号を一時保持
			this.mSVC_KEI_NO = inMap.getString(JBSbatKKIFM327.SVC_KEI_NO);
			// 一時保持リストへ格納
			this.mList_050map.add(inMap);
		}
		
		// 電番区分が０５０番号（お客様電話番号情報データファイル）かチェック
		if(S_TEL_NO_050_99.equals(den_ban_cbn))
		{
			// 一時保持しているサービス契約番号と違うことをチェック
			if(this.mSVC_KEI_NO == null || !this.mSVC_KEI_NO.equals(inMap.getString(JBSbatKKIFM327.SVC_KEI_NO)))
			{
				// 電番区分を「99」から「21」へ変更する
				inMap.set(JBSbatKKIFM327.TELNODIV, S_TEL_NO_050_21);
				// ファイル出力する
				mapKKIFE025.setMap(inMap.getMap());
				// 出力共通電文入出力インターフェイスを設定する
				outputBean.addOutMapList(mapKKIFE025);
				// カウンターをインクリメント
				this.counter++;
			}
		}
		// ファイル出力
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// 件数ファイルオブジェクト
		JBSbatOutputFileUtil cntFile = null;
		
		try
		{
			// フリーパラメータをチェック
			if(super.freeItem == null || "".equals(super.freeItem))
			{
				// 件数ファイルパラメータ異常
				throw new Exception();
			}
			
			// 保持しているコンテンツ決済Ｓ連携のレコードを書き出す
			for(JBSbatServiceInterfaceMap inMap : this.mList_050map)
			{
				StringBuffer sb = new StringBuffer();
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.SBT));				// 種別
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.TELNODIV));		// 電番区分
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.TELNO));			// 電話番号
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.SVC_KEI_NO));		// サービス契約番号
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.SWCUSTID));		// ＳＷ顧客ＩＤ
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.EONETID));			// ｅｏｎｅｔＩＤ
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.CUST_NM));			// 顧客名
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.CUST_KANA));		// 顧客名カナ
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.SVC_CD));			// サービスコード
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.KEI_STAT_CD));		// 契約状態コード
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.MSKMSHO_NO));		// 受付番号
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.SYSID));			// ＳＹＳＩＤ
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.EOID));			// ｅｏＩＤ
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				// 2017/02/13 ANK-2886-00-00 MDD START
//				sb.append(inMap.getString(JBSbatKKIFM327.YOBI03));			// 予備３
				sb.append(inMap.getString(JBSbatKKIFM327.KEI_SKBT_NO));		// 契約識別番号
				// 2017/02/13 ANK-2886-00-00 MDD END
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				// 2017/02/13 ANK-2886-00-00 MDD START
//				sb.append(inMap.getString(JBSbatKKIFM327.YOBI04));			// 予備４
				sb.append(inMap.getString(JBSbatKKIFM327.DSL_CANCEL_YMD));	// 解約／キャンセル年月日
				// 2017/02/13 ANK-2886-00-00 MDD END
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				// 2017/02/13 ANK-2886-00-00 MDD START
//				sb.append(inMap.getString(JBSbatKKIFM327.YOBI05));			// 予備５
				sb.append(inMap.getString(JBSbatKKIFM327.PRC_GRP_CD));		// 料金グループコード
				// 2017/02/13 ANK-2886-00-00 MDD END
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.YOBI06));			// 予備６
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.YOBI07));			// 予備７
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.YOBI08));			// 予備８
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.YOBI09));			// 予備９
				sb.append(SCOPE);
				sb.append(CONM);
				sb.append(SCOPE);
				sb.append(inMap.getString(JBSbatKKIFM327.YOBI10));			// 予備１０
				sb.append(SCOPE);
				
				// 出力ファイルへ書き出す
				super.commonItem.getOutPutFile().write(sb.toString());
				// カウンターをインクリメント
				this.counter++;
			}
			
			// 件数ファイル作成
			cntFile = new JBSbatOutputFileUtil(super.freeItem);
			cntFile.setEncode(JKKBatConst.SJIS);
			cntFile.setLine(CRLF);
			cntFile.createWriter();
			StringBuffer sb = new StringBuffer();
			sb.append(SCOPE);
			sb.append(String.valueOf(this.counter));
			sb.append(SCOPE);
			cntFile.write(sb.toString());
		}
		catch(Exception e)
		{
			// 出力ファイルの作成に失敗
			String rsn = "件数ファイルの作成に失敗（";
			StringBuffer buf = new StringBuffer();
			buf.append("出力件数パス：");
			buf.append(super.freeItem);
			buf.append("）");
			// エラーを投げる
			throw new JBSbatBusinessException("EKKB0250CE", new String[]{ rsn, buf.toString() });
		}
		finally
		{
			// 件数ファイルオブジェクトを閉じる
			if(cntFile != null)
			{
				// 件数ファイルを閉じる
				cntFile.close();
				cntFile = null;
			}
		}
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 *入力情報（お客様電話番号情報データファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFM327-INF1.SBT			お客様電話番号情報データファイル.種別
	 *			 TXT-KKIFM327-INF1.TELNODIV		お客様電話番号情報データファイル.電番区分
	 *			 TXT-KKIFM327-INF1.SWCUSTID		お客様電話番号情報データファイル.ＳＷ顧客ＩＤ
	 *			 TXT-KKIFM327-INF1.CUST_NM		お客様電話番号情報データファイル.顧客名
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	@SuppressWarnings("unchecked")
	private boolean isSingleCheckKKIFM327_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// 種別項目チェック
		strValue = (String)rsMap.get("SBT");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0230TW", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM327-INF1.SBT")});
			return false;
		}

		// 電番区分項目チェック
		strValue = (String)rsMap.get("TELNODIV");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0230TW", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM327-INF1.TELNODIV")});
			return false;
		}

		// ＳＷ顧客ＩＤ項目チェック
		strValue = (String)rsMap.get("SWCUSTID");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0230TW", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM327-INF1.SWCUSTID")});
			return false;
		}

		// 顧客名項目チェック
		strValue = (String)rsMap.get("CUST_NM");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0230TW", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM327-INF1.CUST_NM")});
			return false;
		}

		return true;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * エラーメッセージに関する項目値を格納されたHashMap<String, String>を生成します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.エラーメッセージに関する項目値を格納されたHashMapを生成する。<br>
	 * 2.エラーメッセージに関する項目値を格納されたHashMapに値を設定する。<br>
	 * </pre>
	 * <p>
	 * @return itemvalueMap エラーメッセージに関する項目値を格納されたHashMap
	 */
	private HashMap<String, String> getItemvalueMap()
	{
		// エラーメッセージに関する項目値が格納されたHashMapを設定
		HashMap<String, String> itemvalueMap = new HashMap<String, String>();
		itemvalueMap.put("TXT-KKIFM327-INF1.SBT",			"お客様電話番号情報データファイル.種別");
		itemvalueMap.put("TXT-KKIFM327-INF1.TELNODIV", 		"お客様電話番号情報データファイル.電番区分");
		itemvalueMap.put("TXT-KKIFM327-INF1.SWCUSTID", 		"お客様電話番号情報データファイル.ＳＷ顧客ＩＤ");
		itemvalueMap.put("TXT-KKIFM327-INF1.CUST_NM", 		"お客様電話番号情報データファイル.顧客名");
		return itemvalueMap;
	}
}

