/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSeikyKeiInfoHuka
*	ソースファイル名	：JBSbatCHSeikyKeiInfoHuka.java
*	作成者				：富士通　
*	作成日				：2011年08月15日
*＜機能概要＞
*　請求契約情報付加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/15   富士通		新規作成
*	v3.00		2012/05/08	FJ)本多		【ANK-0024-04-00】請求契約情報付加対象の項目追加
*	v4.00		2012/12/13	FJ)後藤		【TG1-2012-0000320】請求契約情報付加対象の項目追加，設定されていても、上書くように修正
*	v4.01		2013/01/11	FJ)浜口		【KT1-2013-0000022】呼び出し元ジョブにより出力項目を変更
*	v4.02		2013/01/23	FJ)小柴		【内部管理番号-0000644】同封コードにインターフェース側の請求契約番号を設定するように修正
*	v4.03		2013/04/06	FJ)小柴		【IT1-2013-0000858】請求方法の判定メソッドに渡す引数を追加
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatCHIFM048;
import eo.business.util.file.JBSbatCHIFM070;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCEditString;
import eo.common.util.JPCUtilCommon;

/**
* 請求契約情報付加 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHSeikyKeiInfoHuka extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 同封コード桁数 */
	private static final int DOFU_NO_LENGTH = 12;
	
	/** トランファイル判別 領収データ（当月口振請求無） */
	private static final String INF_KOUHURI = "01";

	/** トランファイル判別 当月債権無合算抑止請求データ */
	private static final String INF_SAIKEN = "02";

	/** トランファイル判別 */
	private String trnNm = "";
	
	/** 請求収納業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil chUtil = null;
	
	/** 当月 */
	private String togtu = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
		// 当月算出（請求収納業務共通クラス使用）
		JCHbatSeikyKaknoBusinessUtil seikyBusinessUtil = new JCHbatSeikyKaknoBusinessUtil(super.commonItem);
		togtu = seikyBusinessUtil.getSeikyYm(super.opeDate);
		seikyBusinessUtil.close();
		
		/** Free項目の取得 */
		String[] freeItem = this.freeItem.split(JACStrConst.FREE_DIV);
		// トランファイル判別
		trnNm = freeItem[0];
		
		chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap 入力電文(請求契約インターフェイス情報)
	 * @param tranMap 入力電文(領収データ（当月口振請求無）)
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;

		// 請求契約インターフェイス情報のみ存在する
		if (mastMap != null && tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");

			// 次の請求契約インターフェイス情報読み込み
			this.setMastProcFlg(true);
		}
		// 領収データ（当月口振請求無）のみ存在する
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");

			// 請求契約インターフェイス情報(請求契約情報全件)がないのはおかしい
			// システムエラーとする
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0340CH,
					new String[] {"領収データ（当月口振請求無）", "請求契約インターフェイス情報"});
		}
		// 請求契約インターフェイス情報、領収データ（当月口振請求無）ともに存在する
		else
		{
			// マッチングキー（請求契約番号）取得
			String mastSeiKeiNo = mastMap.getString(JBSbatCHIFM048.SEIKY_KEI_NO);
			String tranSeiKeiNo = tranMap.getString(JBSbatCHIFM070.SEIKY_KEI_NO);

			// マッチ
			int retCompare = mastSeiKeiNo.compareTo(tranSeiKeiNo);
			if (retCompare == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");

				// 領収データ（請求契約情報付加）を出力共通電文に出力する
				outputSeikyKeiInfo(mastMap, tranMap, outputInItem);
				this.setMastProcFlg(true);
				this.setTranProcFlg(true);
			}
			// 入力Ｍ＜入力Ｔ
			else if (retCompare < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");

				// 次の請求契約インターフェイス情報読み込み
				this.setMastProcFlg(true);
			}
			// 入力Ｍ＞入力Ｔ
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");

				// 請求契約インターフェイス情報(請求契約情報全件)にない
				// 領収データ（請求契約情報付加）があるため、ここに来るのはおかしい。
				// システムエラーとする
				throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0340CH,
						new String[] {"領収データ（当月口振請求無）", "請求契約インターフェイス情報"});
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 領収データ（請求契約情報付加）を出力共通電文に出力する
	 * @param mastMap 入力電文(請求契約インターフェイス情報)
	 * @param tranMap 入力電文(領収データ（当月口振請求無）)
	 * @param outputInItem 出力共通電文
	 * @throws Exception
	 */
	private void outputSeikyKeiInfo(JBSbatServiceInterfaceMap mastMap,
									JBSbatServiceInterfaceMap tranMap,
									JBSbatOutputItem outputInItem) throws Exception
	{
		// 領収データ（当月口振請求無）を全項目コピー
		JBSbatServiceInterfaceMap retMap = new JBSbatServiceInterfaceMap();
		retMap.setMap(tranMap.getMap());
		
		// 請求契約インターフェイス情報全付加の場合
		if(trnNm.equals(INF_SAIKEN))
		{
			// 強制窓口フラグ
			String kyoseiFlg 	= mastMap.getString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG);
			// 請求方法コード
			String seikyWayCd = mastMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD);
			// 口座ステータス
			String kozaStat 	= mastMap.getString(JBSbatCHIFM048.KOZA_STAT);
			// クレジットステータス
			String crecardStat 	= mastMap.getString(JBSbatCHIFM048.CRECARD_STAT);
			// クレジット無効年月
			String crecaMkYm 	= mastMap.getString(JBSbatCHIFM048.CRECA_MK_YM);
			// 請求方法適用調整年月日
			String seikyWayAplyAdjYmd = mastMap.getString(JBSbatCHIFM048.SEIKY_WAY_APLY_ADJ_YMD);
			
			String seikyWayCdAf = null;
			
			// 強制窓口フラグ　＝　"1"（登録）の場合
			if(JACStrConst.KYOSEI_MDGC_FLG_SET_ARI.equals(kyoseiFlg))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][強制窓口フラグ　＝　1（登録）]");
				seikyWayCdAf = JACStrConst.SEIKY_WAY_CD_MDGC;
			}
			else
			{
				// 請求方法判定
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求方法判定]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][判定前請求方法コード：" + seikyWayCd + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][口座ステータス：" + kozaStat + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][クレジットカードステータス：" + crecardStat + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][クレジットカード無効年月：" + crecaMkYm + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求年月：" + togtu + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求方法適用調整年月日：" + seikyWayAplyAdjYmd + "]");
				
				seikyWayCdAf = chUtil.seikyWayJudge(seikyWayCd, kozaStat, crecardStat, crecaMkYm, togtu, seikyWayAplyAdjYmd);
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][判定後請求方法コード：" + seikyWayCdAf + "]");
			}
			

			
			// 支払方法コード
			retMap.set(JBSbatCHIFM070.PAY_WAY_CD, seikyWayCdAf);
			// 請求方法コード
			retMap.set(JBSbatCHIFM070.SEIKY_WAY_CD, seikyWayCdAf);
			// 金融機関コード
			retMap.set(JBSbatCHIFM070.BANK_CD, mastMap.getString(JBSbatCHIFM048.BANK_CD));
			// 金融機関支店コード
			retMap.set(JBSbatCHIFM070.BANK_SHITEN_CD, mastMap.getString(JBSbatCHIFM048.BANK_SHITEN_CD));
			// 口座種別コード
			retMap.set(JBSbatCHIFM070.YOKIN_SHUMOKU_CD, mastMap.getString(JBSbatCHIFM048.YOKIN_SHUMOKU_CD));
			// 口座番号
			retMap.set(JBSbatCHIFM070.KOZA_NO, mastMap.getString(JBSbatCHIFM048.KOZA_NO));
			// 通帳記号
			retMap.set(JBSbatCHIFM070.TSUCHO_SYMBOL, mastMap.getString(JBSbatCHIFM048.TSUCHO_SYMBOL));
			// 通帳番号
			retMap.set(JBSbatCHIFM070.TSUCHO_NO, mastMap.getString(JBSbatCHIFM048.TSUCHO_NO));
			// 口座名義人カナ名
			retMap.set(JBSbatCHIFM070.KOZA_MEIGIN_KANA, mastMap.getString(JBSbatCHIFM048.KOZA_MEIGIN_KANA));
			// クレジット会社コード
			retMap.set(JBSbatCHIFM070.CRECARD_COMP_CD, mastMap.getString(JBSbatCHIFM048.CRECARD_COMP_CD));
			// クレジットカード番号
			retMap.set(JBSbatCHIFM070.CRECARD_NO, mastMap.getString(JBSbatCHIFM048.CRECARD_NO));
			// クレジット交換コード
			retMap.set(JBSbatCHIFM070.CREDIT_KOKAN_CD, mastMap.getString(JBSbatCHIFM048.CREDIT_KOKAN_CD));
			// クレジットカード名義人名
			retMap.set(JBSbatCHIFM070.CRECARD_NM_KANA, mastMap.getString(JBSbatCHIFM048.CRECARD_NM_KANA));
			// 申込時支払方法
			retMap.set(JBSbatCHIFM070.MSKM_PAY_WAY_CD, mastMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD));
			// 強制窓口フラグ
			retMap.set(JBSbatCHIFM070.KYOSEI_MADOGUCHI_FLG, mastMap.getString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG));		
		}
		
		// 同封コード（請求契約番号を設定する）
		retMap.set(JBSbatCHIFM070.DOFU_CD, JPCEditString.fillHalfSpace(mastMap.getString(JBSbatCHIFM048.SEIKY_KEI_NO), DOFU_NO_LENGTH, true));
		// 送付先住所コード
		retMap.set(JBSbatCHIFM070.SOHUS_AD_CD, mastMap.getString(JBSbatCHIFM048.SOHUS_AD_CD));
		// 送付先郵便番号
		retMap.set(JBSbatCHIFM070.SOHUS_PCD, mastMap.getString(JBSbatCHIFM048.SOHUS_PCD));
		// 送付先都道府県名
		retMap.set(JBSbatCHIFM070.SOHUS_STATE_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_STATE_NM));
		// 送付先市区町村名
		retMap.set(JBSbatCHIFM070.SOHUS_CITY_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_CITY_NM));
		// 送付先大字通称名
		retMap.set(JBSbatCHIFM070.SOHUS_OAZTSU_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_OAZTSU_NM));
		// 送付先字丁目名
		retMap.set(JBSbatCHIFM070.SOHUS_AZCHO_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_AZCHO_NM));
		// 送付先住所番地号
		retMap.set(JBSbatCHIFM070.SOHUS_AD_BNCHIGO, mastMap.getString(JBSbatCHIFM048.SOHUS_BNCHIGO));
		// 送付先住所補記・建物名
		retMap.set(JBSbatCHIFM070.SOHUS_ADRTTM, mastMap.getString(JBSbatCHIFM048.SOHUS_ADRTTM));
		// 送付先住所補記・部屋番号
		retMap.set(JBSbatCHIFM070.SOHUS_ADRRM, mastMap.getString(JBSbatCHIFM048.SOHUS_ADRRM));
		// 送付先名
		retMap.set(JBSbatCHIFM070.SOHUS_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_NM));
		// 送付先部課名
		retMap.set(JBSbatCHIFM070.SOHUS_BKM, mastMap.getString(JBSbatCHIFM048.SOHUS_BKM));
		// 送付先担当名
		retMap.set(JBSbatCHIFM070.SOHUS_TNTSHA_NM, mastMap.getString(JBSbatCHIFM048.SOHUS_TNTSHA_NM));
		// 請求契約配下サービス契約状態コード
		retMap.set(JBSbatCHIFM070.SKHK_SVKEI_STAT_CD, mastMap.getString(JBSbatCHIFM048.SKHK_SVKEI_STAT_CD));
		// 請求契約配下サービス契約解約理由識別コード
		retMap.set(JBSbatCHIFM070.SKHK_SVKEI_DLRE_SKBT_CD, mastMap.getString(JBSbatCHIFM048.SKHK_SVKEI_DLRE_SKBT_CD));
		// 請求書発行要否
		retMap.set(JBSbatCHIFM070.SEIKYUS_HAKKO_YH, mastMap.getString(JBSbatCHIFM048.SEIKYUS_HAKKO_YH));
		
		// 出力フラグを設定(ファイル出力する)
		retMap.setOutFlg(true);
		
		// 出力共通電文に入出力インターフェースを設定する
		outputInItem.addOutMapList(retMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeSeikyData]");
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
