/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSeikyOutPutPrcInfFile
*	ソースファイル名	：JBSbatCHSeikyOutPutPrcInfFile.java
*	作成者				：富士通　
*	作成日				：2015年02月24日
*＜機能概要＞
*　請求書印刷_料金履歴情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v13.00.00	2015/02/24  FJ）福岡	新規作成 ANK-2416-00-00
*	v14.00.00	2015/05/22	FJ）岡田	対応履歴連動対象フラグ(非表示) ANK-2579-00-00
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatCHIFM096;
import eo.business.util.file.JBSbatCHIFM244;
import eo.business.util.file.JBSbatCHIFM243;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* KSSOLより受信した「お客様情報連携」ファイルのチェックを行う。<p>
* <BR>
* @author 富士通
*/
public class JBSbatCHSeikyOutPutPrcInfFile extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 支払区分のパターンを定義 */
	enum PayKbn {
		
		// 1：窓口,2：口振銀行,3：口振郵政,4：クレジット,0：その他
		MADO("1"), GINKO("2"), YUSEI("3"), CREGIT("4"), OTHER("0"); 
		
		String kbn;
		
		/** コンストラクタ */
		private PayKbn(String kbn) {this.kbn = kbn;}
		
		/** 支払区分返却.（不一致は[5：その他]を返却） */
		public static PayKbn resolve(String kbn) {
			
			for (PayKbn eKbn : PayKbn.values())
				if (eKbn.isMatch(kbn))
					return eKbn;
			
			return OTHER;
		}
		
		/** true：一致、false：不一致 */
		private boolean isMatch(String kbn) {
			return this.kbn.equals(kbn) ? true : false;
		}
	}
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception {
		
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute() start");
		
		// 共通電文
		JBSbatOutputItem oBean = new JBSbatOutputItem();
		
		// 料金履歴情報生成
		JBSbatServiceInterfaceMap outIface = retIfaceMap(inMap.getMap());
		
		// エラー判定
		if (null != outIface) {
			
			// エラー無し
			oBean.addOutMapList(outIface);
			
		} else {
			
			// ワーニング
			String msg1 = "請求契約番号「"   + (String) inMap.get(JBSbatCHIFM243.SEIKY_KEI_NO) + "」";
			String msg2 = "領収のみフラグ「" + (String) inMap.get(JBSbatCHIFM243.R_FLG)        + "」";
			String msg3 = "支払区分「"       + (String) inMap.get(JBSbatCHIFM243.PAY_KBN)      + "」";
			String msg4 = "発送区分「"       + (String) inMap.get(JBSbatCHIFM243.HASSO_KBN)    + "」";
			String msg5 = "レコードの、お客様情報連携ファイルの値が不正な組み合わせです。";
			
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1500KW, new String[] { msg1+msg2+msg3+msg4+msg5 });
		}
		
		super.logPrint.printDebugLog("execute() end");
		return oBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("terminal() start");
		super.logPrint.printDebugLog("terminal() end");
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/** 
	 * 
	 * お客様情報チェック済ファイルを元に,料金履歴情報生成する.
	 * 
	 * @param  tg
	 * @return 
	 */
	@SuppressWarnings("unchecked")
	private JBSbatServiceInterfaceMap retIfaceMap(HashMap tg) {
		super.logPrint.printDebugLog("retIfaceMap() start");
		
		JBSbatServiceInterfaceMap ret = new JBSbatServiceInterfaceMap();
		
		// 編集処理
		StringBuffer kiji = new StringBuffer("KS-SOL発送日：").append(tg.get(JBSbatCHIFM244.HASSO_YMD));	// 編集：記事
		String ymd        = super.opeDate.concat(JCCBatCommon.getSysDateTimeStamp().substring(8));			// 編集：対応年月日時分秒
		String dtlCd      = getPrcTaioSbtDtlCd(tg);															// 編集：料金対応記録種別詳細コード
		
		// 料金対応記録種別詳細コードチェック
		if (JKKStringUtil.isNullBlank(dtlCd)) return null;
		
		// CHIFM096_設定
		ret.set(JBSbatCHIFM096.SEIKY_KEI_NO,               tg.get(JBSbatCHIFM243.SEIKY_KEI_NO));			// 請求契約番号
		ret.set(JBSbatCHIFM096.TAIO_DTM,                   ymd);											// 対応年月日時分秒
		ret.set(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_CD,      JACStrConst.TKRK_SBT_SEIKY_OUTPUT_CRE_BATCH);	// 料金対応記録種別コード 
		ret.set(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_DTL_CD,  dtlCd);											// 料金対応記録種別詳細コード
		ret.set(JBSbatCHIFM096.KIROK_TG_YM,                tg.get(JBSbatCHIFM243.SEIKY_YM));				// 記録対象年月
		//v14.00.00 MOD START
		//ret.set(JBSbatCHIFM096.TAIORRKI_RENDO_TG_FLG,      JACStrConst.TAIORRKI_RENDO_TG_FLG_HYOJI);		// 対応履歴連動対象フラグ
		ret.set(JBSbatCHIFM096.TAIORRKI_RENDO_TG_FLG,      JACStrConst.TAIORRKI_RENDO_TG_FLG_HIHYOJI);		// 対応履歴連動対象フラグ
		//v14.00.00 MOD END
		ret.set(JBSbatCHIFM096.KIJI,                       kiji);											// 記事
		
		ret.setOutFlg(true);
		super.logPrint.printDebugLog("retIfaceMap() end");
		return ret;
	}
	
	/** 
	 * 
	 * 料金対応記録種別詳細コード判定処理.
	 * [領収のみフラグ][発送区分][支払区分]を元に,料金対応記録種別詳細コードを判定し,返却する.
	 * 
	 * @param  tg
	 * @return 
	 */
	@SuppressWarnings("unchecked")
	private String getPrcTaioSbtDtlCd(HashMap tg) {
		super.logPrint.printDebugLog("getPrcTaioSbtDtlCd() start");
		
		final String rOnry    = (String) tg.get(JBSbatCHIFM244.R_FLG);			// 領収のみ
		final String hassoKbn = (String) tg.get(JBSbatCHIFM244.HASSO_KBN);		// 発送区分
		final String payKbn   = (String) tg.get(JBSbatCHIFM244.PAY_KBN);		// 支払区分
		
		super.logPrint.printDebugLog("請求契約番号=" + (String) tg.get(JBSbatCHIFM244.SEIKY_KEI_NO));
		super.logPrint.printDebugLog("領収のみフラグ=" + rOnry);
		super.logPrint.printDebugLog("発送区分=" + hassoKbn);
		super.logPrint.printDebugLog("支払区分=" + payKbn);
		
		// 領収のみフラグ（true：領収のみ、false：領収のみ以外）
		boolean isROnry = JACStrConst.RECEIPT_ONLY_Y.equals(rOnry);
		// 発送区分（true：はがき発送、false：封書発送）RECEIPT_ONLY_Y
		boolean isHasso = JACStrConst.CD01668_HAGAKI.equals(hassoKbn);
		
		// 1：領収のみ
		if (isROnry)
			return retRonly(isHasso, PayKbn.resolve(payKbn));
			
		// 0：領収のみ以外
		if (!isROnry)
			return retRNotOnly(isHasso, PayKbn.resolve(payKbn));
		
		super.logPrint.printDebugLog("getPrcTaioSbtDtlCd() end");
		return null;
	}
	
	/** 
	 * 
	 * [領収のみフラグ]が領収のみの場合に使用する.
	 * 料金対応記録種別詳細コードを返却する.
	 * 
	 * @param isHasso
	 * @param payKbn
	 * @return
	 */
	private String retRonly(boolean isHasso, PayKbn pKbn) {
		
		// 0：はがき発送
		if (isHasso) {
			
			// 支払区分判定
			switch(pKbn) {
			
				case GINKO  	: return JACStrConst.TKRK_SBTD_H_R_GINKO;		// 2.口振銀行
				case YUSEI  	: return JACStrConst.TKRK_SBTD_H_R_YUBIN;		// 3.口振郵政
				default     	: break;										// その他
			}
			
		// 1：封書発送
		} else {
			
			// 支払区分判定
			switch(pKbn) {
			
				case GINKO  	: return JACStrConst.TKRK_SBTD_F_R_GINKO;		// 2.口振銀行
				case YUSEI  	: return JACStrConst.TKRK_SBTD_F_R_YUBIN;		// 3.口振郵政
				default     	: break;										// その他
			}
		}
		return null;
	}
	
	/** 
	 * 
	 * [領収のみフラグ]が領収のみ以外の場合に使用する.
	 * 料金対応記録種別詳細コードを返却する.
	 * 
	 * @param isHasso
	 * @param pKbn
	 * @return
	 */
	private String retRNotOnly(boolean isHasso, PayKbn pKbn) {
		
		// 0：はがき発送
		if (isHasso) {
			
			// 支払区分判定
			switch(pKbn) {
			
				case MADO   	: return JACStrConst.TKRK_SBTD_H_MADO;			// 1.窓口
				case GINKO  	: return JACStrConst.TKRK_SBTD_H_GINKO;			// 2.口振銀行
				case YUSEI  	: return JACStrConst.TKRK_SBTD_H_YUBIN;			// 3.口振郵政
				case CREGIT 	: return JACStrConst.TKRK_SBTD_H_CREGIT;		// 4.クレジット
				default     	: break;										// その他
			}
			
		// 1：封書発送
		} else {
			
			// 支払区分判定
			switch(pKbn) {
			
				case MADO   	: return JACStrConst.TKRK_SBTD_F_MADO;			// 1.窓口
				case GINKO  	: return JACStrConst.TKRK_SBTD_F_GINKO;			// 2.口振銀行
				case YUSEI  	: return JACStrConst.TKRK_SBTD_F_YUBIN;			// 3.口振郵政
				case CREGIT 	: return JACStrConst.TKRK_SBTD_F_CREGIT;		// 4.クレジット
				default     	: break;										// その他
			}
		}
		return null;
	}
}
