/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACPnltyCkanKeikaSochi
*	ソースファイル名	：JBSbatACPnltyCkanKeikaSochi.java
*	作成者				：富士通　
*	作成日				：2018年04月19日
*＜機能概要＞
*　違約金置換（経過措置）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/04/19  FJ）三原	【ANK-3383-00-00】標準工事費分割請求(STEP2) 新規作成
*	v37.00.01	2018/06/06  FJ）三原	【IT1-2018-0000081】オープンカーソル数の上限エラー
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFM164;
import eo.business.util.table.JBSbatKK_T_MSKM;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
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 JBSbatACPnltyCkanKeikaSochi extends JBSbatBusinessService
{
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** SQL定義キー(KK_SELECT_361)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_361 = "KK_SELECT_361";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** 入力ファイルパラメータ */
	private static final String PARAM_IND = "IND";

	/** 既契約者基準日 */
	private static final String kijyunYMD = "20180401";

	/** 経過措置違約金情報マップ */
	private HashMap <String, BigDecimal> pnltyMap = null;

	/** 基準年月日マップ */
	private HashMap <String, String> stdardYmdMap = null;

	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		//IT1-2018-0000081 ADD START
		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		//IT1-2018-0000081 ADD END
		
		// バッチ運用日のログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "バッチ運用日：" + super.opeDate);
		
		// フリー項目を分割して保持する。
		String[] freeItemArray = commonItem.getFreeItem().split(JACStrConst.FREE_DIV);
		
		// 経過措置違約金情報読込ファイルの設定
		this.setpnltyMap(freeItemArray[0], freeItemArray[1], freeItemArray[2]);
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 出力共通電文
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// IT1-2018-0000081 DEL START
		//db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		// IT1-2018-0000081 DEL END
		
		// 申込.申込年月日の取得
		JBSbatCommonDBInterface dbMap = this.getMskmYmd(inMap);
		if(dbMap != null)
		{
			String mskmYmd = dbMap.getString(JBSbatKK_T_MSKM.MSKM_YMD);
		
			// 処理対象の判定
			if(chkRec(inMap, mskmYmd))
			{
				// 経過措置違約金単価
				BigDecimal pnltyTanka = null;
				
				// 違約金マップから単価(旧単価)を取得し、経過措置違約金単価とする
				StringBuffer keyBuf = new StringBuffer();
				keyBuf.append(inMap.getString(JBSbatACIFI016.PRC_GRP_CD));
				keyBuf.append(inMap.getString(JBSbatACIFI016.PCRS_CD));
				keyBuf.append(inMap.getString(JBSbatACIFI016.PRC_SVC_CD));
				keyBuf.append(inMap.getBigDecimal(JBSbatACIFI016.PRC));
				
				if (null != this.pnltyMap.get(keyBuf.toString()) 
					&& null != this.stdardYmdMap.get(keyBuf.toString()))
				{
					// 基準年月日マップ.基準年月日 >= 申込.申込年月日である場合、
					// 旧単価を経過措置違約金単価とする
					if(this.stdardYmdMap.get(keyBuf.toString()).compareTo(mskmYmd) >= 0)
					{
						// 経過措置違約金単価に違約金マップ.単価(旧単価)を設定する
						pnltyTanka = this.pnltyMap.get(keyBuf.toString());
					}
				}
				
				// 取得できなかった場合、編集せずに出力
				if(null == pnltyTanka)
				{
					inMap.setOutFlg(true);
					outputItem.addOutMapList(inMap);
					
					return outputItem;
				}
				
				// 経過措置違約金を取得できた場合、利用料金情報ファイル（違約金情報）.料金を
				// 経過措置違約金に置き換える。
				inMap.setBigDecimal(JBSbatACIFI016.PRC, pnltyTanka);
			}
		}
		
		inMap.setOutFlg(true);
		outputItem.addOutMapList(inMap);
		
		return outputItem;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
	}

	/**
	 * 経過措置対象判定をします。
	 * 
	 * @param inMap 入力電文
	 * @param mskmYmd 申込.申込年月日
	 * @return boolean true：対象、false：対象外
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean chkRec(JBSbatServiceInterfaceMap inMap, String mskmYmd) throws Exception
	{
		// 料金グループコード
		String prcGrpCd = inMap.getString(JBSbatACIFI016.PRC_GRP_CD);
		
		// 料金グループコードが"02"(eo光ネットホームタイプ)または"03"(eo光ネットメゾンタイプ)である場合
		if(JACStrConst.PRC_GRP_CD_NET_HOME.equals(prcGrpCd)
			|| JACStrConst.PRC_GRP_CD_NET_MEZON.equals(prcGrpCd))
		{
			// 申込.申込年月日が"20180401"(既契約者基準日)以下である場合
			if(mskmYmd.compareTo(kijyunYMD) <= 0)
			{
				return true;
			}
		}
		
		return false;
	}

	/**
	 * 経過措置違約金情報ファイル取得。<p>
	 * 
	 * エンコードはShift-JIS、読み込み位置は引数で渡す<br>
	 * ループ(主処理を含む)で使用しない。使用したファイルのクローズまで行う。
	 * 
	 * @param fileDir ディレクトリ
	 * @param fileName ファイル名
	 * @param def ファイル定義名
	 * @throws Exception スローされる例外
	 */
	private void setpnltyMap(String fileDir, String fileName, String def) throws Exception
	{
		// 入力ファイル
		JBSbatInputFileUtil inFileObj = new JBSbatInputFileUtil(fileDir + fileName);
		inFileObj.setEncode(JACStrConst.ENCODE_SJIS);
		inFileObj.createReader();
		
		// ファイル項目定義
		StringBuffer defPath = new StringBuffer();
		defPath.append(JBSbatAplConst.getAplConstValue(PARAM_IND));
		defPath.append(def);
		
		String readLine = inFileObj.readLine();
		
		JBSbatServiceInterfaceMap retInMap = null;
		
		// 違約金マップ
		pnltyMap = new HashMap<String, BigDecimal>();
		// 基準年月日マップ
		stdardYmdMap = new HashMap<String, String>();
		
		while(readLine != null)
		{
			String enc = inFileObj.getEncode();
			// encodeの形式がSHIFT-JISの場合、MS932に変換
			if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
			{
				enc = JACStrConst.ENCODE_MS932;
			}
			
			JBSbatDefFileUtil defUtil = new JBSbatDefFileUtil(defPath.toString(), inFileObj);
			inFileObj.setEncode(enc);
			
			retInMap = defUtil.lineToObject(readLine, inFileObj, 0);
			
			StringBuffer keyBuf = new StringBuffer();
			keyBuf.append(retInMap.getString(JBSbatACIFM164.PRC_GRP_CD));
			keyBuf.append(retInMap.getString(JBSbatACIFM164.PCRS_CD));
			keyBuf.append(retInMap.getString(JBSbatACIFM164.PRC_SVC_CD));
			keyBuf.append(retInMap.getBigDecimal(JBSbatACIFM164.NEW_TANKA));
			
			// 違約金マップに単価(旧単価)を設定する
			pnltyMap.put(keyBuf.toString(), retInMap.getBigDecimal(JBSbatACIFM164.TANKA));
			
			// 基準年月日マップに基準年月日を設定する
			stdardYmdMap.put(keyBuf.toString(), retInMap.getString(JBSbatACIFM164.STDARD_YMD));
			
			readLine = inFileObj.readLine();
		}
		
		// ファイルのクローズを行う
		if (inFileObj != null)
		{
			inFileObj.close();
			inFileObj = null;
		}
		
		return;
	}

	/**
	 * 申込年月日の取得。<p>
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatCommonDBInterface 申込スキーマ
	 * @throws Exception スローされる例外
	 */
	private JBSbatCommonDBInterface getMskmYmd(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 申込スキーマから、申込年月日を取得する。
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// サービス番号
		paramList.setValue(inMap.getString(JBSbatACIFI016.SVC_NO));
		// バッチ運用日
		paramList.setValue(super.opeDate);
		
		this.executeKK_T_SVC_KEI_KK_SELECT_361(paramList.getList().toArray());
		
		return db_KK_T_SVC_KEI.selectNext();
	}

	/**
	 * SQLKEY(KK_SELECT_361)で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_SVC_KEI_KK_SELECT_361(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_KK_SELECT_361);
	}
}
