/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPrcTeiseiDataFileSksi
*	ソースファイル名	：JBSbatCHPrcTeiseiDataFileSksi.java
*	作成者				：富士通　
*	作成日				：2020年04月15日
*＜機能概要＞
*　料金訂正データファイル作成部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v49.00.00	2020/04/15	 FJ)塩津	【ANK-3826-00-00】譲渡未収分の載せ替え処理の自動化
*	v49.00.00	2020/07/03	 FJ)塩津	【IT2-2020-0000011】譲渡元の料金一括変更ができない
*********************************************************************/
package eo.business.service;

// import java.util.HashMap;

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.JBSbatCHIFM351;
import eo.business.util.file.JBSbatCHIFM352;
// import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPrcTeiseiDataFileSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** テーブル(料金項目抽出変換)*/
	// private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";
	
	/** テーブル(料金項目出力名称)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM = "CH_M_PRC_KMK_OPUT_NM";
	
	/** SQL定義キー(CH_SELECT_021)*/
	// private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_021 = "CH_SELECT_021";
	
	/** SQL定義キー(CH_SELECT_008)*/
	private static final String CH_M_PRC_KMK_OPUT_NM_CH_SELECT_008 = "CH_SELECT_008";
	
	/** テーブルアクセスクラス(料金項目抽出変換)*/
	//private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/** テーブルアクセスクラス(料金項目出力名称)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_OPUT_NM = null;

	/** 工事費割賦分割料金情報（ネット） */
	// private String kjHiKpBktPrcInfNet = null;

	/** 工事費割賦分割料金情報（電話） */
	// private String kjHiKpBktPrcInfTel = null;

	/** 料金項目コード */
	private String prcKmkCd = null;
	
	/** 料金項目コード（譲渡先） */
	private String prcKmkCdJotoSaki = null;

	/** 載替対象料金項目情報.請求年月 */
	private String seikyYm = null;

	/** 工事費割賦分割料金項目マップ */
	// private HashMap<String, String> kjHiBktPrcKmkMap = new HashMap<String, String>();

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @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);
		db_CH_M_PRC_KMK_OPUT_NM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// 料金計算日から請求処理日を求める（バッチ運用日、イベントコード"04"）
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		// 請求年月を取得
		seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_SIKY_TRN_DAY);
		
		// JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		// 工事費割賦分割料金情報（ネット）
		// kjHiKpBktPrcInfNet = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_KJ_HI_NET);
		// 工事費割賦分割料金情報（電話）
		// kjHiKpBktPrcInfTel = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_KJ_HI_TEL);
		
		// 工事費割賦分割料金の料金項目コードを取得
		// kjHiBktPrcKmkMap = getKjHiKpBnktPrc(kjHiKpBktPrcInfNet, kjHiKpBktPrcInfTel);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial] 請求年月=" + seikyYm);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 入力ファイル（載替対象料金項目情報）の料金項目コード判定
		// 載替対象料金項目情報.料金項目コードに工事費割賦分割料金が含まれている場合
//		if(kjHiBktPrcKmkMap.containsKey(inMap.getString(JBSbatCHIFM351.PRC_KMK_CD)))
//		{
//			// 料金項目コードの上9桁目を"9"に変換する
//			this.prcKmkCd = replacePrcKmkChng(inMap.getString(JBSbatCHIFM351.PRC_KMK_CD), "9");
//		}
		
		// 料金項目コードの取得
		prcKmkCd = inMap.getString(JBSbatCHIFM351.PRC_KMK_CD);
		
		// 料金訂正データファイルの作成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		makeOutputInfo(outputItem, inMap, prcKmkCd);
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		//db_CH_M_PRC_KMK_CS_CHGE.close();
		db_CH_M_PRC_KMK_OPUT_NM.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CH_SELECT_021)で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_CH_SELECT_021(Object[] param) throws Exception
//	{
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(param[0].toString());
//		paramList.setValue(param[1].toString());
//		paramList.setValue(param[2].toString());
//		paramList.setValue(param[3].toString());
//		paramList.setValue(param[4].toString());
//		paramList.setValue(param[5].toString());
//
//		// DBアクセスを実行します
//		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_021);
//	}
	
	/**
	 * SQLKEY(CH_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_M_PRC_KMK_OPUT_NM_CH_SELECT_008(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_OPUT_NM.selectBySqlDefine(paramList, CH_M_PRC_KMK_OPUT_NM_CH_SELECT_008);
	}

	/**
	 * 料金項目抽出変換情報の取得を行いMAPに設定します。
	 * 
	 * @param workKinoSkbtCd		業務機能識別コード
	 * @return HashMap<String, String> 		退避用マップ
	 * @throws Exception 	業務サービス内で発生した例外全般
	 */
//	private HashMap<String, String> getKjHiKpBnktPrc(String workKinoSkbtCdNet, String workKinoSkbtCdTel) throws Exception
//	{
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKjHiKpBnktPrc]");
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKjHiKpBnktPrc][workKinoSkbtCd=" + workKinoSkbtCdNet + "]");
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKjHiKpBnktPrc][workKinoSkbtCd=" + workKinoSkbtCdTel + "]");
//		
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		
//		paramList.setValue(super.systemCode);				// システムコード
//		paramList.setValue(workKinoSkbtCdNet);				// 業務機能識別コード
//		paramList.setValue(workKinoSkbtCdTel);				// 業務機能識別コード
//		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CST);	// 抽出変換コード
//		paramList.setValue(super.opeDate);					// 料金項目抽出変換適用開始年月日
//		paramList.setValue(super.opeDate);					// 料金項目抽出変換適用終了年月日
//		
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][paramList=" + paramList.getList().toString() + "]");
//		
//		// SQL実行
//		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_021(paramList.getList().toArray());
//		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext(); 
//		
//		HashMap<String, String> rtnMap = new HashMap<String, String>();
//
//		while(dbMap != null)
//		{
//			// マップにデータを格納
//			rtnMap.put(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
//			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
//		}
//		
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKjHiKpBnktPrc]");
//		return rtnMap;
//	}

	/**
	 * 料金項目出力名称に料金項目コードが存在するか判定する
	 * @param prcKmkCd	料金項目コード
	 * @return	prcKmkCdUmflg	料金項目コード有無フラグ
	 * @throws Exception
	 */
	private boolean jdgPrcKmkCdUm(String prcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][jdgPrcKmkCdUm]");
		
		boolean prcKmkCdUmflg = false;
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(prcKmkCd);						// 料金項目コード
		paramList.setValue(super.opeDate);					// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);					// 料金項目抽出変換適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][jdgPrcKmkCdUm][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_PRC_KMK_OPUT_NM_CH_SELECT_008(paramList.getList().toArray());
		JBSbatCommonDBInterface record = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		if (record != null)	
		{
			prcKmkCdUmflg = true;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][jdgPrcKmkCdUm]");
		return prcKmkCdUmflg;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 料金訂正データファイルを作成します
	 * @param outputInItem　出力情報
	 * @param inMap　入力電文
	 * @param prcKmkCd　料金項目コード
	 * @throws Exception
	 */
	private void makeOutputInfo(JBSbatOutputItem outputInItem, JBSbatServiceInterfaceMap inMap, String prcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		// 出力情報
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// v49.00 2020/07/03 IT2-2020-0000011 mod start
//		// 料金項目コード（譲渡先）の取得
//		// 載替対象料金項目情報.料金項目コードの上9桁目が"5"の場合
//		if((JBSbatCHIFM351.PRC_KMK_CD).substring(8, 9).equals("5"))
//		{
//			// 料金項目コードの上9桁目を"8"に変換
//			prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCd, "8");
//			
//			// 変換した料金項目コードが料金項目出力名称に存在するかチェック
//			if(!(jdgPrcKmkCdUm(prcKmkCdJotoSaki)))
//			{
//				// 料金項目コードの上9桁目を"9"に変換
//				prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCdJotoSaki, "9");
//			}
//		}
//		//  載替対象料金項目情報.料金項目コードの上9桁目が"5"以外の場合
//		else
//		{
//			// 料金項目コードの上9桁目を"9"に変換
//			prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCd, "9");
//		}
		
		// 料金項目コード（譲渡先）の取得
		// 載替対象料金項目情報.料金項目コードの上9桁目が"5"の場合
		if(inMap.getString(JBSbatCHIFM351.PRC_KMK_CD).substring(8, 9).equals("5"))
		{
			// 料金項目コードの上9桁目を"8"に変換
			prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCd, "801");
			
			// 変換した料金項目コードが料金項目出力名称に存在するかチェック
			if(!(jdgPrcKmkCdUm(prcKmkCdJotoSaki)))
			{
				// 料金項目コードの上9桁目以降を"901"に変換
				prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCdJotoSaki, "901");
			}
		}
		// 載替対象料金項目情報.料金項目コードの上9桁目が"7"の場合
		else if(inMap.getString(JBSbatCHIFM351.PRC_KMK_CD).substring(8, 9).equals("7"))
		{
			prcKmkCdJotoSaki = prcKmkCd;
		}
		//  載替対象料金項目情報.料金項目コードの上9桁目が"5","7"以外の場合
		else
		{
			// 料金項目コードの上9桁目以降を"901"に変換
			prcKmkCdJotoSaki = replacePrcKmkChng(prcKmkCd, "901");
		}
		// v49.00 2020/07/03 IT2-2020-0000011 mod end
		// 請求契約番号（譲渡元）
		outMap.set(JBSbatCHIFM352.SEIKY_KEI_NO_MT, inMap.getString(JBSbatCHIFM351.SEIKY_KEI_NO_MT));
		// 請求契約番号（譲渡先）
		outMap.set(JBSbatCHIFM352.SEIKY_KEI_NO_SK, inMap.getString(JBSbatCHIFM351.SEIKY_KEI_NO_SK));
		// サービス契約番号
		outMap.set(JBSbatCHIFM352.SVC_KEI_NO, inMap.getString(JBSbatCHIFM351.SVC_KEI_NO).trim());
		// 請求年月（譲渡元）
		outMap.set(JBSbatCHIFM352.SEIKY_YM_MT, inMap.getString(JBSbatCHIFM351.SEIKY_YM));
		// 請求年月（譲渡先）
		outMap.set(JBSbatCHIFM352.SEIKY_YM_SK, seikyYm);
		// サービス詳細識別番号
		outMap.set(JBSbatCHIFM352.SVC_DTL_SKBT_NO, inMap.getString(JBSbatCHIFM351.SVC_DTL_SKBT_NO));
		// 開始日
		outMap.set(JBSbatCHIFM352.USE_STAYMD, inMap.getString(JBSbatCHIFM351.USE_STAYMD));
		// 終了日
		outMap.set(JBSbatCHIFM352.USE_ENDYMD, inMap.getString(JBSbatCHIFM351.USE_ENDYMD));
		// 料金グループコード
		outMap.set(JBSbatCHIFM352.PRC_GRP_CD, inMap.getString(JBSbatCHIFM351.PRC_GRP_CD));
		// 料金コースコード
		outMap.set(JBSbatCHIFM352.PCRS_CD, inMap.getString(JBSbatCHIFM351.PCRS_CD));
		// 料金サービスコード
		outMap.set(JBSbatCHIFM352.PRC_SVC_CD, inMap.getString(JBSbatCHIFM351.PRC_SVC_CD));
		// 料金項目コード（譲渡元）
		outMap.set(JBSbatCHIFM352.PRC_KMK_CD_MT, inMap.getString(JBSbatCHIFM351.PRC_KMK_CD));
		// 料金項目コード（譲渡先）
		outMap.set(JBSbatCHIFM352.PRC_KMK_CD_SK, prcKmkCdJotoSaki);
		// 変更後金額
		outMap.set(JBSbatCHIFM352.CHNG_AMNT, inMap.getString(JBSbatCHIFM351.AMNT));
		// 請求種別
		outMap.set(JBSbatCHIFM352.SEIKY_SBT_CD, inMap.getString(JBSbatCHIFM351.SEIKY_SBT_CD));
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		// 出力処理
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");
	}
	/**
	 * 料金項目コードの上9桁目以降を変換
	 * @param bfPrcKmkCd　変換前の料金項目コード
	 * @param value　変換する値
	 * @return afPrcKmkCd 　変換後の料金項目コード
	 * @throws Exception
	 */
	private String replacePrcKmkChng(String bfPrcKmkCd, String value) throws Exception
	{
		// v49.00 2020/07/03 IT2-2020-0000011 mod start
		// 料金項目コードの上9桁目を値に変換した料金項目コードを設定
		//String afPrcKmkCd = bfPrcKmkCd.substring(0, 8) + value + bfPrcKmkCd.substring(9, 11);
		String afPrcKmkCd = bfPrcKmkCd.substring(0, 8) + value;
		// v49.00 2020/07/03 IT2-2020-0000011 mod end
		return afPrcKmkCd;
	}
}
