/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKEoTelPackTgSksi
*	ソースファイル名	：JBSbatKKEoTelPackTgSksi.java
*	作成者				：富士通　
*	作成日				：2014年05月26日
*＜機能概要＞
*　です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/05/26  FJ)江藤		新規作成(【ANK-2056-00-00】光電話セレクトオプションパック)
*	v9.01.00	2014/06/08  FJ)江藤		IT1-2014-0000213
*   
*********************************************************************/
package eo.business.service;


import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKEoTelPackUtil;
import eo.business.util.file.JBSbatKKIFM600;
import eo.business.util.file.JBSbatKKIFM601;
import eo.business.util.table.JBSbatKK_T_SVC_KEI_UCWK;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKEoTelPackTgSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** お得チェック部品 */
	private JBSbatKKEoTelPackUtil packAplyChk = null;

	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// お得チェック部品の初期化
		packAplyChk = new JBSbatKKEoTelPackUtil();
		
		// お得チェック用初期処理
		packAplyChk.judgeOptPackInit(commonItem, commonItem.getOpeDate());
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		/****************************デバッグログ*****************************/
		super.commonItem.getLogPrint().printDebugLog("\n\n■■■JBSbatKKEoTelPackTgSksi開始■■■\n"
				+"サービス契約番号："+inMap.getString(JBSbatKKIFM601.SVC_KEI_NO) + "\n"
				+"サービス契約内訳番号："+inMap.getString(JBSbatKKIFM601.SVC_KEI_UCWK_NO) + "\n");
		/********************************************************************/
		
		// ■サービス契約内訳が有効なステータスの場合
		if (!isDslCancel(inMap))
		{
			// ■オプション（サブオプション含む）情報取得
			ArrayList<HashMap<String, Object>> opSvcKeiList = packAplyChk.selectOpSvcKeiBySvcKeiUcwk(
																super.commonItem
																,inMap.getString(JBSbatKKIFM601.SVC_KEI_UCWK_NO)
																,super.opeDate
																);
			// お得チェック結果
			String chkResult = null;
			
			if (opSvcKeiList != null && opSvcKeiList.size() > 0)
			{
				// ■お得チェック部品の引数設定
				ArrayList<String[]> judgePcrsCdList = new ArrayList<String[]>(); 
				
				for (HashMap<String, Object> opSvcKei : opSvcKeiList)
				{
					String[] judgePcrsCd = {
							// 料金コースコード
							(String)opSvcKei.get("PCRS_CD")
							// 料金プランコード
							,(String)opSvcKei.get("PPLAN_CD")
					};
					
					judgePcrsCdList.add(judgePcrsCd);
				}

				// お得チェック部品実行
				chkResult = packAplyChk.judgeOptPack(super.commonItem, judgePcrsCdList);
			}
			else
			{
				// 移行断面でオプションが存在したのに、移行後オプションが存在しなくなる場合がこのルート
				// ありえない
				
			}
			
			// ■ 登録用出力データ編集
			editOutMapAdd(inMap, outputBean);
			
			// ■ パック指定が変更されている場合
			// 移行断面のパック指定
			String packSti = (String)inMap.get(JBSbatKKIFM601.PACK_STI);
			
			if (!JKKStringUtil.isNullEmpty(packSti)
					// 20140608 IT1-2014-0000213 MOD START
//					&& packSti.equals(chkResult))
					&& !packSti.equals(chkResult))
					// 20140608 IT1-2014-0000213 MOD END
			{
				// 変更用出力データ編集
				editOutMapChg(inMap, outputBean, opSvcKeiList, chkResult);
			}
		}
		// ■サービス契約内訳が解約・キャンセルされている場合
		else
		{
			// 解約キャンセル用の出力データ編集
			editOutMapDslCancel(inMap, outputBean);
		}
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 登録用の出力データ編集
	 * 
	 * @param inMap  入力データ
	 * @param outputBean  出力データ
	 * @return カレントレコードのJBSbatCommonDBInterfaceオブジェクト
	 * @throws Exception 例外が発生した場合
	 */
	private void editOutMapAdd(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputBean) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 電話番号
		outMap.setString(JBSbatKKIFM600.TELNO, inMap.get(JBSbatKKIFM601.TELNO));
		
		// サービス契約番号
		outMap.setString(JBSbatKKIFM600.SVC_KEI_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_NO));
		
		// サービス契約内訳番号
		outMap.setString(JBSbatKKIFM600.SVC_KEI_UCWK_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_UCWK_NO));
		
		// パック指定
		outMap.setString(JBSbatKKIFM600.PACK_STI, inMap.get(JBSbatKKIFM601.PACK_STI));
		
		// 起動モード
		outMap.setString(JBSbatKKIFM600.KIDOU_MODE, "登録");
		
		// ＳＹＳＩＤ
		outMap.setString(JBSbatKKIFM600.SYSID, inMap.get(JBSbatKKIFM601.SYSID));
		
		outMap.setOutFlg(true);
		
		outputBean.addOutMapList(outMap);
		
	}
	
	/**
	 * 解約キャンセル用の出力データ編集
	 * 
	 * @param inMap  入力データ
	 * @param outputBean  出力データ
	 * @return カレントレコードのJBSbatCommonDBInterfaceオブジェクト
	 * @throws Exception 例外が発生した場合
	 */
	private void editOutMapDslCancel(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputBean) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 電話番号
		outMap.setString(JBSbatKKIFM601.TELNO, inMap.get(JBSbatKKIFM601.TELNO));
		
		// サービス契約番号
		outMap.setString(JBSbatKKIFM601.SVC_KEI_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_NO));
		
		// サービス契約内訳番号
		outMap.setString(JBSbatKKIFM601.SVC_KEI_UCWK_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_UCWK_NO));
		
		// ＳＹＳＩＤ
		outMap.setString(JBSbatKKIFM601.SYSID, inMap.get(JBSbatKKIFM601.SYSID));
		
		// パック指定
		outMap.setString(JBSbatKKIFM601.PACK_STI, packAplyChk.convPackSti((String)inMap.get(JBSbatKKIFM601.PACK_STI)));
		
		// 割込電話／複数通話
		outMap.setString(JBSbatKKIFM601.KEI_NO_B27, inMap.get(JBSbatKKIFM601.KEI_NO_B27));
		
		// 転送電話
		outMap.setString(JBSbatKKIFM601.KEI_NO_B28, inMap.get(JBSbatKKIFM601.KEI_NO_B28));
		
		// 転送電話選択
		outMap.setString(JBSbatKKIFM601.KEI_NO_D07, inMap.get(JBSbatKKIFM601.KEI_NO_D07));

		// 発信者番号表示
		outMap.setString(JBSbatKKIFM601.KEI_NO_B29, inMap.get(JBSbatKKIFM601.KEI_NO_B29));
		
		// 非通知着信拒否
		outMap.setString(JBSbatKKIFM601.KEI_NO_D08, inMap.get(JBSbatKKIFM601.KEI_NO_D08));
		
		// 迷惑電話拒否
		outMap.setString(JBSbatKKIFM601.KEI_NO_B30, inMap.get(JBSbatKKIFM601.KEI_NO_B30));
		
		// 指定番号着信選択
		outMap.setString(JBSbatKKIFM601.KEI_NO_B31, inMap.get(JBSbatKKIFM601.KEI_NO_B31));
		
		// メッセージ
		outMap.setString(JBSbatKKIFM601.MESSAGE, "移行対象データですが、解約状態です。確認してください。");
		
		outMap.setOutFlg(true);
		
		outputBean.addOutMapList_2(outMap);
		
	}
	
	/**
	 * 変更用の出力データ編集
	 * 
	 * @param inMap  入力データ
	 * @param outputBean  出力データ
	 * @param opSvcKeiList  オプションサービス契約
	 * @return カレントレコードのJBSbatCommonDBInterfaceオブジェクト
	 * @throws Exception 例外が発生した場合
	 */
	private void editOutMapChg(
			JBSbatServiceInterfaceMap inMap
			,JBSbatOutputItem outputBean
			,ArrayList<HashMap<String, Object>> opSvcKeiList
			,String packSti 
	) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 電話番号
		outMap.setString(JBSbatKKIFM601.TELNO, inMap.get(JBSbatKKIFM601.TELNO));
		
		// サービス契約番号
		outMap.setString(JBSbatKKIFM601.SVC_KEI_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_NO));
		
		// サービス契約内訳番号
		outMap.setString(JBSbatKKIFM601.SVC_KEI_UCWK_NO, inMap.get(JBSbatKKIFM601.SVC_KEI_UCWK_NO));
		
		// ＳＹＳＩＤ
		outMap.setString(JBSbatKKIFM601.SYSID, inMap.get(JBSbatKKIFM601.SYSID));
		
		// パック指定
		outMap.setString(JBSbatKKIFM601.PACK_STI, packAplyChk.convPackSti((String)inMap.get(JBSbatKKIFM601.PACK_STI)));
		
		// 割込電話／複数通話
		outMap.setString(JBSbatKKIFM601.KEI_NO_B27, inMap.get(JBSbatKKIFM601.KEI_NO_B27));
		
		// 転送電話
		outMap.setString(JBSbatKKIFM601.KEI_NO_B28, inMap.get(JBSbatKKIFM601.KEI_NO_B28));
		
		// 転送電話選択
		outMap.setString(JBSbatKKIFM601.KEI_NO_D07, inMap.get(JBSbatKKIFM601.KEI_NO_D07));

		// 発信者番号表示
		outMap.setString(JBSbatKKIFM601.KEI_NO_B29, inMap.get(JBSbatKKIFM601.KEI_NO_B29));
		
		// 非通知着信拒否
		outMap.setString(JBSbatKKIFM601.KEI_NO_D08, inMap.get(JBSbatKKIFM601.KEI_NO_D08));
		
		// 迷惑電話拒否
		outMap.setString(JBSbatKKIFM601.KEI_NO_B30, inMap.get(JBSbatKKIFM601.KEI_NO_B30));
		
		// 指定番号着信選択
		outMap.setString(JBSbatKKIFM601.KEI_NO_B31, inMap.get(JBSbatKKIFM601.KEI_NO_B31));
		
		// パック指定（起動日）
		// 20140609 IT1-2014-0000213 MOD START 
//		outMap.setString(JBSbatKKIFM601.PACK_STI_KIDO, packSti);
		outMap.setString(JBSbatKKIFM601.PACK_STI_KIDO, packAplyChk.convPackSti(packSti));
		// 20140609 IT1-2014-0000213 MOD END 
		
		// 割込電話／複数通話（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_B27_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "B27"));
		
		// 転送電話（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_B28_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "B28"));
		
		// 転送電話選択（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_D07_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "D07"));

		// 発信者番号表示（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_B29_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "B29"));
		
		// 非通知着信拒否（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_D08_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "D08"));
		
		// 迷惑電話拒否（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_B30_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "B30"));
		
		// 指定番号着信選択（起動日）
		outMap.setString(JBSbatKKIFM601.KEI_NO_B31_KIDO, packAplyChk.getKeiNo(opSvcKeiList, "B31"));

		// メッセージ（起動日）
		outMap.setString(JBSbatKKIFM601.MESSAGE
							,"6/30以降でオプションのサービス開始またはパック内容の変更が必要です。確認してください。"
						);
		
		outMap.setOutFlg(true);
		
		outputBean.addOutMapList_2(outMap);
		
	}
	
	/**
	 * サービス契約内訳の解約キャンセルを判定します
	 * 
	 * @param inMap  入力データ
	 * @return true:解約orキャンセル false:「解約orキャンセル」以外
	 * @throws Exception 例外が発生した場合
	 */
	private boolean isDslCancel(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// ■サービス契約内訳のカレント取得
		HashMap<String, Object> svcKeiUcwk = packAplyChk.selectSvcKeiUcwk(
															super.commonItem
															,inMap.getString(JBSbatKKIFM601.SVC_KEI_UCWK_NO)
															,super.opeDate
															);
		
		String svcKeiUcwkStat = (String)svcKeiUcwk.get(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_STAT);
		if (JKKStrConst.CD00037_DSL_ZM.equals(svcKeiUcwkStat) 
				|| JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiUcwkStat)
			)
		{
			return true;
		}
		
		return false;
	}
}
