/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom						 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatACMobileChrgTrkm
 *	ソースファイル名	：JBSbatACMobileChrgTrkm.java
 *	作成者				：富士通　
 *	作成日				：2011年06月06日
 *＜機能概要＞
 *　モバイル機器関連課金情報取込部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/06/06   富士通		新規作成
 *	v3.00		2012/05/15   FJ) 永田	【ANK-0024-04-00】
 *	v3.01		2012/08/27   FJ) 岡田	【TG1-2012-0000137・138】性能改善
 *	v4.00		2012/12/25   FJ) 前田	【ST1-2012-0000720】
 *	v4.01		2012/12/27   FJ) 早崎	【TG1-2012-0000204】エラー情報出力項目「通信料」追加
 *	v4.02		2013/04/05   FJ) 小柴	【IKK-2013-0000783】文字化け対策のため、エンコード形式の変更
 *	v4.03		2013/04/23   FJ) 早崎	【TG1-2013-0000179】対応
 *	v5.00		2013/08/05   FJ) 岡田	【TG1-2013-0000837】データチェックの結果がモバイル機器関連課金エラー情報に出力されないようにする
 *	v5.01		2013/09/11   FJ) 伊藤	【OM-2013-0001171】故障費・修理費のみをClarisに送信するため、業務パラメータから請求内訳コードを取得して比較を行い、一致した場合法人データとして出力する
 *	v8.00.00	2013/12/10   FJ）柴田	【ANK-1584-00-00】料金計算結果情報(ACIFM097)、エラーデータ(ACIFM015)、外部料金データ(ACIFM014)にサービス詳細識別番号を追加。
*	v8.00.01	2014/02/17   FJ）北端	【IT1-2014-0000059】税率マスタ参照条件見直し
 *	v8.00.02	2014/04/25   FJ）小掠	【OM-2014-0001643】消費税取得を外税で取得
 *	v10.00.00	2014/10/29   FJ）桑島	【OM-2014-0003486】外部料金取込エラーリストの契約期間外エラーの出力対応
 *	v10.00.01	2014/10/29   FJ）桑島	【OM-2014-0003487】契約期間外エラーの判断条件変更
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

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.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatACIFM014;
import eo.business.util.file.JBSbatACIFM015;
import eo.business.util.file.JBSbatACIFM017;
import eo.business.util.table.JBSbatAC_T_SVKEI_CHIKUSEKI;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_OPUT_NM;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_EM_HOJIN_KEI;
import eo.business.util.table.JBSbatKK_M_PCRS;
import eo.business.util.table.JBSbatKK_T_KAKINS;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JACTaxCalcShikibetuCodeUtil;
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 JBSbatACMobileChrgTrkm extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** テーブル(料金項目出力名称)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM = "CH_M_PRC_KMK_OPUT_NM";

	/** テーブル(料金コース)*/
	private static final String D_TBL_NAME_KK_M_PCRS = "KK_M_PCRS";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(ＥＭ法人契約)*/
	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_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** テーブル(サービス契約蓄積)*/
	private static final String D_TBL_NAME_AC_T_SVKEI_CHIKUSEKI = "AC_T_SVKEI_CHIKUSEKI";

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String KK_T_SVC_KEI_AC_SELECT_003 = "AC_SELECT_003";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String KK_T_KAKINS_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CH_M_PRC_KMK_OPUT_NM_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String KK_M_PCRS_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String ZM_M_CD_NM_KANRI_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String CH_T_EM_HOJIN_KEI_AC_SELECT_003 = "AC_SELECT_003";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String AC_T_SVKEI_CHIKUSEKI_AC_SELECT_003 = "AC_SELECT_003";

	/** SQL定義キー(AC_SELECT_016)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_016 = "AC_SELECT_016";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;

	/** テーブルアクセスクラス(料金項目出力名称)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_OPUT_NM = null;

	/** テーブルアクセスクラス(料金コース)*/
	private JBSbatSQLAccess db_KK_M_PCRS = null;

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(ＥＭ法人契約)*/
	private JBSbatSQLAccess db_CH_T_EM_HOJIN_KEI = null;

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/** テーブルアクセスクラス(サービス契約蓄積)*/
	private JBSbatSQLAccess db_AC_T_SVKEI_CHIKUSEKI = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 法人分モバイル機器関連課金情報ヘッダ部レコードタイプ */
	private static final String OUT_INFO_HEADER_REC_TYPE = "0";

	/** 法人分モバイル機器関連課金情報データ部レコードタイプ */
	private static final String OUT_INFO_DATA_REC_TYPE = "1";

	/** 法人分モバイル機器関連課金情報トレーラ部レコードタイプ */
	private static final String OUT_INFO_TRAILER_REC_TYPE = "9";

	/** 出力ファイル定義 */
	private static final String PRM_OTD = "OTD";

	/** 法人分モバイル機器関連課金情報ヘッダ部 */
	private ArrayList<Object> outInfoHeader = null;

	/** 法人分モバイル機器関連課金情報データ部リスト */
	private ArrayList<ArrayList<Object>> outInfoDataList = null;

	/** 法人分モバイル機器関連課金情報トレーラ部 */
	private ArrayList<Object> outInfoTrailer = null;

	/** モバイル機器関連課金エラー情報（料金結果リスト） */
	private ArrayList<ArrayList<Object>> outErrInfo =null;

	/** 請求年月 */
	private String seiYm = null;

	/** システム日付 */
	private String sysDateTime = null;

	/** バッチ運用日付 */
	private String opeDate = null;

	/** 処理識別コード(登録) */
	String tranSkbtCd = null;

	/** 外部料金取込用モバイル機器関連課金情報 */
	private String kino_skbt_mobile = null;

	/** 取込元 */
	private String trkmMt = null;

	/** 請求時期指定コード */
	private String seikyJikiShitei = null;

	/** 請求時期指定名 */
	private String seikyJikiShiteiNm = null;

	/** 外部料金取込システム区分*/
	private String outPrcTrkmSysDiv = null;
	
	/** 法人連携対象EM請求内訳コードセット*/
	private HashSet<String> hojinCmbSeiUwCdSet = null;

	/** EM契約番号エラー */
	private String msgNoEmKeiNoErr = null;

	/** 請求契約番号エラー */
	private String msgNoSeikyNoErr = null;

	/** 契約期間外エラー */
	private String msgKeiPrdErr = null;

	/** 未請求一時金エラー */
	private String[] icjPrdErr = null;

	/** 未請求一時金エラー内容 */
	private String msgIcjPrdErr = null;

	/** 料金グループコード */
	private String thPrcGrpCd = JACStrConst.KARA_MOJI;

	/** 料金コースコード */
	private String thPcrsCd = JACStrConst.KARA_MOJI;

	/** 料金サービスコード */
	private String thPrcSvcCd = JACStrConst.KARA_MOJI;
	
	/** 請求金額 */
	private String thSeikyPrc = null;

	/** 料金計算当月 */
	private String rknCalTogetu = null;

	/** 前回のEM契約者コード */
	private String beforeEmKshCd = JACStrConst.KARA_MOJI;

	/** 前回のEM契約者コードに対応するＤＢデータ */
	private JBSbatCommonDBInterface boforeHojinData = null;

	/** 前回のEM契約者コードに対応するエラーデータ */
	private JBSbatServiceInterfaceMap checkErrorMap = null;

	/** 前回のEM契約者コードに対応する 外部料金データ */
	private JBSbatServiceInterfaceMap mobileChrgOutData = null;
	
	/** 内税変換料金項目コードセット */
	private HashSet<String> wksTaxCnvPrcSet = null;
	
	/** 利用終了日 */
	private String endYmd = null;

	/** モバイル機器関連課金エラー情報ファイル件数 */
	private int 	errInfCnt 	= 0;
	
	/** 料金業務共通クラスインスタンス */
	private JACbatRknBusinessUtil rknBusinessUtil = null;

	/** 税計算識別コード管理クラス */
	private JACTaxCalcShikibetuCodeUtil jACTaxCalcShikibetuCodeUtil = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_CH_M_PRC_KMK_OPUT_NM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM);
		db_KK_M_PCRS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PCRS);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_CH_T_EM_HOJIN_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_EM_HOJIN_KEI);
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		db_AC_T_SVKEI_CHIKUSEKI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_SVKEI_CHIKUSEKI);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		// バッチ運用日付を取得
		opeDate = super.opeDate;
		// システム日付を取得
		sysDateTime = JCCBatCommon.getSysDateTime();

		// 料金スケジュール定義アクセス部品初期処理
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);

		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// エラーメッセージを取得
		msgNoEmKeiNoErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_NO_EMKEINOERR);
		msgNoSeikyNoErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_NO_SEIKYNOERR);
		msgKeiPrdErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_KEI_PRD_ERR);
		icjPrdErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_RSLT_ICJKIN_ERR).split(JACStrConst.COMMA);
		msgIcjPrdErr= getNmKanri(JZM0171Constant.CD01172, icjPrdErr[0], opeDate);

		// 外部料金取込用モバイル機器関連課金情報を取得
		kino_skbt_mobile = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_OT_ML_KK_CRIF);
		
		// 処理識別コード(登録)を取得
		tranSkbtCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_OPT_ADD);
		
		// 請求時期指定(請求月指定)を取得
		seikyJikiShitei = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_SJC_SIKY_STI_MON);
		
		// 外部料金取込システム区分を取得
		outPrcTrkmSysDiv = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_OPS_MBL_KIKI_CHRG);
		
		// 法人連携対象EM請求内訳コードを取得
		String[] hojinCmbSeikyUwCdLst = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_HOJIN_EM_GAIB).split(JACStrConst.COMMA);
		// 法人連携対象EM請求内訳コードセットに対象値を設定
		hojinCmbSeiUwCdSet = new HashSet<String>();
		for(int i = 0; i < hojinCmbSeikyUwCdLst.length; i++)
		{
			hojinCmbSeiUwCdSet.add(hojinCmbSeikyUwCdLst[i]);
		}
		
		// 内税変換料金項目コードを取得
		String[] wksTaxCnvPrcList = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_TAX_CNV_PRC).split(JACStrConst.COMMA);
		// 内税変換料金項目コードセットに対象値を設定
		wksTaxCnvPrcSet = new HashSet<String>();
		for(int i = 0; i < wksTaxCnvPrcList.length; i++)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial] 内税変換料金項目コード：" + wksTaxCnvPrcList[i]);
			wksTaxCnvPrcSet.add(wksTaxCnvPrcList[i]);
		}

		paramUtil.close();

		// コード名称を取得
		trkmMt = getNmKanri(JZM0171Constant.CD00888, JACStrConst.CD_DIV_TRKM_MT_1, opeDate);
		seikyJikiShiteiNm = getNmKanri(JZM0171Constant.CD00972, JACStrConst.CD_DIV_TRKM_MT_1, opeDate);

		// 請求年月を取得
		seiYm = getSikyYm(opeDate);

		// 請求年月から、利用開始日/利用終了日取得
		String[] startEndYmd = schdlUtil.getUseStrEnd(seiYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial] seiYm：" + seiYm);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial] startEndYmd[0]：" + startEndYmd[0]);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial] startEndYmd[1]：" + startEndYmd[1]);

		// 利用終了日を取得
		endYmd = startEndYmd[1];

		// 法人分モバイル機器関連課金情報の初期化
		outInfoHeader = new ArrayList<Object>();
		outInfoDataList = new ArrayList<ArrayList<Object>>();
		outInfoTrailer = new ArrayList<Object>();
		outErrInfo=new ArrayList<ArrayList<Object>>();

		// 料金計算当月取得
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		rknCalTogetu = su.getBillDate(super.opeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
		su.close();

		// 料金業務共通クラスインスタンス生成
		this.rknBusinessUtil = new JACbatRknBusinessUtil(commonItem); 

		// 税計算識別コード管理クラスのインスタンス生成
		this.jACTaxCalcShikibetuCodeUtil  = new JACTaxCalcShikibetuCodeUtil(JACStrConst.CALLER_BATCH, commonItem.getConnection());
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");

		// 出力共通電文を生成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// EM契約者コードを取得
		String emKshCd = inMap.getString(JBSbatACIFM017.EM_KSH);
		
		// 請求内訳コードを取得
		String seikyUcwkCd = inMap.getString(JBSbatACIFM017.SIKY_UW_CD);

		// EM法人契約レコード
		JBSbatCommonDBInterface crrHojinData = null;

		// エラー出力データ
		JBSbatServiceInterfaceMap crrErroMap = null;

		// 外部料金データ
		JBSbatServiceInterfaceMap crrMobileChrg = null;

		//エラー情報出力フラグ
		boolean isErrorListOut = false;


		// 前回キーチェック判定
		if (beforeEmKshCd.equals(emKshCd))
		{
			// 前回の取得結果を設定する
			crrHojinData = boforeHojinData;
			// 前回のチェック結果を設定する
			crrErroMap = checkErrorMap;
			// 前回の外部料金データを設定する
			crrMobileChrg = mobileChrgOutData;
		}
		else
		{	
			// 前回作成法人データをクリアー
			boforeHojinData = null;
			// 前回のチェック結果をクリアー
			checkErrorMap = null;
			// 前回の外部料金データをクリアー
			mobileChrgOutData = null;
			// ブレイクキーを更新
			beforeEmKshCd = emKshCd;
		}

		// 前回法人データ作成結果判定
		if (crrHojinData == null)
		{
			// 法人データを新たに取得する
			crrHojinData = getHojin(emKshCd);
			// 法人データを更新
			boforeHojinData = crrHojinData;
		}

		// 法人データ判定処理
		if (crrHojinData != null)
		{
			// 法人分の場合
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 法人データ：" + emKshCd);
			
			//連携対象請求内訳コードだった場合
			if(hojinCmbSeiUwCdSet.contains(seikyUcwkCd))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 法人連携対象");
				// 法人分モバイル機器関連課金情報のデータ部の生成
				ArrayList<Object> hojinData = createHojinData(inMap, crrHojinData);
				// データをリストに追加
				outInfoDataList.add(hojinData);
			}
			// 法人の場合はnullを返却
			return null;
		}

		// 請求内訳コードを元に料金項目抽出変換より料金項目コードを取得する
		String strOutPrcKmkCd = getOutPrcKmkCd(seikyUcwkCd);

		// 料金項目抽出変換 対象レコード判定処理
		if (strOutPrcKmkCd == null)
		{
			// 対象レコード抽出
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 処理対象外レコード：" + emKshCd);
			// 抽出変換よりレコードが取得できない場合は処理対象外レコード
			return null;
		}
		
		// 請求内訳金額を取得
		thSeikyPrc = inMap.getString(JBSbatACIFM017.SIKY_UW_AMNT);

		// 料金項目コードが内税変換対象の場合
		if(wksTaxCnvPrcSet.contains(strOutPrcKmkCd))
		{
			// 請求内訳金額
			BigDecimal seikyPrc = new BigDecimal(thSeikyPrc);
			
			// 税額を取得
			String taxRateCd = strOutPrcKmkCd.substring(0, 1);	// 料金項目コードの上一桁
			String taxSkbtCd = this.jACTaxCalcShikibetuCodeUtil.getTaxSkbtCd(taxRateCd, JACStrConst.UZEI_SZEI_SKBT_SOTO, super.opeDate);
			BigDecimal[] taxCalcRslt = rknBusinessUtil.calcTaxCharge(taxSkbtCd, seikyPrc, endYmd);
			// 請求内訳金額に求めた税額を加算した金額を請求金額とする
			thSeikyPrc = seikyPrc.add(taxCalcRslt[0]).toString();
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] strOutPrcKmkCd：" + strOutPrcKmkCd);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] seikyPrc：" + seikyPrc);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] endYmd：" + endYmd);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] taxRateCd：" + taxRateCd);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] taxSkbtCd：" + taxSkbtCd);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] taxCalcRslt[0]：" + taxCalcRslt[0]);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] taxCalcRslt[1]：" + taxCalcRslt[1]);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] thSeikyPrc：" + thSeikyPrc);
		}
		
		// 前回のデータチェック結果判定
		if (crrErroMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 前回と同一チェックエラー：" + emKshCd);
			// 前回出力したデータを元にエラーデータを生成する
			// エラーデータに関してはダブルコードの付与および金額のカンマ編集を行う
			crrErroMap.setString(JBSbatACIFM015.PRC_KMK_CD, quoteStr(strOutPrcKmkCd));							// 料金項目コード
			crrErroMap.setString(JBSbatACIFM015.SEIKY_AMNT, quoteStr(JCCBatCommon.formatNumber(thSeikyPrc)));	// 請求内訳金額
			// 出力共通電文にエラーデータを設定
			outputBean.addOutMapList_2(crrErroMap);
			// 出力共通電文を返却
			return outputBean;
		}


		// 前回外部料金データ生成判定
		if (crrMobileChrg != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 前回外部料金データ生成：" + emKshCd);

			// 前回出力した外部料金データを元に生成する
			crrMobileChrg.setString(JBSbatACIFM014.PRC_KMK_CD, strOutPrcKmkCd); // 料金項目コード
			crrMobileChrg.setString(JBSbatACIFM014.SEIKY_AMNT, thSeikyPrc);		// 請求金額

			// 出力共通電文に外部料金データを設定
			outputBean.addOutMapList(crrMobileChrg);
			// 出力共通電文を返却
			return outputBean;
		}


		// サービス契約番号
		String svcKeiNo = null;
		// サービス契約ステータス
		String svcKeiStatus = null;

		// EM契約コードを元にサービス契約<eoモバイル>テーブルを参照し、
		// サービス契約番号、サービス契約ステータスを取得する
		executeKK_T_SVC_KEI_AC_SELECT_003(new Object[] { opeDate, emKshCd });
		JBSbatCommonDBInterface record = db_KK_T_SVC_KEI.selectNext();
		if (record != null)
		{
			// サービス契約番号を取得
			svcKeiNo = record.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO);
			// サービス契約ステータスを取得
			svcKeiStatus = record.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT);
		}

		// 情報付与
		// サービス契約番号を元にサービス契約蓄積を検索し、料金コースコード、料金グループコード、料金サービスコードを取得する
		// 「情報付与」は本来データチェック後に行うべきであるが、モバイル機器関連課金エラー情報（料金計算結果リスト）に
		// サービス契約蓄積の情報を出力する必要があるため、先に処理している
		if(getExtData(svcKeiNo) == false)
		{
			// サービス契約蓄積よりデータが抽出できない場合は
			// モバイル機器関連課金エラー情報（料金計算結果リスト）にエラー情報を出力する
			isErrorListOut = true;
		}

		// サービス契約番号の存在チェック
		if (svcKeiNo == null)
		{
			// EM契約者コードが存在しない場合
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] EM契約者コードエラー：" + emKshCd);
			// エラーデータの作成
			JBSbatServiceInterfaceMap outMap = createMobileChrgErrorData(emKshCd, null, svcKeiNo, strOutPrcKmkCd, thSeikyPrc, 1);
			// 出力共通電文にエラーデータを設定
			outputBean.addOutMapList_2(outMap);
			// チェック結果を次回用に保存
			checkErrorMap = outMap;
			// 出力共通電文を返却
			return outputBean;
		}

		
		//OM-2014-0003487　MOD　START
		// サービス契約ステータスチェック
//		if (JACStrConst.SVC_KEI_STAT_DSL.equals(svcKeiStatus) || JACStrConst.SVC_KEI_STAT_STP.equals(svcKeiStatus))
		// サービス契約ステータス = キャンセル済み("920")
		if (JACStrConst.SVC_KEI_STAT_CNCL_ZUMI.equals(svcKeiStatus))
		//OM-2014-0003487　MOD　END
		{
			//OM-2014-0003487　MOD　START
//			// 解約済み 又は 停止中 の場合
			// キャンセル済み の場合
			//OM-2014-0003487　MOD　END
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] サービス契約ステータスチェックエラー：" + emKshCd);
			// エラーデータの作成
			JBSbatServiceInterfaceMap outMap = createMobileChrgErrorData(emKshCd, null, svcKeiNo, strOutPrcKmkCd, thSeikyPrc, 2);
			// 出力共通電文にエラーデータを設定
			outputBean.addOutMapList_2(outMap);
			// チェック結果を次回用に保存
			checkErrorMap = outMap;
			// 出力共通電文を返却
			return outputBean;
		}

		// サービス契約番号から請求契約番号・請求契約ステータスのレコードを取得
		record = getSeikyKeiNoAndSeikyKeiStat(svcKeiNo, opeDate);

		// 請求先存在チェック
		if (record == null)
		{
			// 請求先が存在しない場合
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 請求契約番号チェックエラー：" + emKshCd);
			// エラーデータの作成
			JBSbatServiceInterfaceMap outMap = createMobileChrgErrorData(emKshCd, null, svcKeiNo, strOutPrcKmkCd, thSeikyPrc, 3);
			// 出力共通電文にエラーデータを設定
			outputBean.addOutMapList_2(outMap);
			// チェック結果を次回用に保存
			checkErrorMap = outMap;
			// 出力共通電文を返却
			return outputBean;
		}

		// 請求契約番号・請求契約ステータスを取得
		String seikyKeiNo = record.getString(JBSbatKK_T_KAKINS.SEIKY_KEI_NO);

		// サービス契約蓄積取得結果判定
		if(isErrorListOut == true)
		{
			ArrayList<Object> errInfoData = createErrInfo(seikyKeiNo, svcKeiNo, strOutPrcKmkCd, thSeikyPrc);
			outErrInfo.add(errInfoData);
		}
		else
		{
			// 外部料金データを生成
			JBSbatServiceInterfaceMap outMap = createMobileChrgOutData(emKshCd, seikyKeiNo, svcKeiNo, strOutPrcKmkCd, thSeikyPrc);
			// 出力共通電文に外部料金データを設定
			outputBean.addOutMapList(outMap);
			// 出力結果を次回用に一時保存
			mobileChrgOutData = outMap;
			// メイン処理終了
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] 外部料金データを生成：" + emKshCd);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		}
		
		// 出力共通電文を返却
		return outputBean;

		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");

		// 法人分モバイル機器関連課金情報のヘッダ部の設定
		outInfoHeader.add(OUT_INFO_HEADER_REC_TYPE);
		outInfoHeader.add(sysDateTime);

		// データ部の件数
		int cnt = outInfoDataList.size();
		// 法人分モバイル機器関連課金情報のトレーラ部の設定
		outInfoTrailer.add(OUT_INFO_TRAILER_REC_TYPE);
		outInfoTrailer.add(cnt);


		// ファイル名の取得(ヘッダ・データ・トレーラ)
		String freeItem = commonItem.getFreeItem();
		String[] files = freeItem.split(JACStrConst.FREE_DIV);

		// ヘッダの情報を取得
		JBSbatOutputFileUtil headerFile = new JBSbatOutputFileUtil(files[1]);
		String headerFileDefName = JBSbatAplConst.getAplConstValue(PRM_OTD) + files[0];
		JBSbatDefFileUtil headerFileDef = new JBSbatDefFileUtil(headerFileDefName, headerFile);
		// ヘッダの出力
		ArrayList<ArrayList<Object>> outInfoHeaderList = new ArrayList<ArrayList<Object>>();
		outInfoHeaderList.add(outInfoHeader);
		createFile(files[1], outInfoHeaderList, headerFile.getEncode(), JACBatCommon.chgKaigyo(headerFile.getLine()), headerFileDef.getDelimiter());

		// データの情報を取得
		JBSbatOutputFileUtil dataFile = new JBSbatOutputFileUtil(files[3]);
		String dataFileDefName = JBSbatAplConst.getAplConstValue(PRM_OTD) + files[2];
		JBSbatDefFileUtil dataFileDef = new JBSbatDefFileUtil(dataFileDefName, dataFile);
		// データの出力
		createFile(files[3], outInfoDataList, dataFile.getEncode(), JACBatCommon.chgKaigyo(dataFile.getLine()), dataFileDef.getDelimiter());

		// トレーラの情報を取得
		JBSbatOutputFileUtil trailerFile = new JBSbatOutputFileUtil(files[5]);
		String trailerFileDefName = JBSbatAplConst.getAplConstValue(PRM_OTD) + files[4];
		JBSbatDefFileUtil trailerFileDef = new JBSbatDefFileUtil(trailerFileDefName, trailerFile);
		// トレーラの出力
		ArrayList<ArrayList<Object>> outInfoTrailerList = new ArrayList<ArrayList<Object>>();
		outInfoTrailerList.add(outInfoTrailer);
		createFile(files[5], outInfoTrailerList, trailerFile.getEncode(), JACBatCommon.chgKaigyo(trailerFile.getLine()), trailerFileDef.getDelimiter());


		//モバイル機器関連課金エラー情報取得
		JBSbatOutputFileUtil errInfoFile = new JBSbatOutputFileUtil(files[7]);
		String errInfoFileDefName = JBSbatAplConst.getAplConstValue(PRM_OTD) + files[6];
		JBSbatDefFileUtil errInfoFileDef = new JBSbatDefFileUtil(errInfoFileDefName, errInfoFile);
		//モバイル機器関連課金エラー情報出力
		createFile(files[7], outErrInfo, errInfoFile.getEncode(), JACBatCommon.chgKaigyo(errInfoFile.getLine()), errInfoFileDef.getDelimiter());

		// 出力件数ログ出力
		String[] msgParam = new String[]{"モバイル機器関連課金エラー情報(料金計算結果リスト）：" + files[7], Integer.toString(this.errInfCnt)};
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0780AI, msgParam);
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_KAKINS.close();
		db_CH_M_PRC_KMK_OPUT_NM.close();
		db_KK_M_PCRS.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_CH_T_EM_HOJIN_KEI.close();
		db_CH_M_PRC_SCHDL_TEIGI.close();
		db_AC_T_SVKEI_CHIKUSEKI.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	EM契約者コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVC_KEI_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_AC_SELECT_003);
	}

	/**
	 * 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 executeKK_T_KAKINS_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	料金グループコード
	 *		 	料金コースコード
	 *		 	料金サービスコード
	 *		 	料金項目コード
	 *		 	料金項目出力名称適用開始年月日
	 *		 	料金項目出力名称適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_OPUT_NM_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());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_OPUT_NM.selectBySqlDefine(paramList, CH_M_PRC_KMK_OPUT_NM_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	料金コースコード
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_PCRS_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_M_PCRS.selectBySqlDefine(paramList, KK_M_PCRS_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 *		 	コード適用開始年月日
	 *		 	コード適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_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_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	EM契約者コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_EM_HOJIN_KEI_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CH_T_EM_HOJIN_KEI.selectBySqlDefine(paramList, CH_T_EM_HOJIN_KEI_AC_SELECT_003);
	}

	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	イベントコード
	 *		 	イベント日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_001(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_001);
	}


	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	請求年月
	 *		 	サービス番号
	 *		 	イベントコード
	 *		 	請求年月
	 *		 	システムコード
	 *		 	料金サービス識別コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_SVKEI_CHIKUSEKI_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_AC_T_SVKEI_CHIKUSEKI.selectBySqlDefine(paramList, AC_T_SVKEI_CHIKUSEKI_AC_SELECT_003);
	}

	/**
	 * SQLKEY(AC_SELECT_016)で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_016(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());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_016);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/


	/**
	 * 法人分モバイル機器関連課金情報のデータ部レコードを生成します。
	 * 
	 * @param inMap 入力電文
	 * @param hojinRecord ＥＭ法人契約取得データ
	 * @return 法人分モバイル機器関連課金情報のデータ部
	 * @throws Exception
	 */
	private ArrayList<Object> createHojinData(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface hojinRecord) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createHojinData]");

		// 法人分モバイル機器関連課金情報のデータ部の生成
		ArrayList<Object> hojinData = new ArrayList<Object>();
		// 法人分モバイル機器関連課金情報のデータ部の設定
		hojinData.add(OUT_INFO_DATA_REC_TYPE);
		hojinData.add(hojinRecord.getString(JBSbatCH_T_EM_HOJIN_KEI.HOJIN_SVC_KEI_UK_NO));
		hojinData.add(hojinRecord.getString(JBSbatCH_T_EM_HOJIN_KEI.HJIN_EO_YKAE_SVKEI_NO));
		hojinData.add(seiYm);
		hojinData.add(inMap.getString(JBSbatACIFM017.SIKY_UW_CD));
		hojinData.add(inMap.getString(JBSbatACIFM017.SIKY_UW_AMNT));
		hojinData.add(sysDateTime);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createHojinData]");

		return hojinData;
	}

	/**
	 * 外部料金データを生成
	 * 
	 * @param emKshCd EM契約者コード
	 * @param seikyKeiNo 請求契約番号
	 * @param svcKeiNo サービス契約番号
	 * @param prcKmkCd 料金項目コード
	 * @param sikyUwAmnt 請求金額
	 * @return 外部料金データ
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap createMobileChrgOutData(
			String emKshCd, String seikyKeiNo, String svcKeiNo, String prcKmkCd, String sikyUwAmnt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createMobileChrgOutData]");
		// 正常データの生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 正常データの設定
		outMap.setString(JBSbatACIFM014.TRAN_SKBT_CD, 	tranSkbtCd);
		outMap.setString(JBSbatACIFM014.SEIKY_KEI_NO, 	seikyKeiNo);
		outMap.setString(JBSbatACIFM014.SVC_KEI_NO, 	svcKeiNo);
		outMap.setString(JBSbatACIFM014.PRC_GRP_CD, 	thPrcGrpCd);
		outMap.setString(JBSbatACIFM014.PCRS_CD, 		thPcrsCd);
		outMap.setString(JBSbatACIFM014.PRC_SVC_CD, 	thPrcSvcCd);
		outMap.setString(JBSbatACIFM014.PRC_KMK_CD, 	prcKmkCd);
		outMap.setString(JBSbatACIFM014.SEIKY_JIKI_SHITEI, seikyJikiShitei);
		outMap.setString(JBSbatACIFM014.SEIKY_YM, seiYm);
		outMap.setString(JBSbatACIFM014.SEIKY_AMNT, sikyUwAmnt);
		outMap.setString(JBSbatACIFM014.OUT_PRC_TRKM_SYS_DIV, outPrcTrkmSysDiv);
		outMap.setString(JBSbatACIFM014.SVC_DTL_SKBT_NO, JACStrConst.KARA_MOJI);
		// 出力フラグを設定
		outMap.setOutFlg(true);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createMobileChrgOutData]");
		// 外部料金データを返却
		return outMap;
	}

	/**
	 * エラーデータを生成
	 * 
	 * @param emKshCd EM契約者コード
	 * @param seikyKeiNo 請求契約番号(null指定可)
	 * @param svcKeiNo サービス契約番号(null指定可)
	 * @param thPrcKmkCd 料金項目コード(null指定可)
	 * @param sikyUwAmnt 請求金額
	 * @param errPlc エラー箇所(1:EM契約者コードチェック、2:サービス契約ステータスチェック、3:請求時期指定チェック)
	 * @return エラーデータ
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap createMobileChrgErrorData(
			String emKshCd, String seikyKeiNo, String svcKeiNo, String thPrcKmkCd, String sikyUwAmnt, int errPlc) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createMobileChrgErrorData]");

		// サービス契約番号・エラー内容を設定
		String errNaiyo = null;
		String errSvcKeiNo = null;
		// エラー箇所
		switch (errPlc)
		{
		case 1:
			errSvcKeiNo = emKshCd;
			errNaiyo = msgNoEmKeiNoErr;
			break;

		case 2:
			errSvcKeiNo = svcKeiNo;
			errNaiyo = msgKeiPrdErr;
			break;

		case 3:
			errSvcKeiNo = svcKeiNo;
			errNaiyo = msgNoSeikyNoErr;
			break;

		default:
			break;
		}

		// エラーデータの生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// OM-2014-0003486　MOD　START
		// エラーデータの設定
//		outMap.setString(JBSbatACIFM015.TRKM_MT, trkmMt);
//		outMap.setString(JBSbatACIFM015.SEIKY_NO, seikyKeiNo);
//		outMap.setString(JBSbatACIFM015.SVC_KEI_NO, errSvcKeiNo);
//		outMap.setString(JBSbatACIFM015.SVC_DTL_SKBT_NO, JACStrConst.KARA_MOJI);
//		outMap.setString(JBSbatACIFM015.ERR_NAIYO, errNaiyo);
//		outMap.setString(JBSbatACIFM015.PCRS_CD, thPcrsCd);
//		outMap.setString(JBSbatACIFM015.PCRS_NM, getPcrcNm(thPcrsCd));
//		outMap.setString(JBSbatACIFM015.PRC_SVC_CD, thPrcSvcCd);
//		outMap.setString(JBSbatACIFM015.PRC_KMK_CD, thPrcKmkCd);
//		outMap.setString(JBSbatACIFM015.PRC_UCWK_NM, getPrcKmkNm(thPrcGrpCd, thPcrsCd, thPrcSvcCd, thPrcKmkCd));
//		outMap.setString(JBSbatACIFM015.SEIKY_JIKI_SHITEI_CD, seikyJikiShitei);
//		outMap.setString(JBSbatACIFM015.SEIKY_JIKI_SHITEI_NM, seikyJikiShiteiNm);
//		outMap.setString(JBSbatACIFM015.SEIKY_YM, JCCBatCommon.formatYears(seiYm));
//		outMap.setString(JBSbatACIFM015.SEIKY_AMNT, JCCBatCommon.formatNumber(sikyUwAmnt));		
		
		// エラーデータの設定
		outMap.setString(JBSbatACIFM015.TRKM_MT, getNullToStr(trkmMt));
		outMap.setString(JBSbatACIFM015.SEIKY_NO, getNullToStr(seikyKeiNo));
		outMap.setString(JBSbatACIFM015.SVC_KEI_NO, getNullToStr(errSvcKeiNo));
		outMap.setString(JBSbatACIFM015.SVC_DTL_SKBT_NO, JACStrConst.KARA_MOJI);
		outMap.setString(JBSbatACIFM015.ERR_NAIYO, getNullToStr(errNaiyo));
		outMap.setString(JBSbatACIFM015.PCRS_CD, getNullToStr(thPcrsCd));
		outMap.setString(JBSbatACIFM015.PCRS_NM, getNullToStr(getPcrcNm(thPcrsCd)));
		outMap.setString(JBSbatACIFM015.PRC_SVC_CD, getNullToStr(thPrcSvcCd));
		outMap.setString(JBSbatACIFM015.PRC_KMK_CD, getNullToStr(thPrcKmkCd));
		outMap.setString(JBSbatACIFM015.PRC_UCWK_NM, getNullToStr(getPrcKmkNm(thPrcGrpCd, thPcrsCd, thPrcSvcCd, thPrcKmkCd)));
		outMap.setString(JBSbatACIFM015.SEIKY_JIKI_SHITEI_CD, getNullToStr(seikyJikiShitei));
		outMap.setString(JBSbatACIFM015.SEIKY_JIKI_SHITEI_NM, getNullToStr(seikyJikiShiteiNm));
		outMap.setString(JBSbatACIFM015.SEIKY_YM, JCCBatCommon.formatYears(seiYm));
		outMap.setString(JBSbatACIFM015.SEIKY_AMNT, JCCBatCommon.formatNumber(sikyUwAmnt));
		// OM-2014-0003486　MOD　END
		
		
		// 囲み文字("")付与
		outMap.setMap(JCHbatSeikyKaknoBusinessUtil.quote(outMap.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));

		// 出力フラグを設定
		outMap.setOutFlg(true);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createMobileChrgErrorData]");
		// 外部料金データを返却
		return outMap;
	}

	/**
	 * エラー情報の出力項目を設定する
	 * @param seikyKeiNo 請求契約番号
	 * @param svcKeiNo サービス契約番号
	 * @param thPrcKmkCd 料金項目コード
	 * @param sikyUwAmnt 請求金額
	 * @return エラー情報
	 * @throws Exception
	 */
	private ArrayList<Object> createErrInfo(String seikyKeiNo, String svcKeiNo, String thPrcKmkCd, String sikyUwAmnt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createErrInfo]");
		
		ArrayList<Object> errInfoData = new ArrayList<Object>();

		//エラーコード
		errInfoData.add(icjPrdErr[0]);

		//エラー内容
		errInfoData.add( msgIcjPrdErr);

		//処理日
		errInfoData.add(JPCUtilCommon.formatDate(super.opeDate));

		//請求先番号
		errInfoData.add( seikyKeiNo);

		//請求先カナ名
		errInfoData.add(JACStrConst.KARA_MOJI);

		//サービス契約番号
		//（EM契約者コードチェックの場合「EM契約者コード」を設定する編集仕様はUIの誤記）
		errInfoData.add(svcKeiNo);

		//サービス詳細識別番号
		errInfoData.add(JACStrConst.KARA_MOJI);

		//請求年月
		errInfoData.add(JCCBatCommon.formatYears(seiYm));

		//料金コースコード
		errInfoData.add(JACStrConst.KARA_MOJI);

		//料金サービスコード
		errInfoData.add(JACStrConst.KARA_MOJI);

		//料金項目コード
		errInfoData.add(thPrcKmkCd);

		//料金内訳明細
		errInfoData.add(JACStrConst.KARA_MOJI);

		//請求金額
		errInfoData.add(sikyUwAmnt);

		//通信料
		errInfoData.add(JACStrConst.KARA_MOJI);

		//投入区分
		errInfoData.add(JACStrConst.KARA_MOJI);

		// モバイル機器課金エラー情報エラーファイル出力カウントアップ
		this.errInfCnt++;
		
		return errInfoData;
	}


	/**
	 * 対象の文字列にダブルコーテーションを付与します。
	 * 
	 * @param itemStr 対象文字列
	 * @return ダブルコート付与後の文字列
	 */
	private String quoteStr(String itemStr)
	{
		return JACStrConst.DOUBLE_QUOTE + itemStr + JACStrConst.DOUBLE_QUOTE;
	}

	/**
	 * 料金コース名称を返却します。
	 * 
	 * @param thPcrsCd 料金コースコード
	 * @return 料金コース名称
	 * @throws Exception 例外
	 */
	private String getPcrcNm(String thPcrsCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPcrcNm]");

		// 料金コース名称
		String retPcrcNm = "";

		// 料金コース名称
		Object[] obj = new Object[6];
		obj[0] = thPcrsCd;
		obj[1] = super.opeDate;
		executeKK_M_PCRS_AC_SELECT_001(obj);
		JBSbatCommonDBInterface result = db_KK_M_PCRS.selectNext();
		if (result != null)
		{
			retPcrcNm =  result.getString(JBSbatKK_M_PCRS.PCRS_NM);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPcrcNm]");
		// 料金コース名称を返却する
		return retPcrcNm;
	}

	/**
	 * 料金項目出力名称を返却します。
	 * 
	 * @param thPrcGrpCd 料金グループコード
	 * @param thPcrsCd 料金コースコード
	 * @param thPrcSvcCd 料金サービスコード
	 * @param thPrcKmkCd 料金項目コード
	 * @return 料金項目出力名称
	 * @throws Exception 例外
	 */
	private String getPrcKmkNm(String thPrcGrpCd, String thPcrsCd, String thPrcSvcCd, String thPrcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcKmkNm]");

		// 料金項目出力名称
		String retPrcKmkNm = "";

		// 料金コース名称
		Object[] obj = new Object[6];
		// 料金内訳名
		obj[0] = thPrcGrpCd;
		obj[1] = thPcrsCd;
		obj[2] = thPrcSvcCd;
		obj[3] = thPrcKmkCd;
		obj[4] = super.opeDate;
		obj[5] = super.opeDate;
		executeCH_M_PRC_KMK_OPUT_NM_AC_SELECT_001(obj);
		JBSbatCommonDBInterface result = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		if (result != null)
		{
			retPrcKmkNm = result.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_NM);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcKmkNm]");
		// 料金項目出力名称を返却する
		return retPrcKmkNm;
	}

	/**
	 * ファイル出力
	 * 
	 * @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);
	}

	/**
	 * EM契約者コードの法人判定処理
	 * 
	 * @param emKshCd EM契約者コード
	 * @return trueなら法人分
	 * @throws Exception
	 */
	private JBSbatCommonDBInterface getHojin(String emKshCd) throws Exception
	{
		// SQL実行
		executeCH_T_EM_HOJIN_KEI_AC_SELECT_003(new Object[] { emKshCd });

		//レコードの取り出し
		return db_CH_T_EM_HOJIN_KEI.selectNext();
	}

	/**
	 * サービス契約番号から請求契約番号・請求ステータスを取得
	 * @param svcKeiNo サービス契約番号
	 * @param trnYmd 処理年月日
	 * @return 取得したレコード
	 * @throws Exception
	 */
	private JBSbatCommonDBInterface getSeikyKeiNoAndSeikyKeiStat(String svcKeiNo, String trnYmd) throws Exception
	{
		// SQL実行
		executeKK_T_KAKINS_AC_SELECT_002(new Object[] { svcKeiNo, trnYmd, trnYmd, trnYmd });

		//レコードの取り出し
		JBSbatCommonDBInterface record = db_KK_T_KAKINS.selectNext();
		// レコードを返却
		return record;
	}

	/**
	 * コード名称管理のコード区分名を取得
	 * 
	 * @param cdSbtCd コード識別コード
	 * @param cdDiv コード区分
	 * @param batYmd バッチ運用日付
	 * @return コード区分名
	 * @throws Exception
	 */
	private String getNmKanri(String cdSbtCd, String cdDiv, String batYmd) throws Exception
	{
		// SQL実行
		executeZM_M_CD_NM_KANRI_AC_SELECT_001(new Object[] { cdSbtCd, cdDiv, batYmd, batYmd });

		// レコードを取得
		JBSbatCommonDBInterface record = db_ZM_M_CD_NM_KANRI.selectNext();

		// レコードの存在チェック
		if (record != null)
		{
			// コード区分名
			return record.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
		}
		else
		{
			// 業務例外
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] { JBSbatZM_M_CD_NM_KANRI.TABLE_NAME });
		}
	}


	/**
	 * 請求年月を取得
	 * 
	 * @param batYmd バッチ運用日付
	 * @return 請求年月
	 * @throws Exception
	 */
	private String getSikyYm(String batYmd) throws Exception
	{
		// SQL実行
		executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_001(new Object[] { JACStrConst.EVENT_CD_SIKY_TRN_DAY, batYmd });

		// レコードの取得
		JBSbatCommonDBInterface record = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		String ym = record.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);
		// レコードの存在チェック
		if (ym != null)
		{
			// 値1を返却
			return ym;
		}
		else
		{
			// 業務例外
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] { JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME });
		}
	}


	/**
	 * 情報付加取得
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約蓄積よりレコードが取得できた場合trueを返却します
	 * @throws Exception
	 */
	private boolean getExtData(String svcKeiNo) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getExtData]");
		Object[] obj = new Object[4];

		if(svcKeiNo == null)
		{
			// サービス契約番号がnullの場合、空設定
			svcKeiNo = JACStrConst.KARA_MOJI;
		}

		// 料金グループコード、料金コースコード、料金サービスコード
		obj[0] = rknCalTogetu;
		obj[1] = svcKeiNo;
		obj[2] = super.systemCode;
		obj[3] = JACStrConst.SVC_SKBT_CD_NRML;
		executeAC_T_SVKEI_CHIKUSEKI_AC_SELECT_003(obj);
		JBSbatCommonDBInterface svkeiResult = db_AC_T_SVKEI_CHIKUSEKI.selectNext();
		
		if(svkeiResult != null){
			String kakinStaYmd=svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.CHRG_STAYMD);
			
			if( endYmd.compareTo(kakinStaYmd) >= 0){
				
				while(svkeiResult != null){
					 
					kakinStaYmd=svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.CHRG_STAYMD);
					 
					 if( endYmd.compareTo(kakinStaYmd) >= 0){
						// 最終行出力処理
							this.thPrcGrpCd 	= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PRC_GRP_CD);
							this.thPcrsCd 		= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PCRS_CD);
							this.thPrcSvcCd 	= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PRC_SVC_CD);	
							assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getExtData]");
							
					 }else{
						 
						 break;
						 
					 }
					 
					 svkeiResult = db_AC_T_SVKEI_CHIKUSEKI.selectNext();
					
				}
				
				return true;
				
			}else{
				while(svkeiResult != null){
					String svcStaYmd =svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.SVC_STAYMD);
					if( svcStaYmd!=null && endYmd.compareTo(svcStaYmd) >= 0){
						
						// 最古行出力処理
						
						this.thPrcGrpCd 	= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PRC_GRP_CD);
						this.thPcrsCd 		= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PCRS_CD);
						this.thPrcSvcCd 	= svkeiResult.getString(JBSbatAC_T_SVKEI_CHIKUSEKI.PRC_SVC_CD);	
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getExtData]");
						
						return true;
						
					}
				
					svkeiResult = db_AC_T_SVKEI_CHIKUSEKI.selectNext();
				}
				return false;
			}
		
		}
		return false;
	}
	

	/**
	 * 料金項目抽出変換マスタより出力料金項目コードを取得します。
	 * 
	 * @param strSikyUwCd 請求内訳コード
	 * @return 出力料金項目コード
	 * @throws Exception
	 */
	private String getOutPrcKmkCd(String strSikyUwCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getOutPrcKmkCd]");
		// 出力料金項目コード
		String thPrcKmkCd = null;

		Object[] obj = new Object[7];
		obj[0] = super.systemCode;				// システムコード
		obj[1] = kino_skbt_mobile;				// 業務機能識別コード
		obj[2] = JACStrConst.CHSHT_CHG_CD_CHG;	// 抽出変換コード
		obj[3] = strSikyUwCd;					// 請求内訳コード
		obj[4] = super.opeDate;					// バッチ運用日
		obj[5] = super.opeDate;					// バッチ運用日
		obj[6] = super.opeDate;					// バッチ運用日
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_016(obj);
		JBSbatCommonDBInterface result = db_CH_M_PRC_KMK_CS_CHGE.selectNext();

		if (result != null)
		{
			thPrcKmkCd = result.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getOutPrcKmkCd]");
		return thPrcKmkCd;
	}
	
	// OM-2014-0003486　ADD　START
	/**
	 * Nullの場合空白を返却します。
	 * 
	 * @param str
	 * @return String 連結した住所コード
	 */
	private String getNullToStr(String str) {
		if(str == null)
		{
			return "";
		}
		return str;
	}
	// OM-2014-0003486　ADD　END

}
