/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKVCheckKicjknSurplus
*	ソースファイル名	：JBSbatKVCheckKicjknSurplus.java
*	作成者				：富士通　
*	作成日				：2013年05月31日
*＜機能概要＞
*　一時金過剰生成チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/05/31   富士通		新規作成
*	v5.00.00	2013/08/22	 FJ)竹之下	【OM-2013-0000397 】メッセージ変更
*	v5.00.00	2013/09/18	 FJ)竹之下	【OM-2013-0002073 】
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKVIFM007;
import eo.business.util.table.JBSbatKK_T_ADCHG_DTL;
import eo.business.util.table.JBSbatKK_T_KAISEN_TG_SVKEI;
import eo.business.util.table.JBSbatKK_T_KICJKN;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKV_M_IDVB_ICJKN_CRJK;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKVCheckKicjknSurplus extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(契約一時金)*/
	private static final String D_TBL_NAME_KK_T_KICJKN = "KK_T_KICJKN";

	/** テーブル(進捗)*/
	private static final String D_TBL_NAME_KK_T_PRG = "KK_T_PRG";

	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	/** テーブル(料金グループ)*/
	private static final String D_TBL_NAME_KK_M_PRC_GRP = "KK_M_PRC_GRP";
	/** テーブル(住所変更明細)*/
	private static final String D_TBL_NAME_KK_T_ADCHG_DTL = "KK_T_ADCHG_DTL";

	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(異動区分別一時金生成条件)*/
	private static final String D_TBL_NAME_KV_M_IDVB_ICJKN_CRJK  = "KV_M_IDVB_ICJKN_CRJK";
	/** テーブル(一時支払料金マスタ)*/
	private static final String D_TBL_KK_M_TMP_PAY_PRC  = "KK_M_TMP_PAY_PRC";

	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** SQL定義キー(KV_SELECT_002)*/
	private static final String KK_T_KICJKN_KV_SELECT_002 = "KV_SELECT_002";

	/** SQL定義キー(KV_SELECT_004)*/
	private static final String KK_T_PRG_KV_SELECT_004 = "KV_SELECT_004";

	/** SQL定義キー(KV_SELECT_006)*/
	private static final String KK_T_SVC_KEI_KV_SELECT_007 = "KV_SELECT_007";

	/** SQL定義キー(KV_SELECT_010)*/
	private static final String KV_M_IDVB_ICJKN_CRJK_KV_SELECT_002 = "KV_SELECT_002";
	/** SQL定義キー(KV_SELECT_002)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KV_SELECT_002 = "KV_SELECT_002";

	/** SQL定義キー(KV_SELECT_003)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KV_SELECT_003 = "KV_SELECT_003";
	/** SQL定義キー(KV_SELECT_002)*/
	private static final String KK_T_KAKINS_KV_SELECT_002 = "KV_SELECT_002";
	/** SQL定義キー(KV_SELECT_001)*/
	private static final String KK_T_ADCHG_DTL_KV_SELECT_001 = "KV_SELECT_001";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(契約一時金)*/
	private JBSbatSQLAccess db_KK_T_KICJKN = null;

	/** テーブルアクセスクラス(進捗)*/
	private JBSbatSQLAccess db_KK_T_PRG = null;

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	/** テーブルアクセスクラス(異動区分別一時金生成条件)*/
	private JBSbatSQLAccess db_KV_M_IDVB_ICJKN_CRJK = null;
	/** テーブルアクセスクラス(料金グループ)*/
	private JBSbatSQLAccess db_KK_M_PRC_GRP = null;
	/** テーブルアクセスクラス(回線対象サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI = null;
	/** テーブルアクセスクラス(一時支払料金)*/
	private JBSbatSQLAccess db_KK_M_TMP_PAY_PRC = null;
	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;
	/** テーブルアクセスクラス(住所変更明細)*/
	private JBSbatSQLAccess db_KK_T_ADCHG_DTL = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** 契約一時金データ */
	private JBSbatCommonDBInterface KicjknData = null;
	/** 条件マスタリスト */
	private ArrayList<JBSbatCommonDBInterface> jknMstDatLst = null;
	/** 条件マスタ */
	private JBSbatCommonDBInterface jknMstData = null;
	/** 進捗データ */
	private JBSbatCommonDBInterface prgData = null;

	/** 複数データ格納用リスト */
	private ArrayList<JBSbatCommonDBInterface> dataLst =
		new ArrayList<JBSbatCommonDBInterface>();
	/** FREE項目から取得した出力モード */
	private String outMode = null;
	/** FREE項目から取得した開始日 */
	private String prmStartDay = null;
	/** FREE項目から取得した終了日 */
	private String prmEndDay = null;
	/** サービス契約番号 */
	private String svckNo = "";
	/** 一時支払料金番号 */
	private String tmpPayNo = "";
	/** 異動区分(条件マスタ) */
	private String idoKbn = "";
	/** バンドル有無 */
	private String bndlUm = "";
	/** 料金プランCD */
	private String planCd = "";
	/** 料金プラン名 */
	private String planNm = "";
	/** 照査年月日 */
	private String shosaYmd = "";

	/** 出力共通電文 */
	JBSbatOutputItem outputBean = new JBSbatOutputItem();
	/** 料金グループ該当フラグ */
	private boolean PrcGrpFlg = false;
	/** 初回読込フラグ */
	private boolean firstFlg = true;
	/** 不整合DB名 */
	private String fuseigoDbName = "";
	/** マスタ存在フラグ */
	private boolean mst = false;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// フリー項目を分割して日付を取得する。
		String[] freeItemArray = commonItem.getFreeItem().split("@");
		outMode = freeItemArray[0];
		prmStartDay = freeItemArray[1];
		prmEndDay = freeItemArray[2];
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KICJKN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KICJKN);
		db_KK_T_PRG = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_PRG);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_M_PRC_GRP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PRC_GRP);
		db_KK_T_KAISEN_TG_SVKEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_KV_M_IDVB_ICJKN_CRJK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KV_M_IDVB_ICJKN_CRJK);
		db_KK_M_TMP_PAY_PRC = new JBSbatSQLAccess(commonItem, D_TBL_KK_M_TMP_PAY_PRC);
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_KK_T_ADCHG_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ADCHG_DTL);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
	try {
			set();		//ヘッダー情報セット判定
			//契約一時金
			if(!getKicjknInfo())
			{
				super.logPrint.printDebugLog(
						"契約一時金なし 期間 " + prmStartDay + " 〜 " + prmEndDay);
				return outputBean;		//１件もない
			}
			out:for(JBSbatCommonDBInterface db : dataLst)
			{
				setIni();
				svckNo = cnvNullToEmp(db.getString(JBSbatKK_T_KICJKN.SVC_KEI_NO));
				tmpPayNo = cnvNullToEmp(db.getString(JBSbatKK_T_KICJKN.TMP_PAY_PRC_NO));
				KicjknData = db;

				if(!checkSvckNo(db))	//サービス契約番号の存在チェック
				{
					outputBean.addOutMapList(setOutInfo("1"));	//調査対象
					continue out;
				}
				if(!getKsyInfo())	//検証用データ(条件マスタ)取得
				{
					if(!mst)
					{
						if("3".equals(outMode))
						{
							outputBean.addOutMapList(setOutInfo("3"));	//対象外
						}
						continue out;
					}else if(prgData == null)
					{
						outputBean.addOutMapList(setOutInfo("1"));	//調査対象
						continue out;
					}
				}

				//サービス契約回線対象内訳番号を取得後、バンドル有無取得(一時金生成チェックと同)
				getBunDlInfo(getKaisnTgLst());
				//住所変更明細 サービス契約異動種別CDが[3]かチェック
				String cd = checkSvcKeiIdoSbtCd();

				if(!check(cd))
				{
					outputBean.addOutMapList(setOutInfo("1"));	//調査対象
					continue out;
				}
				if("2".equals(outMode) || "3".equals(outMode))
				{
					outputBean.addOutMapList(setOutInfo("2"));	//正常
				}
			}

		} catch (Exception e) {
			super.logPrint.printBusinessErrorLog("EKKB0960AI", new String[]{
					"info：" + e + " " + svckNo + " " + idoKbn
					+ " " + getStaCkInfo(e)});
		}
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KICJKN.close();
		db_KK_T_PRG.close();
		db_KK_T_SVC_KEI.close();
		db_KK_M_PRC_GRP.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_KV_M_IDVB_ICJKN_CRJK.close();
		db_KK_M_TMP_PAY_PRC.close();
		db_KK_T_KAKINS.close();
		db_KK_T_ADCHG_DTL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
		super.logPrint.printDebugLog("terminal_END");
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KV_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_T_KICJKN_KV_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KICJKN.selectBySqlDefine(paramList, KK_T_KICJKN_KV_SELECT_002);
	}

	/**
	 * SQLKEY(KV_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_T_PRG_KV_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_PRG.selectBySqlDefine(paramList, KK_T_PRG_KV_SELECT_004);
	}

	/**
	 * SQLKEY(KV_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_T_SVC_KEI_KV_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KV_SELECT_007);
	}
	/**
	 * SQLKEY(KV_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_PRC_GRP_KV_SELECT_001(Object[] param) throws Exception
//	{
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(param[0].toString());
//
//		// DBアクセスを実行します
//		db_KK_M_PRC_GRP.selectBySqlDefine(paramList, KK_M_PRC_GRP_KV_SELECT_001);
//	}
	/**
	 * SQLKEY(KK_SELECT_005)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
//	private void executeZM_M_CD_NM_KANRI_KV_SELECT_001(Object[] param) throws Exception
//	{
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(param[0].toString());
//		paramList.setValue(param[1].toString());
//		paramList.setValue(param[2].toString());
//		paramList.setValue(param[3].toString());
//		// DBアクセスを実行します
//		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_KV_SELECT_001);
//	}
	//マスタ
	private void executeKV_M_IDVB_ICJKN_CRJK_KV_SELECT_002(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_KV_M_IDVB_ICJKN_CRJK.selectBySqlDefine(paramList, KV_M_IDVB_ICJKN_CRJK_KV_SELECT_002);
	}
	
	/**
	 * SQLKEY(KV_SELECT_002)で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_KV_SELECT_002(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_KV_SELECT_002);
	}

	/**
	 * SQLKEY(KV_SELECT_003)で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_KV_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KV_SELECT_003);
	}

	//課金先から請求契約番号の検索
	private void executeKK_T_KAKINS_KV_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_KV_SELECT_002);
	}
	/**
	 * SQLKEY(KV_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_T_ADCHG_DTL_KV_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_ADCHG_DTL.selectBySqlDefine(paramList, KK_T_ADCHG_DTL_KV_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	//出力ファイル情報をセット
	private JBSbatServiceInterfaceMap setOutInfo(String rslt) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.set(JBSbatKVIFM007.SVC_KEI_NO, svckNo);
		outMap.set(JBSbatKVIFM007.TMP_PAY_PRC_NO, 
				KicjknData.getString(JBSbatKK_T_KICJKN.TMP_PAY_PRC_NO));
		//一時支払金名称
		outMap.set(JBSbatKVIFM007.TMP_PAY_PRC_NAME, KicjknData.getString("TMP_NM"));
		//請求契約番号
		outMap.setString(JBSbatKVIFM007.SEIKY_KEI_NO, getSeiKyukNo());

		//新マスタのIDO_DIV
		if(null != jknMstData)
		{
			outMap.set(JBSbatKVIFM007.IDO_DIV, 
					jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.IDO_DIV));
			outMap.set(JBSbatKVIFM007.IDO_DIV_NM, jknMstData.getString("IDO_DIV_NM"));

			//マスタに該当なければ空白を上書き
			if(!PrcGrpFlg)
			{
				outMap.set(JBSbatKVIFM007.PRGP_CD_MST, "");
				outMap.set(JBSbatKVIFM007.PRGP_NM_MST, "");
			}else
			{
				//最初に取得した新マスタから↓
				outMap.set(JBSbatKVIFM007.PRGP_CD_MST,  cnvNullToEmp(
						jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD)));
				outMap.set(JBSbatKVIFM007.PRGP_NM_MST, cnvNullToEmp(
						jknMstData.getString("PRC_GRP_NM")));
			}
		}else
		{
			outMap.set(JBSbatKVIFM007.IDO_DIV, "");
			outMap.set(JBSbatKVIFM007.IDO_DIV_NM, "");
			outMap.set(JBSbatKVIFM007.PRGP_CD_MST, "");
			outMap.set(JBSbatKVIFM007.PRGP_NM_MST, "");
		}
		//更新運用日を出力
		outMap.set(JBSbatKVIFM007.KICJKN_ADD_UNYO_YMD, 
				KicjknData.getString(JBSbatKK_T_KICJKN.UPD_UNYO_YMD));

		//契約一時金のサービス契約番号から取得したサービス契約から
		outMap.set(JBSbatKVIFM007.PPLAN_CD_KICJKN, planCd);
//				KicjknData.getString("svcPrcGrpCd"));	//	プランCD？
		outMap.set(JBSbatKVIFM007.PPLAN_NM_KICJKN, planNm);
		outMap.set(JBSbatKVIFM007.SHOSA_YMD, shosaYmd);
		outMap.set(JBSbatKVIFM007.BUNDLE_UM, bndlUm);		//バンドル有無
		outMap.set(JBSbatKVIFM007.CHOSA_TG_DIV, rslt);
		outMap.set(JBSbatKVIFM007.CHOSA_TG_DIV_NM, cnvChosaDiv(rslt) + fuseigoDbName);
		outMap.setOutFlg(true);
		return outMap;
	}
	//検証用データ取得
	private boolean getKsyInfo() throws Exception
	{
		boolean rslt = true;

		//異動区分〜条件
		if(!getJoken())
		{
			super.logPrint.printDebugLog(svckNo + " 異動区分:" + idoKbn +
					" 異動区分別一時金生成条件なし 一時支払番号:" + tmpPayNo);
			return false;
		}

		for(JBSbatCommonDBInterface jkn :jknMstDatLst)
		{
			fuseigoDbName = "";
			//進捗を取得するまで (条件マスタ該当分ループ)
			if(getPrgInfo(jkn))
			{
				jknMstData = jkn;
				//サービス契約
				if(getSvcInfo())
				{
					if(checkPrcGrpCd()) //料金グループCD比較
					{
						PrcGrpFlg = true;
						break;
					}
				}
			}
		}
		if(null == prgData || "0".equals(prgData.getString("CNT")))
		{
			fuseigoDbName = " 進捗";
			return false;
		}
		if(!PrcGrpFlg)
		{
			super.logPrint.printDebugLog(
					"料金グループCD不一致 マスタ:サービス契約 " 
					+jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.IDVB_ICJKN_CRJK_NO) 
					+  " " +  jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD) + " "
					+ KicjknData.getString("svcPrcGrpCd") + 
					" " + svckNo + " 一時金支払番号:" + tmpPayNo + " 異動区分:" + idoKbn);
		}
		return rslt;
	}

	//契約一時金・検証用〜区分 取得
	private boolean getKicjknInfo() throws Exception
	{
		boolean rslt = true;
		String[] param = {prmStartDay, prmEndDay};//開始年月日、終了年月日
		executeKK_T_KICJKN_KV_SELECT_002(param);
		JBSbatCommonDBInterface dataMap = db_KK_T_KICJKN.selectNext();

		if(null == dataMap)
		{
			return false;
		}

		while(null != dataMap)
		{
			dataLst.add(dataMap);
			dataMap = db_KK_T_KICJKN.selectNext();
		}
		super.logPrint.printDebugLog("契約一時金 件数:" + dataLst.size() +
				" バッチ運用日:" + prmStartDay);
		return rslt;
	}
	//異動区分〜条件取得
	private boolean getJoken() throws Exception
	{
		//一時支払料金番号
		String[] param = {tmpPayNo};
		executeKV_M_IDVB_ICJKN_CRJK_KV_SELECT_002(param);
		JBSbatCommonDBInterface data = db_KV_M_IDVB_ICJKN_CRJK.selectNext();
		if(null == data)
		{
			mst = false;
			jknMstData = null;
			return false;
		}
		mst = true;
		jknMstDatLst = new ArrayList<JBSbatCommonDBInterface>();
		while(null != data)
		{
			jknMstDatLst.add(data);
			data = db_KV_M_IDVB_ICJKN_CRJK.selectNext();
		}
		return true;
	}

	//進捗 取得
	private boolean getPrgInfo(JBSbatCommonDBInterface jkn) throws Exception
	{
		idoKbn = jkn.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.IDO_DIV);
		boolean rslt = true;
		String[] param = {svckNo, idoKbn};//新マスタの移動区分

		executeKK_T_PRG_KV_SELECT_004(param);
		prgData = db_KK_T_PRG.selectNext();
		//nullは基本なし
		if(null == prgData||"0".equals(prgData.getString("CNT")))
		{
			prgData = null;
			return false;
		}
		return rslt;
	}
	//サービス契約[料金グループCD] 取得
	private boolean getSvcInfo() throws Exception
	{
		//新マスタのPRC_GRP_CD
		if(null == jknMstData)  return false;
//		if(!isNotBlank(jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD)))
//		{
//			commonItem.getLogPrint().printDebugLog("検索不要_検証用〜料金グループCDなし"+
//					"サービス契約番号:" + svckNo);
//			return true;
//		}

		String[] param = {svckNo, prmEndDay + "235959999"};
		executeKK_T_SVC_KEI_KV_SELECT_007(param);
		JBSbatCommonDBInterface dataMap = db_KK_T_SVC_KEI.selectNext();

		if(null == dataMap)
		{
			commonItem.getLogPrint().printDebugLog("サービス契約なし "+
					"サービス契約番号:" + svckNo);
			return false;
		}
		//サービス契約の料金グループCDセット
		KicjknData.setValue("svcPrcGrpCd", 
				dataMap.getString(JBSbatKK_T_SVC_KEI.PRC_GRP_CD));
		planCd = cnvNullToEmp(dataMap.getString(JBSbatKK_T_SVC_KEI.PPLAN_CD));
		planNm = cnvNullToEmp(dataMap.getString("PPLAN_NM"));
		shosaYmd = cnvNullToEmp(dataMap.getString(JBSbatKK_T_SVC_KEI.SHOSA_YMD));
		return true;
	}

	//料金グループＣＤ比較
	private boolean checkPrcGrpCd() throws Exception
	{
		String mstPrcGrp = jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD);
		if(isNotBlank(mstPrcGrp))	//00,99 もチェックしない
		{
			String svcPrcGrp = KicjknData.getString("svcPrcGrpCd"); //サービス契約の料金GRP_CD
			if(!mstPrcGrp.equals(svcPrcGrp))
			{
				return false;
			}
		}
		return true;
	}
	//バンドル情報取得 SQL２回発行
	private boolean getBunDlInfo(ArrayList<JBSbatCommonDBInterface> ksnTgLst) throws Exception
	{
		if(!jknBndl())
		{
			return true;	//取得対象外
		}
		bndlUm = "無";

		if(0 == ksnTgLst.size())
		{
			commonItem.getLogPrint().printDebugLog(
					svckNo + " " + idoKbn + ":回線なしの為、バンドルなし(1st)");
			return true;
		}
		ArrayList<JBSbatCommonDBInterface> anthrSvck = getSvckNoAnthr(ksnTgLst.get(0));
		if(null == anthrSvck || anthrSvck.size() == 0)
		{
			return true;
		}

		bndlUm = "有";
		for(JBSbatCommonDBInterface anthr : anthrSvck)	//基本1回線のみ
		{
			fuseigoDbName = fuseigoDbName +
				" bndl:" + anthr.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO);
		}
		return true;
	}
	//バンドル情報取得条件を満たしているか判定
	private boolean jknBndl() throws Exception
	{
		boolean ryknGrp = false;
		boolean idoDiv = false;
		//条件マスタ.一時金分類コード 2:工事費
//		if("2".equals(jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.ICJKN_BUNRUI_CD)))
//		{
//			bunrui = true;
//		}else{
//			return false;
//		}
		//マスタ料金グループCD
		String mstPrcGrp = jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD);
		if("02".equals(mstPrcGrp) || "03".equals(mstPrcGrp) || 
				"04".equals(mstPrcGrp) || "10".equals(mstPrcGrp))
		{
			ryknGrp = true;
		}else{
			return false;
		}
		// 以下の異動区分  のみ検索
		if("00001".equals(idoKbn) || "00002".equals(idoKbn))
//		if("00001".equals(idoKbn) || "00002".equals(idoKbn)||"00019".equals(idoKbn)) //テスト用
		{
			idoDiv =  true;
		}else{
			return false;
		}
		return ryknGrp && idoDiv;
	}

	/**
	 * 料金グループCDが異なる、または存在しないはずの一時金があればfalseを返す
	 * @return
	 * @throws Exception
	 */
	private boolean check(String idoSbtCd) throws Exception
	{
		//料金グループCD比較
		if(!PrcGrpFlg)
		{
			return false;
		}
		//バンドル有
		if("有".equals(bndlUm))
		{
			//ただし、「契約一時金」の一時金額が0の場合、正常
			if("0".equals(KicjknData.getString(JBSbatKK_T_KICJKN.ICJKN_AMNT)))
			{
				return true;
			}
			String bnriCd = cnvNullToEmp(
					KicjknData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.ICJKN_BUNRUI_CD));
			//eo光電話
			if("10".equals(KicjknData.getString("svcPrcGrpCd")))
			{
				if("00001".equals(idoKbn))
				{
					if("1".equals(bnriCd) || "2".equals(bnriCd))
					return false;			//新規→事務手も工事費もないはず
				}
				if("00002".equals(idoKbn) && "2".equals(bnriCd))
				{
					return false;			//サービス追加→工事費ないはず
				}
			}else
			{
				//料金グループコードがeo光ネットホーム、eo光ネットメゾン、eo光ネットマンションタイプ
				if("00002".equals(idoKbn) && "2".equals(bnriCd))
				{
					return false;		//サービス追加→工事費ないはず
				}
			}
			commonItem.getLogPrint().printDebugLog(idoKbn + " " + svckNo + " バンドルcheck_OK");
		}
		//住所変更：サービス契約異動種別CD[3]の場合、一時金存在してok
		if("00019".equals(idoKbn))
		{
			if("1".equals(idoSbtCd)||"2".equals(idoSbtCd))
			{
				return false;
			}else if("3".equals(idoSbtCd))
			{
				return true;
			}
		}
		return true;
	}
	
	//サービス契約回線対象内訳番号 取得
	private ArrayList<JBSbatCommonDBInterface> getKaisnTgLst() throws Exception
	{
		String[] param = {svckNo, prmEndDay};
		executeKK_T_KAISEN_TG_SVKEI_KV_SELECT_002(param);

		JBSbatCommonDBInterface dataMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();

		ArrayList<JBSbatCommonDBInterface> tgLst = 
			new ArrayList<JBSbatCommonDBInterface>();
		if(null == dataMap)
		{
			return tgLst;
		}
		String utwk = "";		//2番号(複数)もある
		while(null != dataMap)
		{
			utwk = " 回線:" + dataMap.getString(
					JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO);
			fuseigoDbName = fuseigoDbName + utwk;

			tgLst.add(dataMap);
			dataMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();
		}
		return tgLst;
	}

	//進捗以外のサービス契約番号 取得(2nd)
	private ArrayList<JBSbatCommonDBInterface> getSvckNoAnthr(
			JBSbatCommonDBInterface db) throws Exception
	{
		String[] param = {prmEndDay, svckNo, 
				db.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO), prmEndDay};
		executeKK_T_KAISEN_TG_SVKEI_KV_SELECT_003(param);
		
		JBSbatCommonDBInterface dataMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();
		if(null == dataMap)
		{
			commonItem.getLogPrint().printDebugLog("回線対象とサービス契約になし(2nd) "+ svckNo + " "+
					db.getString(JBSbatKK_T_KAISEN_TG_SVKEI.SVC_KEI_KAISEN_UCWK_NO) + " " +  idoKbn);
			return null;
		}
		ArrayList<JBSbatCommonDBInterface> bundlDatLst =
			new ArrayList<JBSbatCommonDBInterface>();
		while(null != dataMap)
		{
			bundlDatLst.add(dataMap);
			dataMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();
		}
		return bundlDatLst;
	}
	//指定項目、存在チェック(料金グループCD)
	private boolean isNotBlank(String val) throws Exception
	{
		if("00".equals(val) ||"".equals(val) || null == val)
		{
			return false;
		}
		return true;
	}

	//KK2101 住所変更明細 サービス契約異動種別CDが[3]かチェック
	private String checkSvcKeiIdoSbtCd() throws Exception
	{
		//住所変更の電話・TVのみチェック
		if("00019".equals(idoKbn))
		{
			String mstPrcGrp = jknMstData.getString(JBSbatKV_M_IDVB_ICJKN_CRJK.PRC_GRP_CD);
			if("10".equals(mstPrcGrp) || "11".equals(mstPrcGrp))
			{
				executeKK_T_ADCHG_DTL_KV_SELECT_001(new Object[]{svckNo, prmEndDay});
				JBSbatCommonDBInterface dataMap = db_KK_T_ADCHG_DTL.selectNext();
	
				if(null == dataMap)
				{
					super.logPrint.printDebugLog("住所変更明細なし " + svckNo + " " + idoKbn);
					return "";
				}
				String idoSbt = cnvNullToEmp(
						dataMap.getString(JBSbatKK_T_ADCHG_DTL.SVC_KEI_IDO_SBT_CD));
				fuseigoDbName = " svc異動種別CD:" + idoSbt;
				return idoSbt;
			}
		}
		return "";
	}

	//調査区分名取得
	private String cnvChosaDiv(String div)
	{
		if("1".equals(div))
		{
			return "調査対象";
		}
		if("2".equals(div))
		{
			return "正常";
		}
		if("3".equals(div))
		{
			return "一時金検証対象外";
		}
		return "";
	}
	//初期化
	private void setIni()
	{
		svckNo = "";
		tmpPayNo = "";
		idoKbn = "";
		bndlUm = "";
		planCd = "";
		planNm = "";
		shosaYmd = "";
		fuseigoDbName = "";
		PrcGrpFlg = false;
		mst = false;
	}
	//ヘッダー出力判定、２行目以降はoutputBeanクリア
	private void set() throws Exception
	{
		//ヘッダー情報セット
		if(firstFlg)
		{
			outputBean.addOutMapList(setHeder());
			firstFlg = false;
		}else
		{
			outputBean.getOutMapList().clear();
		}
	}
	//ヘッダー出力
	private JBSbatServiceInterfaceMap setHeder() throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.setString(JBSbatKVIFM007.SVC_KEI_NO, "サービス契約番号");
		outMap.setString(JBSbatKVIFM007.SEIKY_KEI_NO, "請求契約番号");
		outMap.setString(JBSbatKVIFM007.TMP_PAY_PRC_NO, "一時支払料金番号");
		outMap.setString(JBSbatKVIFM007.TMP_PAY_PRC_NAME, "一時支払料金名称");
		outMap.setString(JBSbatKVIFM007.IDO_DIV, "導出異動区分");
		outMap.setString(JBSbatKVIFM007.IDO_DIV_NM, "導出異動区分名");
		outMap.setString(JBSbatKVIFM007.KICJKN_ADD_UNYO_YMD, "契約一時金更新運用日");
		outMap.setString(JBSbatKVIFM007.PPLAN_CD_KICJKN, "料金プランコード(契約一時金)");
		outMap.setString(JBSbatKVIFM007.PPLAN_NM_KICJKN, "料金プラン名称(契約一時金)");
		outMap.setString(JBSbatKVIFM007.PRGP_CD_MST, "料金グループコード(マスタ)");

		outMap.setString(JBSbatKVIFM007.SHOSA_YMD, "照査年月日");
		outMap.setString(JBSbatKVIFM007.PRGP_NM_MST, "料金グループ名称(マスタ)");
		outMap.setString(JBSbatKVIFM007.BUNDLE_UM, "バンドル有無");
		outMap.setString(JBSbatKVIFM007.CHOSA_TG_DIV, "調査対象区分");
		outMap.setString(JBSbatKVIFM007.CHOSA_TG_DIV_NM, "調査対象区分名称");
		outMap.setOutFlg(true);
		return outMap;
	}

	/**
	 * サービス契約番号の存在チェック
	 * @param db
	 * @return 判定結果
	 * @throws Exception
	 */
	private boolean checkSvckNo(JBSbatCommonDBInterface db) throws Exception
	{
		String svck = db.getString(JBSbatKK_T_KICJKN.SVC_KEI_NO);
		if(null == 	svck || "".equals(svck))
		{
//			commonItem.getLogPrint().printBusinessErrorLog("EKKB0960AI",
//					new String[]{"サービス契約番号なし。契約一時金番号:" + 
//					db.getString(JBSbatKK_T_KICJKN.KICJKN_NO)});
			return false;
		}
		return true;
	}

	//請求契約番号を取得
	private String getSeiKyukNo() throws Exception
	{
		executeKK_T_KAKINS_KV_SELECT_002(new Object[]{svckNo, prmEndDay});
		JBSbatCommonDBInterface outMap = db_KK_T_KAKINS.selectNext();
		if(null == outMap)
		{
			return "";
		}
		return outMap.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO);
	}

	/**
	 * null → ""に変換するメソッド
	 * @param val 文字列
	 * @return 変換後文字列
	 */
	private String cnvNullToEmp(String val)
	{
		String rslt = val;
		if(null == val)
		{
			rslt = "";
		}
		return rslt;
	}

	/**
	 * 指定クラスのException情報のみログ出力
	 * @param e
	 * @return
	 */
	private String getStaCkInfo(Exception e)
	{
		StringBuilder sb = new StringBuilder();
		StackTraceElement[] st = e.getStackTrace();

		for(StackTraceElement stInfo :st)
		{
			if(stInfo.getClassName().contains(this.getClassName()))
			{
				sb.append("/");
				sb.append(stInfo.getMethodName());
				sb.append(" Line:");
				sb.append(stInfo.getLineNumber());
			}
		}
		return String.valueOf(sb);
	}
}
