/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACStbOrsKeiYearChsht
*	ソースファイル名	：JBSbatACStbOrsKeiYearChsht.java
*	作成者				：富士通　
*	作成日				：2018年09月26日
*＜機能概要＞
*　設備卸契約情報（年間獲得数料金)抽出処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v39.00.00	2018/09/26  FJ)原田		新規作成【ANK-3478-00-00】ｅｏ光設備卸対応(サービス開始対応)
*********************************************************************/
package eo.business.service;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM311;
import eo.business.util.file.JBSbatACIFM316;
import eo.business.util.file.JBSbatACIFM317;
import eo.common.constant.JACStrConst;
import eo.common.util.JKKStringUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* 設備卸契約情報（年間獲得数料金)抽出処理 <p>
*<BR>
* @author 富士通
*/
public class JBSbatACStbOrsKeiYearChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	
	/** ファイルパス(中間ファイル) */
	private String filePath = null;
	
	/** 卸先事業者インセンティブ設定情報(年間獲得数料金) */
	private ArrayList<HashMap<String,String>> ACIFM316List = new ArrayList<HashMap<String,String>>();
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	
	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception 例外処理
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		String freeItem = commonItem.getFreeItem();
		String[] freeInf = freeItem.split(JACStrConst.FREE_DIV);
		
		// ファイルパス
		filePath = freeInf[0];
		
		// 卸先事業者インセンティブ設定情報(年間獲得数料金)リスト作成
		makeFreeInfoList(freeInf[1]);
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		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]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inMap=" + inMap.getMap().toString() + "]");
		
		// 設備卸契約情報(年間獲得数料金)作成
		JBSbatOutputItem outputInf = this.makeOutputInf(inMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return(outputInf);
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception 例外処理
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		
		// DBアクセスクラスをクローズします
		
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 出力電文(設備卸契約情報(年間獲得数料金))を作成します。
	 * 
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutputInf(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInf]");
		
		JBSbatOutputItem outputInf = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		Boolean outputFlg = false;
		
		String trgtOrsjgsCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM311.ORSJGS_CD));					// 卸先事業者コード
		String trgtSvcCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM311.SVC_CD));						// サービスコード
		String trgtSvcKeiNo = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM311.SVC_KEI_NO));				// サービス契約番号
		String trgtSvcStaYmd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM311.SVC_STA_YMD));				// サービス開始年月日
		
		if (ACIFM316List != null && ACIFM316List.size() > 0)
		{
			for (int i = 0; ACIFM316List.size() > i; i++)
			{
				HashMap<String, String> orsjgsKeiInfoMap = new HashMap<String, String>();
				
				orsjgsKeiInfoMap = ACIFM316List.get(i);
				
				// 判定用卸先事業者コード
				String judgeOrsjgsCd = orsjgsKeiInfoMap.get("ORSJGS_CD");
				// 判定用サービスコード
				String judgeSvcCd = orsjgsKeiInfoMap.get("SVC_CD");
				// 判定用計算期間開始日
				String judgeCalcPrdStaYmd = orsjgsKeiInfoMap.get("CALC_PRD_STA_YMD");
				// 判定用計算期間終了日
				String judgeCalcPrdEndYmd = orsjgsKeiInfoMap.get("CALC_PRD_END_YMD");
				
				if (judgeOrsjgsCd.equals(trgtOrsjgsCd)									// 設備卸契約情報(継続利用契約料金／年間獲得数料金).卸先事業者コード＝卸先事業者インセンティブ設定情報(年間獲得数料金).卸先事業者コード
						&& judgeSvcCd.equals(trgtSvcCd)									// 設備卸契約情報(継続利用契約料金／年間獲得数料金).サービスコード＝卸先事業者インセンティブ設定情報(年間獲得数料金).サービスコード
						&& judgeCalcPrdStaYmd.compareTo(trgtSvcStaYmd) <= 0				// 設備卸契約情報(継続利用契約料金／年間獲得数料金).サービス開始年月日≧卸先事業者インセンティブ設定情報(年間獲得数料金).計算期間開始日
						&& judgeCalcPrdEndYmd.compareTo(trgtSvcStaYmd) >= 0				// 設備卸契約情報(継続利用契約料金／年間獲得数料金).サービス開始年月日≦卸先事業者インセンティブ設定情報(年間獲得数料金).計算期間終了日
						)
				{
					// 条件に一致するレコードが存在した場合、出力
					outmap.setString(JBSbatACIFM317.ORSJGS_CD, trgtOrsjgsCd);			// 卸先事業者コード
					outmap.setString(JBSbatACIFM317.SVC_KEI_NO, trgtSvcKeiNo);			// サービス契約番号
					outmap.setString(JBSbatACIFM317.SVC_CD, trgtSvcCd);					// サービスコード
					outmap.setBigDecimal(JBSbatACIFM317.CHSHT_CNT, BigDecimal.ONE);			// "1"固定で設定
					outputFlg = true;
				}
			}
		}
		else
		{
			// 検索結果0件の場合
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf]");
			return null;
		}
		
		if (outputFlg)
		{
			// ファイル出力する
			outmap.setOutFlg(true);
		}
		else
		{
			// 検索結果0件の場合
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf]");
			return null;
		}
		
		// 出力共通電文に設定
		outputInf.addOutMapList(outmap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputInf][outmap=" + outmap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf]");
		
		return(outputInf);
	}
	
	
	/**
	 * 中間ファイルを読込み、情報をMapに設定します。
	 * @param fileName ファイル名
	 * @throws Exception 業務サービス内で発生した例外全般
	 * 
	 */
	private void makeFreeInfoList(String fileName) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeFreeInfoMap]");
		
		// 初期設定
		HashMap<String, String> ACIFM316Map = new HashMap<String, String>();
		
		JBSbatInputFileUtil inFileUtil = new JBSbatInputFileUtil(filePath + fileName);
		
		inFileUtil.setEncode(JACStrConst.ENCODE_MS932);
		
		inFileUtil.createReader();
		
		while (inFileUtil.ready())
		{
			// 初期化
			ACIFM316Map = new HashMap<String, String>();
			
			String[] tmpreadline = inFileUtil.readLine().split(JACStrConst.COMMA, -1);
			
			// 卸先事業者インセンティブ設定情報(年間獲得数料金)をレコード単位で読み込む
			if( tmpreadline != null && tmpreadline.length > 0 )
			{
				// 卸先事業者コード
				ACIFM316Map.put(JBSbatACIFM316.ORSJGS_CD,tmpreadline[0].replace("\"", ""));
				// サービスコード
				ACIFM316Map.put(JBSbatACIFM316.SVC_CD,tmpreadline[1].replace("\"", ""));
				// 計算期間開始日
				ACIFM316Map.put(JBSbatACIFM316.CALC_PRD_STA_YMD,tmpreadline[2].replace("\"", ""));
				// 計算期間終了日
				ACIFM316Map.put(JBSbatACIFM316.CALC_PRD_END_YMD,tmpreadline[3].replace("\"", ""));
				
				ACIFM316List.add(ACIFM316Map);
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeFreeInfoMap]");
	}
	
	
}
