/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACEmJgsUcwkPrcTrkm
*	ソースファイル名	：JBSbatACEmJgsUcwkPrcTrkm.java
*	作成者				：富士通　
*	作成日				：2011年12月08日
*＜機能概要＞
*　ＥＭ事業者間精算内訳料金取込部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/08   富士通		新規作成
*	v4.00.00	2013/01/08   FJ)早崎	【ST1-2013-0000024】対応 入力ファイル定義修正
*	v4.00.01	2013/02/19   FJ)早崎	【ST2-2013-0000612】対応 出力ファイル項目追加
*	v4.00.02	2013/02/22   FJ)垣内	【ST2-2013-0000612】対応 ＥＭ事業者間
*	v5.00.00	2013/10/30   FJ)黒木	【OM-2013-0002478 】EM精算結果出力不正対応
*	v6.00.00	2013/12/13   FJ)小掠	【OM-2013-0002478 】EM精算結果出力不正対応
*	v6.00.01	2013/12/24   FJ)早崎	【OM-2013-0005343 】出力．請求年月をバッチ運用日前月に修正
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM195;
import eo.business.util.file.JBSbatACIFM017;
import eo.business.util.file.JBSbatACIFM249;
import eo.business.util.table.JBSbatCH_M_EM_HJIN_SVC_CHG;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_T_EM_HOJIN_KEI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
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.JBSbatBusinessFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACEmJgsUcwkPrcTrkm extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ＥＭ法人契約)*/
	private static final String D_TBL_NAME_CH_T_EM_HOJIN_KEI = "CH_T_EM_HOJIN_KEI";

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** テーブル(ＥＭ法人サービス変換)*/
	private static final String D_TBL_NAME_CH_M_EM_HJIN_SVC_CHG = "CH_M_EM_HJIN_SVC_CHG";

	/** SQL定義キー(AC_SELECT_005)*/
	private static final String CH_T_EM_HOJIN_KEI_AC_SELECT_005 = "AC_SELECT_005";

	/** SQL定義キー(AC_SELECT_023)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_023 = "AC_SELECT_023";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CH_M_EM_HJIN_SVC_CHG_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(ＥＭ法人契約)*/
	private JBSbatSQLAccess db_CH_T_EM_HOJIN_KEI = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/** テーブルアクセスクラス(ＥＭ法人サービス変換)*/
	private JBSbatSQLAccess db_CH_M_EM_HJIN_SVC_CHG = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** 請求年月 */
	private String tmpSikyYm = JACStrConst.KARA_MOJI;
	
	/** 精算年月月末日 */
	private String tmpSsnYmMatubi = JACStrConst.KARA_MOJI;
	
	/** サービス番号 */
	private String tmpSvcNo = JACStrConst.KARA_MOJI;
	
	/** 事業者コード */
	private String jigyoshaCd = JACStrConst.KARA_MOJI;
	
	/** 事業者契約コード */
	private String jigyoshaKeiCd = JACStrConst.KARA_MOJI;
	
	/** 退避．抽出変換マスタ（ＥＭ事業者間精算内訳コード変換）*/
	private HashMap<String, JBSbatCommonDBInterface> wkCsChgeUwChg = null;
	
	/** 料金コースコード */
	private String tmpPcrsCd = JACStrConst.KARA_MOJI;
	
	/** 料金サービスコード */
	private String tmpPrcSvcCd = JACStrConst.KARA_MOJI;
	
	/** 精算項目コード */
	private String tmpOutPrcKmkCd = JACStrConst.KARA_MOJI;

	/** 出力ファイル定義 */
	private static final String PRM_OTD = "OTD";
	
	/** フリー項目（ファイル情報） */
	private String[] files = null;

	/** 修理代金等（ＥＭ契約なし）ファイル */
	JBSbatOutputFileUtil errInfoFile = null;

	/** 修理代金等（ＥＭ契約なし）ファイル定義 */
	JBSbatDefFileUtil errInfoFileDef = null;	

	/** 修理代金等（ＥＭ契約なし）ファイル出力件数 */
	private int errInfCnt 	= 0;

	/** 修理代金等（ＥＭ契約なし）リスト */
	private ArrayList<ArrayList<Object>> outErrInfo = null;
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_EM_HOJIN_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_EM_HOJIN_KEI);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		db_CH_M_EM_HJIN_SVC_CHG = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_EM_HJIN_SVC_CHG);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");

		// フリー項目
		this.files = freeItem.split(JACStrConst.FREE_DIV);

		// 修理代金等（ＥＭ契約なし）取得
		this.errInfoFile = new JBSbatOutputFileUtil(this.files[1]);
		String errInfoFileDefName = JBSbatAplConst.getAplConstValue(this.PRM_OTD) + this.files[0];
		this.errInfoFileDef = new JBSbatDefFileUtil(errInfoFileDefName, errInfoFile);
		
		// 修理代金等（ＥＭ契約なし）退避リスト
		outErrInfo = new  ArrayList<ArrayList<Object>>();
		
		// 料金スケジュールユーティリティ生成
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		
		try
		{
			// 請求年月取得
			this.tmpSikyYm = JBSbatInterface.adjustMonth(super.opeDate, -1).substring(0, 6);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][tmpSikyYm=" + this.tmpSikyYm + "]");

			// 精算年月月末日取得（運用日の前月末日）
			this.tmpSsnYmMatubi = this.tmpSikyYm.concat(JBSbatInterface.getEndOfMonth(this.tmpSikyYm));
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][tmpSsnYmMatubi=" + this.tmpSsnYmMatubi + "]");
		}
		finally
		{
			su.close();
		}
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 業務パラメータより事業者コード(EM事業者コード)を取得する
		this.jigyoshaCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_EM_JIGYOSHA_CD);
		
		// 業務パラメータより事業者契約コードを取得する
		this.jigyoshaKeiCd = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_EM_JGS_REPAIR);
		
		// EM事業者間精算内訳コード変換
		String wkParaEmDtlCh = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_WKS_EM_DTL_CH);
		
		// パラメータ取得クラスクローズ
		paramUtil.close();

		// 精算項目コード（内訳コード変換）の取得
		this.wkCsChgeUwChg = this.makeCsChgeMap(wkParaEmDtlCh);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tmpSvcNo=" + this.tmpSvcNo + "]") : true;
		
		// 入力Ｍのみnullの場合
		if(mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみnull]");
			
			// Ｔフラグtrue
			this.setTranProcFlg(true);
			
			// ＥＭ法人契約スキーマ検索
			boolean rtnFlg = this.selctEmHojinKei(tranMap);

			// 対象データが存在しない場合
			if(rtnFlg == false)
			{
				return outputInItem;
			}
		}
		// 入力Ｔのみnullの場合
		else if(mastMap != null && tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみnull]");
			
			// Ｍフラグtrue
			this.setMastProcFlg(true);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			return outputInItem;
		}
		// 入力Ｍ、入力Ｔともにデータありの場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともにデータあり]");
			
			// マッチングキーＭ（空白削除）
			String mastKey = mastMap.getString(JBSbatACIFM249.JIGYOSHA_KEI_ID).trim();
			// マッチングキーＴ
			String tranKey = tranMap.getString(JBSbatACIFM017.EM_KSH);
			
			// マッチした場合
			if(mastKey.equals(tranKey))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチ]");
				
				// サービス番号退避
				this.tmpSvcNo = mastMap.getString(JBSbatACIFM249.SVC_KEI_NO);
				// 料金コースコード
				this.tmpPcrsCd = mastMap.getString(JBSbatACIFM249.PCRS_CD);
				// 料金サービスコード
				this.tmpPrcSvcCd = mastMap.getString(JBSbatACIFM249.PPLAN_CD);
				
				// 精算項目コード変換キー
				StringBuffer ssnKmkKey = new StringBuffer();
				ssnKmkKey.append(mastMap.getString(JBSbatACIFM249.PCRS_CD));
				String prcKmkCd = JPCUtilCommon.fillHalfSpace(String.valueOf(tranMap.getString(JBSbatACIFM017.SIKY_UW_CD)),
																					JACStrConst.PRC_KMK_CD_LENGTH, true);
				ssnKmkKey.append(prcKmkCd);
				String ssnKey = ssnKmkKey.toString();
				
				if(this.wkCsChgeUwChg.containsKey(ssnKey))
				{
					JBSbatCommonDBInterface dmMap = this.wkCsChgeUwChg.get(ssnKey);
					this.tmpOutPrcKmkCd = dmMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD);
				}

				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][tmpSvcNo" + this.tmpSvcNo + "]");
				
				// マッチフラグtrue
				this.setMatchProcFlg(true);
			}
			// マッチングキーＭ＞マッチングキーＴの場合
			else if(mastKey.compareTo(tranKey) > 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチングキーＭ＞マッチングキーＴ]");
				
				// Ｔフラグtrue
				this.setTranProcFlg(true);
				
				// ＥＭ法人契約スキーマ検索
				boolean rtnFlg = this.selctEmHojinKei(tranMap);

				// 対象データが存在しない場合
				if(rtnFlg == false)
				{
					return outputInItem;
				}
			}
			// 上記以外の場合
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチングキーＭ＜マッチングキーＴ]");
				
				// Ｍフラグtrue
				this.setMastProcFlg(true);
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
				return outputInItem;
			}
			
		}
		
		// 出力情報作成
		this.makeOutputItem(tranMap, outputInItem);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");

		// エラーファイル修理代金等（ＥＭ契約なし）出力
		createFile(files[1], outErrInfo, errInfoFile.getEncode(), JACBatCommon.chgKaigyo(errInfoFile.getLine()), errInfoFileDef.getDelimiter());
		
		// ＥＭ契約が取得できなかった場合の業務エラーログ出力処理
		if (outErrInfo.size() > 0)
		{
			String[] msgParam = new String[] {JBSbatCH_M_EM_HJIN_SVC_CHG.TABLE_NAME, JACStrConst.KARA_MOJI};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, msgParam);
		}

		// 出力件数ログ出力
		String[] msgParam = new String[]{"修理代金等（ＥＭ契約なし）：" + files[1], Integer.toString(this.errInfCnt)};
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0780AI, msgParam);

		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_EM_HOJIN_KEI.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		db_CH_M_EM_HJIN_SVC_CHG.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(AC_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 executeCH_T_EM_HOJIN_KEI_AC_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_T_EM_HOJIN_KEI.selectBySqlDefine(paramList, CH_T_EM_HOJIN_KEI_AC_SELECT_005);
	}

	/**
	 * SQLKEY(AC_SELECT_023)で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_AC_SELECT_023(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());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_023);
	}

	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	EM法人契約番号
	 *		 	精算年月末日
	 *		 	EM法人サービス変換適用開始年月日
	 *		 	EM法人サービス変換適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_EM_HJIN_SVC_CHG_AC_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_CH_M_EM_HJIN_SVC_CHG.selectBySqlDefine(paramList, CH_M_EM_HJIN_SVC_CHG_AC_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * ＥＭ法人契約スキーマを検索し、その結果をもとに退避．サービス番号に値を設定します。
	 * 
	 * @param tranMap 入力Ｔ（ＥＭ請求明細データ）
	 * @return true:存在 false:未存在 を戻します。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean selctEmHojinKei(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selctEmHojinKei]");

		// サービス番号、料金コースコード、料金サービスコード取得
		JBSbatCommonDBInterface dbMap = getEmHojinSvcMap(tranMap);

		// 対象データが存在しない場合
		if(dbMap == null)
		{
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getEmHojinSvcMap][dbMap=" + dbMap.getMap().toString() + "]");
		
		this.tmpSvcNo = dbMap.getString(JBSbatCH_T_EM_HOJIN_KEI.HJIN_EO_YKAE_SVKEI_NO);
		this.tmpPcrsCd = dbMap.getString(JBSbatCH_M_EM_HJIN_SVC_CHG.PCRS_CD);
		this.tmpPrcSvcCd = dbMap.getString(JBSbatCH_M_EM_HJIN_SVC_CHG.PRC_SVC_CD);
		
		// 料金項目コード編集（料金項目抽出変換より取得）
		StringBuffer ssnKmkKey = new StringBuffer();
		ssnKmkKey.append(JACStrConst.PCRS_CD_SP);
		String prcKmkCd = JPCUtilCommon.fillHalfSpace(String.valueOf(tranMap.getString(JBSbatACIFM017.SIKY_UW_CD)),
																				JACStrConst.PRC_KMK_CD_LENGTH, true);
		ssnKmkKey.append(prcKmkCd);
		String ssnKey = ssnKmkKey.toString();
		
		if(this.wkCsChgeUwChg.containsKey(ssnKey))
		{
			JBSbatCommonDBInterface dmMap = this.wkCsChgeUwChg.get(ssnKey);
			this.tmpOutPrcKmkCd = dmMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selctEmHojinKei][tmpSvcNo" + this.tmpSvcNo + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selctEmHojinKei]");
		
		return true;
		
	}
	
	/**
	 * 料金項目抽出変換情報の取得を行いMAPに設定します。
	 * 
	 * @param workKinoSkbtCd		業務機能識別コード
	 * @param chshtChgCd			抽出変換コード
	 * @return HashMap<String, JBSbatCommonDBInterface> 		退避用マップ
	 * @throws Exception 	業務サービス内で発生した例外全般
	 */
	private HashMap<String, JBSbatCommonDBInterface> makeCsChgeMap(String workKinoSkbtCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeCsChgeMap]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][workKinoSkbtCd=" + workKinoSkbtCd + "]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(super.systemCode);					// システムコード
		paramList.setValue(workKinoSkbtCd);						// 業務機能識別コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CHG);		// 抽出変換コード
		paramList.setValue(super.opeDate);						// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);						// 料金項目抽出変換適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_023(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext(); 
		
		HashMap<String, JBSbatCommonDBInterface> rtnMap = new HashMap<String, JBSbatCommonDBInterface>();
		
		// 対象データが存在しない場合
		if(dbMap == null)
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][DB未存在エラー]");
			String[] outCntMsg = {JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, workKinoSkbtCd};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}

		while(dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][dbMap=" + dbMap.getMap().toString() + "]");
			// マップキー作成
			StringBuffer mapKey = new StringBuffer();
			mapKey.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD));
			mapKey.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));

			// マップにデータを格納
			rtnMap.put(mapKey.toString(), dbMap);
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeCsChgeMap]");
		return rtnMap;
	}

	/**
	 * EM法人サービス契約情報の取得を行い、設定します。
	 * 
	 * @param emHojinKeiNo		ＥＭ契約者コード
	 * @throws Exception 	業務サービス内で発生した例外全般
	 */
	private JBSbatCommonDBInterface getEmHojinSvcMap(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getEmHojinSvcMap]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		String emHojinKeiNo = tranMap.getString(JBSbatACIFM017.EM_KSH);
		paramList.setValue(emHojinKeiNo);					// ＥＭ契約者コード
		paramList.setValue(this.tmpSsnYmMatubi);			// 精算年月末日
		paramList.setValue(this.tmpSsnYmMatubi);			// EM法人サービス変換適用開始年月日
		paramList.setValue(this.tmpSsnYmMatubi);			// EM法人サービス変換適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getEmHojinSvcMap][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_EM_HJIN_SVC_CHG_AC_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_EM_HJIN_SVC_CHG.selectNext(); 

		// 対象データが存在しない場合
		if(dbMap == null)
		{
			// エラー情報の出力項目を設定する
			ArrayList<Object> errInfoData = createErrInfo(tranMap);
			
			// 修理代金等（ＥＭ契約なし）エラー情報に追加
			outErrInfo.add(errInfoData);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getEmHojinSvcMap]");
		return dbMap;
	}

	/**
	 * 出力情報を作成します。
	 * 
	 * @param tranMap 入力Ｔ（ＥＭ請求明細データ）
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputItem(JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputItem]");
		
		JBSbatServiceInterfaceMap outBean = new JBSbatServiceInterfaceMap();
		
		// 請求先番号
		outBean.set(JBSbatACIFM195.SEIKY_KEI_NO,		tranMap.get(JBSbatACIFM017.EM_KSH));
		// 請求年月
		outBean.set(JBSbatACIFM195.SEIKY_YM,			this.tmpSikyYm);
		// サービス番号
		outBean.set(JBSbatACIFM195.SVC_NO,				this.tmpSvcNo);
		// 料金コースコード
		outBean.set(JBSbatACIFM195.PCRS_CD,				this.tmpPcrsCd);
		// 料金サービスコード
		outBean.set(JBSbatACIFM195.PRC_SVC_CD,			this.tmpPrcSvcCd);
		// 料金項目コード
		outBean.set(JBSbatACIFM195.PRC_KMK_CD,			this.tmpOutPrcKmkCd);
		// 料金
		outBean.set(JBSbatACIFM195.PRC,					tranMap.get(JBSbatACIFM017.SIKY_UW_AMNT));
		// 相対区分
		outBean.set(JBSbatACIFM195.AIT_DIV,				JACStrConst.AITAIKBN_NON);
		// 締め日
		outBean.set(JBSbatACIFM195.SIME_DAY,			JACStrConst.SIME_DAY_GETUMATSU);
		// 事業者コード
		outBean.set(JBSbatACIFM195.JIGYOSHA_CD,			this.jigyoshaCd);
		// 事業者契約コード
		outBean.set(JBSbatACIFM195.JIGYOSHA_KEI_CD,		this.jigyoshaKeiCd);
		
		outBean.setOutFlg(true);
		
		outputInItem.addOutMapList(outBean);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputItem]");
		return;
	}

	/**
	 * エラー情報の出力項目を設定する
	 * @param inMap		入力電文
	 * @return	JBSbatServiceInterfaceMap	出力電文
	 * @throws Exception
	 */
	private ArrayList<Object> createErrInfo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		ArrayList<Object> errInfoData = new ArrayList<Object>();

		// レコードタイプ
		errInfoData.add(tranMap.getString(JBSbatACIFM017.REC_TYPE));

		// 再販事業者管理コード（サービス契約番号）
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SVC_KEI_NO));

		// ＭＳＩＳＤＮ
		errInfoData.add(tranMap.getString(JBSbatACIFM017.MSISDN));

		// 予備１
		errInfoData.add(tranMap.getString(JBSbatACIFM017.ICCID));

		// 予備２
		errInfoData.add(tranMap.getString(JBSbatACIFM017.IMEI));

		// ＥＭ契約者コード
		errInfoData.add(tranMap.getString(JBSbatACIFM017.EM_KSH));

		// 予備３
		errInfoData.add(tranMap.getString(JBSbatACIFM017.PLAN_NO));

		// 請求内訳コード
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SIKY_UW_CD));

		// 請求内訳名称
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SIKY_UW_NM));

		// 請求内訳金額
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SIKY_UW_AMNT));

		// 予備４
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SIKY_APLY_STAYMD));

		// 予備５
		errInfoData.add(tranMap.getString(JBSbatACIFM017.SIKY_APLY_ENDYMD));

		// 予備６
		errInfoData.add(tranMap.getString(JBSbatACIFM017.TTL_USE_PCT_CNT));

		// 備考
		errInfoData.add(tranMap.getString(JBSbatACIFM017.BIKO));

		// 予備７
		errInfoData.add(tranMap.getString(JBSbatACIFM017.YOBI));
		
		// 修理代金等（ＥＭ契約なし）ファイル出力件数カウントアップ
		this.errInfCnt++;
		
		return errInfoData;
	}
	
	/**
	 * ファイル出力
	 * 
	 * @param file ファイル名
	 * @param arrayList 出力データを格納した配列
	 * @param encode エンコード
	 * @param line 改行コード
	 * @param div 区切文字
	 * @throws Exception
	 */
	private void createFile(String file, ArrayList<ArrayList<Object>> arrayList, String encode, String line, String div) throws Exception
	{
		// encodeの形式がSHIFT-JISの場合、MS932に変換
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(encode.toUpperCase()))
		{
			encode = JACStrConst.ENCODE_MS932;
		}
		
		// ファイルの生成
		JBSbatBusinessFileUtil fileUtil = JCCBatCommon.createBusinessFileUtil(file, encode, line, div);
		Iterator<ArrayList<Object>> it = arrayList.iterator();
		// データ数分繰り返し
		while (it.hasNext())
		{
			// データを取得
			ArrayList<Object> data = it.next();
			// ファイルに書き込み
			JCCBatCommon.printBusinessFileUtil(fileUtil, data);
		}
		// ファイルを閉じる
		JCCBatCommon.closeBusinessFileUtil(fileUtil);
	}
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
}
