/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHMineoTawsPrtTgSikysCst
*	ソースファイル名	：JBSbatCHMineoTawsPrtTgSikysCst.java
*	作成者				：富士通　
*	作成日				：2014年07月07日
*＜機能概要＞
*　mineo問合せ先印刷対象請求先抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/07/07   FJ）桑島	【ANK-2194-00-00】新規作成
*	v9.00.01	2014/08/13   FJ）中作	【OM-2014-0002706】障害対応
*	v12.00.00	2014/12/25   FJ）福岡	【ANK-2225-00-00】mineo問合せ先対応
*	v66.00.00	2023/04/20   FJ）中原	【ANK-4418-00-00】mineo譲渡手数料の集計先変更対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatCHIFM238;
import eo.business.util.file.JBSbatCHIFM239;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_T_SEIKY;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHMineoTawsPrtTgSikysCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

// v12.00.00 DEL START
//	/** SQL定義キー(CH_SELECT_043)*/
//	private static final String CH_T_SEIKY_CH_SELECT_043 = "CH_SELECT_043";
// v12.00.00 DEL END
	
	/** SQL定義キー(CH_SELECT_019)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_019 = "CH_SELECT_019";

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
// v12.00.00 DEL START
//	/** 請求収納業務共通クラス */
//	private JCHbatSeikyKaknoBusinessUtil seikyUtil = null;
	
//	/**
//	 * 請求契約番号保持領域（請求スキーマ情報）
//	 * */
//	private ArrayList<String[]> seiky_seikyKeiNo_List = null;
// v12.00.00 DEL END
	
	/**
	 * 業務機能識別（mineo請求）
	 */
	private static final String WORK_KINO_SKBT_CD_CHEK = "MVNO_CHEK";
	
	/**
	 * 業務機能識別（mineo単独請求）
	 */
	private static final String WORK_KINO_SKBT_CD_ONLY = "MVNO_ONLY";
	
	/**
	 * 料金項目抽出変換（mineo請求）情報保持領域
	 * */
	private ArrayList<String[]> prcKmkCsChge_Chek_List = null;
	
	/**
	 * 料金項目抽出変換（mineo単独請求）情報保持領域
	 * */
	private ArrayList<String[]> prcKmkCsChge_Only_List = null;
	
	/**
	 * 対象請求契約番号保持領域
	 * */
	private ArrayList<String> tgSeikyKeiNo_List = null;
	
// v12.00.00 ADD START
	
	/** freeパラメタ：合計明細 */
	private ArrayList<HashMap<String, String>> gkiList  = null;
	
	/** freeパラメタ：未納明細 */
	private ArrayList<HashMap<String, String>> gskyList = null;
	
	/** 当月請求のみ */
	private ArrayList<String[]> chifm238Only   = null;
	
	/** 当月請求＋未納合算 */
	private ArrayList<String[]> chifm238And239 = null;
	
	/** 未納合算のみ */
	private ArrayList<String[]> chifm239Only   = null;
	
// v12.00.00 ADD END
// v66.00.00 ADD START
	
	/** freeパラメタ：mineo単独合計明細 */
	private ArrayList<HashMap<String, String>> mineoSoroGkiList  = null;
	
// v66.00.00 ADD END
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
// v12.00.00 DEL START
//		// 請求収納業務共通クラス
//		seikyUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
//		//請求契約番号保持領域（請求スキーマ情報）
//		seiky_seikyKeiNo_List = new ArrayList<String[]>();
// v12.00.00 DEL END
		//料金項目抽出変換（mineo請求）情報保持領域
		prcKmkCsChge_Chek_List = new ArrayList<String[]>();
		//料金項目抽出変換（mineo単独請求）情報保持領域
		prcKmkCsChge_Only_List = new ArrayList<String[]>();
		//対象請求契約番号保持領域
		tgSeikyKeiNo_List = new ArrayList<String>();
		
		// DBアクセスクラスを生成します
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		
// v12.00.00 ADD START
		
		this.gkiList         = new ArrayList<HashMap<String,String>>();	// freeパラメタ：合計明細
		this.gskyList        = new ArrayList<HashMap<String,String>>();	// freeパラメタ：未納明細
// ANK-4418-00-00 ADD START
		this.mineoSoroGkiList         = new ArrayList<HashMap<String,String>>();	// freeパラメタ：mineo単独合計明細
// ANK-4418-00-00 ADD END
		
		this.chifm238Only    = new ArrayList<String[]>();					// 当月請求のみ
		this.chifm238And239  = new ArrayList<String[]>();					// 当月請求＋未納合算
		this.chifm239Only    = new ArrayList<String[]>();					// 未納合算のみ
		
		// mineo請求情報検索
		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_CHEK);
		// mineo単独請求情報検索
		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_ONLY);
		
		// フリー項目取得
		String[] freeItem = super.freeItem.split(JKKBatConst.S_PARAM_DELIM);
		
		// 起動パラメータ FREE より、入力パラメタ取得
		String infPass1 = freeItem[0];
		String infPass2 = freeItem[1];
// ANK-4418-00-00 ADD START
		String infPass3 = freeItem[2];
// ANK-4418-00-00 ADD END
		
		setFreePararm(infPass1, "CHIFM238.def");
		setFreePararm(infPass2, "CHIFM239.def");
// ANK-4418-00-00 ADD START
		setFreePararm(infPass3, "CHIFM418.def");
// ANK-4418-00-00 ADD END
		
// v12.00.00 ADD END
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
// v12.00.00 DEL START
//		
//		//(1) mineo単独請求抽出
//		
//		//OM-2014-0002706 MOD STA
//		// 請求年月（（当日含まない過去直近））
//		//String seikySyoriYm = seikyUtil.getBillYmNotContain(super.opeDate, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
//		//super.logPrint.printDebugLog("■請求年月（（当日含まない過去直近）） =" + seikySyoriYm + "]");
//		// 請求年月（（当日含む過去直近））
//		String seikySyoriYm = seikyUtil.getBillYmContain(super.opeDate, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
//		super.logPrint.printDebugLog("■請求年月（（当日含む過去直近）） =" + seikySyoriYm + "]");
//		//OM-2014-0002706 MOD END
//		
//		//(a) 請求書印刷対象抽出条件
//		if(seikySyoriYm != null && !JACStrConst.KARA_MOJI.equals(seikySyoriYm))
//		{
//			selectSeikyPrintTgInfo(seikySyoriYm);
//		}
//		else
//		{
//			// マスタ未存在エラー
//			// 業務例外
//			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0260CE, new String[]
//			      { JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, super.opeDate });
//		}
//		
//		// 2.  mineo請求情報検索
//		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_CHEK);
//		// 3.  mineo単独請求情報検索
//		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_ONLY);
		
// v12.00.00 DEL END
		
// v12.00.00 ADD START
		
		// 内部で振り分け
		setMatchInf();
		
		// 単独請求か否かを判定し[tgSeikyKeiNo_List]へ請求契約番号を格納
		getTgSeikyKeiNoInfo(this.chifm238Only);
		getTgSeikyKeiNoInfo(this.chifm239Only);
		getTgSeikyKeiNoInfo(this.chifm238And239);
		
		// 重複除外
		distinctForSkNo();
		
// v12.00.00 ADD END
		
// v12.00.00 DEL START
//		//対象（mineo単独請求抽出）請求契約番号抽出
//		getTgSeikyKeiNoInfo();
// v12.00.00 DEL END
		
		//対象（mineo単独請求抽出）請求契約番号出力
		JBSbatOutputItem out_bean = new JBSbatOutputItem();
		
// v12.00.00 MOD START
//		out_bean = setTgSeikyKeiNoInfo(out_bean);
		
		// 請求契約番号出力
		retOutFile(out_bean);
		
// v12.00.00 MOD END
		
		return out_bean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SEIKY.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
// v12.00.00 DEL START
//	/**
//	 * SQLKEY(CH_SELECT_043)でDBアクセスを行います。<br>
//	 * <p>
//	 * <b>処理フロー</b><br>
//	 * <pre>
//	 * 1.引数でバイント変数を設定します。<br>
//	 *
//	 * 2.DBアクセスを実行します。<br>
//	 * 
//	 * 3.メソッドの呼び出し方です。<br>
//	 *		引数:
//	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
//	 *		 	請求年月
//	 *		 	料金項目抽出変換適用開始年月日
//	 *		 	料金項目抽出変換適用終了年月日
//	 *		 	請求年月
//	 * </pre>
//	 * <p>
//	 * @param param バイント変数の値配列。
//	 * @throws Exception 業務サービス内で発生した例外全般。
//	 */
//	private void executeCH_T_SEIKY_CH_SELECT_043(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_CH_T_SEIKY.selectBySqlDefine(paramList, CH_T_SEIKY_CH_SELECT_043);
//	}
// v12.00.00 DEL END
	
	/**
	 * SQLKEY(CH_SELECT_019)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	バッチ運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_019(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_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_019);
	}
	
// v12.00.00 DEL START
//	/**
//	 * 請求書印刷対象抽出情報を取得します。
//	 * 
//	 * @param 請求年月（当日含まない過去直近）
//	 * @throws Exception 
//	 */
//	private void selectSeikyPrintTgInfo(String seikySyoriYm) throws Exception
//	{
//		super.logPrint.printDebugLog("selectSeikyPrintTgInfo() START");
//		
//		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
//		
//		// 請求年月
//		whereParam.setValue(seikySyoriYm);
//		// 料金項目抽出変換適用開始年月日
//		whereParam.setValue(super.opeDate);
//		// 料金項目抽出変換適用終了年月日
//		whereParam.setValue(super.opeDate);
//		// 請求年月
//		whereParam.setValue(seikySyoriYm);
//		
//		super.logPrint.printDebugLog("■[selectSeikyPrintTgInfo][whereParam=" + whereParam.getList().toString() + "]");
//		
//		// 請求書印刷対象抽出
//		executeCH_T_SEIKY_CH_SELECT_043(whereParam.getList().toArray());
//		
//		// 結果を取得
//		JBSbatCommonDBInterface dbMap =  db_CH_T_SEIKY.selectNext();
//		
//		while(dbMap != null)
//		{
//			//請求契約番号,料金グループコード,料金コースコード,料金サービスコード,料金項目コード 取得
//			String[] seikyu_rec =	{JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_T_SEIKY.SEIKY_KEI_NO)),
//					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_T_SEIKY_UCWK.PRC_GRP_CD)),
//					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_T_SEIKY_UCWK.PCRS_CD)),
//					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_T_SEIKY_UCWK.PRC_SVC_CD)),
//					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_T_SEIKY_UCWK.PRC_KMK_CD))
//			};
//
//			// 請求契約番号格納
//			seiky_seikyKeiNo_List.add(seikyu_rec);
//			dbMap =  db_CH_T_SEIKY.selectNext();
//		}
//		
//		super.logPrint.printDebugLog("selectSeikyPrintTgInfo() END");
//	}
// v12.00.00 DEL END
	
	
	/**
	 * 料金項目抽出変換マスタ情報を取得します。
	 * 
	 * @param 請求年月（当日含まない過去直近）
	 * @throws Exception 
	 */
	private void selectPrcKmkCsChgeInfo(String workKinoSkbtCd) throws Exception
	{
		super.logPrint.printDebugLog("selectPrcKmkCsChgeInfo() START");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// システムコード
		whereParam.setValue(super.systemCode);
		// 業務機能識別コード
		whereParam.setValue(workKinoSkbtCd);
		// 抽出変換コード
		whereParam.setValue("1");
		// 料金項目抽出変換適用年月日
		whereParam.setValue(super.opeDate);
		
		super.logPrint.printDebugLog("■[selectPrcKmkCsChgeInfo][whereParam=" + whereParam.getList().toString() + "]");
		
		// 請求内訳情報抽出
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_019(whereParam.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap =  db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		while(dbMap != null)
		{
			//料金グループコード,料金コースコード,料金サービスコード,料金項目コード 取得
			String[] prcKmkCsChge_rec =	{
					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD)),
					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)),
					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD)),
					JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD))
			};

			if(WORK_KINO_SKBT_CD_CHEK.equals(workKinoSkbtCd))
			{
				// 料金項目抽出変換（mineo請求）情報格納
				prcKmkCsChge_Chek_List.add(prcKmkCsChge_rec);
			}
			else
			{
				// 料金項目抽出変換（mineo単独請求）情報格納
				prcKmkCsChge_Only_List.add(prcKmkCsChge_rec);
			}

			dbMap =  db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		
		super.logPrint.printDebugLog("selectPrcKmkCsChgeInfo() END");
	}
	
	
	/**
	 * 対象（mineo単独請求抽出）請求契約番号情報を取得します。
	 * 
	 * @throws Exception 
	 */
// v12.00.00 MOD START
//	private void getTgSeikyKeiNoInfo() throws Exception
	private void getTgSeikyKeiNoInfo(ArrayList<String[]> seiky_seikyKeiNo_List) throws Exception
// v12.00.00 MOD END
	{
		super.logPrint.printDebugLog("getTgSeikyKeiNoInfo() START");
		
		String seikyKeiNo_key = JACStrConst.KARA_MOJI;
		//請求内訳情報が存在する同じ請求契約番号のレコード数
		int key_totalCnt = 0;
		//同じ請求契約番号の業務機能識別（mineo請求：MVNO_CHEK）レコード数
		int key_chekCnt = 0;
		//同じ請求契約番号の業務機能識別（mineo請求：MVNO_ONLY）レコード数
		int key_onlyCnt = 0;
		//同じ請求契約番号の間で処理を継続するかの判断用
		boolean key_keizkFlg = true;
// ANK-4418-00-00 ADD START
		//請求内訳内の初期費用mineo分の合計金額
		long totalAmnt = 0;
		//請求内訳内の初期費用mineo分の返却値金額
		String returnAmnt = null;
		//初期費用存在フラグ
		boolean key_shokiFlg = false;
// ANK-4418-00-00 ADD END
		
		
		//請求内訳情報が存在する場合
		if(seiky_seikyKeiNo_List.size() != 0)
		{
			//入力ファイルを繰り返し処理
			for (int i = 0; i < seiky_seikyKeiNo_List.size(); i++)
			{
				String[] seikyInfo = seiky_seikyKeiNo_List.get(i);
				
				// 初回ループ時に請求契約番号を設定
				if (JACStrConst.KARA_MOJI.equals(seikyKeiNo_key))
				{
					seikyKeiNo_key = seikyInfo[0];
				}
				
				//請求契約番号取得
				String seikyKeiNo = seikyInfo[0];
				
				// 請求契約番号がキー（請求契約番号）と同じ場合
				if (seikyKeiNo_key.equals(seikyKeiNo))
				{
					//請求内訳情報が存在する同じ請求契約番号のレコード数
					key_totalCnt++;
					
					if(key_keizkFlg)
					{
						//業務機能識別（mineo請求：MVNO_CHEK）と比較
						if(isMvnoChekInfo(seikyInfo))
						{
							key_chekCnt++;
						}
						
						//業務機能識別（mineo単独請求：MVNO_ONLY）と比較
						if(isMvnoOnlyInfo(seikyInfo))
						{
							key_onlyCnt++;
						}
						else
						{
							// ANK-4418-00-00 MOD START
							////対象不可と判断
							//key_keizkFlg = false;
							//初期費用の有無と金額をチェック
							returnAmnt = MvnoSoroChekInfo(seikyInfo);
							if ( null != returnAmnt && "0".compareTo(returnAmnt) <= 0 )
							{
								key_shokiFlg = true;
								totalAmnt+= Long.parseLong(returnAmnt);
							}
							else
							{
								//対象不可と判断
								key_keizkFlg = false;
							}
							// ANK-4418-00-00 MOD END
						}
					}
				}
				// 前回ループ時の請求契約番号と異なる場合
				else
				{
					super.logPrint.printDebugLog("■同じ請求契約番号の間、処理を継続した場合  key_keizkFlg⇒"+ key_keizkFlg);
					//同じ請求契約番号の間、処理を継続した場合
					if(key_keizkFlg)
					{
						super.logPrint.printDebugLog("■key_chekCnt ⇒"+ key_chekCnt);
						super.logPrint.printDebugLog("■key_totalCnt ⇒"+ key_totalCnt);
						super.logPrint.printDebugLog("■key_onlyCnt ⇒"+ key_onlyCnt);
						if(key_chekCnt > 0 && key_totalCnt == key_onlyCnt)
						{
							super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
							//対象請求契約番号保持
							tgSeikyKeiNo_List.add(seikyKeiNo_key);

						}
						// ANK-4418-00-00 MOD START
						// 請求内訳の初期費用のみが差分である場合
						//else if(key_totalCnt - key_onlyCnt == 1 && key_shokiFlg)
						else if(key_shokiFlg)
						{
							// mineo単独当月請求のみの合計値と一致しているかチェックし、一致すればリスト追加
							if ( isMvnoShikiCheck(seikyKeiNo_key, totalAmnt ))
							{
								super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
								tgSeikyKeiNo_List.add(seikyKeiNo_key);
							}
						}
						// ANK-4418-00-00 MOD END
					}
					//初期化
					key_totalCnt = 0;
					key_chekCnt = 0;
					key_onlyCnt = 0;
					key_keizkFlg = true;
// ANK-4418-00-00 ADD START
					totalAmnt = 0;
					returnAmnt = null;
// ANK-4418-00-00 ADD END
					//キー（請求契約番号）設定
					seikyKeiNo_key = seikyKeiNo;
					//請求内訳情報が存在する同じ請求契約番号のレコード数
					key_totalCnt++;
					
					if(key_keizkFlg)
					{
						//業務機能識別（mineo請求：MVNO_CHEK）と比較
						if(isMvnoChekInfo(seikyInfo))
						{
							key_chekCnt++;
						}
						
						//業務機能識別（mineo単独請求：MVNO_ONLY）と比較
						if(isMvnoOnlyInfo(seikyInfo))
						{
							key_onlyCnt++;
						}
						else
						{
							// ANK-4418-00-00 MOD START
							////対象不可と判断
							//key_keizkFlg = false;
							//初期費用の有無と金額をチェック
							returnAmnt = MvnoSoroChekInfo(seikyInfo);
							if ( null != returnAmnt && "0".compareTo(returnAmnt) <= 0 )
							{
								key_shokiFlg = true;
								totalAmnt+= Long.parseLong(returnAmnt);
							}
							else
							{
								//対象不可と判断
								key_keizkFlg = false;
							}
							// ANK-4418-00-00 MOD END
						}
					}
				}

			}
			
			//請求内訳情報ループを抜けた最終データ確認
			if(key_keizkFlg)
			{
				super.logPrint.printDebugLog("■key_chekCnt ⇒"+ key_chekCnt);
				super.logPrint.printDebugLog("■key_totalCnt ⇒"+ key_totalCnt);
				super.logPrint.printDebugLog("■key_onlyCnt ⇒"+ key_onlyCnt);
				if(key_chekCnt > 0 && key_totalCnt == key_onlyCnt)
				{
					super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
					tgSeikyKeiNo_List.add(seikyKeiNo_key);
				}
				// ANK-4418-00-00 MOD START
				// 請求内訳の初期費用のみが差分である場合
				//else if(key_totalCnt - key_onlyCnt == 1 && key_shokiFlg)
				else if(key_shokiFlg)
				{
					// mineo単独当月請求のみの合計値と一致しているかチェックし、一致すればリスト追加
					if ( isMvnoShikiCheck(seikyKeiNo_key, totalAmnt ))
					{
						super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
						tgSeikyKeiNo_List.add(seikyKeiNo_key);
					}
				}
				// ANK-4418-00-00 MOD END
			}
			
		}
		
		super.logPrint.printDebugLog("getTgSeikyKeiNoInfo() END");
	}
	
	
	
	/**
	 * 料金項目抽出変換マスタ情報 業務機能識別（mineo請求：MVNO_CHEK）と比較します。
	 * 
	 * @param 請求内訳合計明細情報
	 * @throws Exception 
	 */
	private boolean isMvnoChekInfo(String[] seikyUcwkInfo) throws Exception
	{
		super.logPrint.printDebugLog("chekMvnoChekInfo() START");
		
		if(prcKmkCsChge_Chek_List.size() != 0)
		{
			
			for (int i = 0; i < prcKmkCsChge_Chek_List.size(); i++)
			{
				String[] prcKmkCsChge_Chek = prcKmkCsChge_Chek_List.get(i);
				super.logPrint.printDebugLog("■請求内訳合計明細Chek　"+seikyUcwkInfo[1]+","+seikyUcwkInfo[2]+","+seikyUcwkInfo[3]+","+seikyUcwkInfo[4]);
				super.logPrint.printDebugLog("■料金項目抽出変換Chek　"+prcKmkCsChge_Chek[0]+","+prcKmkCsChge_Chek[1]+","+prcKmkCsChge_Chek[2]+","+prcKmkCsChge_Chek[3]);
				////料金グループコード,料金コースコード,料金サービスコード,料金項目コード が一致するものがある場合
				if(seikyUcwkInfo[1].equals(prcKmkCsChge_Chek[0]) &&
						seikyUcwkInfo[2].equals(prcKmkCsChge_Chek[1]) &&
						seikyUcwkInfo[3].equals(prcKmkCsChge_Chek[2]) &&
						seikyUcwkInfo[4].equals(prcKmkCsChge_Chek[3]))
				{
					return true;
				}

			}
		}
		super.logPrint.printDebugLog("chekMvnoChekInfo() END");
		
		return false;
	}
	
	/**
	 * 料金項目抽出変換マスタ情報 業務機能識別（mineo単独請求：MVNO_ONLY）と比較します。
	 * 
	 * @param 請求内訳合計明細情報
	 * @throws Exception 
	 */
	private boolean isMvnoOnlyInfo(String[] seikyUcwkInfo) throws Exception
	{
		super.logPrint.printDebugLog("chekMvnoOnlyInfo() START");
		
		if(prcKmkCsChge_Only_List.size() != 0)
		{
			
			for (int i = 0; i < prcKmkCsChge_Only_List.size(); i++)
			{
				String[] prcKmkCsChge_Only = prcKmkCsChge_Only_List.get(i);
				super.logPrint.printDebugLog("■請求内訳合計明細Only　"+seikyUcwkInfo[1]+","+seikyUcwkInfo[2]+","+seikyUcwkInfo[3]+","+seikyUcwkInfo[4]);
				super.logPrint.printDebugLog("■料金項目抽出変換Only　"+prcKmkCsChge_Only[0]+","+prcKmkCsChge_Only[1]+","+prcKmkCsChge_Only[2]+","+prcKmkCsChge_Only[3]);
				////料金グループコード,料金コースコード,料金サービスコード,料金項目コード が一致するものがある場合
				if(seikyUcwkInfo[1].equals(prcKmkCsChge_Only[0]) &&
						seikyUcwkInfo[2].equals(prcKmkCsChge_Only[1]) &&
						seikyUcwkInfo[3].equals(prcKmkCsChge_Only[2]) &&
						seikyUcwkInfo[4].equals(prcKmkCsChge_Only[3]))
				{
					return true;
				}

			}
		}
		super.logPrint.printDebugLog("chekMvnoOnlyInfo() END");
		
		return false;
	}
	
// ANK-4418-00-00 ADD START
	/**
	 * 初期費用とmineo単独明細の金額合計を確認
	 * 
	 * @param 請求内訳合計明細情報
	 * @throws Exception 
	 */
	private String MvnoSoroChekInfo(String[] seikyUcwkInfo) throws Exception
	{
		super.logPrint.printDebugLog("MvnoSoroChekInfo() START");
		String returnAmnt = null;
		// 初期費用の場合である場合、金額を設定
		if(JACStrConst.PRC_KMK_CD_INIT_COST_KAGAMI.equals(seikyUcwkInfo[4]) )
		{
			returnAmnt = seikyUcwkInfo[5];
		}
		super.logPrint.printDebugLog("MvnoSoroChekInfo() END");
		
		return returnAmnt;
	}
	
	/**
	 * 初期費用の合計金額とmineo単独ファイルに存在する金額をチェック
	 * 
	 * @param 請求内訳合計明細情報
	 * @param 初期費用合計
	 * @throws Exception 
	 */
	private boolean isMvnoShikiCheck(String seikyKeiNo_key, long totalAmnt) throws Exception
	{
		super.logPrint.printDebugLog("isMvnoShikiCheck() START");
		
		if(null != this.mineoSoroGkiList && this.mineoSoroGkiList.size() != 0)
		{
			
			for (HashMap<String, String> tg : this.mineoSoroGkiList) 
			{
				String sKno = tg.get(JBSbatCHIFM239.SEIKY_KEI_NO);
				String aMnt = tg.get(JBSbatCHIFM239.AMNT);
				//初期費用とmineo単独請求ファイルの金額が一致している場合
				if(null != seikyKeiNo_key && null != sKno && null != aMnt && 
						seikyKeiNo_key.equals(sKno) && totalAmnt == Long.parseLong(aMnt) )
				{
					return true;
				}

			}
		}
		super.logPrint.printDebugLog("isMvnoShikiCheck() END");
		
		return false;
	}
// ANK-4418-00-00 ADD END
	
// v12.00.00 DEL START
//	/**
//	 * mineo問合せ先印刷対象請求先情報を作成します。
//	 * 
//	 * @param 対象格納領域
//	 * @return  JBSbatOutputItem mineo問合せ先印刷対象請求先情報
//	 * @throws Exception 
//	 */
//	private JBSbatOutputItem setTgSeikyKeiNoInfo(JBSbatOutputItem out_bean) throws Exception
//	{
//		super.logPrint.printDebugLog("setTgSeikyKeiNoInfo() START");
//		
//
//		for (int i = 0; i < tgSeikyKeiNo_List.size(); i++)
//		{
//			String seiky_seikyKeiNo = tgSeikyKeiNo_List.get(i);
//			super.logPrint.printDebugLog("■出力対象　請求契約番号　"+ seiky_seikyKeiNo);
//			
//			BigDecimal cnt = new BigDecimal(i + 1);
//			
//			//出力対象項目格納領域作成
//			JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();
//			//請求先番号
//			out_map.setString(JBSbatCHIFE059.CLAIM_NO, seiky_seikyKeiNo);
//			//エンドレコード識別
//			out_map.setString(JBSbatCHIFE059.END_REC_SKBT, JACStrConst.SPACE_1);
//			//通番
//			out_map.setString(JBSbatCHIFE059.SEQ, JPCUtilCommon.fillHalfSpace(JPCUtilCommon.fillZero(cnt.toString(), 6, false),19,true));
//			
//			out_map.setOutFlg(true);
//			
//			out_bean.addOutMapList(out_map);
//
//		}
//		
//		//出力対象項目格納領域作成
//		JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();
//		//請求先番号
//		out_map.setString(JBSbatCHIFE059.CLAIM_NO, JPCUtilCommon.fillHalfSpace(JACStrConst.SPACE_1, 10, true));
//		//エンドレコード識別
//		out_map.setString(JBSbatCHIFE059.END_REC_SKBT, JACStrConst.DATA_KUBUN_END);
//		//通番
//		BigDecimal cnt = new BigDecimal(tgSeikyKeiNo_List.size());
//		out_map.setString(JBSbatCHIFE059.SEQ, JPCUtilCommon.fillHalfSpace(JPCUtilCommon.fillZero(cnt.toString(), 6, false),19,true));
//		
//		out_map.setOutFlg(true);
//		
//		out_bean.addOutMapList(out_map);
//		
//		super.logPrint.printDebugLog("setTgSeikyKeiNoInfo() END");
//		
//		return out_bean;
//	}
// v12.00.00 DEL END
	
// v12.00.00 ADD START
	
	/**
	 * 
	 * freeパラメタ設定
	 * 
	 * @param  path
	 * @param  def
	 */
	private void setFreePararm(String path, String def) throws Exception {
		
		super.logPrint.printDebugLog("setFreePararm() START [def：" + path + "]");
		
		// 引数により,設定先を動的に変更
// ANK-4418-00-00 DEL START
//		boolean isDef = def.equals("CHIFM238.def") ? true : false;
// ANK-4418-00-00 DEL END
		
		JBSbatServiceInterfaceMap rowMap = null;
		
		JBSbatInputFileUtil readObj      = new JBSbatInputFileUtil(path);
		JBSbatDefFileUtil   fileDef      = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue("IND") + def, readObj);
		
		readObj.createReader();
		
		String line = "";
		while(readObj.ready()) {
			
			line   = readObj.readLine();
			rowMap = fileDef.lineToObject(line, readObj, 0);
			
			// 格納リストへ設定
// ANK-4418-00-00 MOD START
//			if (isDef) { this.gkiList.add(retCHIFM238(rowMap)); } else { this.gskyList.add(retCHIFM239(rowMap)); }
			if("CHIFM238.def".equals(def))
			{
				this.gkiList.add(retCHIFM238(rowMap));
			} 
			else if("CHIFM239.def".equals(def))
			{
				this.gskyList.add(retCHIFM239(rowMap));
			}
			else
			{
				this.mineoSoroGkiList.add(retCHIFM239(rowMap));
			}
// ANK-4418-00-00 MOD END
		}
		
		// 閉じる
		if (readObj != null)
			readObj.close();
		
		// 初期化
		readObj = null;
		
		super.logPrint.printDebugLog("setFreePararm() END");
	}
	
	/**
	 * 
	 * 合計明細をkey付与して返却
	 * 
	 * @param  adRowMap
	 * @return 
	 * @throws Exception
	 */
	private HashMap<String, String> retCHIFM238(JBSbatServiceInterfaceMap adRowMap) throws Exception {
		
		HashMap<String, String> ret = new HashMap<String, String>();
		
		ret.put(JBSbatCHIFM238.SEIKY_KEI_NO, retStrRep(adRowMap.getString(JBSbatCHIFM238.SEIKY_KEI_NO)));
		ret.put(JBSbatCHIFM238.SEIKY_NO,     retStrRep(adRowMap.getString(JBSbatCHIFM238.SEIKY_NO)));
		ret.put(JBSbatCHIFM238.PRC_GRP_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM238.PRC_GRP_CD)));
		ret.put(JBSbatCHIFM238.PCRS_CD,      retStrRep(adRowMap.getString(JBSbatCHIFM238.PCRS_CD)));
		ret.put(JBSbatCHIFM238.PRC_SVC_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM238.PRC_SVC_CD)));
		ret.put(JBSbatCHIFM238.PRC_KMK_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM238.PRC_KMK_CD)));
		ret.put(JBSbatCHIFM238.MVNO_PRC_KMK_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM238.MVNO_PRC_KMK_CD)));
// ANK-4418-00-00 ADD START
		ret.put(JBSbatCHIFM238.AMNT,         retStrRep(adRowMap.getString(JBSbatCHIFM238.AMNT)));
// ANK-4418-00-00 ADD END
		
		return ret;
	}
	
	/**
	 * 
	 * 未納明細をkey付与して返却
	 * 
	 * @param  adRowMap
	 * @return 
	 * @throws Exception
	 */
	private HashMap<String, String> retCHIFM239(JBSbatServiceInterfaceMap adRowMap) throws Exception {
		
		HashMap<String, String> ret = new HashMap<String, String>();
		
		ret.put(JBSbatCHIFM239.SEIKY_KEI_NO, retStrRep(adRowMap.getString(JBSbatCHIFM239.SEIKY_KEI_NO)));
		ret.put(JBSbatCHIFM239.SEIKY_NO,     retStrRep(adRowMap.getString(JBSbatCHIFM239.SEIKY_NO)));
		ret.put(JBSbatCHIFM239.PRC_GRP_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM239.PRC_GRP_CD)));
		ret.put(JBSbatCHIFM239.PCRS_CD,      retStrRep(adRowMap.getString(JBSbatCHIFM239.PCRS_CD)));
		ret.put(JBSbatCHIFM239.PRC_SVC_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM239.PRC_SVC_CD)));
		ret.put(JBSbatCHIFM239.PRC_KMK_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM239.PRC_KMK_CD)));
// ANK-4418-00-00 ADD START
		ret.put(JBSbatCHIFM239.AMNT,         retStrRep(adRowMap.getString(JBSbatCHIFM239.AMNT)));
// ANK-4418-00-00 ADD END
		
		return ret;
	}
	
	
	/** 「"」を削除 */
	private String retStrRep(String tg) {
		return tg.replaceAll("\"", "");
	}
	
	/**
	 * 
	 * リストへの振分けを実施する.
	 * 
	 */
	private void setMatchInf() {
		
		// 合算の請求契約番号リスト
		HashMap<String, ArrayList<HashMap<String, String>>> sGkiMap  = retCusMap(this.gkiList, JBSbatCHIFM238.SEIKY_KEI_NO);
		// 未納合算の請求契約番号リスト
		HashMap<String, ArrayList<HashMap<String, String>>> sGMiMap  = retCusMap(this.gskyList, JBSbatCHIFM239.SEIKY_KEI_NO);
		
		// リストの振分け
		creChifmList(sGkiMap, sGMiMap);
		
		// リストlog
		listLog();
	}
	
	/** リストログ出力 */
	private void listLog() {
		
		int cnt = 0;
		for (String[] str : this.chifm238Only) {
			super.logPrint.printDebugLog("chifm238Only [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm238Only：" + print);
			}
		}
		
		cnt = 0;
		for (String[] str : this.chifm239Only) {
			super.logPrint.printDebugLog("chifm239Only [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm239Only：" + print);
			}
		}
		
		cnt = 0;
		for (String[] str : this.chifm238And239) {
			super.logPrint.printDebugLog("chifm238And239 [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm238And239：" + print);
			}
		}
	}
	
	/**
	 * 
	 * 以下,リストへの振分けを実施し,クラス変数への設定を行う.
	 * 
	 * ・[chifm238Only]   当月請求のみ
	 * ・[chifm239Only]   未納合算のみ
	 * ・[chifm238And239] 当月請求＋未納合算
	 * 
	 * @param sGkiMap
	 * @param sGMiMap
	 */
	private void creChifmList(HashMap<String, ArrayList<HashMap<String, String>>> sGkiMap,
									HashMap<String, ArrayList<HashMap<String, String>>> sGMiMap) {
		
		// 合算を起点に繰り返す
		Iterator<String> gkiIt = sGkiMap.keySet().iterator();
		while (gkiIt.hasNext()) {
			
			String itKey = gkiIt.next();
			
			/** 合算：存在する、未納合算：存在する */
			if (sGMiMap.containsKey(itKey)) {
				
				/** 当月ご請求料金が存在しない場合は未納合算のみとする */
				if (null == sGkiMap.get(itKey).get(0).get(JBSbatCHIFM238.MVNO_PRC_KMK_CD) || "" == sGkiMap.get(itKey).get(0).get(JBSbatCHIFM238.MVNO_PRC_KMK_CD)) {
					setList(sGMiMap.get(itKey), this.chifm239Only);
				} else {
					setList(sGkiMap.get(itKey), this.chifm238And239);
					setList(sGMiMap.get(itKey), this.chifm238And239);
				}
				continue;
				
			/** 合算：存在する、未納合算：存在しない */
			} else {
				
				setList(sGkiMap.get(itKey), this.chifm238Only);
				continue;
			}
		}
		
		// 未納合算を起点に繰り返す
		Iterator<String> gMiIt = sGMiMap.keySet().iterator();
		while (gMiIt.hasNext()) {
			
			String itKey = gMiIt.next();
			
			/** 合算：存在しない、未納合算：存在する */
			if (!sGkiMap.containsKey(itKey)) {
				
				setList(sGMiMap.get(itKey), this.chifm239Only);
				continue;
			}
		}
	}
	
	/**
	 * 
	 * 対象となるリストと,チェック用の配列を作成する.
	 * 
	 * @param tgList
	 * @param setTg
	 */
	private void setList(ArrayList<HashMap<String, String>> tgList, ArrayList<String[]> setTg) {
		
		for (HashMap<String, String> tgMap : tgList) {
			
			String[] rec = {
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.SEIKY_KEI_NO)),		// 請求契約番号
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.PRC_GRP_CD)),		// 料金グループコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.PCRS_CD)),			// 料金コースコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.PRC_SVC_CD)),		// 料金サービスコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.PRC_KMK_CD)),		// 料金項目コード
// ANK-4418-00-00 ADD START
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM238.AMNT)),				// 金額
// ANK-4418-00-00 ADD END
			};
			
			// 請求情報格納
			setTg.add(rec);
		}
	}
	
	/**
	 * 
	 * 「合算」「未納合算」リストを,振分けに必要な情報へ置き換える.
	 * 
	 * @param tgList
	 * @param key
	 * @return
	 */
	private HashMap<String, ArrayList<HashMap<String, String>>> retCusMap(ArrayList<HashMap<String, String>> tgList, final String key) {
		
		// 戻り値
		HashMap<String, ArrayList<HashMap<String, String>>> ret = new HashMap<String, ArrayList<HashMap<String,String>>>();
		
		// 対象リスト分、繰り返し
		for (HashMap<String, String> tg : tgList) {
			
			ArrayList<HashMap<String, String>> ad = new ArrayList<HashMap<String,String>>();
			
			String sKno = tg.get(key);
			
			// 初回は,無条件に設定
			if (ret.isEmpty()) {
				
				ad.add(tg);
				ret.put(sKno, ad);
				continue;
			}
			
			// 一致：既に格納済
			if (ret.containsKey(sKno)) {
				
				ad = ret.get(sKno);
				
				ad.add(tg);
				ret.put(sKno, ad);
				
			// 不一致：未格納
			} else {
				
				ad.add(tg);
				ret.put(sKno, ad);
			}
		}
		
		return ret;
	}
	
	/**
	 * 
	 * 重複した請求契約番号を,削除する.
	 * クラス変数を直接変更する.
	 * 
	 */
	private void distinctForSkNo() {
		
		Set<String> set = new HashSet<String>();
		
		for (Iterator<String> i = this.tgSeikyKeiNo_List.iterator(); i.hasNext();) {
			
			String s = i.next();
			if (set.contains(s)) {
				i.remove();
			} else {
				set.add(s);
			}
		}
	}
	
	/**
	 * 
	 * 出力共通電文クラスへの設定を行う.
	 * 
	 * @param outBean
	 */
	private void retOutFile(JBSbatOutputItem outBean) {
		
		for (String sKno : this.tgSeikyKeiNo_List) {
			
			// 出力対象項目格納領域作成
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
			
			outMap.set(JBSbatCH_T_SEIKY.SEIKY_KEI_NO, sKno);
			outMap.setOutFlg(true);
			
			outBean.addOutMapList(outMap);
		}
	}
// v12.00.00 ADD END
}
