/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACTsnRirekiHojinSaiChk
*	ソースファイル名	：JBSbatACTsnRirekiHojinSaiChk.java
*	作成者				：富士通　
*	作成日				：2012年10月15日
*＜機能概要＞
*　ＥＭ通信履歴法人分差異チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/10/15  FJ）今井	【ANK-0143-00-00】新規作成
*	v8.00.00	2014/05/22  FJ)狭間		【OM-2014-0001771】利用バイト数をint型で処理を行っているのをBigDecimal型に変更する
*********************************************************************/
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.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM027;
import eo.business.util.file.JBSbatACIFM168;
import eo.business.util.table.JBSbatCH_T_EM_HOJIN_KEI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTsnRirekiHojinSaiChk extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ＥＭ法人契約)*/
	private static final String D_TBL_NAME_CH_T_EM_HOJIN_KEI = "CH_T_EM_HOJIN_KEI";

	/** SQL定義キー(AC_SELECT_008)*/
	private static final String CH_T_EM_HOJIN_KEI_AC_SELECT_008 = "AC_SELECT_008";

	/** テーブルアクセスクラス(ＥＭ法人契約)*/
	private JBSbatSQLAccess db_CH_T_EM_HOJIN_KEI = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 退避．パケット算出単位*/
	private BigDecimal tmpPctSnstTani;

	/** ワーク．ＥＭ契約者コード*/
	private String wkEMKeishaCd;

	/** ワーク．１日分連携済みフラグ（true：連携済み、false：未連携）*/
	private boolean wkZumiFlg = false;

	/** ワーク．差異分リスト*/
	private ArrayList<HashMap<String, String>> wkDiffList;

	/** ワーク．訂正前総バイト数*/
	private BigDecimal wkTeiseBfTtlByteCnt;

	/** ワーク．訂正後総バイト数*/
	private BigDecimal wkTeiseAfTtlByteCnt;



	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_EM_HOJIN_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_EM_HOJIN_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 業務パラメータ情報取得
		// パケット算出単位
		this.tmpPctSnstTani = new BigDecimal(paramUtil.getGyoumuParameter(JACStrConst.WKPAR_AC_PCT_SNST_TANI));
		assert JACBatCommon.printDebugLog(super.logPrint, "パケット算出単位：" + this.tmpPctSnstTani);
		
		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		// ワーク領域の初期化処理
		this.clearWkData();

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 入力M、入力T共にNullの場合は処理を抜ける。
		if(mastMap == null && tranMap == null)
		{
			return(outputInItem);
		}
		// 入力MのみNullの場合
		else if(mastMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Tのみ存在する]");
			
			// Ｔのみ時の処理
			this.procTranOnly(tranMap, outputInItem);
			
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			
			return outputInItem;
		}
		// 入力TのみNullの場合
		else if(tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");
			
			// Mのみ時の処理
			this.procMastOnly(mastMap, outputInItem);
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			
			return outputInItem;
		}
		
		// マッチングキーの作成
		String mKey = mastMap.getString(JBSbatACIFM027.EM_KEISHA_CD);	// ＥＭ契約者コード
		String tKey = tranMap.getString(JBSbatACIFM027.EM_KEISHA_CD);	// ＥＭ契約者コード
		
		// 入力M ＝ 入力T
		if(mKey.equals(tKey))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");
			
			// マッチ時の処理
			this.procMatch(mastMap, tranMap, outputInItem);
			
			return outputInItem;
		}
		// 入力M ＞ 入力T
		else if(mKey.compareTo(tKey) > 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");
			
			// Ｔのみ時の処理
			this.procTranOnly(tranMap, outputInItem);
			
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			
			return outputInItem;
		}
		// 入力M ＜ 入力T
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");
			
			this.procMastOnly(mastMap, outputInItem);
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			
			return outputInItem;
		}
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		

		// ファイル出力部品を取得
		JBSbatOutputFileUtil outFileObj = super.commonItem.getOutPutFile();

		// 出力定義ファイル名を取得する。
		String outFileDefName = JBSbatAplConst.getAplConstValue("OTD") + super.freeItem;

		// 出力定義ファイルオブジェクトを生成する
		JBSbatDefFileUtil outFileDef = new JBSbatDefFileUtil(outFileDefName, outFileObj);

		// 入出力格納マップオブジェクト生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		//ワーク.差異分リストの件数分ファイル出力を行う
		for (int i = 0; this.wkDiffList.size() > i; i++)
		{
			HashMap<String, String> diff = this.wkDiffList.get(i);

			JBSbatCommonDBInterface dbMap = this.selectEMKeiHojin(this.wkEMKeishaCd);

			String useDay = diff.get(JBSbatACIFM168.USE_DAY);

			// 出力情報設定
			outMap.setString(JBSbatACIFM168.EM_KEISHA_CD, this.wkEMKeishaCd); // ＥＭ契約者コード 
			outMap.setString(JBSbatACIFM168.USE_DAY, diff.get(JBSbatACIFM168.USE_DAY)); // 利用日
			outMap.setString(JBSbatACIFM168.TEISE_BF_BYTE_CNT, diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT)); // 訂正前バイト数
			outMap.setString(JBSbatACIFM168.TEISE_AF_BYTE_CNT, diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT)); // 訂正後バイト数

			if (diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT) != JACStrConst.KARA_MOJI) // 訂正後パケット数
			{
				outMap.setString(JBSbatACIFM168.TEISE_AF_PCT_CNT, this.pctCntCalc(new BigDecimal(diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT))));
			}
			else
			{
				outMap.setString(JBSbatACIFM168.TEISE_AF_PCT_CNT, JACStrConst.KARA_MOJI);
			}

			if (this.wkZumiFlg)
			{
				// 差分
				BigDecimal teiseiAfByteCnt	= BigDecimal.ZERO;
				BigDecimal teiseiBfByteCnt	= BigDecimal.ZERO;
				BigDecimal saBun			= BigDecimal.ZERO;

				if (diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT) != JACStrConst.KARA_MOJI)
				{
					teiseiAfByteCnt = new BigDecimal(diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT));
				}
				if (diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT) != JACStrConst.KARA_MOJI)
				{
					teiseiBfByteCnt = new BigDecimal(diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT));
					// 差分 ＝ 訂正後バイト数 − 訂正前バイト数
					saBun = teiseiAfByteCnt.subtract(teiseiBfByteCnt);
					outMap.setString(JBSbatACIFM168.SABUN, saBun.toString()); // 差分
				}
				else
				{
					outMap.setString(JBSbatACIFM168.SABUN, JACStrConst.KARA_MOJI); // 差分
				}
				
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_BYTE_CNT, this.wkTeiseBfTtlByteCnt); // 訂正前総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_BYTE_CNT, this.wkTeiseAfTtlByteCnt); // 訂正後総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_PCT_CNT, this.pctCntCalc(this.wkTeiseBfTtlByteCnt)); // 訂正前総パケット数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_PCT_CNT, this.pctCntCalc(this.wkTeiseAfTtlByteCnt)); // 訂正後総パケット数
			}
			else
			{
				outMap.setString(JBSbatACIFM168.SABUN, JACStrConst.KARA_MOJI); // 差分
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_BYTE_CNT, JACStrConst.KARA_MOJI); // 訂正前総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_BYTE_CNT, JACStrConst.KARA_MOJI); // 訂正後総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_PCT_CNT, JACStrConst.KARA_MOJI); // 訂正前総パケット数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_PCT_CNT, JACStrConst.KARA_MOJI); // 訂正後総パケット数
			}

			outMap.setString(JBSbatACIFM168.USE_MON_CNT, useDay.substring(0, 6)); // 利用月
			
			// DBより値を取得できなかった場合
			if(dbMap == null)
			{
				outMap.setString(JBSbatACIFM168.SVC_STAYMD, JACStrConst.KARA_MOJI); // サービス開始日
				outMap.setString(JBSbatACIFM168.CHRG_STAYMD, JACStrConst.KARA_MOJI); // 課金開始日
			}
			// 取得できた場合
			else
			{
				outMap.setString(JBSbatACIFM168.SVC_STAYMD, dbMap.getString(JBSbatCH_T_EM_HOJIN_KEI.SVC_STAYMD)); // サービス開始日
				outMap.setString(JBSbatACIFM168.CHRG_STAYMD, dbMap.getString(JBSbatCH_T_EM_HOJIN_KEI.EM_CHRG_STAYMD)); // 課金開始日
			}
			
			outMap.setOutFlg(true);

			//ファイル出力を行う
			outFileObj.print(outMap, outFileDef);
		}

		//ファイルクローズを行う
		outFileObj.close();

		// ログ出力
		String[] outCntMsg = { JACStrConst.LOG_MSG_TERMINAL, String.valueOf(this.wkDiffList.size()) };
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0560AI, outCntMsg);
		
		// DBアクセスクラスをクローズします
		db_CH_T_EM_HOJIN_KEI.close();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(AC_SELECT_008)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	ＥＭ契約者コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_EM_HOJIN_KEI_AC_SELECT_008(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_008);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * マッチング時の処理
	 * 
	 * @param mastMap
	 *            確定呼のEM利用呼情報(法人分データ部)
	 * @param tranMap
	 *            1日バックアップ分のEM利用呼情報(法人分データ部)
	 * @param outputInItem
	 *            入力情報
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void procMatch(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		String mastEmKeishaCd = mastMap.getString(JBSbatACIFM027.EM_KEISHA_CD); // 入力Ｍ．ＥＭ契約者コード

		String mastUseByteCnt = mastMap.getString(JBSbatACIFM027.USE_BYTE_CNT); // 入力Ｍ．利用バイト数
		String tranUseByteCnt = tranMap.getString(JBSbatACIFM027.USE_BYTE_CNT); // 入力Ｔ．利用バイト数
		
		String mastTsnUseDay = mastMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY); // 入力Ｍ．通信利用日
		String tranTsnUseDay = tranMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY); // 入力Ｔ．通信利用日

		// ワーク．ＥＭ契約者コード　＝　null（初回レコード）　　　または、
		// ワーク．ＥＭ契約者コード　＝　入力Ｍ．ＥＭ契約者コード　の場合
		if (this.wkEMKeishaCd == null || this.wkEMKeishaCd.equals(mastEmKeishaCd))
		{
			this.wkZumiFlg = true;
			
			// 通信利用日・利用バイト数比較処理
			useDayMatch(mastEmKeishaCd, mastUseByteCnt, tranUseByteCnt, mastTsnUseDay, tranTsnUseDay);
		}
		// ワーク．ＥＭ契約者コード　≠　入力Ｍ．ＥＭ契約者コード　の場合、
		else
		{
			// ＥＭパケット法人の出力処理
			this.outFile(outputInItem);

			// ワーク領域の初期化処理
			this.clearWkData();
			
			// 通信利用日・利用バイト数比較処理
			useDayMatch(mastEmKeishaCd, mastUseByteCnt, tranUseByteCnt, mastTsnUseDay, tranTsnUseDay);
		}
	}
	
	
	/**
	 * 通信利用日・利用バイト数比較処理
	 * 
	 * @param mastEmKeishaCd
	 *            入力Ｍ．ＥＭ契約者コード
	 * @param mastUseByteCnt
	 *            入力Ｍ．利用バイト数
	 * @param tranUseByteCnt
	 *            入力Ｔ．利用バイト数
	 * @param mastTsnUseDay
	 *            入力Ｍ．通信利用日
	 * @param tranTsnUseDay
	 *            入力Ｔ．通信利用日
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void useDayMatch(String mastEmKeishaCd, String mastUseByteCnt, String tranUseByteCnt, String mastTsnUseDay, String tranTsnUseDay)
					throws Exception
	{

		// ワーク．ＥＭ契約者コード　←　入力Ｍ．ＥＭ契約者コード
		this.wkEMKeishaCd = mastEmKeishaCd;

		// 入力Ｍ．通信利用日　＝　入力Ｔ．通信利用日　の場合
		if (mastTsnUseDay.equals(tranTsnUseDay))
		{

			// 入力Ｍ．利用バイト数　＝　入力Ｔ．利用バイト数　の場合
			if (mastUseByteCnt.equals(tranUseByteCnt))
			{
				// ワーク．差異分リストは差異なしのため、設定しない。
			}
			// 入力Ｍ．利用バイト数　≠　入力Ｔ．利用バイト数　の場合
			else
			{
				HashMap<String, String> wkDiff = new HashMap<String, String>();
				wkDiff.put(JBSbatACIFM168.USE_DAY, tranTsnUseDay);
				wkDiff.put(JBSbatACIFM168.TEISE_BF_BYTE_CNT, tranUseByteCnt);
				wkDiff.put(JBSbatACIFM168.TEISE_AF_BYTE_CNT, mastUseByteCnt);

				this.wkDiffList.add(wkDiff);
			}

			// ワーク．訂正前総バイト数　＝　ワーク．訂正前総バイト数　＋　入力T．利用バイト数
			this.wkTeiseBfTtlByteCnt = this.wkTeiseBfTtlByteCnt.add(new BigDecimal(tranUseByteCnt));

			// ワーク．訂正後総バイト数　＝　ワーク．訂正後総バイト数　＋　入力Ｍ．利用バイト数
			this.wkTeiseAfTtlByteCnt = this.wkTeiseAfTtlByteCnt.add(new BigDecimal(mastUseByteCnt));

			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
		}

		// 入力Ｍ．通信利用日　＜　入力Ｔ．通信利用日　の場合
		else if (mastTsnUseDay.compareTo(tranTsnUseDay) < 0)
		{
			// マスタのみの利用呼情報の設定
			this.setMastData(mastTsnUseDay, mastUseByteCnt);

			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
		}
		// 入力Ｍ．通信利用日　＞　入力Ｔ．通信利用日　の場合
		else
		{
			// トランのみの利用呼情報の設定処理
			this.setTranData(tranTsnUseDay, tranUseByteCnt);

			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);

		}
	}

	
	/**
	 * Ｍのみ時の処理
	 * 
	 * @param mastMap 確定呼のEM利用呼情報(法人分データ部)
	 * @param outputInItem  入力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void procMastOnly(JBSbatServiceInterfaceMap mastMap, JBSbatOutputItem outputInItem) throws Exception
	{
		String mastEmKeishaCd 	= mastMap.getString(JBSbatACIFM027.EM_KEISHA_CD);		// 入力Ｍ．ＥＭ契約者コード
		String mastUseByteCnt 	= mastMap.getString(JBSbatACIFM027.USE_BYTE_CNT);		// 入力Ｍ．利用バイト数
		String mastTsnUseDay 	= mastMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY);		// 入力Ｍ．通信利用日

		// ワーク．ＥＭ契約者コード　＝　null（初回レコード）の場合
		if(this.wkEMKeishaCd == null)
		{
			// ワーク．ＥＭ契約者コード　←　入力Ｍ．ＥＭ契約者コード
			this.wkEMKeishaCd = mastEmKeishaCd;
			
			// マスタのみの利用呼情報の設定
			this.setMastData(mastTsnUseDay, mastUseByteCnt);
			
		}
		// ワーク．ＥＭ契約者コード　＝　入力Ｍ．ＥＭ契約者コード　の場合
		else if(this.wkEMKeishaCd.equals(mastEmKeishaCd))
		{
			// マスタのみの利用呼情報の設定
			this.setMastData(mastTsnUseDay, mastUseByteCnt);
			
		}
		// ワーク．ＥＭ契約者コード　≠　入力Ｍ．ＥＭ契約者コード　の場合
		else
		{
			// ＥＭパケット法人の出力
			this.outFile(outputInItem);
			
			// ワーク情報の初期化
			this.clearWkData();
			
			// ワーク情報の更新
			// ワーク．ＥＭ契約者コード　←　入力Ｍ．ＥＭ契約者コード
			this.wkEMKeishaCd = mastEmKeishaCd;
			
			// マスタのみの利用呼情報の設定
			this.setMastData(mastTsnUseDay, mastUseByteCnt);
			
		}
	}

	/**
	 * Ｔのみ時の処理
	 * 
	 * @param tranMap 1日バックアップ分のEM利用呼情報(法人分データ部)
	 * @param outputInItem  入力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void procTranOnly(JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		String tranEmKeishaCd	= tranMap.getString(JBSbatACIFM027.EM_KEISHA_CD);		// 入力Ｔ．ＥＭ契約者コード
		String tranUseByteCnt	= tranMap.getString(JBSbatACIFM027.USE_BYTE_CNT);		// 入力Ｔ．利用バイト数
		String tranTsnUseDay 	= tranMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY);		// 入力T．通信利用日
		
		// ワーク．ＥＭ契約者コード　＝　null（初回レコード）の場合
		if(this.wkEMKeishaCd == null)
		{
			// ワーク．ＥＭ契約者コード　←　入力Ｔ．ＥＭ契約者コード
			this.wkEMKeishaCd = tranEmKeishaCd;
			
			// トランのみの利用呼情報の設定
			this.setTranData(tranTsnUseDay, tranUseByteCnt);
		}
		// ワーク．ＥＭ契約者コード　＝　入力Ｔ．ＥＭ契約者コード　の場合
		else if(this.wkEMKeishaCd.equals(tranEmKeishaCd))
		{
			// トランのみの利用呼情報の設定
			this.setTranData(tranTsnUseDay, tranUseByteCnt);
		}
		// ワーク．ＥＭ契約者コード　≠　入力Ｔ．ＥＭ契約者コード　の場合
		else
		{
			// ＥＭパケット法人の出力
			this.outFile(outputInItem);
			
			// ワーク情報の初期化
			this.clearWkData();
			
			// ワーク情報の更新
			// ワーク．ＥＭ契約者コード　←　入力Ｔ．ＥＭ契約者コード
			this.wkEMKeishaCd = tranEmKeishaCd;
			
			// トランのみの利用呼情報の設定
			this.setTranData(tranTsnUseDay, tranUseByteCnt);
			
		}
	}

	/**
	 * マスタのみの利用呼情報の設定処理
	 * 
	 * @param tsnUseDay 通信利用日
	 * @param useByteCnt 利用バイト数
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setMastData(String tsnUseDay, String useByteCnt) throws Exception
	{
		// ワーク．差異分リスト
		HashMap<String, String> wkDiff = new HashMap<String, String>();
		wkDiff.put(JBSbatACIFM168.USE_DAY,				tsnUseDay);
		wkDiff.put(JBSbatACIFM168.TEISE_BF_BYTE_CNT,	JACStrConst.KARA_MOJI);
		wkDiff.put(JBSbatACIFM168.TEISE_AF_BYTE_CNT,	useByteCnt);
		
		this.wkDiffList.add(wkDiff);
		
		// ワーク．訂正前総バイト数　編集なし
		
		// ワーク．訂正後総バイト数　＝　ワーク．訂正後総バイト数　＋　入力Ｍ．利用バイト数
		this.wkTeiseAfTtlByteCnt = this.wkTeiseAfTtlByteCnt.add(new BigDecimal(useByteCnt));
		
		return;
	}

	/**
	 * トランのみの利用呼情報の設定処理
	 * 
	 * @param tsnUseDay 通信利用日
	 * @param useByteCnt 利用バイト数
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setTranData(String tsnUseDay, String useByteCnt) throws Exception
	{
		// ワーク．差異分リスト
		HashMap<String, String> wkDiff = new HashMap<String, String>();
		wkDiff.put(JBSbatACIFM168.USE_DAY,				tsnUseDay);
		wkDiff.put(JBSbatACIFM168.TEISE_BF_BYTE_CNT,	useByteCnt);
		wkDiff.put(JBSbatACIFM168.TEISE_AF_BYTE_CNT,	JACStrConst.KARA_MOJI);
		
		this.wkDiffList.add(wkDiff);
		
		// ワーク．訂正前総バイト数　＝　ワーク．訂正前総バイト数　＋　入力Ｍ．利用バイト数
		this.wkTeiseBfTtlByteCnt = this.wkTeiseBfTtlByteCnt.add(new BigDecimal(useByteCnt));
		
		// ワーク．訂正後総バイト数　編集なし
		
		return;
	}

	/**
	 * ワーク領域の初期化処理
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void clearWkData() throws Exception
	{
		this.wkDiffList = new ArrayList<HashMap<String, String>> ();		// ワーク．差異分リスト
		this.wkTeiseBfTtlByteCnt = BigDecimal.ZERO;							// ワーク．訂正前総バイト数
		this.wkTeiseAfTtlByteCnt = BigDecimal.ZERO;							// ワーク．訂正後総バイト数
		
		return;
	}
	
	/**
	 * ＥＭパケット法人の出力処理
	 * @param outputInItem  入力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outFile(JBSbatOutputItem outputInItem) throws Exception
	{

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");

		for (int i = 0; this.wkDiffList.size() > i; i++)
		{
			HashMap<String, String> diff = this.wkDiffList.get(i);

			JBSbatCommonDBInterface dbMap = this.selectEMKeiHojin(this.wkEMKeishaCd);

			// 出力レコード情報設定
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

			String useDay = diff.get(JBSbatACIFM168.USE_DAY);

			// 出力情報設定
			outMap.setString(JBSbatACIFM168.EM_KEISHA_CD, this.wkEMKeishaCd); // ＥＭ契約者コード 
			outMap.setString(JBSbatACIFM168.USE_DAY, diff.get(JBSbatACIFM168.USE_DAY)); // 利用日
			outMap.setString(JBSbatACIFM168.TEISE_BF_BYTE_CNT, diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT)); // 訂正前バイト数
			outMap.setString(JBSbatACIFM168.TEISE_AF_BYTE_CNT, diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT)); // 訂正後バイト数

			if (diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT) != JACStrConst.KARA_MOJI) // 訂正後パケット数
			{
				outMap.setString(JBSbatACIFM168.TEISE_AF_PCT_CNT, this.pctCntCalc(new BigDecimal(diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT))));
			}
			else
			{
				outMap.setString(JBSbatACIFM168.TEISE_AF_PCT_CNT, JACStrConst.KARA_MOJI);
			}

			if (this.wkZumiFlg)
			{
				// 差分
				BigDecimal teiseiAfByteCnt	= BigDecimal.ZERO;
				BigDecimal teiseiBfByteCnt	= BigDecimal.ZERO;
				BigDecimal saBun			= BigDecimal.ZERO;

				if (diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT) != JACStrConst.KARA_MOJI)
				{
					teiseiAfByteCnt = new BigDecimal(diff.get(JBSbatACIFM168.TEISE_AF_BYTE_CNT));
				}
				if (diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT) != JACStrConst.KARA_MOJI)
				{
					teiseiBfByteCnt = new BigDecimal(diff.get(JBSbatACIFM168.TEISE_BF_BYTE_CNT));
					// 差分 ＝ 訂正後バイト数 − 訂正前バイト数
					saBun = teiseiAfByteCnt.subtract(teiseiBfByteCnt);
					outMap.setString(JBSbatACIFM168.SABUN, saBun.toString()); // 差分
				}
				else
				{
					outMap.setString(JBSbatACIFM168.SABUN, JACStrConst.KARA_MOJI); // 差分
				}

				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_BYTE_CNT, this.wkTeiseBfTtlByteCnt); // 訂正前総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_BYTE_CNT, this.wkTeiseAfTtlByteCnt); // 訂正後総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_PCT_CNT, this.pctCntCalc(this.wkTeiseBfTtlByteCnt)); // 訂正前総パケット数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_PCT_CNT, this.pctCntCalc(this.wkTeiseAfTtlByteCnt)); // 訂正後総パケット数
			}
			else
			{
				outMap.setString(JBSbatACIFM168.SABUN, JACStrConst.KARA_MOJI); // 差分
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_BYTE_CNT, JACStrConst.KARA_MOJI); // 訂正前総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_BYTE_CNT, JACStrConst.KARA_MOJI); // 訂正後総バイト数
				outMap.setString(JBSbatACIFM168.TEISE_BF_TTL_PCT_CNT, JACStrConst.KARA_MOJI); // 訂正前総パケット数
				outMap.setString(JBSbatACIFM168.TEISE_AF_TTL_PCT_CNT, JACStrConst.KARA_MOJI); // 訂正後総パケット数
			}

			outMap.setString(JBSbatACIFM168.USE_MON_CNT, useDay.substring(0, 6)); // 利用月
			// DBより値を取得できなかった場合
			if(dbMap == null)
			{
				outMap.setString(JBSbatACIFM168.SVC_STAYMD, JACStrConst.KARA_MOJI); // サービス開始日
				outMap.setString(JBSbatACIFM168.CHRG_STAYMD, JACStrConst.KARA_MOJI); // 課金開始日
			}
			// 取得できた場合
			else
			{
				outMap.setString(JBSbatACIFM168.SVC_STAYMD, dbMap.getString(JBSbatCH_T_EM_HOJIN_KEI.SVC_STAYMD)); // サービス開始日
				outMap.setString(JBSbatACIFM168.CHRG_STAYMD, dbMap.getString(JBSbatCH_T_EM_HOJIN_KEI.EM_CHRG_STAYMD)); // 課金開始日
			}

			outMap.setOutFlg(true);

			outputInItem.addOutMapList(outMap);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}

	/**
	 * ＥＭ契約法人の検索処理
	 * @return 
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface selectEMKeiHojin(String emKeishaCd) throws Exception
	{
		// 対象キーの設定
		JBSbatCommonDBInterface dbSelectList = new JBSbatCommonDBInterface();

		// パラメタ設定
		dbSelectList.setValue(emKeishaCd);

		// SELECT文発行
		this.executeCH_T_EM_HOJIN_KEI_AC_SELECT_008(dbSelectList.getList().toArray());

		// 結果を取得
		return this.db_CH_T_EM_HOJIN_KEI.selectNext();
	}

	/**
	 * パケット数計算処理
	 * @param byteCnt バイト数
	 * @return 
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private BigDecimal pctCntCalc(BigDecimal byteCnt) throws Exception
	{
		return JACBatCommon.round(JACStrConst.ROUND_UP, byteCnt.divide(this.tmpPctSnstTani), 0);
	}

}
