/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSeikyOutPutPrcInfFileKcs
*	ソースファイル名	：JBSbatCHSeikyOutPutPrcInfFileKcs.java
*	作成者				：富士通　
*	作成日				：2020年10月23日
*＜機能概要＞
*　請求書印刷_料金履歴情報作成_ＫＣＳ部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v52.00.00	2020/10/23  FJ）中原	新規作成 ANK-3838-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.JBSbatCHIFM366;
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;

/**
* さくらＫＣＳより受信した「お客様情報連携」ファイルのチェックを行う。<p>
* <BR>
* @author 富士通
*/
public class JBSbatCHSeikyOutPutPrcInfFileKcs 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 msg = "請求契約番号「"   + (String) inMap.get(JBSbatCHIFM366.SEIKY_KEI_NO) + "」"
			 + "領収のみフラグ「" + (String) inMap.get(JBSbatCHIFM366.R_FLG)        + "」"
			 + "支払区分「"       + (String) inMap.get(JBSbatCHIFM366.PAY_KBN)      + "」"
			 + "発送区分「"       + (String) inMap.get(JBSbatCHIFM366.HASSO_KBN)    + "」"
			 + "銀行名「"       + (String) inMap.get(JBSbatCHIFM366.BANK_NM)    + "」"
			 + "支店名「"       + (String) inMap.get(JBSbatCHIFM366.SHITEN_NM)    + "」"
			 + "預金種目名「"       + (String) inMap.get(JBSbatCHIFM366.YOKIN_SHUMOKU_NM)    + "」"
			 + "パーフェクト口座番号「"       + (String) inMap.get(JBSbatCHIFM366.PKOZA_NO)    + "」"
			 + "手数料負担方式「"       + (String) inMap.get(JBSbatCHIFM366.COMMISION_FTN_HSK_CD)    + "」"
		 	 + "レコードの、お客様情報連携ファイルの値が不正な組み合わせです。";
			
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1760CE, new String[] { msg });
		}
		
		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("請求書発行日：").append(tg.get(JBSbatCHIFM366.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(JBSbatCHIFM366.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(JBSbatCHIFM366.SEIKY_YM));				// 記録対象年月
		ret.set(JBSbatCHIFM096.TAIORRKI_RENDO_TG_FLG,      JACStrConst.TAIORRKI_RENDO_TG_FLG_HIHYOJI);		// 対応履歴連動対象フラグ
		
		// パーフェクト口座番号が設定されている場合
		if ( tg.get(JBSbatCHIFM366.PKOZA_NO) != null && !"       ".equals(tg.get(JBSbatCHIFM366.PKOZA_NO)) )
		{
			kiji.append("　")
			.append((String)tg.get(JBSbatCHIFM366.BANK_NM))
			.append("　")
			.append((String)tg.get(JBSbatCHIFM366.SHITEN_NM))
			.append("　パーフェクト口座番号：")
			.append((String)tg.get(JBSbatCHIFM366.PKOZA_NO));
		}
		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(JBSbatCHIFM366.R_FLG);			// 領収のみ
		final String hassoKbn = (String) tg.get(JBSbatCHIFM366.HASSO_KBN);		// 発送区分
		final String payKbn   = (String) tg.get(JBSbatCHIFM366.PAY_KBN);		// 支払区分
		final String commisonFtnHskCd   = (String) tg.get(JBSbatCHIFM366.COMMISION_FTN_HSK_CD);		// 手数料負担方式
		
		super.logPrint.printDebugLog("請求契約番号=" + (String) tg.get(JBSbatCHIFM366.SEIKY_KEI_NO));
		super.logPrint.printDebugLog("領収のみフラグ=" + rOnry);
		super.logPrint.printDebugLog("発送区分=" + hassoKbn);
		super.logPrint.printDebugLog("支払区分=" + payKbn);
		super.logPrint.printDebugLog("手数料負担方式コード=" + commisonFtnHskCd);
		
		// 領収のみフラグ（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), commisonFtnHskCd);
		
		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
	 * @param commisonFtnHskCd
	 * @return
	 */
	private String retRNotOnly(boolean isHasso, PayKbn pKbn, String commisonFtnHskCd) {
		
		// 0：はがき発送
		if (isHasso) {
			
			// 支払区分判定
			switch(pKbn) {
			
				case MADO   	:
					// 顧客負担方式
					if ( JACStrConst.FTN_HOSHIKI_KO.equals(commisonFtnHskCd) )
					{
						return JACStrConst.TKRK_SBTD_H_M_KOKYAKU;			// 1.窓口　顧客負担
					}
					// 企業負担
					if ( JACStrConst.FTN_HOSHIKI_KI.equals(commisonFtnHskCd) )
					{
						return JACStrConst.TKRK_SBTD_H_M_KIGYO;				// 1.窓口　企業負担
					}
					break;
				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   	:
					// 顧客負担方式
					if ( JACStrConst.FTN_HOSHIKI_KO.equals(commisonFtnHskCd) )
					{
						return JACStrConst.TKRK_SBTD_F_M_KOKYAKU;			// 1.窓口　顧客負担
					}
					// 企業負担
					if ( JACStrConst.FTN_HOSHIKI_KI.equals(commisonFtnHskCd) )
					{
						return JACStrConst.TKRK_SBTD_F_M_KIGYO;				// 1.窓口　企業負担
					}
					break;
				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;
	}
}
