/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom						 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKSvcStaTgKeiAdd
*	ソースファイル名	：JBSbatKKSvcStaTgKeiAdd.java
*	作成者				：富士通　
*	作成日				：2011年06月28日
*＜機能概要＞
*　サービス開始対象契約登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/28  FJ)久保田	新規作成
*	v3.00.00	2012/10/05  FJ)藤本		【ST1-2012-0000688】障害対応
*	v3.01.00	2013/03/22  FJ)神田		【IT1-2013-0000498】障害対応
*	v5.00.00	2013/11/22  FJ)団		【OM-2013-0004258】障害対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM030;
import eo.business.util.file.JBSbatKKIFM049;
import eo.business.util.table.JBSbatKK_T_KAISEN_TG_SVKEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.log.JBSbatLogUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKSvcStaTgKeiAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";

	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";

	/** テーブル(サービス契約回線内訳)*/
	private static final String D_TBL_NAME_KK_T_SVKEI_KAISEN_UW = "KK_T_SVKEI_KAISEN_UW";

	/** SQL定義キー(KK_SELECT_053)*/
	private static final String KK_T_SVC_KEI_UCWK_KK_SELECT_053 = "KK_SELECT_053";

	/** SQL定義キー(KK_SELECT_012)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KK_SELECT_012 = "KK_SELECT_012";

	/** SQL定義キー(KK_SELECT_017)*/
	private static final String KK_T_SVKEI_KAISEN_UW_KK_SELECT_017 = "KK_SELECT_017";

	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;

	/** テーブルアクセスクラス(回線対象サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI = null;

	/** テーブルアクセスクラス(サービス契約回線内訳)*/
	private JBSbatSQLAccess db_KK_T_SVKEI_KAISEN_UW = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 処理年月日*/
	private static String  SRI_YMD = "SRI_YMD";
	
	/** サービス開始処理種別コード*/
	private static String  SVC_KIS_SRSB_CD = "SVC_KIS_SRSB_CD";
	
	/** サービス開始処理単位コード*/
	private static String  SVC_KIS_SRTI_CD = "SVC_KIS_SRTI_CD";
	
	/** サービス契約番号*/
	private static String  SVC_KEI_NO = "SVC_KEI_NO";
	
	/** サービス契約内訳番号*/
	private static String  SVC_KEI_UCWK_NO = "SVC_KEI_UCWK_NO";
	
	/** 基準年月日*/
	private static String  KJN_YMD = "KJN_YMD";
	
	/**
	 * 処理年月日
	 */
	protected String sriYmd = "";
	
	/**
	 * サービス開始処理種別コード
	 */
	protected String svcKisSrsbCd = "";
	
	/**
	 * サービス開始処理単位コード
	 */
	protected String svcKisSrtiCd = "";
	
	/**
	 * サービス契約番号
	 */
	protected String svcKeiNo = "";
	
	/**
	 * サービス契約内訳番号
	 */
	protected String svcKeiUcwkNo = "";
	
	/**
	 * 基準年月日
	 */
	protected String kjnYmd = "";
	
	/**
	 * 変更基準年月日
	 */
	protected String chKjnYmd = "";
	
	/**
	 * 中間ファイルリスト
	 */
	protected ArrayList<HashMap<String, Object>> kkifm030List = new ArrayList<HashMap<String, Object>>();
	
	/**
	 *  基準日変更フラグ
	 */
	protected boolean kjnYmdFlg = false;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
		db_KK_T_KAISEN_TG_SVKEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_KK_T_SVKEI_KAISEN_UW = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVKEI_KAISEN_UW);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
		{
			super.logPrint.printDebugLog("execute_START");
		}
		
		// 中間ファイルの読み込みを行います。
		getKkifm049(inMap);
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 中間ファイル．サービス契約内訳番号が空の場合
		if("".equals(inMap.getString(JBSbatKKIFM030.SVC_KEI_UCWK_NO)))
		{
			if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
			{
				super.logPrint.printDebugLog("サービス契約基点ファイル");
			}
			
			// サービス開始対象契約取得ファイルのファイル出力
			outputBean = createKkifm030(kjnYmdFlg);
			
			HashMap<String, Object> inputMap = new HashMap<String, Object>();
			
			// 読み込んだ中間ファイル情報をListに格納する。
			setKkifm049List(inputMap);
			
			if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
			{
				for(int i = 0 ;i < kkifm030List.size() ; i++)
				{
					super.logPrint.printDebugLog("kkifm030List[" + i + "].SVC_KEI_NO:" + kkifm030List.get(i).get(SVC_KEI_NO));
				}
			}

		}
		// 中間ファイル．サービス契約内訳番号が存在する場合
		else
		{
			if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
			{
				super.logPrint.printDebugLog("サービス契約内訳基点ファイル");
			}
			
			// 検索条件のパラメータを設定。
			String [] select053Param = {commonItem.getOpeDate(), svcKeiUcwkNo, commonItem.getOpeDate()};
			
			// サービス契約内訳検索処理の実行。
			executeKK_T_SVC_KEI_UCWK_KK_SELECT_053(select053Param);
			
			JBSbatCommonDBInterface select053Map = db_KK_T_SVC_KEI_UCWK.selectNext();
			
			if(select053Map != null)
			{
				// 検索結果から「サービス契約番号」を取得します。
				String svcKeiNo053 = JBSbatStringUtil.Rtrim(select053Map.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO)) ;
				
				if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
				{
					super.logPrint.printDebugLog("KK_SELECT_053(サービス契約番号)：" + svcKeiNo053);
				}
				
				// 検索条件のパラメータを設定。
				String [] select012Param = {svcKeiNo053, commonItem.getOpeDate()};
				
				// サービス契約内訳検索処理の実行。
				executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_012(select012Param);
				
				JBSbatCommonDBInterface select012Map = db_KK_T_KAISEN_TG_SVKEI.selectNext();
				
				if(select012Map != null)
				{
					// 検索結果から「サービス契約回線内訳番号」を取得します。
					String svcKeiKaisenUcwkNo012 = JBSbatStringUtil.Rtrim(select012Map.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO));
					
					if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
					{
						super.logPrint.printDebugLog("KK_SELECT_012(サービス契約回線内訳番号)：" + svcKeiKaisenUcwkNo012);
					}
					
					// 検索条件のパラメータを設定。
					String [] select017Param = {commonItem.getOpeDate(), commonItem.getOpeDate(), svcKeiKaisenUcwkNo012};
					
					// サービス契約内訳検索処理の実行。
					executeKK_T_SVKEI_KAISEN_UW_KK_SELECT_017(select017Param);
					
					// SQL実行結果取得用mapを生成（サービス契約回線内訳）
					JBSbatCommonDBInterface select017Map = new JBSbatCommonDBInterface(); 
					
					kjnYmdFlg = false;
					
					for(select017Map = db_KK_T_SVKEI_KAISEN_UW.selectNext(); null != select017Map ; select017Map = db_KK_T_SVKEI_KAISEN_UW.selectNext())
					{
						// 検索結果から「サービス契約番号」を取得します。
						String svcKeiNo017 = JBSbatStringUtil.Rtrim(select017Map.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
						
						if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
						{
							super.logPrint.printDebugLog("KK_SELECT_017(サービス契約番号)：" + svcKeiNo017);
						}
						
						for(int i = 0 ;i < kkifm030List.size() ; i++)
						{
							String svcKeiNoMap = kkifm030List.get(i).get(SVC_KEI_NO).toString();
							String kjnYmdMap = kkifm030List.get(i).get(KJN_YMD).toString();
							
							if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
							{
								super.logPrint.printDebugLog("SVC_KEI_NO :" + svcKeiNoMap);
								super.logPrint.printDebugLog("KJN_YMD    :" + kjnYmdMap);
								super.logPrint.printDebugLog("基準年月日 :" + kjnYmd);
							}
							
							if(svcKeiNoMap.equals(svcKeiNo017))
							{
								if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
								{
									super.logPrint.printDebugLog("同一回線内訳に紐づいているサービス契約番号：" + svcKeiNo017);
								}
								
								// ネットの開始日（基準日）
								if (0 == kjnYmdMap.length())
								{
									throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, new String[] { "ネットの開始日（基準日）" });
								}

								// 電話の開始日（基準日）
								if (0 == kjnYmd.length())
								{
									throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, new String[] { "電話の開始日（基準日）" });
								}
								
								// ネットの開始日（基準日）＞電話の開始日（基準日）の場合
								if(Integer.parseInt(kjnYmdMap) > Integer.parseInt(kjnYmd))
								{
									chKjnYmd = kjnYmdMap;
									
									if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
									{
										super.logPrint.printDebugLog("基準日の修正：" + kjnYmd + " -> " + chKjnYmd);
									}
									
									kjnYmdFlg = true;
								}
							}
						}
					}
				}
			}
			// サービス開始対象契約取得ファイルのファイル出力
			outputBean = createKkifm030(kjnYmdFlg);
		}
		
		if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
		{
			super.logPrint.printDebugLog("execute_END");
		}
		
		//出力共通電文を返却
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI_UCWK.close();
		db_KK_T_KAISEN_TG_SVKEI.close();
		db_KK_T_SVKEI_KAISEN_UW.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_053)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	サービス契約内訳番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVC_KEI_UCWK_KK_SELECT_053(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI_UCWK.selectBySqlDefine(paramList, KK_T_SVC_KEI_UCWK_KK_SELECT_053);
	}

	/**
	 * SQLKEY(KK_SELECT_012)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *		 	回線内訳使用開始年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_012(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KK_SELECT_012);
	}

	/**
	 * SQLKEY(KK_SELECT_017)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	回線内訳使用開始年月日
	 *		 	予約適用年月日
	 *		 	サービス契約回線内訳番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVKEI_KAISEN_UW_KK_SELECT_017(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_SVKEI_KAISEN_UW.selectBySqlDefine(paramList, KK_T_SVKEI_KAISEN_UW_KK_SELECT_017);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 
	 * 中間ファイルの読み込みを行います。
	 * 
	 * @param inMap 中間ファイルの値。
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void getKkifm049(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		
		sriYmd       = inMap.getString(JBSbatKKIFM049.SRI_YMD);						// 処理年月日
		svcKisSrsbCd = inMap.getString(JBSbatKKIFM049.SVC_KIS_SRSB_CD);				// サービス開始処理種別コード
		svcKisSrtiCd = inMap.getString(JBSbatKKIFM049.SVC_KIS_SRTI_CD);				// サービス開始処理単位コード
		svcKeiNo     = inMap.getString(JBSbatKKIFM049.SVC_KEI_NO);					// サービス契約番号
		svcKeiUcwkNo = inMap.getString(JBSbatKKIFM049.SVC_KEI_UCWK_NO);				// サービス契約内訳番号
		kjnYmd       = inMap.getString(JBSbatKKIFM049.KJN_YMD);						// 基準年月日
	}

	private void setKkifm049List(HashMap<String, Object> inputMap)
	{
		
		inputMap.put(SRI_YMD, sriYmd);						// 処理年月日
		inputMap.put(SVC_KIS_SRSB_CD, svcKisSrsbCd);		// サービス開始処理種別コード
		inputMap.put(SVC_KIS_SRTI_CD, svcKisSrtiCd);		// サービス開始処理単位コード
		inputMap.put(SVC_KEI_NO, svcKeiNo);					// サービス契約番号
		inputMap.put(SVC_KEI_UCWK_NO, svcKeiUcwkNo);		// サービス契約内訳番号
		inputMap.put(KJN_YMD, kjnYmd);						// 基準年月日
		
		kkifm030List.add(inputMap);
	}

	/**
	 * 
	 *  サービス開始対象契約取得ファイルの作成を行います。
	 * @param kjnYmdFlg 
	 *  
	 * @return outputBean JBSbatOutputItem
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private JBSbatOutputItem createKkifm030(boolean kjnYmdFlg) throws Exception
	{
		
		if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
		{
			super.logPrint.printDebugLog("kjnYmdFlg:" + kjnYmdFlg);
		}
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		//入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
		//項目を設定
		outmap.setString(JBSbatKKIFM030.SRI_YMD, sriYmd);							// 処理年月日
		outmap.setString(JBSbatKKIFM030.SVC_KIS_SRSB_CD, svcKisSrsbCd);				// サービス開始処理種別コード
		outmap.setString(JBSbatKKIFM030.SVC_KIS_SRTI_CD, svcKisSrtiCd);				// サービス開始処理単位コード
		outmap.setString(JBSbatKKIFM030.SVC_KEI_NO, svcKeiNo);						// サービス契約番号
		outmap.setString(JBSbatKKIFM030.SVC_KEI_UCWK_NO, svcKeiUcwkNo);				// サービス契約内訳番号
		if(!kjnYmdFlg)
		{
			outmap.setString(JBSbatKKIFM030.KJN_YMD, kjnYmd);						// 基準年月日
			outmap.setString(JBSbatKKIFM030.HNK_MAE_SVC_STA_YMD, kjnYmd);			// 変更前サービス開始年月日←基準日
		}
		else
		{
			// ネットの開始日（基準日）＞電話の開始日（基準日）の場合は
			// ネットの開始日（基準日）で電話の開始日（基準日）を置き換える。
			outmap.setString(JBSbatKKIFM030.KJN_YMD, chKjnYmd);						// 基準年月日
			outmap.setString(JBSbatKKIFM030.HNK_MAE_SVC_STA_YMD, chKjnYmd);			// 変更前サービス開始年月日←基準日
		}
		outmap.setString(JBSbatKKIFM030.HNK_MAE_SVC_CHRG_STAYMD, "");				// 変更前サービス課金開始年月日
		outmap.setString(JBSbatKKIFM030.HNK_ATO_SVC_STA_YMD, "");					// 変更後サービス開始年月日
		outmap.setString(JBSbatKKIFM030.HNK_ATO_SVC_CHRG_STAYMD, "");				// 変更後サービス課金開始年月日
		
		//出力フラグを設定
		outmap.setOutFlg(true);
		//出力共通電文に入出力インターフェースを設定する。
		outputBean.addOutMapList(outmap);
		//出力共通電文を返却
		return outputBean;
	}
}
