/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKKhnCsOpCnlMtchChk
*	ソースファイル名	：JBSbatKKKhnCsOpCnlMtchChk.java
*	作成者				：富士通　
*	作成日				：2012年02月17日
*＜機能概要＞
*　基本コース・オプションチャンネル組合せチェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/02/23   FJ)藤本	新規作成
*	v4.00.00	2012/07/24   FJ)神吉	【ANK-0531-00-00】TVオプションＣｈ重複チェック対応
*	v4.00.01	2012/12/27   FJ)団      【ST4-2012-0000147】性能改善
*	v4.00.02	2013/01/04   FJ)団      【ST4-2012-0000369】性能改善
*	v4.00.03	2013/01/08   FJ)古内    【ST4-2012-0000369】性能改善
*	v4.00.04	2013/03/19   FJ)柳      【IT1-2012-0000498】対応
*	v4.00.05	2013/03/28	 FJ)庭山	【ST4-2013-0000347】性能改善
*	v5.00.00	2013/05/01   FJ)団		【IT1-2013-0001109】品質向上
*	v5.00.01	2013/07/24   FJ)団		【】障害対応
*********************************************************************/
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 eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM018;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatKK_M_OP_SVC;
import eo.business.util.table.JBSbatKK_M_PCRS;
import eo.business.util.table.JBSbatKK_M_PCRS_OP_SVC;
import eo.business.util.table.JBSbatKK_T_IDO_RSV;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI_UCWK;
import eo.business.util.table.JBSbatZM_T_TAKNKIKI_WK;
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.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKKhnCsOpCnlMtchChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金コース＿オプションサービス)*/
	private static final String D_TBL_NAME_KK_M_PCRS_OP_SVC = "KK_M_PCRS_OP_SVC";

	/** テーブル(料金コース)*/
	private static final String D_TBL_NAME_KK_M_PCRS = "KK_M_PCRS";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";

	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_M_PCRS_OP_SVC_KK_SELECT_001 = "KK_SELECT_001";

	/** SQL定義キー(KK_SELECT_038)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_038 = "KK_SELECT_038";

	/** SQL定義キー(KK_SELECT_047)*/
	private static final String KK_T_KKTK_SVC_KEI_KK_SELECT_047 = "KK_SELECT_047";

	/** テーブルアクセスクラス(料金コース)*/
	private JBSbatSQLAccess db_KK_M_PCRS = null;
	
	/** テーブルアクセスクラス(料金コース＿オプションサービス)*/
	private JBSbatSQLAccess db_KK_M_PCRS_OP_SVC = null;

	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;

	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_M_PCRS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PCRS);
		db_KK_M_PCRS_OP_SVC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PCRS_OP_SVC);
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute_START");
		
		// 出力用クラスの生成
		JBSbatOutputItem out_item = new JBSbatOutputItem();
		
		// ■料金コース_オプションサービスの検索を行います。
		String[] param = {super.opeDate, super.opeDate};
		this.executeKK_M_PCRS_OP_SVC_KK_SELECT_001(param);
		
		// 検索結果より１件目を読み込みます。
		JBSbatCommonDBInterface pcrsOpSvcResult = db_KK_M_PCRS_OP_SVC.selectNext();
		if(null == pcrsOpSvcResult)
		{
			return out_item;
		}
		
		// 処理年月１日の設定
		String opeFirstD = super.opeDate.substring(0, 6) + "01";
		// 処理年月末日の設定
		String opeEndD = super.opeDate.substring(0, 6) + JBSbatDateUtil.getEndOfMonth(super.opeDate.substring(0, 6));
		
		// 料金コース_オプションサービス検索結果を格納するリストの初期化を行います。
		HashMap<String, ArrayList<String>> ucwkPcrsSbopSvcMap = new HashMap<String, ArrayList<String>>();
		// 料金コース検索結果を格納するリストの初期化を行います。
		HashMap<String, String> pcrsMap = new HashMap<String, String>();
		
		// 料金コース_オプションサービス検索結果分、繰り返します。
		while(pcrsOpSvcResult != null)
		{
			// 料金コースコード
			String pcrs_cd = JBSbatStringUtil.Rtrim(pcrsOpSvcResult.getString(JBSbatKK_M_PCRS_OP_SVC.PCRS_CD));
			// オプションサービスコード
			String op_svc_cd = JBSbatStringUtil.Rtrim(pcrsOpSvcResult.getString(JBSbatKK_M_PCRS_OP_SVC.OP_SVC_CD));
			
			// 料金コース_オプションサービス検索結果を料金コース単位のリストへ追加します。
			if (!ucwkPcrsSbopSvcMap.containsKey(pcrs_cd))
			{
				ucwkPcrsSbopSvcMap.put(pcrs_cd, new ArrayList<String>());
			}
			ucwkPcrsSbopSvcMap.get(pcrs_cd).add(op_svc_cd);
			
			// 次の料金コース_オプションサービス検索結果を読み込みます。
			pcrsOpSvcResult = db_KK_M_PCRS_OP_SVC.selectNext();
		}
		
		// オプションサービス契約取得のクエリーを取得
		String opSvcQuery = db_KK_T_OP_SVC_KEI.getSql(KK_T_OP_SVC_KEI_KK_SELECT_038);
		
		BufferedReader in_reader = null;
		String in_file_nm = commonItem.getFreeItem();
		
		try
		{
			// 入力ファイルクラスを生成します。
			in_reader = new BufferedReader(new InputStreamReader(new FileInputStream(in_file_nm)));
			
			// ファイルが終了するまで読込みを繰り返します
			while (in_reader.ready())
			{
				JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();
				String[] data = in_reader.readLine().split(",");
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO, JBSbatStringUtil.Rtrim(data[0].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_NO, JBSbatStringUtil.Rtrim(data[1].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.PCRS_CD, JBSbatStringUtil.Rtrim(data[2].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.PLAN_CHRG_STAYMD, JBSbatStringUtil.Rtrim(data[3].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.PLAN_CHRG_ENDYMD, JBSbatStringUtil.Rtrim(data[4].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.KEI_CNC_YMD, JBSbatStringUtil.Rtrim(data[5].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.PLAN_STAYMD, JBSbatStringUtil.Rtrim(data[6].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_CHRG_STAYMD, JBSbatStringUtil.Rtrim(data[7].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_STP_YMD, JBSbatStringUtil.Rtrim(data[8].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_STP_RLS_YMD, JBSbatStringUtil.Rtrim(data[9].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_PAUSE_YMD, JBSbatStringUtil.Rtrim(data[10].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_PAUSE_RLS_YMD, JBSbatStringUtil.Rtrim(data[11].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.PLAN_ENDYMD, JBSbatStringUtil.Rtrim(data[12].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_SVC_KEI_UCWK.SVC_DSL_YMD, JBSbatStringUtil.Rtrim(data[13].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_IDO_RSV.IDO_RSV_NO, JBSbatStringUtil.Rtrim(data[14].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_IDO_RSV.RSV_APLY_YMD, JBSbatStringUtil.Rtrim(data[15].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_IDO_RSV.IDO_DIV, JBSbatStringUtil.Rtrim(data[16].replace("\"", "")));
				inMap.setValue(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD, JBSbatStringUtil.Rtrim(data[17].replace("\"", "")));
				
				if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
				{
					super.logPrint.printDebugLog("-->サービス契約内訳番号：" + inMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO));
				}
				
				// 期間対象外データの場合
				if(!this.checkPrdSvcKeiUcwk(inMap, opeFirstD, opeEndD))
				{
					// エラーとせずにログを出力し、次のサービス契約内訳で期間のチェックを行います。
					super.logPrint.printDebugLog("サービス契約内訳▼期間対象外データ：" 
							+ JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO)));
					continue;
				}
				
				String pcrs_cd_ucwk = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PCRS_CD));
				
				ArrayList<String> pcrsSbopSvcList = ucwkPcrsSbopSvcMap.get(pcrs_cd_ucwk);
				if (pcrsSbopSvcList == null || pcrsSbopSvcList.size() == 0)
				{
					continue;
				}
				
				// 料金コース名の取得
				if (!pcrsMap.containsKey(pcrs_cd_ucwk))
				{
					String[] pcrs_param = {pcrs_cd_ucwk, JBSbatStringUtil.Rtrim(data[18].replace("\"", ""))};
					
					JBSbatCommonDBInterface outMap = executeKK_M_PCRS(pcrs_param);
					if (outMap == null)
					{
						pcrsMap.put(pcrs_cd_ucwk, "");
					}
					else
					{
						pcrsMap.put(pcrs_cd_ucwk, JBSbatStringUtil.Rtrim(outMap.getString(JBSbatKK_M_PCRS.PCRS_NM)));
					}
				}
				inMap.setValue(JBSbatKK_M_PCRS.PCRS_NM, pcrsMap.get(pcrs_cd_ucwk));
				
				// サービス契約内訳検索結果よりサービス契約内訳番号を取得します。
				String svc_kei_ucwk_no = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO));
				
				StringBuilder opSvcBindList = new StringBuilder();
				// バイント変数のリストを生成します
				JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
				paramList.setValue(super.opeDate);
				paramList.setValue(super.opeDate);
				paramList.setValue(super.opeDate);
				paramList.setValue(super.opeDate);
				paramList.setValue(svc_kei_ucwk_no);
				for (int p = 0; p < pcrsSbopSvcList.size(); p++)
				{
					String op_svc_cd = JBSbatStringUtil.Rtrim(pcrsSbopSvcList.get(p));
					if (opSvcBindList.length() > 0)
					{
						opSvcBindList.append(',');
					}
					opSvcBindList.append('?');
					paramList.setValue(op_svc_cd);
				}
				paramList.setValue(opeEndD);
				paramList.setValue(opeFirstD);
				paramList.setValue(super.opeDate);
				
				// 対象となるオプションサービス契約をＩＮ句にて検索する。
				db_KK_T_OP_SVC_KEI.setSqlMap(KK_T_OP_SVC_KEI_KK_SELECT_038, 
						                     opSvcQuery.replace("KK0351.OP_SVC_CD = ? AND", String.format("KK0351.OP_SVC_CD IN (%s) AND", opSvcBindList)));
				
				db_KK_T_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_KK_SELECT_038);
				
				// 検索結果がなかった場合
				JBSbatCommonDBInterface opSvcKeiResult = db_KK_T_OP_SVC_KEI.selectNext();
				if(null == opSvcKeiResult)
				{
					// エラーとせずにログを出力し、次のオプションサービスコードでオプションサービス契約の検索を行います。
					super.logPrint.printDebugLog("オプションサービス契約検索結果なし。サービス契約内訳番号：" + svc_kei_ucwk_no);
					continue;
				}
				
				// ****** ＳＴＢＩＤ及びＣＣＡＳの機器製造番号を取得 ******
				// 宅内機器STBIDの初期化を行います。
				String stb_id = "";
				
				// 宅内機器種別コードがC-CAS（C0）の機器製造番号の初期化を行います。
				String kiki_seizo_no = "";
				// ■機器提供サービス契約の検索を行います。
				String[] paramKktkSvcKei = {svc_kei_ucwk_no, super.opeDate};
				this.executeKK_T_KKTK_SVC_KEI_KK_SELECT_047(paramKktkSvcKei);
				
				// 検索結果がなかった場合はエラーとせずにログを出力します。
				JBSbatCommonDBInterface kktkSvckeiResult = db_KK_T_KKTK_SVC_KEI.selectNext();
				if(null == kktkSvckeiResult)
				{
					super.logPrint.printDebugLog("機器提供サービス契約検索結果なし。サービス契約内訳番号：" + svc_kei_ucwk_no);
				}
				else
				{
					// 検索結果分、ループします。
					while(kktkSvckeiResult != null)
					{
						// 宅内機器種別コードがSTB（A0）のレコードの宅内機器型式コードを元に宅内機器検索処理を行います。
						if("A0".equals(JBSbatStringUtil.Rtrim(kktkSvckeiResult.getString(JBSbatKK_T_KKTK_SVC_KEI.TAKNKIKI_SBT_CD))))
						{
							// 宅内機器ワークより該当するSTBIDの取得を行います。
							stb_id = JBSbatStringUtil.Rtrim(kktkSvckeiResult.getString(JBSbatZM_T_TAKNKIKI_WK.STB_ID));
						}
						else
						{
							// 宅内機器種別コードがC-CAS（C0）の機器製造番号をセットします。
							kiki_seizo_no = kktkSvckeiResult.getString(JBSbatKK_T_KKTK_SVC_KEI.KIKI_SEIZO_NO);
						}
						
						// 次の機器提供契約検索結果を読み込みます。
						kktkSvckeiResult = db_KK_T_KKTK_SVC_KEI.selectNext();
					}
				}
				
				// オプションサービス契約内訳検索結果分、繰り返し期間のチェックを行います。
				while(opSvcKeiResult != null)
				{
					if(super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG))
					{
						super.logPrint.printDebugLog("---->オプションサービス契約番号：" + opSvcKeiResult.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO));
					}
					
					// 期間対象外データの場合
					if(!this.checkPrdOpSvcKei(opSvcKeiResult, opeFirstD, opeEndD))
					{
						// エラーとせずにログを出力し、次のオプションサービス契約で期間のチェックを行います。
						super.logPrint.printDebugLog("オプションサービス契約▼期間対象外データ：" + opSvcKeiResult.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO));
					}
					else
					{
						// 検索結果を元に出力ファイルを作成します。
						JBSbatServiceInterfaceMap out_map = this.getOutMapData(inMap, opSvcKeiResult, stb_id, kiki_seizo_no);
						out_map.setOutFlg(true);
						out_item.addOutMapList(out_map);
					}
					
					// 次のサービス契約内訳検索結果を読み込みます。
					opSvcKeiResult = db_KK_T_OP_SVC_KEI.selectNext();
				}
			}
			in_reader.close();
		}
		catch(IOException ioe)
		{
			// ファイル未存在
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0020CE, new String[]{in_file_nm});
		}
		finally
		{
			if (in_reader != null)
			{
				in_reader.close();
			}
		}
		
		super.logPrint.printDebugLog("execute_END");
		return out_item;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_M_PCRS.close();
		db_KK_M_PCRS_OP_SVC.close();
		db_KK_T_OP_SVC_KEI.close();
		db_KK_T_KKTK_SVC_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * SQLKEY(KK_SELECT_001)で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_M_PCRS_OP_SVC_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_M_PCRS_OP_SVC.selectBySqlDefine(paramList, KK_M_PCRS_OP_SVC_KK_SELECT_001);
	}

	/**
	 * SQLKEY(KK_SELECT_047)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SVC_KEI_UCWK_NO
	 *		 	RSV_APLY_YMD
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KKTK_SVC_KEI_KK_SELECT_047(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_KK_SELECT_047);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	PCRS_CD
	 *		 	GENE_ADD_DTM
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_M_PCRS(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("PCRS_CD", whereParam[0]);
		whereMap.setValue("GENE_ADD_DTM", whereParam[1]);

		// DBアクセスを実行します
		return db_KK_M_PCRS.selectByPrimaryKeys(whereMap);
	}

	/**
	 * サービス契約内訳の期間のチェック処理を行います。<br>
	 * 
	 * @param resultMap サービス契約内訳の検索結果
	 * @return boolean checkPrd()の結果
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean checkPrdSvcKeiUcwk(JBSbatCommonDBInterface resultMap, String opeFirstD, String opeEndD) throws Exception
	{
		return this.checkPrd(resultMap, opeFirstD, opeEndD, 0);
	}
	
	/**
	 * オプションサービス契約の期間のチェック処理を行います。<br>
	 * 
	 * @param resultMap オプションサービス契約の検索結果
	 * @return boolean checkPrd()の結果
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean checkPrdOpSvcKei(JBSbatCommonDBInterface resultMap, String opeFirstD, String opeEndD) throws Exception
	{
		return this.checkPrd(resultMap, opeFirstD, opeEndD, 1);
	}
	
	/**
	 * 期間のチェック処理を行います。<br>
	 * 
	 * @param resultMap サービス契約内訳またはオプションサービス契約の検索結果
	 * @param check 0：サービス契約内訳　1：オプションサービス契約
	 * @return boolean true：チェックOK　false：チェックNG
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean checkPrd(JBSbatCommonDBInterface resultMap, String opeFirstD, String opeEndD, int check) throws Exception
	{
		super.logPrint.printDebugLog("checkPrd_START：" + check);
		
		// ワーク用日付の初期化
		String plan_sta_ymd = "";
		String plan_endymd = "";
		String svc_pause_ymd = "";
		String svc_pause_rls_ymd = "";
		String plan_chrg_staymd = "";
		String plan_chrg_endymd = "";
		String svc_stp_ymd = "";
		String svc_stp_rls_ymd = "";
		
		// 検索結果がサービス契約内訳の場合
		if(0 == check)
		{
			// プラン開始年月日
			plan_sta_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_STAYMD));
			// プラン終了年月日
			plan_endymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_ENDYMD));
			// サービス休止年月日
			svc_pause_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_PAUSE_YMD));
			// サービス休止解除年月日
			svc_pause_rls_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_PAUSE_RLS_YMD));
			// プラン課金開始年月日
			plan_chrg_staymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_CHRG_STAYMD));
			// プラン課金終了年月日
			plan_chrg_endymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_CHRG_ENDYMD));
			// サービス停止年月日
			svc_stp_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_STP_YMD));
			// サービス停止解除年月日
			svc_stp_rls_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_STP_RLS_YMD));

		}
		else
		{
			// プラン開始年月日
			plan_sta_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_STAYMD));
			// プラン終了年月日
			plan_endymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_ENDYMD));
			// サービス休止年月日
			svc_pause_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_PAUSE_YMD));
			// サービス休止解除年月日
			svc_pause_rls_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_PAUSE_RLS_YMD));
			// プラン課金開始年月日
			plan_chrg_staymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_CHRG_STAYMD));
			// プラン課金終了年月日
			plan_chrg_endymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_CHRG_ENDYMD));
			// サービス停止年月日
			svc_stp_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_STP_YMD));
			// サービス停止解除年月日
			svc_stp_rls_ymd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_STP_RLS_YMD));
		}
		
		// プラン課金開始年月日＞処理年月の末日  OR  プラン課金終了年月日＜処理年月の1日
		if((plan_chrg_staymd.compareTo(opeEndD) > 0 || plan_chrg_endymd.compareTo(opeFirstD) < 0))
		{
			super.logPrint.printDebugLog("checkPrd_END▼プラン課金開始日：" + plan_chrg_staymd + "、プラン課金終了日：" + plan_chrg_endymd);
			return false;
		}
		// 検索結果がサービス契約内訳の場合
		if(0 == check)
		{
			// サービス休止年月日が設定されている かつ サービス休止年月日＜＝処理年月の１日 かつ サービス休止解除年月日が未設定
			if(!"".equals(svc_pause_ymd) && svc_pause_ymd.compareTo(opeFirstD) <= 0 && "".equals(svc_pause_rls_ymd))
			{
				super.logPrint.printDebugLog("checkPrd_END▼サービス休止年月日：" + svc_pause_ymd + "、サービス休止解除年月日：" + svc_pause_rls_ymd);
				return false;
			}
			
			// 異動予約を取得している場合
			String idoRsvNo = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_IDO_RSV.IDO_RSV_NO));
			if(!"".equals(idoRsvNo))
			{
				// サービス休止年月日が設定されている かつ サービス休止年月日＜＝処理年月の１日 かつ 異動区分が"00025:休止変更・予約取消" かつ 異動予約状態コードIN（"00:未反映","03:予約手続中"）
				String idoDiv = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_IDO_RSV.IDO_DIV));
				String idoRsvStatCd = JBSbatStringUtil.Rtrim(resultMap.getString(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD));
				if(!"".equals(svc_pause_ymd) && svc_pause_ymd.compareTo(opeFirstD) <= 0 && "00025".equals(idoDiv) && ("00".equals(idoRsvStatCd) || "03".equals(idoRsvStatCd)))
				{
					super.logPrint.printDebugLog("checkPrd_END▼サービス休止年月日：" + svc_pause_ymd + "、異動区分：" + idoDiv + "、異動予約状態コード：" + idoRsvStatCd);
					return false;
				}
				
			}
			
			// サービス停止年月日が設定されている かつ サービス停止年月日＜＝処理年月の１日 かつ サービス停止解除年月日が未設定
			if(!"".equals(svc_stp_ymd) && svc_stp_ymd.compareTo(opeFirstD) <= 0 && "".equals(svc_stp_rls_ymd))
			{
				super.logPrint.printDebugLog("checkPrd_END▼サービス停止年月日：" + svc_stp_ymd + "、サービス停止解除年月日：" + svc_stp_rls_ymd);
				return false;
			}
			
			// サービス停止年月日が設定されている かつ サービス停止年月日＜＝処理年月の１日 かつ サービス停止解除年月日＞処理年月の末日
			if(!"".equals(svc_stp_ymd) && svc_stp_ymd.compareTo(opeFirstD) <= 0 && svc_stp_rls_ymd.compareTo(opeEndD) > 0)
			{
				super.logPrint.printDebugLog("checkPrd_END▼サービス停止年月日：" + svc_stp_ymd + "、サービス停止解除年月日：" + svc_stp_rls_ymd);
				return false;
			}
		}
		super.logPrint.printDebugLog("checkPrd_END");
		return true;
	}
	
	/**
	 * 検索結果を元に出力ファイルに転記し、返却します。<br>
	 * 
	 * @param svcKeiUcwkMap サービス契約内訳検索結果
	 * @param opSvcKeiMap オプションサービス契約検索結果
	 * @param stb_id 宅内機器種別コードがSTB（A0）の宅内機器．STBID
	 * @param kiki_seizo_no 宅内機器種別コードがC-CAS（C0）の機器製造番号
	 * @return out_map 出力ファイルクラスｓ
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap getOutMapData(JBSbatCommonDBInterface svcKeiUcwkMap,
													 JBSbatCommonDBInterface opSvcKeiMap,
													 String stb_id,
													 String kiki_seizo_no) throws Exception
	{
		// 出力ファイルクラスの生成を行います。
		JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();
		
		// チェック種別 → 固定値をセット。
		out_map.set(JBSbatKKIFM018.CHK_SBT, "基本コース・オプションチャンネル組合せチェック");
		// 処理年月 → バッチ運用日の年月をセット。
		out_map.set(JBSbatKKIFM018.SRI_YM, super.opeDate.substring(0, 4) + "年" + super.opeDate.substring(4, 6) + "月");
		// お客さまID → サービス契約内訳．サービス契約番号をセット。
		out_map.set(JBSbatKKIFM018.CUST_ID, JBSbatStringUtil.Rtrim(svcKeiUcwkMap.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_NO)));
		// お客様名 → お客様．お客様名を45桁にしてセット。
		String cust_nm = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatCK_T_CUST.CUST_NM));
		if(15 < cust_nm.length())
		{
			out_map.set(JBSbatKKIFM018.CUST_NM, cust_nm.substring(0, 15));
		}
		else
		{
			out_map.set(JBSbatKKIFM018.CUST_NM, cust_nm);
		}
		// ＳＴＢ−ＩＤ → 宅内機器検索結果．STBIDをセット。
		out_map.set(JBSbatKKIFM018.STB_ID, stb_id);
		// Ｃ−ＣＡＳ−ＩＤ → 機器提供サービス契約．宅内機器種別コードがC-CAS（C0）の機器製造番号をセット。
		out_map.set(JBSbatKKIFM018.C_CASID, kiki_seizo_no);
		// 基本料金コースコード → サービス契約内訳．料金コースコードをセット。
		out_map.set(JBSbatKKIFM018.KIHON_PCRS_CD, JBSbatStringUtil.Rtrim(svcKeiUcwkMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PCRS_CD)));
		// 基本料金コース名称 → 料金コース．料金コース名を設定。
		String pcrsNm = JBSbatStringUtil.Rtrim(svcKeiUcwkMap.getString(JBSbatKK_M_PCRS.PCRS_NM));
		if(15 < pcrsNm.length())
		{
			out_map.set(JBSbatKKIFM018.KIHON_PCRS_NAME, pcrsNm.substring(0, 15));
		}
		else
		{
			out_map.set(JBSbatKKIFM018.KIHON_PCRS_NAME, pcrsNm);
		}
		
		// 基本契約開始日 → サービス契約内訳．プラン開始年月日をセット。
		String planStaYMD = JBSbatStringUtil.Rtrim(svcKeiUcwkMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_STAYMD));
		if (!"".equals(planStaYMD) && planStaYMD.length() >=8)
		{
			out_map.set(JBSbatKKIFM018.KIHON_KEI_STAYMD, planStaYMD.substring(0, 4) + "/" + planStaYMD.substring(4, 6) + "/" + planStaYMD.substring(6, 8));
		}
		// 基本契約終了日 → サービス契約内訳．プラン終了年月日をセット。
		String planEndYMD = JBSbatStringUtil.Rtrim(svcKeiUcwkMap.getString(JBSbatKK_T_SVC_KEI_UCWK.PLAN_ENDYMD));
		if (!"".equals(planEndYMD) && planEndYMD.length() >=8)
		{
			out_map.set(JBSbatKKIFM018.KIHON_KEI_ENDYMD, planEndYMD.substring(0, 4) + "/" + planEndYMD.substring(4, 6) + "/" + planEndYMD.substring(6, 8));
		}
		// オプションサービスコード → オプションサービス契約．オプションサービスコードをセット。
		out_map.set(JBSbatKKIFM018.OP_SVC_CD, JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_CD)));
		// オプションサービス名 → オプションサービス．オプションサービス名をセット。
		String opSvcNm = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_M_OP_SVC.OP_SVC_NM));
		if(15 < opSvcNm.length())
		{
			out_map.set(JBSbatKKIFM018.OP_SVC_NAME, opSvcNm.substring(0, 15));
		}
		else
		{
			out_map.set(JBSbatKKIFM018.OP_SVC_NAME, opSvcNm);
		}
		// オプションサービス契約開始日 → オプションサービス契約．プラン開始年月日をセット。
		String planStaYMD_op = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_STAYMD));
		if (!"".equals(planStaYMD_op) && planStaYMD_op.length() >=8)
		{
			out_map.set(JBSbatKKIFM018.OP_SVC_KEI_STAYMD, planStaYMD_op.substring(0, 4) + "/" + planStaYMD_op.substring(4, 6) + "/" + planStaYMD_op.substring(6, 8));
		}
		// オプションサービス契約終了日 → オプションサービス契約．プラン終了年月日をセット。
		String planEndYMD_op = JBSbatStringUtil.Rtrim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.PLAN_ENDYMD));
		if (!"".equals(planEndYMD_op) && planEndYMD_op.length() >=8)
		{
			out_map.set(JBSbatKKIFM018.OP_SVC_KEI_ENDYMD, planEndYMD_op.substring(0, 4) + "/" + planEndYMD_op.substring(4, 6) + "/" + planEndYMD_op.substring(6, 8));
		}
		// エラー内容詳細 → 固定値をセット。
		out_map.set(JBSbatKKIFM018.ERR_NAIYO_DTAIL, "基本コースに含まれるオプションチャンネル契約が存在します");
		
		return out_map;
	}
}
