/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHElectTawsPrtTgSikysCst
*	ソースファイル名	：JBSbatCHElectTawsPrtTgSikysCst.java
*	作成者				：富士通　
*	作成日				：2014年07月07日
*＜機能概要＞
*　NTT卸問合せ先印刷対象請求先抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v73.00.00	2024/11/11   FJ) 張    新規作成【ANK-4427-00-00】NTT卸対応：STEP1
**	v73.00.01	2025/01/14   FJ) 張    IT1-2025-0000003 【ANK-4427-00-00】NTT卸対応：STEP1
*********************************************************************/
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.JBSbatCHIFM460;
import eo.business.util.file.JBSbatCHIFM461;
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 JBSbatCHNttoTawsPrtTgSikysCst 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";

	/** 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;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
//IT1-2025-0000003 20250114 張 DEL START 
//	/**
//	 * 業務機能識別（NTT卸請求）
//	 */
//	private static final String WORK_KINO_SKBT_CD_CHEK = "NTTO_CHEK";
//IT1-2025-0000003 20250114 張 DEL END
	/**
	 * 業務機能識別（NTT卸単独請求）
	 */
	private static final String WORK_KINO_SKBT_CD_ONLY = "NTTO_ONLY";
	
	/**
	 * 料金項目抽出変換（NTT卸請求）情報保持領域
	 * */
	private ArrayList<String[]> prcKmkCsChge_Chek_List = null;
	
	/**
	 * 料金項目抽出変換（NTT卸単独請求）情報保持領域
	 * */
	private ArrayList<String[]> prcKmkCsChge_Only_List = null;
	
	/**
	 * 対象請求契約番号保持領域
	 * */
	private ArrayList<String> tgSeikyKeiNo_List = null;
	
	/** freeパラメタ：合計明細 */
	private ArrayList<HashMap<String, String>> gkiList  = null;
	
	/** freeパラメタ：未納明細 */
	private ArrayList<HashMap<String, String>> gskyList = null;
	
	/** 当月請求のみ */
	private ArrayList<String[]> chifm460Only   = null;
	
	/** 当月請求＋未納合算 */
	private ArrayList<String[]> chifm460And461 = null;
	
	/** 未納合算のみ */
	private ArrayList<String[]> chifm461Only   = null;
	
	/** freeパラメタ：eo電気単独合計明細 */
//	private ArrayList<HashMap<String, String>> electSoroGkiList  = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		//料金項目抽出変換（NTT卸請求）情報保持領域
		prcKmkCsChge_Chek_List = new ArrayList<String[]>();
		//料金項目抽出変換（NTT卸単独請求）情報保持領域
		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);
		
		
		this.gkiList         = new ArrayList<HashMap<String,String>>();	// freeパラメタ：合計明細
		this.gskyList        = new ArrayList<HashMap<String,String>>();	// freeパラメタ：未納明細
		
		this.chifm460Only    = new ArrayList<String[]>();					// 当月請求のみ
		this.chifm460And461  = new ArrayList<String[]>();					// 当月請求＋未納合算
		this.chifm461Only    = new ArrayList<String[]>();					// 未納合算のみ
		
//IT1-2025-0000003 20250114 張 DEL START 
//		// NTT卸請求情報検索
//		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_CHEK);
//IT1-2025-0000003 20250114 張 DEL END 
		// NTT卸単独請求情報検索
		selectPrcKmkCsChgeInfo(WORK_KINO_SKBT_CD_ONLY);
		
		// フリー項目取得
		String[] freeItem = super.freeItem.split(JKKBatConst.S_PARAM_DELIM);
		
		// 起動パラメータ FREE より、入力パラメタ取得
		String infPass1 = freeItem[0];
		String infPass2 = freeItem[1];
		
		setFreePararm(infPass1, "CHIFM460.def");
		setFreePararm(infPass2, "CHIFM461.def");
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 内部で振り分け
		setMatchInf();
		
		// 単独請求か否かを判定し[tgSeikyKeiNo_List]へ請求契約番号を格納
		getTgSeikyKeiNoInfo(this.chifm460Only);
		getTgSeikyKeiNoInfo(this.chifm461Only);
		getTgSeikyKeiNoInfo(this.chifm460And461);
		
		// 重複除外
		distinctForSkNo();
		
		
		
		//対象（NTT卸単独請求抽出）請求契約番号出力
		JBSbatOutputItem out_bean = new JBSbatOutputItem();
		
		// 請求契約番号出力
		retOutFile(out_bean);
		
		
		return out_bean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SEIKY.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	
	/**
	 * 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);
	}
	
	
	
	/**
	 * 料金項目抽出変換マスタ情報を取得します。
	 * 
	 * @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))
			};
//IT1-2025-0000003 20250114 張 DEL START 
//			if(WORK_KINO_SKBT_CD_CHEK.equals(workKinoSkbtCd))
//			{
//				// 料金項目抽出変換（NTT卸請求）情報格納
//				prcKmkCsChge_Chek_List.add(prcKmkCsChge_rec);
//			}
//			else
//			{
//IT1-2025-0000003 20250114 張 DEL END 
				// 料金項目抽出変換（NTT卸単独請求）情報格納
				prcKmkCsChge_Only_List.add(prcKmkCsChge_rec);
//IT1-2025-0000003 20250114 張 DEL START 
//			}
//IT1-2025-0000003 20250114 張 DEL END 

			dbMap =  db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		
		super.logPrint.printDebugLog("selectPrcKmkCsChgeInfo() END");
	}
	
	
	/**
	 * 対象（NTT卸単独請求抽出）請求契約番号情報を取得します。
	 * 
	 * @throws Exception 
	 */
	private void getTgSeikyKeiNoInfo(ArrayList<String[]> seiky_seikyKeiNo_List) throws Exception
	{
		super.logPrint.printDebugLog("getTgSeikyKeiNoInfo() START");
		
		String seikyKeiNo_key = JACStrConst.KARA_MOJI;
		//請求内訳情報が存在する同じ請求契約番号のレコード数
		int key_totalCnt = 0;
		//同じ請求契約番号の業務機能識別（NTT卸請求：NTTO_ONLY）レコード数
		int key_onlyCnt = 0;
		//同じ請求契約番号の間で処理を継続するかの判断用
		boolean key_keizkFlg = true;
		
		//請求内訳情報が存在する場合
		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)
					{
						
						//業務機能識別（NTT卸単独請求：NTTO_ONLY）と比較
						if(isNttoOnlyInfo(seikyInfo))
						{
							key_onlyCnt++;
						}
						else
						{
								//対象不可と判断
								key_keizkFlg = false;
						}
					}
				}
				// 前回ループ時の請求契約番号と異なる場合
				else
				{
					super.logPrint.printDebugLog("■同じ請求契約番号の間、処理を継続した場合  key_keizkFlg⇒"+ key_keizkFlg);
					//同じ請求契約番号の間、処理を継続した場合
					if(key_keizkFlg)
					{	
						super.logPrint.printDebugLog("■key_totalCnt ⇒"+ key_totalCnt);
						super.logPrint.printDebugLog("■key_onlyCnt ⇒"+ key_onlyCnt);
						if( key_totalCnt == key_onlyCnt)
						{
							super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
							//対象請求契約番号保持
							tgSeikyKeiNo_List.add(seikyKeiNo_key);
						}
					}
					//初期化
					key_totalCnt = 0;			
					key_onlyCnt = 0;
					key_keizkFlg = true;
					//キー（請求契約番号）設定
					seikyKeiNo_key = seikyKeiNo;
					//請求内訳情報が存在する同じ請求契約番号のレコード数
					key_totalCnt++;
					
					if(key_keizkFlg)
					{
						
						//業務機能識別（NTT卸単独請求：NTTO_ONLY）と比較
						if(isNttoOnlyInfo(seikyInfo))
						{
							key_onlyCnt++;
						}
						else
						{
							//対象不可と判断
							key_keizkFlg = false;
						}
					}
				}

			}
			
			//請求内訳情報ループを抜けた最終データ確認
			if(key_keizkFlg)
			{
				
				super.logPrint.printDebugLog("■key_totalCnt ⇒"+ key_totalCnt);
				super.logPrint.printDebugLog("■key_onlyCnt ⇒"+ key_onlyCnt);
				if(key_totalCnt == key_onlyCnt)
				{
					super.logPrint.printDebugLog("■tgSeikyKeiNo_List 追加⇒"+ seikyKeiNo_key);
					tgSeikyKeiNo_List.add(seikyKeiNo_key);
				}
			}
			
		}
		
		super.logPrint.printDebugLog("getTgSeikyKeiNoInfo() END");
	}
	
	
	
	/**
	 * 料金項目抽出変換マスタ情報 業務機能識別（NTT卸単独請求：NTTO_ONLY）と比較します。
	 * 
	 * @param 請求内訳合計明細情報
	 * @throws Exception 
	 */
	private boolean isNttoOnlyInfo(String[] seikyUcwkInfo) throws Exception
	{
		super.logPrint.printDebugLog("chekElecOnlyInfo() 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]) &&
//IT1-2025-0000003 20250114 張 MOD START 
						//seikyUcwkInfo[2].equals(prcKmkCsChge_Only[1]) &&
						seikyUcwkInfo[2].equals(prcKmkCsChge_Only[1]))
//IT1-2025-0000003 20250114 張 MOD END
//IT1-2025-0000003 20250114 張 DEL START 
//						seikyUcwkInfo[3].equals(prcKmkCsChge_Only[2]) &&
//						seikyUcwkInfo[4].equals(prcKmkCsChge_Only[3]))
//IT1-2025-0000003 20250114 張 DEL END
				{
					return true;
				}

			}
		}
		super.logPrint.printDebugLog("chekElecOnlyInfo() END");
		
		return false;
	}
	
	/**
	 * 
	 * freeパラメタ設定
	 * 
	 * @param  path
	 * @param  def
	 */
	private void setFreePararm(String path, String def) throws Exception {
		
		super.logPrint.printDebugLog("setFreePararm() START [def：" + path + "]");
		
		// 引数により,設定先を動的に変更
		boolean isDef = def.equals("CHIFM460.def") ? true : false;
		
		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);
			
			if (isDef) { 
				this.gkiList.add(retCHIFM460(rowMap)); 
			} else {
				this.gskyList.add(retCHIFM461(rowMap)); 
			}
		}
		
		// 閉じる
		if (readObj != null)
			readObj.close();
		
		// 初期化
		readObj = null;
		
		super.logPrint.printDebugLog("setFreePararm() END");
	}
	
	/**
	 * 
	 * 合計明細をkey付与して返却
	 * 
	 * @param  adRowMap
	 * @return 
	 * @throws Exception
	 */
	private HashMap<String, String> retCHIFM460(JBSbatServiceInterfaceMap adRowMap) throws Exception {
		
		HashMap<String, String> ret = new HashMap<String, String>();
		
		ret.put(JBSbatCHIFM460.SEIKY_KEI_NO, retStrRep(adRowMap.getString(JBSbatCHIFM460.SEIKY_KEI_NO)));
		ret.put(JBSbatCHIFM460.SEIKY_NO,     retStrRep(adRowMap.getString(JBSbatCHIFM460.SEIKY_NO)));
		ret.put(JBSbatCHIFM460.PRC_GRP_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM460.PRC_GRP_CD)));
		ret.put(JBSbatCHIFM460.PCRS_CD,      retStrRep(adRowMap.getString(JBSbatCHIFM460.PCRS_CD)));
		ret.put(JBSbatCHIFM460.PRC_SVC_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM460.PRC_SVC_CD)));
		ret.put(JBSbatCHIFM460.PRC_KMK_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM460.PRC_KMK_CD)));

		return ret;
	}
	
	/**
	 *  
	 * 未納明細をkey付与して返却
	 *
	 * @param  adRowMap
	 * @return 
	 * @throws Exception
	 */
	private HashMap<String, String> retCHIFM461(JBSbatServiceInterfaceMap adRowMap) throws Exception {
		
		HashMap<String, String> ret = new HashMap<String, String>();
		
		ret.put(JBSbatCHIFM461.SEIKY_KEI_NO, retStrRep(adRowMap.getString(JBSbatCHIFM461.SEIKY_KEI_NO)));
		ret.put(JBSbatCHIFM461.SEIKY_NO,     retStrRep(adRowMap.getString(JBSbatCHIFM461.SEIKY_NO)));
		ret.put(JBSbatCHIFM461.PRC_GRP_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM461.PRC_GRP_CD)));
		ret.put(JBSbatCHIFM461.PCRS_CD,      retStrRep(adRowMap.getString(JBSbatCHIFM461.PCRS_CD)));
		ret.put(JBSbatCHIFM461.PRC_SVC_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM461.PRC_SVC_CD)));
		ret.put(JBSbatCHIFM461.PRC_KMK_CD,   retStrRep(adRowMap.getString(JBSbatCHIFM461.PRC_KMK_CD)));

		return ret;
	}
	
	
	/** 「"」を削除 */
	private String retStrRep(String tg) {
		return tg.replaceAll("\"", "");
	}
	
	/**
	 * 
	 * リストへの振分けを実施する.
	 * 
	 */
	private void setMatchInf() {
		
		// 合算の請求契約番号リスト
		HashMap<String, ArrayList<HashMap<String, String>>> sGkiMap  = retCusMap(this.gkiList, JBSbatCHIFM460.SEIKY_KEI_NO);
		// 未納合算の請求契約番号リスト
		HashMap<String, ArrayList<HashMap<String, String>>> sGMiMap  = retCusMap(this.gskyList, JBSbatCHIFM461.SEIKY_KEI_NO);
		
		// リストの振分け
		creChifmList(sGkiMap, sGMiMap);
		
		// リストlog
		listLog();
	}
	
	/** リストログ出力 */
	private void listLog() {
		
		int cnt = 0;
		for (String[] str : this.chifm460Only) {
			super.logPrint.printDebugLog("chifm460Only [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm460Only：" + print);
			}
		}
		
		cnt = 0;
		for (String[] str : this.chifm461Only) {
			super.logPrint.printDebugLog("chifm461Only [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm461Only：" + print);
			}
		}
		
		cnt = 0;
		for (String[] str : this.chifm460And461) {
			super.logPrint.printDebugLog("chifm460And461 [" + cnt++ + "]");
			
			for (String print : str) {
				super.logPrint.printDebugLog("chifm460And461：" + print);
			}
		}
	}
	
	/**
	 * 
	 * 以下,リストへの振分けを実施し,クラス変数への設定を行う.
	 * 
	 * ・[chifm460Only]   当月請求のみ
	 * ・[chifm461Only]   未納合算のみ
	 * ・[chifm460And461] 当月請求＋未納合算
	 * 
	 * @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)) {
				
					setList(sGkiMap.get(itKey), this.chifm460And461);
					setList(sGMiMap.get(itKey), this.chifm460And461);
				continue;
				
			/** 合算：存在する、未納合算：存在しない */
			} else {
				
				setList(sGkiMap.get(itKey), this.chifm460Only);
				continue;
			}
		}
		
		// 未納合算を起点に繰り返す
		Iterator<String> gMiIt = sGMiMap.keySet().iterator();
		while (gMiIt.hasNext()) {
			
			String itKey = gMiIt.next();
			
			/** 合算：存在しない、未納合算：存在する */
			if (!sGkiMap.containsKey(itKey)) {
				
				setList(sGMiMap.get(itKey), this.chifm461Only);
				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(JBSbatCHIFM460.SEIKY_KEI_NO)),		// 請求契約番号
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM460.PRC_GRP_CD)),		// 料金グループコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM460.PCRS_CD)),			// 料金コースコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM460.PRC_SVC_CD)),		// 料金サービスコード
					JBSbatStringUtil.Rtrim(tgMap.get(JBSbatCHIFM460.PRC_KMK_CD)),		// 料金項目コード
			};
			
			// 請求情報格納
			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);
		}
	}
}
