/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAC050ApKoIfReTonyuJdg
*	ソースファイル名	：JBSbatAC050ApKoIfReTonyuJdg.java
*	作成者				：富士通　
*	作成日				：2013年03月01日
*＜機能概要＞
*　０５０アプリ利用呼情報再投入判定部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/03/01  FJ)早崎		【ANK-1419-00-00_050アプリ】対応 新規作成
*	v5.01.00	2013/06/05  FJ)前田		【IKK-2013-0001170】対応 050アプリ利用呼情報エラー情報(再投入)の小数点削除の処理を追加
*	v5.02.00	2013/06/19  FJ)岡田		【IKK-2013-0001199】エラーファイル有件出力時に警告終了とするよう修正
*	v23.00.00	2016/04/04  FJ)中嶋		【OM-2016-0000889】エラーファイル有件出力時に警告終了からインフォメーション出力するよう修正
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM204;
import eo.business.util.file.JBSbatACIFM205;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAC050ApKoIfReTonyuJdg extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 再投入期間 */
	private int reEntryTerm = 0;

	/** エラー件数 */
	private int errCnt = 0;
// OM-2016-0000889 ADD START
	/**	EACB1010CI	*/
	public static final String EACB1010CI = "EACB1010CI";
// OM-2016-0000889 ADD END	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		// 業務パラメータ取得
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 再投入期間
		this.reEntryTerm = Integer.valueOf(paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_RE_ENTRY_TERM));

		// パラメータ取得部品のクローズ処理
		paramUtil.close();

		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 outputInItem = new JBSbatOutputItem();

		// エラーコード
		String errCd = inMap.getString(JBSbatACIFM205.ERR_CD);

		// 通話開始年月日＋再投入期間
		String pcallStaYmdAddTerm = JCCBatCommon.addDay(inMap.getString(JBSbatACIFM205.PCALL_STAYMD), this.reEntryTerm);

		// (エラーコード＝お客様ID取得エラー または 通話種別取得エラー) かつ 通話開始年月日＋再投入期間 ＞ バッチ運用日 の場合
		if ((JACStrConst.WKPARA_AC_MSG_CUST_STKUERR.equals(errCd) || JACStrConst.WKPARA_AC_MSG_STKU_TWSBTERR.equals(errCd))
						&& super.opeDate.compareTo(pcallStaYmdAddTerm) < 0)
		{
			// 050アプリ利用呼情報エラー情報(再投入)ファイル出力処理
			outputInItem.addOutMapList_2(this.outPut050ApKoInfoRe(inMap));
		}
		// 上記以外の場合
		else
		{
			// 050アプリ利用呼情報エラー情報(確定)ファイル出力処理
			outputInItem.addOutMapList(this.outPut050ApKoInfoKaku(inMap));

			// エラー出力件数カウントアップ
			errCnt++;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");

		// エラー情報出力件数確認
		if (errCnt > 0)
		{
			// 050アプリ利用呼情報エラー情報(確定)ファイルが有件である場合
// OM-2016-0000889 MOD START
//			// 警告終了 「【警告】エラー対象レコード＝（%1%）」
//			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0340CW, new String[] { Integer.toString(errCnt) });
			// インフォメーションフラグをtrueに設定
			commonItem.setInformationFlg(true);
			// 警告終了 「【情報】エラー対象レコード＝（%1%）」
			super.logPrint.printBusinessErrorLog(EACB1010CI, new String[] { Integer.toString(errCnt) });
// OM-2016-0000889 MOD END
		}
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 050アプリ利用呼情報エラー情報(確定)ファイル出力処理
	 * @param  inMap    入力電文
	 * @return outInfoMap 050アプリ利用呼情報エラー情報(確定)
	 * @throws Exception  業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap outPut050ApKoInfoKaku(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outPut050ApKoInfoKaku]");

		JBSbatServiceInterfaceMap outInfoMap = new JBSbatServiceInterfaceMap();

		// 課金先電話番号
		outInfoMap.set(JBSbatACIFM205.KAKINS_TELNO, inMap.getString(JBSbatACIFM205.KAKINS_TELNO));

		// 発信元電話番号
		outInfoMap.set(JBSbatACIFM205.HASHIN_TELNO, inMap.getString(JBSbatACIFM205.HASHIN_TELNO));

		// 着信先電話番号
		outInfoMap.set(JBSbatACIFM205.INCOMING_TELNO, inMap.getString(JBSbatACIFM205.INCOMING_TELNO));

		// 通話開始日
		outInfoMap.set(JBSbatACIFM205.PCALL_STAYMD, inMap.getString(JBSbatACIFM205.PCALL_STAYMD));

		// 通話開始時刻
		outInfoMap.set(JBSbatACIFM205.PCALL_STA_HMS, inMap.getString(JBSbatACIFM205.PCALL_STA_HMS));

		// 通話終了日
		outInfoMap.set(JBSbatACIFM205.PCALL_ENDYMD, inMap.getString(JBSbatACIFM205.PCALL_ENDYMD));

		// 通話終了時刻
		outInfoMap.set(JBSbatACIFM205.PCALL_END_HMS, inMap.getString(JBSbatACIFM205.PCALL_END_HMS));

		// 通話秒数
		outInfoMap.set(JBSbatACIFM205.PCALL_SEC_CNT, inMap.getString(JBSbatACIFM205.PCALL_SEC_CNT));

		// 通話度数
		outInfoMap.set(JBSbatACIFM205.PCALL_DOSU, inMap.getString(JBSbatACIFM205.PCALL_DOSU));

		// 通話単価
		outInfoMap.set(JBSbatACIFM205.PCALL_TANKA, inMap.getString(JBSbatACIFM205.PCALL_TANKA));

		// 通話料金
		outInfoMap.set(JBSbatACIFM205.PCALL_PRC, inMap.getString(JBSbatACIFM205.PCALL_PRC));

		// 通話種別
		outInfoMap.set(JBSbatACIFM205.PCALL_SBT, inMap.getString(JBSbatACIFM205.PCALL_SBT));

		// サービス区分
		outInfoMap.set(JBSbatACIFM205.SVC_DIV, inMap.getString(JBSbatACIFM205.SVC_DIV));

		// 切断理由-SIP
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV_SIP, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV_SIP));

		// 切断理由-ISUP
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV_ISUP, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV_ISUP));

		// 切断理由区分
		outInfoMap.set(JBSbatACIFM205.CUT_RSN_DIV, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV));

		// 切断詳細情報-大項目
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_DKMK_IDX_NO, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_DKMK_IDX_NO));

		// 切断詳細情報-中項目
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_CKMK_IDX_NO, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_CKMK_IDX_NO));

		// 切断詳細情報-発着種別
		outInfoMap.set(JBSbatACIFM205.CUT_DTAIL_INFO_HTCK_SBT_CD, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_HTCK_SBT_CD));

		// 課金表示
		outInfoMap.set(JBSbatACIFM205.CHRG_DSP_CD, inMap.getString(JBSbatACIFM205.CHRG_DSP_CD));

		// 緊急通報呼フラグ
		outInfoMap.set(JBSbatACIFM205.EMG_KO_FLG, inMap.getString(JBSbatACIFM205.EMG_KO_FLG));

		// CHG信号受信回数
		outInfoMap.set(JBSbatACIFM205.CHG_SIGNAL_RCV_CNT, inMap.getString(JBSbatACIFM205.CHG_SIGNAL_RCV_CNT));

		// 転送時発信元電話番号
		outInfoMap.set(JBSbatACIFM205.TENSO_JI_HASHIN_TELNO, inMap.getString(JBSbatACIFM205.TENSO_JI_HASHIN_TELNO));

		// 国名
		outInfoMap.set(JBSbatACIFM205.COUNTRY_NM, inMap.getString(JBSbatACIFM205.COUNTRY_NM));

		// エラーコード
		outInfoMap.set(JBSbatACIFM205.ERR_CD, inMap.getString(JBSbatACIFM205.ERR_CD));

		// エラー内容
		outInfoMap.set(JBSbatACIFM205.ERR_NAIYO, inMap.getString(JBSbatACIFM205.ERR_NAIYO));

		outInfoMap.setOutFlg(true);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outPut050ApKoInfoKaku]");

		return outInfoMap;
	}

	
	/**
	 * 050アプリ利用呼情報エラー情報(再投入)ファイル出力処理
	 * @param  inMap    入力電文
	 * @return outInfoMap 050アプリ利用呼情報エラー情報(再投入)
	 * @throws Exception  業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap outPut050ApKoInfoRe(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outPut050ApKoInfoRe]");

		JBSbatServiceInterfaceMap outInfoMap = new JBSbatServiceInterfaceMap();

		// 課金先電話番号
		outInfoMap.set(JBSbatACIFM204.KAKINS_TELNO, inMap.getString(JBSbatACIFM205.KAKINS_TELNO));

		// 発信元電話番号
		outInfoMap.set(JBSbatACIFM204.HASHIN_TELNO, inMap.getString(JBSbatACIFM205.HASHIN_TELNO));

		// 着信先電話番号
		outInfoMap.set(JBSbatACIFM204.INCOMING_TELNO, inMap.getString(JBSbatACIFM205.INCOMING_TELNO));

		// 通話開始日
		outInfoMap.set(JBSbatACIFM204.PCALL_STAYMD, inMap.getString(JBSbatACIFM205.PCALL_STAYMD));

		// 通話開始時刻
		outInfoMap.set(JBSbatACIFM204.PCALL_STA_HMS, inMap.getString(JBSbatACIFM205.PCALL_STA_HMS));

		// 通話終了日
		outInfoMap.set(JBSbatACIFM204.PCALL_ENDYMD, inMap.getString(JBSbatACIFM205.PCALL_ENDYMD));

		// 通話終了時刻
		outInfoMap.set(JBSbatACIFM204.PCALL_END_HMS, inMap.getString(JBSbatACIFM205.PCALL_END_HMS));

		// 通話秒数
		outInfoMap.set(JBSbatACIFM204.PCALL_SEC_CNT, deleteDecimalPoint(inMap.getString(JBSbatACIFM205.PCALL_SEC_CNT),
						JACStrConst.PCALL_SEC_CNT_DEC_LENGTH));

		// 通話度数
		outInfoMap.set(JBSbatACIFM204.PCALL_DOSU, inMap.getString(JBSbatACIFM205.PCALL_DOSU));

		// 通話単価
		outInfoMap.set(JBSbatACIFM204.PCALL_TANKA,
						deleteDecimalPoint(inMap.getString(JBSbatACIFM205.PCALL_TANKA), JACStrConst.PCALL_TANKA_DEC_LENGTH));

		// 通話料金
		outInfoMap.set(JBSbatACIFM204.PCALL_PRC, deleteDecimalPoint(inMap.getString(JBSbatACIFM205.PCALL_PRC), JACStrConst.PCALL_PRC_DEC_LENGTH));

		// 通話種別
		outInfoMap.set(JBSbatACIFM204.PCALL_SBT, inMap.getString(JBSbatACIFM205.PCALL_SBT));

		// サービス区分
		outInfoMap.set(JBSbatACIFM204.TUWA_SVC_SKBT_CD, inMap.getString(JBSbatACIFM205.SVC_DIV));

		// 切断理由-SIP
		outInfoMap.set(JBSbatACIFM204.CUT_RSN_DIV_SIP, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV_SIP));

		// 切断理由-ISUP
		outInfoMap.set(JBSbatACIFM204.CUT_RSN_DIV_ISUP, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV_ISUP));

		// 切断理由区分
		outInfoMap.set(JBSbatACIFM204.CUT_RSN_DIV, inMap.getString(JBSbatACIFM205.CUT_RSN_DIV));

		// 切断詳細情報-大項目
		outInfoMap.set(JBSbatACIFM204.CUT_DTAIL_INFO_DKMK_IDX_NO, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_DKMK_IDX_NO));

		// 切断詳細情報-中項目
		outInfoMap.set(JBSbatACIFM204.CUT_DTAIL_INFO_CKMK_IDX_NO, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_CKMK_IDX_NO));

		// 切断詳細情報-発着種別
		outInfoMap.set(JBSbatACIFM204.CUT_DTAIL_INFO_HTCK_SBT_CD, inMap.getString(JBSbatACIFM205.CUT_DTAIL_INFO_HTCK_SBT_CD));

		// 課金表示
		outInfoMap.set(JBSbatACIFM204.CHRG_DSP_CD, inMap.getString(JBSbatACIFM205.CHRG_DSP_CD));

		// 緊急通報呼フラグ
		outInfoMap.set(JBSbatACIFM204.EMG_KO_FLG, inMap.getString(JBSbatACIFM205.EMG_KO_FLG));

		// CHG信号受信回数
		outInfoMap.set(JBSbatACIFM204.CHG_SIGNAL_RCV_CNT, inMap.getString(JBSbatACIFM205.CHG_SIGNAL_RCV_CNT));

		// 転送時発信元電話番号
		outInfoMap.set(JBSbatACIFM204.TENSO_JI_HASHIN_TELNO, inMap.getString(JBSbatACIFM205.TENSO_JI_HASHIN_TELNO));

		// 国名
		outInfoMap.set(JBSbatACIFM204.COUNTRY_NM, inMap.getString(JBSbatACIFM205.COUNTRY_NM));

		outInfoMap.setOutFlg(true);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outPut050ApKoInfoRe]");

		return outInfoMap;
	}

	/**
	 * 文字列の右から指定された桁数の位置の小数点を削除する
	 * @param baseNumValue	削除元文字列
	 * @param decNum	小数点以下の桁数
	 * @return			小数点を削除した文字列
	 * @throws Exception
	 */
	private String deleteDecimalPoint(String baseNumValue, int decNum) throws Exception
	{
		StringBuffer numValue = new StringBuffer(baseNumValue);

		return numValue.deleteCharAt(baseNumValue.length() - (decNum + 1)).toString();
	}

}
