/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAC050ApUseKoInfJtTrkm
*	ソースファイル名	：JBSbatAC050ApUseKoInfJtTrkm.java
*	作成者				：富士通　
*	作成日				：2017年11月14日
*＜機能概要＞
*　050アプリ利用呼情報（上限通知）取込部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v35.00.00	2017/11/02   FJ）清原	【ANK-3192-00-00】LaLaCallの通話明細情報の取得タイミング変更 新規作成
*	v50.00.00	2020/07/23   GDC）ジョバニー	【ANK-3898-00-00】LaLaCall呼情報の取り込み方式の改善
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM204;
import eo.business.util.file.JBSbatACIFM205;
import eo.business.util.file.JBSbatACIFM207;
import eo.business.util.table.JBSbatAC_M_TUWA_SBT;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCN_T_CONT_KEI_UCWK;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAC050ApUseKoInfJtTrkm extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** テーブル(コンテンツ契約内訳)*/
	private static final String D_TBL_NAME_CN_T_CONT_KEI_UCWK = "CN_T_CONT_KEI_UCWK";

	/** テーブル(通話種別)*/
	private static final String D_TBL_NAME_AC_M_TUWA_SBT = "AC_M_TUWA_SBT";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CN_T_CONT_KEI_UCWK_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_004)*/
	private static final String AC_M_TUWA_SBT_AC_SELECT_004 = "AC_SELECT_004";

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/** テーブルアクセスクラス(コンテンツ契約)*/
	private JBSbatSQLAccess db_CN_T_CONT_KEI_UCWK = null;

	/** テーブルアクセスクラス(通話種別)*/
	private JBSbatSQLAccess db_AC_M_TUWA_SBT = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
		
	/** 課金表示(課金) */
	private static final String CHRG_DSP_CD_KA = "2";
	
	/** 転送時発信電話番号(フル桁*) */
	private static final String FULL_AST = "**********************";
	
	/** マスタのみフラグ */
	private boolean onlyMastData = false;
	
	/** フリー項目のファイル名 */
	private String[] freeFiles = null;
	
	/** 050アプリ利用呼情報(前月)情報ファイル */
	private JBSbatBusinessFileUtil apKoInfoDataFile = null;
	
	/** 請求年月 */
	private String seikyYm = null;

	/** 請求年月前月 */
	private String seikyYmBefore = null;
	
	/** 利用年月 */
	private String useYm = null;
	
	/** 利用年月前月 */
	private String useYmBefore = null;
	
	/** バッチ運用日(年月部分)*/
	private String opeDateYM = null;
	
	/** バッチ運用日前月(年月部分)*/
	private String opeDateYMBefore = null;

	/** 解約処理猶予時間 */
	private int kykDelayTime = 0;
	
	/** 退避．SYSID */
	private String bkSysId = null;
	
	/** 退避．コンテンツ契約番号 */
	private String bkContKeiNo = null;
	
	/** 退避．課金可否 */
	private String bkChrgKaHi = null;

	/** 退避．課税非課税コード */
	private String bkKazeiHikazeiCd = null;

	/** 退避．課金対象利用月識別コード */
	private String bkChrgTgUseMonSkbtCd = null;

	/** 退避．重複チェックコード */
	private String bkDbleChkCd = null;

	/** 退避．エラーコード */
	private String bkErrCd = null;

	/** 退避．エラー内容 */
	private String bkErrNaiyo = null;
	
	/** 通話種別マスタデータマップ */
	private HashMap<String, JBSbatCommonDBInterface> tuwaSbtMap = null;
	
	/** エラー情報出力項目マップ */
	private HashMap<String, String> errInfoMap = null;

	/** ファイル内重複チェック用 転送呼通話終了年月日時分秒リスト：課金電話番号単位でクリア */
	private ArrayList<String[]> prevEndymdhms_tenso_list = new ArrayList<String[]>();

	/** ファイル内重複チェック用 転送呼以外通話終了年月日時分秒リスト：課金電話番号単位でクリア */
	private ArrayList<String[]> prevEndymdhms_tensoigai_list = new ArrayList<String[]>();

	/** ファイル内重複チェック用キー(重複チェックコード１用) */
	private ArrayList<String> preDupChekRecord_cd1  = new ArrayList<String>();

	/** 前回の課金先電話番号を退避 */
	private String tmpKakinsTelNo = JACStrConst.KARA_MOJI;
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		db_CN_T_CONT_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CN_T_CONT_KEI_UCWK);
		db_AC_M_TUWA_SBT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_TUWA_SBT);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// ファイル名を取得
		String freeItem = commonItem.getFreeItem();
		this.freeFiles = freeItem.split(JACStrConst.FREE_DIV);

		// 050アプリ利用呼情報(前月)情報のオープン
		this.apKoInfoDataFile = createFile(freeFiles[0], freeFiles[1]); 

		// 請求年月を取得する
		this.seikyYm = getSeikyYm(super.opeDate);

		// 請求年月前月を取得する
		this.seikyYmBefore = JCCBatCommon.addMonth(seikyYm.concat(JACStrConst.STR_OF_MONTH), -1).substring(0, 6);

		// 料金スケジュール定義アクセス部品
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);

		// 利用年月を取得
		this.useYm = su.getBillDate(super.opeDate, JACStrConst.EVENT_050_TUWA_MAKE_YMD);

		// 利用年月前月を取得する
		this.useYmBefore = JCCBatCommon.addMonth(useYm.concat(JACStrConst.STR_OF_MONTH), -1).substring(0, 6);

		// 料金スケジュール定義アクセス部品をクローズ
		su.close();
		
		// 業務パラメータ取得アクセス部品
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 解約処理猶予時間
		this.kykDelayTime = Integer.valueOf(paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_KYK_DELAY_TIME));
		
		// エラー情報出力項目マップ
		this.errInfoMap = new HashMap<String, String>();
		
		// お客様ID取得エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_CUST_STKUERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_CUST_STKUERR));
		// 契約情報エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_KEI_INF_ERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_KEI_INF_ERR));
		// 通話種別取得エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_STKU_TWSBTERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_STKU_TWSBTERR));
		// 通話料連携済エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_TWR_RNKZM_ERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_TWR_RNKZM_ERR));
		// 通話開始年月未来日エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_TWSTA_FUTRERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_TWSTA_FUTRERR));
		// 読込ファイル内レコード重複エラー
		this.errInfoMap.put(JACStrConst.WKPARA_AC_MSG_LFILER_DBLERR, paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_LFILER_DBLERR));

		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		// バッチ運用日(年月部分)
		this.opeDateYM = super.opeDate.substring(0, 6);

		// バッチ運用日前月(年月部分)
		this.opeDateYMBefore = JCCBatCommon.addMonth(super.opeDate, -1).substring(0, 6);

		// 通話種別マスタデータ取得
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 通話種別マスタデータマップ
		this.tuwaSbtMap = new HashMap<String, JBSbatCommonDBInterface>();
		
		// 対象キーの設定
		dbList.setValue(super.opeDate);								// バッチ運用日
		dbList.setValue(super.opeDate);								// バッチ運用日
		dbList.setValue(JACStrConst.PCALL_SVC_SBT_CD_050_APP);		// "93"(050アプリ) 

		
		// SQL実行
		executeAC_M_TUWA_SBT_AC_SELECT_004(dbList.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_AC_M_TUWA_SBT.selectNext();
		
		// 検索結果が存在する場合
		if (dbMap != null) 
		{
			while (dbMap != null)
			{
				// 通話種別．通話種別コード ＋ 通話種別．通話サービス識別コード
				String mapKey = this.makeStr(dbMap.getString(JBSbatAC_M_TUWA_SBT.PCALL_SBT_CD)
													, dbMap.getString(JBSbatAC_M_TUWA_SBT.TUWA_SVC_SKBT_CD));
				
				// 通話種別マスタデータマップに取得結果を格納する
				tuwaSbtMap.put(mapKey, dbMap);
				
				dbMap = db_AC_M_TUWA_SBT.selectNext();
			}
		}
		else
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInfo][DB未存在エラー]");
			String[] outCntMsg = {JBSbatAC_M_TUWA_SBT.TABLE_NAME, dbList.getList().toString()};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}
		 
		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;

		// マスタのみフラグ初期化
		this.onlyMastData = false;
		
		// エラーレコード判定フラグ
		boolean errJudgeFlg = false;
		
		// 入力Ｍのみ存在する
		if (mastMap != null && tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");
			
			// マスタのみフラグ←true
			this.onlyMastData = true;
			
			// SQLローダー用明細情報ファイル出力処理
			outputInItem.addOutMapList_2(this.makeSqlLoaderInfo(mastMap, tranMap));

			// フラグ．マスタ ← true
			this.setMastProcFlg(true);
		}
		// 入力Ｔのみ存在する
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
			
			// 各エラーチェックを行う
			errJudgeFlg = checkInfo(tranMap);
			
			// 正常データの場合
			if(!errJudgeFlg)
			{
				// 入力T．通話終了日
				String pcallEndYmd = tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD).substring(0, 6);
				
				// 入力T．通話終了日＝バッチ運用日の場合
				if(pcallEndYmd.equals(this.opeDateYM))
				{
					// SQLローダー用明細情報ファイル出力処理
					outputInItem.addOutMapList_2(this.makeSqlLoaderInfo(mastMap, tranMap));
				}
				// 入力T．通話終了日＝バッチ運用日前月の場合
				else if(pcallEndYmd.equals(this.opeDateYMBefore))
				{
					// 050アプリ利用呼情報(前月)ファイル出力処理
					make050ApUseKoInfo(tranMap);
				}
			}
			// いずれかのエラーチェックに該当している場合
			else
			{
				// ファイル出力処理
				outputInItem.addOutMapList(this.make050ApErrInfo(tranMap));

			}

			// フラグ．トラン ← true
			this.setTranProcFlg(true);
		}
		// 入力Ｍ、入力Ｔともに存在する
		else
		{
			// マッチングキー取得
			
			// 入力M：課金先電話番号＋通話開始年月日＋通話開始時分秒＋転送時発信電話番号＋通話種別コード
			String mastKey = this.makeStr(mastMap.getString(JBSbatACIFM207.KAKINS_TELNO), mastMap.getString(JBSbatACIFM207.PCALL_STAYMD), mastMap.getString(JBSbatACIFM207.PCALL_STA_HMS), mastMap.getString(JBSbatACIFM207.TENSO_JI_HASHIN_TELNO), mastMap.getString(JBSbatACIFM207.TUWA_SKBT_CD));
			
			String tensoJiHashinTelno = tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO);
			
			// 転送時発信電話番号が未設定のときはALL＊で埋める
			if(tensoJiHashinTelno== null || tensoJiHashinTelno.trim().equals(""))
			{
				tensoJiHashinTelno = FULL_AST;
			}
			
			// 入力T：課金電話番号＋通話開始日＋通話開始時刻＋転送時発信番号＋通話種別
			String tranKey = this.makeStr(tranMap.getString(JBSbatACIFM204.KAKINS_TELNO), tranMap.getString(JBSbatACIFM204.PCALL_STAYMD), tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS), tensoJiHashinTelno, tranMap.getString(JBSbatACIFM204.PCALL_SBT));
			
			// 入力T．通話終了日
			String pcallEndYmd = tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD).substring(0, 6);
			
			// 入力Ｍ＝入力Ｔ（マッチ）
			if (mastKey.compareTo(tranKey) == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");

				// 各エラーチェックを行う
				errJudgeFlg = checkInfo(tranMap);
				
				// 正常データの場合
				if(!errJudgeFlg)
				{
					// 入力T．通話終了日＝バッチ運用日の場合
					if(pcallEndYmd.equals(this.opeDateYM))
					{
						// SQLローダー用明細情報ファイル出力処理
						outputInItem.addOutMapList_2(this.makeSqlLoaderInfo(mastMap, tranMap));
					}
					// 入力T．通話終了日＝バッチ運用日前月の場合
					else if(pcallEndYmd.equals(this.opeDateYMBefore))
					{
						// 050アプリ利用呼情報(前月)ファイル出力処理
						make050ApUseKoInfo(tranMap);
					}
				}
				// いずれかのエラーチェックに該当している場合
				else
				{
					// ファイル出力処理
					outputInItem.addOutMapList(this.make050ApErrInfo(tranMap));

				}

				// フラグ．マスタ ← true
				this.setMastProcFlg(true);
				
				// フラグ．トラン ← true
				this.setTranProcFlg(true);

			}
			
			// 入力Ｍ＜入力Ｔ
			else if (mastKey.compareTo(tranKey) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");

				// マスタのみフラグ←true
				this.onlyMastData = true;
				
				// SQLローダー用明細情報ファイル出力処理
				outputInItem.addOutMapList_2(this.makeSqlLoaderInfo(mastMap, tranMap));
				
				// フラグ．マスタ ← true
				this.setMastProcFlg(true);
			}
			
			// 入力Ｍ＞入力Ｔ
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");

				// 各エラーチェックを行う
				errJudgeFlg = checkInfo(tranMap);
				
				// 正常データの場合
				if(!errJudgeFlg)
				{
					// 入力T．通話終了日＝バッチ運用日の場合
					if(pcallEndYmd.equals(this.opeDateYM))
					{
						// SQLローダー用明細情報ファイル出力処理
						outputInItem.addOutMapList_2(this.makeSqlLoaderInfo(mastMap, tranMap));
					}
					// 入力T．通話終了日＝バッチ運用日前月の場合
					else if(pcallEndYmd.equals(this.opeDateYMBefore))
					{
						// 050アプリ利用呼情報(前月)ファイル出力処理
						make050ApUseKoInfo(tranMap);
					}
				}
				// いずれかのエラーチェックに該当している場合
				else
				{
					// ファイル出力処理
					outputInItem.addOutMapList(this.make050ApErrInfo(tranMap));

				}

				// フラグ．トラン ← true
				this.setTranProcFlg(true);
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_SCHDL_TEIGI.close();
		db_CN_T_CONT_KEI_UCWK.close();
		db_AC_M_TUWA_SBT.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// ファイルクローズ
		JCCBatCommon.closeBusinessFileUtil(this.apKoInfoDataFile);

		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_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 executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	050電話番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCN_T_CONT_KEI_UCWK_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CN_T_CONT_KEI_UCWK.selectBySqlDefine(paramList, CN_T_CONT_KEI_UCWK_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	通話種別適用開始年月日
	 *		 	通話種別適用終了年月日
	 *		 	通話サービス種別コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_TUWA_SBT_AC_SELECT_004(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_AC_M_TUWA_SBT.selectBySqlDefine(paramList, AC_M_TUWA_SBT_AC_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 050アプリ利用呼情報エラー情報(取込)ファイル出力処理
	 * @param  mastMap    入力電文
	 * @param  tranMap    入力電文
	 * @return outInfoMap SQLローダー用明細情報
	 * @throws Exception  業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap make050ApErrInfo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][make050ApErrInfo]");
		
		JBSbatServiceInterfaceMap outInfoMap = new JBSbatServiceInterfaceMap();
		
		// 課金電話番号
		outInfoMap.set(JBSbatACIFM205.KAKINS_TELNO,							tranMap.getString(JBSbatACIFM204.KAKINS_TELNO));
		// 発信元電話番号
		outInfoMap.set(JBSbatACIFM205.HASHIN_TELNO,							tranMap.getString(JBSbatACIFM204.HASHIN_TELNO));
		// 着信先電話番号
		outInfoMap.set(JBSbatACIFM205.INCOMING_TELNO,						tranMap.getString(JBSbatACIFM204.INCOMING_TELNO));
		// 通話開始日
		outInfoMap.set(JBSbatACIFM205.PCALL_STAYMD,							tranMap.getString(JBSbatACIFM204.PCALL_STAYMD));
		// 通話開始時刻
		outInfoMap.set(JBSbatACIFM205.PCALL_STA_HMS,						tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS));
		// 通話終了日
		outInfoMap.set(JBSbatACIFM205.PCALL_ENDYMD,							tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD));
		// 通話終了時刻
		outInfoMap.set(JBSbatACIFM205.PCALL_END_HMS,						tranMap.getString(JBSbatACIFM204.PCALL_END_HMS));
		// 通話秒数
		outInfoMap.set(JBSbatACIFM205.PCALL_SEC_CNT,						new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_SEC_CNT), JACStrConst.PCALL_SEC_CNT_DEC_LENGTH)));
		// 通話度数
		outInfoMap.set(JBSbatACIFM205.PCALL_DOSU,							tranMap.getString(JBSbatACIFM204.PCALL_DOSU));
		// 通話単価
		outInfoMap.set(JBSbatACIFM205.PCALL_TANKA,							new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_TANKA), JACStrConst.PCALL_TANKA_DEC_LENGTH)));
		// 通話料金
		outInfoMap.set(JBSbatACIFM205.PCALL_PRC,							new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_PRC), JACStrConst.PCALL_PRC_DEC_LENGTH)));
		// 通話種別
		outInfoMap.set(JBSbatACIFM205.PCALL_SBT,							tranMap.getString(JBSbatACIFM204.PCALL_SBT));
		// サービス区分
		outInfoMap.set(JBSbatACIFM205.SVC_DIV,								tranMap.getString(JBSbatACIFM204.TUWA_SVC_SKBT_CD));
		// 切断理由-SIP
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV_SIP,						tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_SIP));
		// 切断理由-ISUP
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV_ISUP,						tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_ISUP));
		// 切断理由区分
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV,							tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV));
		// 切断詳細情報-大項目
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_DKMK_IDX_NO,			tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_DKMK_IDX_NO));
		// 切断詳細情報-中項目
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_CKMK_IDX_NO,			tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_CKMK_IDX_NO));
		// 切断詳細情報-発着種別
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_HTCK_SBT_CD,			tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_HTCK_SBT_CD));
		// 課金表示
		outInfoMap.set(JBSbatACIFM205.CHRG_DSP_CD,							tranMap.getString(JBSbatACIFM204.CHRG_DSP_CD));
		// 緊急通報呼フラグ
		outInfoMap.set(JBSbatACIFM205.EMG_KO_FLG,							tranMap.getString(JBSbatACIFM204.EMG_KO_FLG));
		// CHG信号受信回数
		outInfoMap.set(JBSbatACIFM205.CHG_SIGNAL_RCV_CNT,					tranMap.getString(JBSbatACIFM204.CHG_SIGNAL_RCV_CNT));
		// 転送時発信元番号
		outInfoMap.set(JBSbatACIFM205.TENSO_JI_HASHIN_TELNO,				tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO));
		// 国名
		outInfoMap.set(JBSbatACIFM205.COUNTRY_NM,							tranMap.getString(JBSbatACIFM204.COUNTRY_NM));
		// エラーコード
		outInfoMap.set(JBSbatACIFM205.ERR_CD,								this.bkErrCd);
		// エラー内容
		outInfoMap.set(JBSbatACIFM205.ERR_NAIYO,							this.bkErrNaiyo);

		outInfoMap.setOutFlg(true);
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][make050ApErrInfo]");
		
		return outInfoMap;
	}

	
	
	/**
	 * SQLローダー用明細情報ファイル出力処理
	 * @param  mastMap    入力電文
	 * @param  tranMap    入力電文
	 * @return outInfoMap SQLローダー用明細情報
	 * @throws Exception  業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeSqlLoaderInfo(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeSqlLoaderInfo]");
		
		JBSbatServiceInterfaceMap outInfoMap = new JBSbatServiceInterfaceMap();
		
		// マスタのみフラグ = true の場合
		if(this.onlyMastData)
		{
			// SYSID
			outInfoMap.set(JBSbatACIFM207.SYSID,							mastMap.getString(JBSbatACIFM207.SYSID));
			// 課金先電話番号
			outInfoMap.set(JBSbatACIFM207.KAKINS_TELNO,						mastMap.getString(JBSbatACIFM207.KAKINS_TELNO));
			// コンテンツ契約番号
			outInfoMap.set(JBSbatACIFM207.CONT_KEI_NO,						mastMap.getString(JBSbatACIFM207.CONT_KEI_NO));
			// 課金対象年月
			outInfoMap.set(JBSbatACIFM207.KAKIN_TRG_YM,						mastMap.getString(JBSbatACIFM207.KAKIN_TRG_YM));
			// 通話開始年月日
			outInfoMap.set(JBSbatACIFM207.PCALL_STAYMD,						mastMap.getString(JBSbatACIFM207.PCALL_STAYMD));
			// 通話開始時分秒
			outInfoMap.set(JBSbatACIFM207.PCALL_STA_HMS,					mastMap.getString(JBSbatACIFM207.PCALL_STA_HMS));
			// 発信電話番号
			outInfoMap.set(JBSbatACIFM207.HASHIN_TELNO,						mastMap.getString(JBSbatACIFM207.HASHIN_TELNO));
			// 着信電話番号
			outInfoMap.set(JBSbatACIFM207.INCOMING_TELNO,					mastMap.getString(JBSbatACIFM207.INCOMING_TELNO));
			// 通話終了年月日
			outInfoMap.set(JBSbatACIFM207.PCALL_ENDYMD,						mastMap.getString(JBSbatACIFM207.PCALL_ENDYMD));
			// 通話終了時分秒
			outInfoMap.set(JBSbatACIFM207.PCALL_END_HMS,					mastMap.getString(JBSbatACIFM207.PCALL_END_HMS));
			// 通話秒数
			outInfoMap.set(JBSbatACIFM207.PCALL_SEC_CNT,					mastMap.getString(JBSbatACIFM207.PCALL_SEC_CNT));
			// 通話度数
			outInfoMap.set(JBSbatACIFM207.PCALL_DOSU,						mastMap.getString(JBSbatACIFM207.PCALL_DOSU));
			// 通話単価
			outInfoMap.set(JBSbatACIFM207.PCALL_TANKA,						mastMap.getString(JBSbatACIFM207.PCALL_TANKA));
			// 通話料金
			outInfoMap.set(JBSbatACIFM207.PCALL_PRC,						mastMap.getString(JBSbatACIFM207.PCALL_PRC));
			// 通話種別コード
			outInfoMap.set(JBSbatACIFM207.TUWA_SKBT_CD,						mastMap.getString(JBSbatACIFM207.TUWA_SKBT_CD));
			// 課税非課税コード
			outInfoMap.set(JBSbatACIFM207.KAZEI_HIKAZEI_CD,					mastMap.getString(JBSbatACIFM207.KAZEI_HIKAZEI_CD));
			// 通話サービス識別コード
			outInfoMap.set(JBSbatACIFM207.TUWA_SVC_SKBT_CD,					mastMap.getString(JBSbatACIFM207.TUWA_SVC_SKBT_CD));
			// 切断理由-SIP
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV_SIP,					mastMap.getString(JBSbatACIFM207.CUT_RSN_DIV_SIP));
			// 切断理由-ISUP
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV_ISUP,					mastMap.getString(JBSbatACIFM207.CUT_RSN_DIV_ISUP));
			// 切断理由区分
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV,						mastMap.getString(JBSbatACIFM207.CUT_RSN_DIV));
			// 切断詳細情報-大項目インデックス番号
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_DKMK_IDX_NO,		mastMap.getString(JBSbatACIFM207.CUT_DTAIL_INFO_DKMK_IDX_NO));
			// 切断明細情報-中項目インデックス
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_CKMK_IDX_NO,		mastMap.getString(JBSbatACIFM207.CUT_DTAIL_INFO_CKMK_IDX_NO));
			// 切断明細情報-発着種別コード
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_HTCK_SBT_CD,		mastMap.getString(JBSbatACIFM207.CUT_DTAIL_INFO_HTCK_SBT_CD));
			// 課金表示コード
			outInfoMap.set(JBSbatACIFM207.CHRG_DSP_CD,						mastMap.getString(JBSbatACIFM207.CHRG_DSP_CD));
			// 緊急通報呼フラグ
			outInfoMap.set(JBSbatACIFM207.EMG_KO_FLG,						mastMap.getString(JBSbatACIFM207.EMG_KO_FLG));
			// CHG信号受信回数
			outInfoMap.set(JBSbatACIFM207.CHG_SIGNAL_RCV_CNT,				mastMap.getString(JBSbatACIFM207.CHG_SIGNAL_RCV_CNT));
			// 転送時発信電話番号
			outInfoMap.set(JBSbatACIFM207.TENSO_JI_HASHIN_TELNO,			mastMap.getString(JBSbatACIFM207.TENSO_JI_HASHIN_TELNO));
			// 国名
			outInfoMap.set(JBSbatACIFM207.COUNTRY_NM,						mastMap.getString(JBSbatACIFM207.COUNTRY_NM));
			// 課金可否
			outInfoMap.set(JBSbatACIFM207.CHRG_KH,							mastMap.getString(JBSbatACIFM207.CHRG_KH));
		}
		// 上記以外の場合
		else
		{
			// SYSID
			outInfoMap.set(JBSbatACIFM207.SYSID,							this.bkSysId);
			// 課金先電話番号
			outInfoMap.set(JBSbatACIFM207.KAKINS_TELNO,						tranMap.getString(JBSbatACIFM204.KAKINS_TELNO));
			// コンテンツ契約番号
			outInfoMap.set(JBSbatACIFM207.CONT_KEI_NO,						this.bkContKeiNo);
			// 課金対象年月
			outInfoMap.set(JBSbatACIFM207.KAKIN_TRG_YM,						tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD).substring(0, 6));
			// 通話開始年月日
			outInfoMap.set(JBSbatACIFM207.PCALL_STAYMD,						tranMap.getString(JBSbatACIFM204.PCALL_STAYMD));
			// 通話開始時分秒
			outInfoMap.set(JBSbatACIFM207.PCALL_STA_HMS,					tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS));
			// 発信電話番号
			outInfoMap.set(JBSbatACIFM207.HASHIN_TELNO,						tranMap.getString(JBSbatACIFM204.HASHIN_TELNO));
			// 着信電話番号
			outInfoMap.set(JBSbatACIFM207.INCOMING_TELNO,					tranMap.getString(JBSbatACIFM204.INCOMING_TELNO));
			// 通話終了年月日
			outInfoMap.set(JBSbatACIFM207.PCALL_ENDYMD,						tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD));
			// 通話終了時分秒
			outInfoMap.set(JBSbatACIFM207.PCALL_END_HMS,					tranMap.getString(JBSbatACIFM204.PCALL_END_HMS));
			// 通話秒数
			outInfoMap.set(JBSbatACIFM207.PCALL_SEC_CNT,					new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_SEC_CNT), JACStrConst.PCALL_SEC_CNT_DEC_LENGTH)));
			// 通話度数
			outInfoMap.set(JBSbatACIFM207.PCALL_DOSU,						tranMap.getString(JBSbatACIFM204.PCALL_DOSU));
			// 通話単価
			outInfoMap.set(JBSbatACIFM207.PCALL_TANKA,						new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_TANKA), JACStrConst.PCALL_TANKA_DEC_LENGTH)));
			// 通話料金
			outInfoMap.set(JBSbatACIFM207.PCALL_PRC,						new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_PRC), JACStrConst.PCALL_PRC_DEC_LENGTH)));
			// 通話種別コード
			outInfoMap.set(JBSbatACIFM207.TUWA_SKBT_CD,						tranMap.getString(JBSbatACIFM204.PCALL_SBT));
			// 課税非課税コード
			outInfoMap.set(JBSbatACIFM207.KAZEI_HIKAZEI_CD,					this.bkKazeiHikazeiCd);
			// 通話サービス識別コード
			outInfoMap.set(JBSbatACIFM207.TUWA_SVC_SKBT_CD,					tranMap.getString(JBSbatACIFM204.TUWA_SVC_SKBT_CD));
			// 切断理由-SIP
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV_SIP,					tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_SIP));
			// 切断理由-ISUP
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV_ISUP,					tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_ISUP));
			// 切断理由区分
			outInfoMap.set(JBSbatACIFM207.CUT_RSN_DIV,						tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV));
			// 切断詳細情報-大項目インデックス番号
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_DKMK_IDX_NO,		tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_DKMK_IDX_NO));
			// 切断明細情報-中項目インデックス
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_CKMK_IDX_NO,		tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_CKMK_IDX_NO));
			// 切断明細情報-発着種別コード
			outInfoMap.set(JBSbatACIFM207.CUT_DTAIL_INFO_HTCK_SBT_CD,		tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_HTCK_SBT_CD));
			// 課金表示コード
			outInfoMap.set(JBSbatACIFM207.CHRG_DSP_CD,						tranMap.getString(JBSbatACIFM204.CHRG_DSP_CD));
			// 緊急通報呼フラグ
			outInfoMap.set(JBSbatACIFM207.EMG_KO_FLG,						tranMap.getString(JBSbatACIFM204.EMG_KO_FLG));
			// CHG信号受信回数
			outInfoMap.set(JBSbatACIFM207.CHG_SIGNAL_RCV_CNT,				tranMap.getString(JBSbatACIFM204.CHG_SIGNAL_RCV_CNT));
			
			// 転送時発信電話番号
			// 入力T．転送時発信電話番号がnullの場合
			if(tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO) == null || tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO).trim().equals(""))
			{
				outInfoMap.set(JBSbatACIFM207.TENSO_JI_HASHIN_TELNO,		FULL_AST);
			}
			// 上記以外の場合
			else
			{
				outInfoMap.set(JBSbatACIFM207.TENSO_JI_HASHIN_TELNO,		tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO));
			}
			
			// 国名
			outInfoMap.set(JBSbatACIFM207.COUNTRY_NM,						tranMap.getString(JBSbatACIFM204.COUNTRY_NM));
			// 課金可否
			outInfoMap.set(JBSbatACIFM207.CHRG_KH,							this.bkChrgKaHi);

		}

		outInfoMap.setOutFlg(true);
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeSqlLoaderInfo]");
		
		return outInfoMap;
	}

	/**
	 * 050アプリ利用呼情報(前月)ファイル出力処理
	 * 
	 * @param  outPutMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void make050ApUseKoInfo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][make050ApUseKoInfo]");
		
		ArrayList<Object> outPutDateInfoList = new ArrayList<Object>();

		// SYSID
		outPutDateInfoList.add(this.bkSysId);
		// 課金先電話番号
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.KAKINS_TELNO));
		// コンテンツ契約番号
		outPutDateInfoList.add(this.bkContKeiNo);
		// 課金対象年月
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD).substring(0, 6));
		// 通話開始年月日
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_STAYMD));
		// 通話開始時分秒
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS));
		// 発信電話番号
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.HASHIN_TELNO));
		// 着信電話番号
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.INCOMING_TELNO));
		// 通話終了年月日
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD));
		// 通話終了時分秒
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_END_HMS));
		// 通話秒数
		outPutDateInfoList.add(new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_SEC_CNT), JACStrConst.PCALL_SEC_CNT_DEC_LENGTH)));
		// 通話度数
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_DOSU));
		// 通話単価
		outPutDateInfoList.add(new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_TANKA), JACStrConst.PCALL_TANKA_DEC_LENGTH)));
		// 通話料金
		outPutDateInfoList.add(new BigDecimal(addDecimalPoint(tranMap.getString(JBSbatACIFM204.PCALL_PRC), JACStrConst.PCALL_PRC_DEC_LENGTH)));
		// 通話種別コード
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.PCALL_SBT));
		// 課税非課税コード
		outPutDateInfoList.add(this.bkKazeiHikazeiCd);
		// 通話サービス識別コード
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.TUWA_SVC_SKBT_CD));
		// 切断理由区分-SIP
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_SIP));
		// 切断理由区分-ISUP
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV_ISUP));
		// 切断理由区分
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_RSN_DIV));
		// 切断詳細情報-大項目インデックス番号
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_DKMK_IDX_NO));
		// 切断詳細情報-中項目インデックス番号
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_CKMK_IDX_NO));
		// 切断詳細情報-発着種別コード
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CUT_DTAIL_INFO_HTCK_SBT_CD));
		// 課金表示コード
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CHRG_DSP_CD));
		// 緊急通報呼フラグ
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.EMG_KO_FLG));
		// CHG信号受信回数
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.CHG_SIGNAL_RCV_CNT));
		
		// 転送時発信電話番号
		// 入力T．転送時発信電話番号がnullの場合
		if(tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO) == null || tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO).trim().equals(""))
		{
			outPutDateInfoList.add(FULL_AST);
		}
		// 上記以外の場合
		else
		{
			outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO));
		}

		// 国名
		outPutDateInfoList.add(tranMap.getString(JBSbatACIFM204.COUNTRY_NM));
		// 課金可否
		outPutDateInfoList.add(this.bkChrgKaHi);

		// 050アプリ利用呼情報(前月)ファイル出力
		JCCBatCommon.printBusinessFileUtil(this.apKoInfoDataFile, outPutDateInfoList);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][make050ApUseKoInfo]");
		
	}

	/**
	 * 各エラーチェックを実施する
	 * 
	 * @param tranMap    トランファイル
	 * @return errFlg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean checkInfo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// エラーデータ該当フラグ
		boolean errFlg = false;
		
		// コンテンツ契約情報取得処理
		errFlg = getContKeiInfo(tranMap);
	
		if(!errFlg)
		{
			// 通話種別存在チェック
			errFlg = checkTuwaSbt(tranMap);
		}
		
		if(!errFlg)
		{
			// 遅延呼チェック
			errFlg = checkChienKo(tranMap);
		}
		
		if(!errFlg)
		{
			// 未来呼チェック
			errFlg = checkFutureKo(tranMap);
		}

		if(!errFlg)
		{
			// 重複チェック
			errFlg = checkDouble(tranMap);
			
			// 重複チェックエラーならエラーコードとエラー内容を設定
			if(errFlg)
			{
				// 読込ファイル内レコード重複エラー
				this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_LFILER_DBLERR;
				this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_LFILER_DBLERR);
			}
		}

		if(!errFlg)
		{
			// 課金表示
			String chrgDspCd = tranMap.getString(JBSbatACIFM204.CHRG_DSP_CD);
			
			// 課金可不可判定処理
			judgeKakinKaHi(chrgDspCd);
		}

		return errFlg;

	}
	
	
	/**
	 * コンテンツ契約情報を取得する
	 * 
	 * @param tranMap    トランファイル
	 * @return errFlg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean getContKeiInfo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// エラーデータ該当フラグ
		boolean errFlg = false;
		
		// コンテンツ契約情報取得フラグ
		boolean getContInfoFlg = false;
		
		// 入力T．課金電話番号
		String kakinTelNo = tranMap.getString(JBSbatACIFM204.KAKINS_TELNO);
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		paramList.setValue(kakinTelNo);									// 050電話番号

		executeCN_T_CONT_KEI_UCWK_AC_SELECT_002(paramList.getList().toArray());

		JBSbatCommonDBInterface record = db_CN_T_CONT_KEI_UCWK.selectNext();

		// 取得結果が存在する場合
		if (record != null)
		{
			while(record != null)
			{
				// コンテンツ契約内訳．サービス開始年月日時分秒
				String tuwaStaYmd = record.getString(JBSbatCN_T_CONT_KEI_UCWK.SVC_STA_DTM);
				
				// 取得日付がnullの場合、処理をスキップします。
				if (tuwaStaYmd == null || tuwaStaYmd.trim().isEmpty())
				{
					// 次レコード取得
					record = db_CN_T_CONT_KEI_UCWK.selectNext();
					
					continue;
				}
				// nullではない場合、データを15バイト取得します。
				else
				{
					tuwaStaYmd = tuwaStaYmd.substring(0, 15);
				}
			
				// コンテンツ契約内訳．サービス終了年月日時分秒＋解約処理猶予時間
				String tuwaEndYmd = JACbatRknBusinessUtil.addHour(record.getString(JBSbatCN_T_CONT_KEI_UCWK.SVC_END_DTM), this.kykDelayTime).substring(0, 15);
				
				// 入力T．通話開始日
				String inTuwaStaYmd = tranMap.getString(JBSbatACIFM204.PCALL_STAYMD).concat(tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS));

				// （サービス終了年月日時分秒＋解約処理猶予時間） < 入力T．通話開始日 
				// の場合その呼情報に対する取込処理を終了
				if (tuwaEndYmd.compareTo(inTuwaStaYmd) < 0)
				{
					break;
				}

				// コンテンツ契約内訳．サービス開始年月日時分秒≦入力T．通話開始日≦コンテンツ契約内訳．サービス終了年月日時分秒＋解約処理猶予時間
				if(tuwaStaYmd.compareTo(inTuwaStaYmd) <= 0 && tuwaEndYmd.compareTo(inTuwaStaYmd) >= 0)
				{
					// 退避．SYSID←コンテンツ契約内訳．SYSID
					this.bkSysId = record.getString(JBSbatCN_T_CONT_KEI_UCWK.SYSID);
					
					// 退避．コンテンツ契約番号←コンテンツ契約内訳．コンテンツ契約番号
					this.bkContKeiNo = record.getString(JBSbatCN_T_CONT_KEI_UCWK.CONT_KEI_NO);
					
					// コンテンツ契約情報取得フラグ←true
					getContInfoFlg = true;
					
					break;
				}
				
				// 次レコード取得
				record = db_CN_T_CONT_KEI_UCWK.selectNext();
			}
			
			// 契約期間が一致するコンテンツ契約情報が存在しない場合
			if(!getContInfoFlg)
			{
				// 契約情報エラーを設定
// ANK-3898-00-00 Mod Start
//				this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_KEI_INF_ERR;
//				this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_KEI_INF_ERR);
				this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_CUST_STKUERR;
				this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_CUST_STKUERR);
// ANK-3898-00-00 Mod End
				
				// エラーデータ該当フラグ←true
				errFlg = true;
			}
		}
		// 取得結果が存在しない場合
		else
		{
			// お客様IDエラーを設定
			this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_CUST_STKUERR;
			this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_CUST_STKUERR);
			
			// エラーデータ該当フラグ←true
			errFlg = true;
		}
		
		return errFlg;
	}

	/**
	 * 通話種別存在チェック処理
	 * 
	 * @param tranMap    トランファイル
	 * @return errFlg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean checkTuwaSbt(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// エラーデータ該当フラグ
		boolean errFlg = false;
		
		// 検索キー
		String searchKey = this.makeStr(tranMap.getString(JBSbatACIFM204.PCALL_SBT), tranMap.getString(JBSbatACIFM204.TUWA_SVC_SKBT_CD));
		
		// 検索結果が存在する場合
		if(this.tuwaSbtMap.containsKey(searchKey))
		{
			// 通話種別マスタデータマップより値を取得
			JBSbatCommonDBInterface tuwaSbtdb = this.tuwaSbtMap.get(searchKey);
			
			// 課税非課税コード
			this.bkKazeiHikazeiCd = tuwaSbtdb.getString(JBSbatAC_M_TUWA_SBT.KAZEI_HIKAZEI_CD);
			// 課金対象利用月識別コード
			this.bkChrgTgUseMonSkbtCd  = tuwaSbtdb.getString(JBSbatAC_M_TUWA_SBT.CHRG_TG_USE_MON_SKBT_CD);
			// 重複チェックコード
			this.bkDbleChkCd = tuwaSbtdb.getString(JBSbatAC_M_TUWA_SBT.DBLE_CHK_CD);
		}
		// 検索結果が存在しない場合
		else
		{
			// 通話種別取得エラー
			this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_STKU_TWSBTERR;
			this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_STKU_TWSBTERR);
			
			// エラーデータ該当フラグ←true
			errFlg = true;
		}

		return errFlg;
	}
	
	/**
	 * 遅延呼チェック処理
	 * 
	 * @param tranMap    トランファイル
	 * @return errFlg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean checkChienKo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// エラーデータ該当フラグ
		boolean errFlg = false;
		
		// 入力T．通話終了日
		String PcallEndYmd = tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD).substring(0, 6);
		
		if(this.bkChrgTgUseMonSkbtCd.equals("0") && PcallEndYmd.compareTo(this.useYm) < 0 ||
									this.bkChrgTgUseMonSkbtCd.equals("1") && PcallEndYmd.compareTo(this.useYmBefore) < 0)
		{
			// 通話料連携済みエラー
			
			this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_TWR_RNKZM_ERR;
			this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_TWR_RNKZM_ERR);
			
			// エラーデータ該当フラグ←true
			errFlg = true;
		}
		
		return errFlg;
	}
	
	
	/**
	 * 未来呼チェック処理
	 * 
	 * @param tranMap    トランファイル
	 * @return errFlg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean checkFutureKo(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// エラーデータ該当フラグ
		boolean errFlg = false;
		
		if(this.bkChrgTgUseMonSkbtCd.equals("1") && this.seikyYmBefore.compareTo((tranMap.getString(JBSbatACIFM204.PCALL_STAYMD)).substring(0, 6)) < 0)
		{
			// 通話開始年月未来日エラー
			this.bkErrCd    = JACStrConst.WKPARA_AC_MSG_TWSTA_FUTRERR;
			this.bkErrNaiyo = this.errInfoMap.get(JACStrConst.WKPARA_AC_MSG_TWSTA_FUTRERR);
			
			// エラーデータ該当フラグ←true
			errFlg = true;
		}
		
		return errFlg;
	}
	
	/**
	 * 重複チェック処理
	 * 
	 * @param tranMap    トランファイル
	 * @return errFLg    エラーデータ該当フラグ
	 * @throws Exception
	 */
	private boolean checkDouble(JBSbatServiceInterfaceMap tranMap) throws Exception
	{

		/* ▼チェックに必要な項目 */
		// 課金電話番号
		String kakins_telno = tranMap.getString(JBSbatACIFM204.KAKINS_TELNO);

		// 通話開始年月日
		String pcall_staymd = tranMap.getString(JBSbatACIFM204.PCALL_STAYMD);

		// 通話開始時分秒
		String pcall_sta_hms = tranMap.getString(JBSbatACIFM204.PCALL_STA_HMS);

		// 通話終了年月日
		String pcall_endymd = tranMap.getString(JBSbatACIFM204.PCALL_ENDYMD);

		// 通話終了時分秒
		String pcall_end_hms = tranMap.getString(JBSbatACIFM204.PCALL_END_HMS);

		// 転送元電話番号
		String tenso_ji_hashin_telno = tranMap.getString(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO);

		// 通話種別
		String pcall_sbt = tranMap.getString(JBSbatACIFM204.PCALL_SBT);

		// 課金電話番号、通話開始年月日、通話開始時分秒、通話種別、転送元電話番号
		String fileKey = kakins_telno + pcall_staymd + pcall_sta_hms + pcall_sbt + tenso_ji_hashin_telno;

		// 通話開始年月日時分秒
		String pcall_staymdhms = pcall_staymd + pcall_sta_hms;

		// 通話終了年月日時分秒
		String pcall_endymdhms = pcall_endymd +  pcall_end_hms;

		// 重複チェックコードを取得
		// 重複チェックコードごとにチェック内容が分かれる
		String dbleChkCd = this.bkDbleChkCd;

		//発信元電話番号
		String hashin_telno = tranMap.getString(JBSbatACIFM204.HASHIN_TELNO);

		//======================================================================================================
		// ▼初回はチェックOKで返す＋現在行の重複チェックキー退避▼
		if (!kakins_telno.equals(tmpKakinsTelNo))
		{
			// チェック用リストのクリア
			prevEndymdhms_tenso_list.clear();
			prevEndymdhms_tensoigai_list.clear();
			preDupChekRecord_cd1.clear();

		}

		tmpKakinsTelNo = tranMap.getString(JBSbatACIFM204.KAKINS_TELNO);

		// 重複チェックコード１用のチェックキーを退避
		if ("1".equals(dbleChkCd) && preDupChekRecord_cd1.size() == 0)
		{
			preDupChekRecord_cd1.add(fileKey);
			return false;
		}
		// 重複チェックコード０用のチェックキーを退避
		else if ("0".equals(dbleChkCd) && prevEndymdhms_tenso_list.size() == 0 && prevEndymdhms_tensoigai_list.size() == 0)
		{
			// 転送呼、転送呼以外の通話終了年月日時分秒を退避
			if (!"".equals(tenso_ji_hashin_telno.trim()))
			{
				prevEndymdhms_tenso_list.add(new String[]{pcall_staymdhms, pcall_endymdhms, tenso_ji_hashin_telno, hashin_telno});
			}
			else
			{
				prevEndymdhms_tensoigai_list.add(new String[]{pcall_staymdhms, pcall_endymdhms});
			}
			return false;
		}

		//======================================================================================================
		/* ▼ファイル内レコード重複チェック開始▼ */
		// 下記チェック処理でエラーになった呼情報は登録対象となるので、次以降のチェック対象にならない(退避しない)

		// ▼▼重複チェックコードが１の場合
		if ("1".equals(dbleChkCd))
		{
			// 課金電話番号、通話開始年月日、通話開始時分秒、通話種別、転送元電話番号が完全一致でエラー
			if (preDupChekRecord_cd1.contains(fileKey))
			{
				return true;
			}
			preDupChekRecord_cd1.add(fileKey);
			return false;
		}

		// ▼▼重複チェックコードが０の場合
		else
		{
			// 現在行よりも古い呼情報に対してチェックする為、チェック対象の情報を, 転送呼、転送呼以外のそれぞれで分けて蓄積している
			// 転送呼同士の呼情報のチェック、転送呼以外同士の呼情報のチェック、転送呼は転送呼以外・転送呼以外は転送呼に対してのチェックが必要
			ArrayList<String[]> langeCheckList = null;
			ArrayList<String[]> equalCheckList = null;
			if (!"".equals(tenso_ji_hashin_telno.trim()))
			{
				// 転送呼の場合
				langeCheckList = prevEndymdhms_tenso_list;
				equalCheckList = prevEndymdhms_tensoigai_list;
			}
			else
			{
				// 転送呼以外の場合
				langeCheckList = prevEndymdhms_tensoigai_list;
				equalCheckList = prevEndymdhms_tenso_list;
			}

			// チェック１：通話時間が重なっていないかチェック
			for (String[] pcalltime : langeCheckList)
			{
				//現在行.転送呼かつ前行.転送呼の場合
				if (!"".equals(tenso_ji_hashin_telno.trim()))
				{
					//開始時間が同じ
					if(pcalltime[0].equals(pcall_staymdhms))
					{
						return true;
					}
					//通話時間が重なっていて
					//発信番号が同じで
					//通話開始時刻と通話終了時刻が違う
					else if(pcalltime[0].compareTo(pcall_staymdhms) <= 0 &&  pcall_staymdhms.compareTo(pcalltime[1]) <= 0
									&& hashin_telno.equals(pcalltime[3])
									&& !pcalltime[1].equals(pcall_staymdhms))
					{
						return true;
					}
				}
				else if(pcalltime[0].compareTo(pcall_staymdhms) <= 0 &&  pcall_staymdhms.compareTo(pcalltime[1]) <= 0)
				{
					return true;
				}
			}

			// 現在行.転送呼と前行.転送呼でないor現在行.転送呼でないと前行.転送呼：通話開始、通話終了のいずれかが一致していないかチェック
			for (String[] pcalltime : equalCheckList)
			{
				// 通話開始年月日分秒が前行と一致していればエラー
				if (pcalltime[0].equals(pcall_staymdhms))
				{
					return true;

					// 通話終了年月日分秒が前行と一致していればエラー
				}
				else if(pcalltime[1].equals(pcall_endymdhms))
				{
					return true;
				}
			}

			// 転送呼、転送呼以外の通話終了年月日時分秒をそれぞれ退避
			if ("".equals(tenso_ji_hashin_telno.trim()))
			{
				prevEndymdhms_tensoigai_list.add(new String[]{pcall_staymdhms, pcall_endymdhms});
			}
			else
			{
				prevEndymdhms_tenso_list.add(new String[]{pcall_staymdhms, pcall_endymdhms, tenso_ji_hashin_telno, hashin_telno});	
			}
		}

		// 上記チェックを抜ければOKを返却
		return false;

	}

	/**
	 * 課金可不可判定処理
	 * 
	 * @param ChrgDspCd  課金表示
	 * @throws Exception
	 */
	private void judgeKakinKaHi(String ChrgDspCd) throws Exception
	{
		// 課金表示≠"2"(課金)
		if(!CHRG_DSP_CD_KA.equals(ChrgDspCd))
		{
			// 退避．課金可否←"0"（課金否）
			this.bkChrgKaHi = JACStrConst.CHRG_KH_FAIL;
		}
		// 上記以外の場合
		else
		{
			// 退避．課金可否←"1"（課金可）
			this.bkChrgKaHi = JACStrConst.CHRG_KH_PSB;

		}

	}

	
	/**
	 * 請求年月を取得する
	 * 
	 * @param ymd 年月日
	 * @return 請求年月
	 * @throws Exception
	 */
	private String getSeikyYm(String ymd) throws Exception
	{
		executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_002(new String[] {ymd, ymd});
		JBSbatCommonDBInterface record = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		if (record != null)
		{
			// レコードが存在する場合
			return record.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);
		}
		else
		{
			// レコードが存在しない場合

			// 業務例外
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] {JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME});
		}
	}

	/**
	 * 文字を連結します
	 * @param  string 文字
	 * @return strBuf 連結した文字列
	 */
	private String makeStr(String ...string)
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeStr]");
		
		StringBuffer strBuf = new StringBuffer();
		for(String str:string)
		{
			if(str == null)
			{
				strBuf.append(JACStrConst.KARA_MOJI);
			}
			else
			{
				strBuf.append(str);
			}
		}
		
		assert strBuf != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][strBuf][strBuf = " + strBuf.toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeStr]");
		
		return strBuf.toString();
	}

	
	/**
	 * 文字列の右から 指定された桁数の位置に小数点を付与する
	 * @param baseNumValue	付与元文字列
	 * @param decNum	小数点以下桁数
	 * @return	double	小数点付与後文字列
	 * @throws Exception
	 */
	private String addDecimalPoint(String baseNumValue, int decNum) throws Exception
	{
		StringBuffer numValue = new StringBuffer(baseNumValue);

		// 指定位置に小数点を付与して返却
		return numValue.insert(baseNumValue.length() - decNum, JACStrConst.DECIMAL_POINT).toString();
	}

	/**
	 * ファイルオブジェクトを生成します。
	 * 
	 * @param filePath ファイルパス
	 * @param fileDef 出力対象のDEFファイル名
	 * @return JBSbatBusinessFileUtil ファイル出力制御オブジェクト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatBusinessFileUtil createFile(String filePath, String fileDef) throws Exception {
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createFile]");
		JBSbatOutputFileUtil trailerFile = new JBSbatOutputFileUtil(filePath);
		String tempFileDefName = JBSbatAplConst.getAplConstValue("OTD") + fileDef;
		JBSbatDefFileUtil trailerFileDef = new JBSbatDefFileUtil(tempFileDefName, trailerFile);

		// ファイルの生成
		JBSbatBusinessFileUtil fileUtil = JCCBatCommon.createBusinessFileUtil(filePath
																			, JACStrConst.ENCODE_MS932
																			, JACBatCommon.chgKaigyo(JACStrConst.LINE_CRLF)
																			, trailerFileDef.getDelimiter());
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createFile]");
		return fileUtil;
	}

}
