/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACIcjknAddListSksi
*	ソースファイル名	：JBSbatACIcjknAddListSksi.java
*	作成者				：富士通　
*	作成日				：2011年09月08日
*＜機能概要＞
*　一時金登録リスト作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/08   富士通		新規作成
*	v8.00.00	2013/12/13   FJ)鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JACBatCommon;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFE018;
import eo.business.util.file.JBSbatACIFM094;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JPCUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* 一時金登録リスト作成 <p>
*<BR>
* @author 富士通
*/
public class JBSbatACIcjknAddListSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String ZM_M_CD_NM_KANRI_AC_SELECT_003 = "AC_SELECT_003";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** レコード識別名称マップ */
	private HashMap<String, String> recSkbtMap = null;
	
	/** 登録種別名称マップ */
	private HashMap<String, String> addSbtMap = null;
	
	/** 投入区分名称マップ */
	private HashMap<String, String> tnyDivMap = null;
	
	/** レコードカウンタ */
	private int cntRow = 0;
	
	/** 更新日時項目長 */
	private static final int UPD_DTM_LEN = 14;
	
	/** 請求先カナ名項目長 */
	private static final int SIKYS_KANA_LEN = 25;
	
	/** Ｎｏ項目長 */
	private static final int NO_LEN = 4;
	
	/** 操作者名項目長 */
	private static final int OPRT_NM_LEN = 8;
	
	/** コード種別コード(レコード識別) */
	private static final String CD_SBT_REC_SKBT = "REC_SKB";
	
	/** コード種別コード(登録種別) */
	private static final String CD_SBT_ADD_SBT = "ADD_SBT";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// レコード識別名称マップ
		this.recSkbtMap = this.getCdNmKnriInf(JZM0171Constant.CD01170);
		
		// 登録種別名称マップ
		this.addSbtMap = this.getCdNmKnriInf(JZM0171Constant.CD01171);
		
		// 投入区分名称マップ
		this.tnyDivMap = this.getCdNmKnriInf(JZM0171Constant.CD00972);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		
		// 更新前・レコード識別
		String recSkbt = inMap.getString(JBSbatACIFM094.REC_SKBT_CHBF);
		
		
		if(!JACStrConst.KARA_MOJI.equals(recSkbt))
		// 更新前項目が存在する
		{
			// レコード連番
			this.cntRow++;
			
			// 更新前項目設定
			outItem.addOutMapList(this.getOutMapBF(inMap));
		}
		
		// レコード連番
		this.cntRow++;
		
		// 更新後項目設定
		outItem.addOutMapList(this.getOutMapAF(inMap));
		
		
		return(outItem);
	
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_CD_NM_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	適用開始年月日
	 *		 	適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_AC_SELECT_003(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_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_AC_SELECT_003);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	/**
	 * コード名称管理から指定されたコード種別コードのコード区分名マップを取得する。
	 * @param cd　コード種別コード
	 * @return HashMap　コード名称マップ
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private HashMap<String, String> getCdNmKnriInf(String cd) throws Exception
	{
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		HashMap<String, String> hm = new HashMap<String, String>();
		
		
		whereParam.setValue(cd);				// コード種別コード
		whereParam.setValue(super.opeDate);		// 適用開始年月日
		whereParam.setValue(super.opeDate);		// 適用終了年月日
		
		// SQL実行
		executeZM_M_CD_NM_KANRI_AC_SELECT_003(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_ZM_M_CD_NM_KANRI.selectNext();
		
		// 取得できなかった場合
		if(dbMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0250CE,
					new String[] {JBSbatZM_M_CD_NM_KANRI.TABLE_NAME, whereParam.getList().toString()});
		}
		// 上記以外の場合
		else
		{
			while(null != dbMap)
			{
				// コード名称管理情報マップに検索結果を設定（キー：コード区分）
				hm.put(dbMap.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV), dbMap.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM));
				
				dbMap = db_ZM_M_CD_NM_KANRI.selectNext();
			}
		}
		
		
		return(hm);
	}
	
	/**
	 * 出力マップを取得する。(更新前)
	 * @param inMap　入力情報
	 * @return JBSbatServiceInterfaceMap　出力マップ
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap getOutMapBF(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 編集後項目取得
		String[] kmk = getAfterKmk(new String[]{	inMap.getString(JBSbatACIFM094.UPD_DTM_CHBF),		// 投入日
													String.valueOf(this.cntRow),						// Ｎｏ
													inMap.getString(JBSbatACIFM094.REC_SKBT_CHBF),		// レコード識別
													inMap.getString(JBSbatACIFM094.ADD_SBT_CHBF),		// 登録種別
													inMap.getString(JBSbatACIFM094.SIKY_AMNT_CHBF),		// 請求額
													inMap.getString(JBSbatACIFM094.TONYU_DIV_CHBF),		// 投入区分
													inMap.getString(JBSbatACIFM094.SEIKY_YM_CHBF),		// 請求年月
													inMap.getString(JBSbatACIFM094.OPRT_NM_CHBF),		// 操作者名
													inMap.getString(JBSbatACIFM094.UPD_DTM_CHBF),		// 更新日時
													inMap.getString(JBSbatACIFM094.SIKYS_KANA_CHBF)});	// 請求先カナ名
		
		
		outMap.setString(JBSbatACIFE018.TONYU_YMD,		kmk[0]);											// 投入日
		outMap.setString(JBSbatACIFE018.NO,				kmk[1]);											// Ｎｏ
		outMap.setString(JBSbatACIFE018.OPRT_ID,		inMap.getString(JBSbatACIFM094.OPRT_ID_CHBF));		// 操作者ＩＤ
		outMap.setString(JBSbatACIFE018.OPRT_NM,		kmk[7]);											// 操作者名
		outMap.setString(JBSbatACIFE018.UPD_DTM,		kmk[8]);											// 更新日時
		outMap.setString(JBSbatACIFE018.REC_SKBT,		kmk[2]);											// レコード識別
		outMap.setString(JBSbatACIFE018.ADD_SBT,		kmk[3]);											// 登録種別
		outMap.setString(JBSbatACIFE018.SEIKY_KEI_NO,	inMap.getString(JBSbatACIFM094.SEIKY_KEI_NO_CHBF));	// 請求契約番号
		outMap.setString(JBSbatACIFE018.SIKYS_KANA,		kmk[9]);											// 請求先カナ名
		outMap.setString(JBSbatACIFE018.SVC_KEI_NO,		inMap.getString(JBSbatACIFM094.SVC_KEI_NO_CHBF));	// サービス契約番号
		outMap.setString(JBSbatACIFE018.SVC_DTL_SKBT_NO,	inMap.getString(JBSbatACIFM094.SVC_DTL_SKBT_NO_CHBF));	// サービス詳細識別番号
		outMap.setString(JBSbatACIFE018.PCRS_CD,		inMap.getString(JBSbatACIFM094.PCRS_CD_CHBF));		// 料金コースコード
		outMap.setString(JBSbatACIFE018.PRC_SVC_CD,		inMap.getString(JBSbatACIFM094.PRC_SVC_CD_CHBF));	// 料金サービスコード
		outMap.setString(JBSbatACIFE018.PRC_KMK_CD,		inMap.getString(JBSbatACIFM094.PRC_KMK_CD_CHBF));	// 料金項目コード
		outMap.setString(JBSbatACIFE018.PRC_UW_NM,		inMap.getString(JBSbatACIFM094.PRC_UW_NM_CHBF));	// 料金内訳名
		outMap.setString(JBSbatACIFE018.SIKY_AMNT,		kmk[4]);											// 請求額
		outMap.setString(JBSbatACIFE018.TONYU_DIV,		kmk[5]);											// 投入区分
		outMap.setString(JBSbatACIFE018.SEIKY_YM,		kmk[6]);											// 請求年月
		
		// 各項目を"で囲む
		outMap.setMap(JACBatCommon.quote(outMap.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));

		outMap.setOutFlg(true);
		
		
		return(outMap);
	}
	
	/**
	 * 出力マップを取得する。(更新後)
	 * @param inMap　入力情報
	 * @return JBSbatServiceInterfaceMap　出力マップ
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap getOutMapAF(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 編集後項目取得
		String[] kmk = getAfterKmk(new String[]{	inMap.getString(JBSbatACIFM094.UPD_DTM_CHAF),		// 投入日
													String.valueOf(this.cntRow),						// Ｎｏ
													inMap.getString(JBSbatACIFM094.REC_SKBT_CHAF),		// レコード識別
													inMap.getString(JBSbatACIFM094.ADD_SBT_CHAF),		// 登録種別
													inMap.getString(JBSbatACIFM094.SIKY_AMNT_CHAF),		// 請求額
													inMap.getString(JBSbatACIFM094.TONYU_DIV_CHAF),		// 投入区分
													inMap.getString(JBSbatACIFM094.SEIKY_YM_CHAF),		// 請求年月
													inMap.getString(JBSbatACIFM094.OPRT_NM_CHAF),		// 操作者名
													inMap.getString(JBSbatACIFM094.UPD_DTM_CHAF),		// 更新日時
													inMap.getString(JBSbatACIFM094.SIKYS_KANA_CHAF)});	// 請求先カナ名
		
		
		outMap.setString(JBSbatACIFE018.TONYU_YMD,		kmk[0]);											// 投入日
		outMap.setString(JBSbatACIFE018.NO,				kmk[1]);											// Ｎｏ
		outMap.setString(JBSbatACIFE018.OPRT_ID,		inMap.getString(JBSbatACIFM094.OPRT_ID_CHAF));		// 操作者ＩＤ
		outMap.setString(JBSbatACIFE018.OPRT_NM,		kmk[7]);											// 操作者名
		outMap.setString(JBSbatACIFE018.UPD_DTM,		kmk[8]);											// 更新日時
		outMap.setString(JBSbatACIFE018.REC_SKBT,		kmk[2]);											// レコード識別
		outMap.setString(JBSbatACIFE018.ADD_SBT,		kmk[3]);											// 登録種別
		outMap.setString(JBSbatACIFE018.SEIKY_KEI_NO,	inMap.getString(JBSbatACIFM094.SEIKY_KEI_NO_CHAF));	// 請求契約番号
		outMap.setString(JBSbatACIFE018.SIKYS_KANA,		kmk[9]);											// 請求先カナ名
		outMap.setString(JBSbatACIFE018.SVC_KEI_NO,		inMap.getString(JBSbatACIFM094.SVC_KEI_NO_CHAF));	// サービス契約番号
		outMap.setString(JBSbatACIFE018.SVC_DTL_SKBT_NO,	inMap.getString(JBSbatACIFM094.SVC_DTL_SKBT_NO_CHAF));	// サービス詳細識別番号
		outMap.setString(JBSbatACIFE018.PCRS_CD,		inMap.getString(JBSbatACIFM094.PCRS_CD_CHAF));		// 料金コースコード
		outMap.setString(JBSbatACIFE018.PRC_SVC_CD,		inMap.getString(JBSbatACIFM094.PRC_SVC_CD_CHAF));	// 料金サービスコード
		outMap.setString(JBSbatACIFE018.PRC_KMK_CD,		inMap.getString(JBSbatACIFM094.PRC_KMK_CD_CHAF));	// 料金項目コード
		outMap.setString(JBSbatACIFE018.PRC_UW_NM,		inMap.getString(JBSbatACIFM094.PRC_UW_NM_CHAF));	// 料金内訳名
		outMap.setString(JBSbatACIFE018.SIKY_AMNT,		kmk[4]);											// 請求額
		outMap.setString(JBSbatACIFE018.TONYU_DIV,		kmk[5]);											// 投入区分
		outMap.setString(JBSbatACIFE018.SEIKY_YM,		kmk[6]);											// 請求年月

		// 各項目を"で囲む
		outMap.setMap(JACBatCommon.quote(outMap.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));
		
		outMap.setOutFlg(true);
		
		
		return(outMap);
	}
	
	/**
	 * 各項目を編集する。
	 * @param kmk[]　0:投入日、1:Ｎｏ、2:レコード識別、3:登録種別、4:請求額、5:投入区分、6:請求年月、7:操作者名、8:更新日時、9:請求先カナ名
	 * @return String[]　編集後項目
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String[] getAfterKmk(String[] kmk) throws Exception
	{
		String[] kmkAf = new String[kmk.length];
		
		
		// 投入日をYYYY年MM月DD日に変換
		kmkAf[0] = JACBatCommon.formatDate(JPCUtilCommon.toYmdFromDtm(kmk[0]));
		
		
		// Ｎｏを左0パディング
		kmkAf[1] = JPCUtilCommon.fillZero(kmk[1], NO_LEN, false);
		
		
		// レコード識別名称取得
		if(this.recSkbtMap.containsKey(kmk[2]))
		{
			kmkAf[2] = this.recSkbtMap.get(kmk[2]);
		}
		else
		// マップに存在しない場合
		{
			kmkAf[2] = "";
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0250CE,
					new String[] {JBSbatZM_M_CD_NM_KANRI.TABLE_NAME, CD_SBT_REC_SKBT.concat(JACStrConst.SPACE_1).concat(kmk[2])});
		}
		// TODO メインでの暫定対応 一括のコード区分を4→3とする
		// 登録種別名称取得
		if("4".equals(kmk[3])){
			kmk[3] = "3";
		}
		if(this.addSbtMap.containsKey(kmk[3]))
		{
			kmkAf[3] = this.addSbtMap.get(kmk[3]);
		}
		else
		// マップに存在しない場合
		{
			kmkAf[3] = "";
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0250CE,
					new String[] {JBSbatZM_M_CD_NM_KANRI.TABLE_NAME, CD_SBT_ADD_SBT.concat(JACStrConst.SPACE_1).concat(kmk[3])});
		}
		
		
		// 請求額をカンマで桁区切り
		kmkAf[4] = JPCUtilCommon.formatNumber(kmk[4]);
		
		
		// 投入区分名称取得
		if(this.tnyDivMap.containsKey(kmk[5]))
		{
			kmkAf[5] = this.tnyDivMap.get(kmk[5]);
		}
		else
		// マップに存在しない場合
		{
			kmkAf[5] = "";
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0250CE,
					new String[] {JBSbatZM_M_CD_NM_KANRI.TABLE_NAME, JZM0171Constant.CD00972.concat(JACStrConst.SPACE_1).concat(kmk[5])});
		}
		
		
		// 請求年月をYYYY/MMに変換
		kmkAf[6] = JPCUtilCommon.formatYears(kmk[6]);
		
		
		// 操作者名長さ調整
		if(kmk[7].length() > OPRT_NM_LEN)
		{
			kmkAf[7] = kmk[7].substring(0, OPRT_NM_LEN);
		}
		else
		{
			kmkAf[7] = kmk[7];
		}
		
		
		// 更新日時長さ調整
		if(kmk[8].length() > UPD_DTM_LEN)
		{
			kmkAf[8] = kmk[8].substring(0, UPD_DTM_LEN);
		}
		else
		{
			kmkAf[8] = kmk[8];
		}
		
		
		// 請求先カナ名長さ調整
		if(kmk[9].length() > SIKYS_KANA_LEN)
		{
			kmkAf[9] = kmk[9].substring(0, SIKYS_KANA_LEN);
		}
		else
		{
			kmkAf[9] = kmk[9];
		}
		
		
		return(kmkAf);
	}
}
