/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACStbOrsSeikyInfoChsht
*	ソースファイル名	：JBSbatACStbOrsSeikyInfoChsht.java
*	作成者				：FJ）鈴木　
*	作成日				：2018年04月17日
*＜機能概要＞
*　設備卸請求料金情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/04/17  富士通		ANK-3366-00-00 新規作成 ｅｏ光設備卸対応
*   v37.01.00	2018/05/31  富士通		IT2-2018-0000048 インセンティブ料金ファイルの債権譲渡金額が想定値と異なる
*   v39.00.00	2018/09/25  富士通		IT1-2018-0000152 NTTコミュニケーションズ分料金の二重計上対応
*	v39.01.00	2018/10/05  富士通		IT1-2018-0000158 前月月末取得不備対応
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM296;
import eo.business.util.file.JBSbatACIFM301;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;

/**
* 
* 設備卸請求料金情報抽出部品です。 <p>
*<BR>
* @author 富士通
*/
public class JBSbatACStbOrsSeikyInfoChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AC_SELECT_028)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028 = "AC_SELECT_028";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	// IT1-2018-0000158 DEL START
//	/**  退避．群月初日 */
//	private String tmpCycFst = null;
//	
//	/**  退避．群月末日 */
//	private String tmpCycEnd = null;
	// IT1-2018-0000158 DEL END
	
	// IT1-2018-0000152 DEL START
//	/** ID番号計の料金項目コード */
//	private String idPrcKmkCd = null;
	// IT1-2018-0000152 DEL END
	
	/** 債権譲渡対象区分（3：債権譲渡） */
	public static final String SKN_JOTO_TG_DIV_SAIKENJOTO = "3";
	
	/** 退避. 前回キー */
	private String tmpPrvKey = null;
	
	/** 退避．債権譲渡金額  */
	private BigDecimal saikenJotoPrc = BigDecimal.ZERO;
	
	/**
	 * 
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @param inMap　入力電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// IT1-2018-0000158 DEL START
		//// 料金スケジュール定義アクセス部品初期処理
		//JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		//
		//try
		//{
		//	// 請求年月を取得する
		//	String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		//	
		//	// 請求年月から、利用開始終了日取得
		//	String[] strEndYmd = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		//	
		//	this.tmpCycFst = strEndYmd[0];	// 群月初日
		//	this.tmpCycEnd = strEndYmd[1];	// 群月末日
		//	assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月初日：" + tmpCycFst + "]");
		//	assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月末日：" + tmpCycEnd + "]");
		//}
		//finally
		//{
		//	// 料金スケジュール定義アクセス部品クローズ
		//	schdlUtil.close();
		//}
		// IT1-2018-0000158 DEL END
		
		// IT1-2018-0000152 DEL START
//		// ID番号計の料金項目コード取得
//		this.getPrcKmkCd();
		// IT1-2018-0000152 DEL END

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();
		
		// 1件目のレコードの場合	
		if(!outputInItem.isOutMapList())	
		{	
			// ダミーレコードセット
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// 入力．キー
		String tmpKey = null;
		
		// 今回キーの作成
		if(inMap != null)
		{
			tmpKey = inMap.getString(JBSbatACIFM296.ORSJGS_CD);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeStr][tmpKey = " + tmpKey + "]") ;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeStr][tmpPrvKey = " + tmpPrvKey + "]") ;
		

		// 退避．前回キー ≠ null、かつ 退避．前回キー ≠ 入力．今回キー または 最終レコードの場合
		if((tmpPrvKey != null && !tmpPrvKey.equals(tmpKey)) || inMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．前回キー ≠ null、かつ 退避．前回キー ≠ 入力．今回キー の場合]");
			// 出力
			makeOutputInfo(outputInItem,tmpPrvKey);
			
			// 最終レコードの場合
			if (inMap == null)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][最終レコードの場合]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
				return outputInItem;
			}
			
			// 退避情報初期化
			// 退避．債権譲渡金額をクリア
			saikenJotoPrc = BigDecimal.ZERO;
		}
		
		// 最終レコード以外の場合
		if (inMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][最終レコード以外の場合]");

			// 債権譲渡金額合算方法
			// IT1-2018-0000152 MOD START
			//this.saikenAddJdg(inMap,idPrcKmkCd);
			this.saikenAddJdg(inMap, null);
			// IT1-2018-0000152 MOD END
			
			// ファイル編集用情報退避
			// 退避．前回キーに入力．今回キーを退避する。
			tmpPrvKey = tmpKey;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028)で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_028(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_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	// IT1-2018-0000152 DEL START
//	/**
//	 * ID番号計の料金項目コードを取得
//	 * @param 
//	 * @return 
//	 * 
//	 */
//	private void getPrcKmkCd() throws Exception
//	{
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcKmkCd]");
//		
//		String idPrcKmkCd= "";
//		
//		// パラメータ取得部品の初期処理
//		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
//		// パラメータ取得部品(業務パラメータ)を使用し、以下を取得
//		String gyomuPara = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_ID_NO_KEI);
//		
//		// パラメータ取得部品のクローズ処理
//		paramUtil.close();
//
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//				
//		// システムコード
//		paramList.setValue(JACStrConst.SYS_CD_CH);
//		// 業務機能識別コード
//		paramList.setValue(gyomuPara);
//		// 群月末日
//		paramList.setValue(this.tmpCycEnd);
//
//		// SQL実行
//		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_028(paramList.getList().toArray());
//		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
//		
//		// 取得できた場合
//		if (dbMap != null)
//		{
//			idPrcKmkCd = dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD);
//		}
//		// 対象データが存在しない場合
//		else 
//		{
//            // DB未存在エラー
//            assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcKmkCd][DB未存在エラー]");
//            String[] outCntMsg = {JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, gyomuPara};
//            // エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
//            throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
//		}
//		
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcKmkCd]");
//		
//		this.idPrcKmkCd = idPrcKmkCd;
//
//		return;
//	}
	// IT1-2018-0000152 DEL END
	
	/**
	 * 債権譲渡金額合算対象判定,債権譲渡金額合計の計算
	 * 
	 * @param inMap 入力電文
	 * @param 
	 * @return saikenJotoyPrc2 債権譲渡金額（総合計）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal saikenAddJdg(JBSbatServiceInterfaceMap inMap
								,String idPrcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][saikenAddJdg]");

		// IT1-2018-0000152 MOD START
//		// インセンティブ料金連携情報.料金項目コード≠退避.prcKmkCd 且つ 
//		//		インセンティブ料金連携情報.債権譲渡対象区分 = 3:債権譲渡 の場合
//		// IT2-2018-0000048 MOD START
//		if ((!(JBSbatACIFM296.PRC_KMK_CD).equals(idPrcKmkCd)) && inMap.getString(JBSbatACIFM296.SKN_JOTO_TG_DIV).equals(SKN_JOTO_TG_DIV_SAIKENJOTO));
//		if ((!inMap.getString(JBSbatACIFM296.PRC_KMK_CD).equals(idPrcKmkCd)) && inMap.getString(JBSbatACIFM296.SKN_JOTO_TG_DIV).equals(SKN_JOTO_TG_DIV_SAIKENJOTO))
//		// IT2-2018-0000048 MOD END
		// インセンティブ料金連携情報.料金項目コードの３〜５桁目が"900"かを判定するフラグ
		// TRUE：３〜５桁目が"900"以外 FALSE：３〜５桁目が"900"
		Boolean shukTrgtFlg = shukTrgtJudge(inMap.getString(JBSbatACIFM296.PRC_KMK_CD));
		
		// インセンティブ料金連携情報.料金項目コードの３〜５桁目が"900"以外 且つ
		// インセンティブ料金連携情報.債権譲渡対象区分 = 3:債権譲渡 の場合
		if ( shukTrgtFlg && inMap.getString(JBSbatACIFM296.SKN_JOTO_TG_DIV).equals(SKN_JOTO_TG_DIV_SAIKENJOTO) )
		// IT1-2018-0000152 MOD END
		{ 
			// 債権譲渡金額を足す
			// 債権譲渡金額（総合計）＝　債権譲渡金額（合計）＋　入力．債権譲渡金額金額
			saikenJotoPrc = saikenJotoPrc.add(inMap.getBigDecimal(JBSbatACIFM296.AMNT));
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][saikenAddJdg]");
		return saikenJotoPrc;
	}
	
	
	/**
	 * 設備卸請求料金情報を出力します
	 * 
	 * @param inMap 入力電文
	 * @param saikenJotoPrc 債権譲渡金額
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo(JBSbatOutputItem outputInItem
									, String tmpPrvKey) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 卸先事業者コード
		outMap.setString(JBSbatACIFM301.ORSJGS_CD, 			tmpPrvKey);

		// 金額
		outMap.setString(JBSbatACIFM301.AMNT, 				saikenJotoPrc);

		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
	
	// IT1-2018-0000152 ADD START
	/**
	 * 対象の料金項目コードが「インセンティブ料金連携情報」の集計対象かを判定します。
	 * 
	 * @param prcKmkCd 料金項目コード
	 */
	private boolean shukTrgtJudge(String prcKmkCd)
	{
		Boolean shukTrgt = true;
		
		String prcKmkCd3to5 = prcKmkCd.substring(2, 5);
		
		// 料金項目コードの先頭3桁〜5桁が９００の場合、FALSEを設定。
		if("900".equals(prcKmkCd3to5))
		{
			shukTrgt = false;
		}
		
		return shukTrgt;
	}
	// IT1-2018-0000152 ADD 
}
