/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSikykeiChgeInfoChsht
*	ソースファイル名	：JBSbatCHSikykeiChgeInfoChsht.java
*	作成者				：富士通　
*	作成日				：2011年07月02日
*＜機能概要＞
*　請求契約変更情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/02   富士通		新規作成
*	v3.00		2012/05/27   FJ）冨井	【ANK-0024-04-00】処理名変更
*	v4.00		2013/04/08   FJ) 小柴	【IT1-2013-0000858】出力項目追加（請求方法適用調整年月日）
*	v5.00		2013/07/15   FJ) 小柴	【TG1-2013-0000699】入力元ファイルの項目定義変更に合わせ、項目名を変更
*	v5.01		2013/08/11   FJ) 小柴	【TG1-2013-0000929】入力トランファイルの新規追加
*															マスタファイルとトランファイルを比較し、差異のあるレコードのみ出力するように処理を追加・修正
*	v5.02		2013/08/15   FJ) 後藤	【TG1-2013-0000997】マッチングキーの取得元修正
*	v5.03		2013/10/03   FJ) 伊藤	【OM-2013-0002535】請求方法コード変更判定処理を追加、契約請求方法コード追加に伴う対応
*	v6.00		2013/12/26   FJ) 早崎	【OM-2013-0005152】運用日が料金計算日の場合、抑止情報(料金計算日強制窓口)を出力
*	v6.01		2014/02/03   FJ) 小掠	【OM-2014-0000172】,【OM-2014-0000176】請求情報の強制窓口フラグがnullなら'0'に置き換えるように修正
*	v7.00		2014/02/06   FJ) 伊藤	【OM-2014-0000488】項目英名違いによる単純転送漏れ対応。比較項目に「（マ）利用契約者区分：（ト）社内使用識別フラグ」を追加。
*   v20.00      2015/11/04   FJ) 山裾   【ANK-2565-00-00】「クレジットカード番号預りＩＤ」「仕向先会社コード」を追加
*   v35.00      2017/11/08   FJ) 森脇   【OM-2017-0001068】「通帳記号」「クレジットカード会社コード」を追加
*   v37.00.00   2018/04/02   FJ)酒井     ANK-3366-00-00
*   v41.00.00   2019/01/21   FJ) 河邊   【OM-2019-0000047】契約請求方法CD更新不備
*
*********************************************************************/
package eo.business.service;

import java.util.HashMap;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM048;
import eo.business.util.file.JBSbatCHIFM065;
import eo.business.util.file.JBSbatCHIFM143;
import eo.business.util.file.JBSbatCHIFM179;
import eo.common.constant.JACStrConst;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;

/**
* 変更分抽出 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHSikykeiChgeInfoChsht extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 当月 */
	private String togtu = null;
	
	/** 料金計算当月 */
	private String prcCalcTogtu = null;

	/** 料金計算日フラグ */
	private boolean prcCalDayFlg = false;
	
	/** 抑止情報作成判定フラグ */
	private boolean yoksiInfoSksJudge = false;
	
	/** 強制窓口抑止情報Map */
	private HashMap<String, String> kyseMdgYoksInfoMap = null;
	
	/** 請求収納業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil chUtil = null;
	
	/** 差分チェック対象項目名（マスタ） */
	private String[] checkMastTargetNm = {
			JBSbatCHIFM048.SKHK_SVKEI_STAT_CD,			// 請求契約配下サービス契約状態コード
			JBSbatCHIFM048.SEIKY_WAY_CD,				// 請求方法コード
			JBSbatCHIFM048.NEXT_SEIKY_WAY_DIV,			// 次回請求方法コード
			JBSbatCHIFM048.SKHK_SVKEI_DLRE_SKBT_CD,		// 請求契約配下サービス契約解約理由識別コード
			JBSbatCHIFM048.SEIKYUS_HAKKO_YH,			// 請求書発行要否
			JBSbatCHIFM048.SHS_HOJIN_SBT_CD,			// 送付先法人格種別コード
			JBSbatCHIFM048.SHS_HOJIN_ZENGO_SHITEI_CD,	// 送付先法人格前後指定コード
			JBSbatCHIFM048.SHS_KANA,					// 送付先カナ名
			JBSbatCHIFM048.SOHUS_AD_CD,					// 送付先住所コード
			JBSbatCHIFM048.SOHUS_PCD,					// 送付先郵便番号
			JBSbatCHIFM048.SOHUS_STATE_NM,				// 送付先都道府県名
			JBSbatCHIFM048.SOHUS_CITY_NM,				// 送付先市区町村名
			JBSbatCHIFM048.SOHUS_OAZTSU_NM,				// 送付先大字通称名
			JBSbatCHIFM048.SOHUS_AZCHO_NM,				// 送付先字丁目名
			JBSbatCHIFM048.SOHUS_BNCHIGO,				// 送付先住所番地号
			JBSbatCHIFM048.SOHUS_ADRTTM,				// 送付先住所補記・建物名
			JBSbatCHIFM048.SOHUS_ADRRM,					// 送付先住所補記・部屋番号
			JBSbatCHIFM048.SOHUS_TELNO,					// 送付先電話番号
			JBSbatCHIFM048.SOHUS_NM,					// 送付先名
			JBSbatCHIFM048.SOHUS_BKM,					// 送付先部課名
			JBSbatCHIFM048.SOHUS_TNTSHA_NM,				// 送付先担当者名
			JBSbatCHIFM048.SOHUS_MLAD,					// 送付先メールアドレス
			JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG,		// 強制窓口フラグ
			JBSbatCHIFM048.BANK_CD,						// 金融機関コード
			JBSbatCHIFM048.BANK_SHITEN_CD,				// 金融機関支店コード
			JBSbatCHIFM048.YOKIN_SHUMOKU_CD,			// 預金種目コード
			JBSbatCHIFM048.KOZA_NO,						// 口座番号
			JBSbatCHIFM048.NEW_CD,						// 新規コード
			JBSbatCHIFM048.KOZA_MEIGIN_KANA,			// 口座名義人カナ名
			JBSbatCHIFM048.TSUCHO_NO,					// 通帳番号
			JBSbatCHIFM048.CRECARD_NO,					// クレジットカード番号
			JBSbatCHIFM048.CRECARD_YK_KIGEN,			// クレジットカード有効期限
			JBSbatCHIFM048.CREDIT_KOKAN_CD,				// クレジット交換コード
			JBSbatCHIFM048.CRECARD_NM_KANA,				// クレジットカード名義カナ名
			JBSbatCHIFM048.CRECARD_NM_ROMAJI,			// クレジットカード名義ローマ字

			// 2015/11/10 ANK-2565-00-00 Mod Start //
//			JBSbatCHIFM048.USE_KSH_DIV					// 利用契約者区分
			JBSbatCHIFM048.USE_KSH_DIV,					// 利用契約者区分
			JBSbatCHIFM048.CRECARD_NO_AZKRI_ID,			// クレジットカード番号預りＩＤ
			JBSbatCHIFM048.SHIKOSAKI_COMP_CD,			// 仕向先会社コード
			// 2015/11/10 ANK-2565-00-00 Add End //
			// OM-2017-0001068 ADD START
			JBSbatCHIFM048.TSUCHO_SYMBOL,				// 通帳記号
			JBSbatCHIFM048.CRECARD_COMP_CD,				// クレジットカード会社コード
			// OM-2017-0001068 ADD END
			
// 2018/04/03 ANK-3366-00-00 ADD STA
			JBSbatCHIFM048.ORSJGS_CD,					// 卸先事業者コード 
// 2018/04/03 ANK-3366-00-00 ADD END

	};
	
	/** 差分チェック対象項目名（マスタ） */
	private String[] checkTranTargetNm = {
			JBSbatCHIFM179.SKHK_SVKEI_STAT_CD,			// 請求契約配下サービス契約状態コード
			JBSbatCHIFM179.SEIKY_WAY_CD,				// 請求方法コード
			JBSbatCHIFM179.NEXT_SEIKY_WAY_DIV,			// 次回請求方法コード
			JBSbatCHIFM179.SKHK_SVKEI_DLRE_SKBT_CD,		// 請求契約配下サービス契約解約理由識別コード
			JBSbatCHIFM179.SEIKYUS_HAKKO_YH,			// 請求書発行要否
			JBSbatCHIFM179.SHS_HOJIN_SBT_CD,			// 送付先法人格種別コード
			JBSbatCHIFM179.SHS_HOJIN_ZENGO_SHITEI_CD,	// 送付先法人格前後指定コード
			JBSbatCHIFM179.SHS_KANA,					// 送付先カナ名
			JBSbatCHIFM179.SOHUS_AD_CD,					// 送付先住所コード
			JBSbatCHIFM179.SOHUS_PCD,					// 送付先郵便番号
			JBSbatCHIFM179.SOHUS_STATE_NM,				// 送付先都道府県名
			JBSbatCHIFM179.SOHUS_CITY_NM,				// 送付先市区町村名
			JBSbatCHIFM179.SOHUS_OAZTSU_NM,				// 送付先大字通称名
			JBSbatCHIFM179.SOHUS_AZCHO_NM,				// 送付先字丁目名
			JBSbatCHIFM179.SOHUS_BNCHIGO,				// 送付先住所番地号
			JBSbatCHIFM179.SOHUS_ADRTTM,				// 送付先住所補記・建物名
			JBSbatCHIFM179.SOHUS_ADRRM,					// 送付先住所補記・部屋番号
			JBSbatCHIFM179.SOHUS_TELNO,					// 送付先電話番号
			JBSbatCHIFM179.SOHUS_NM,					// 送付先名
			JBSbatCHIFM179.SOHUS_BKM,					// 送付先部課名
			JBSbatCHIFM179.SOHUS_TNTSHA_NM,				// 送付先担当者名
			JBSbatCHIFM179.SOHUS_MLAD,					// 送付先メールアドレス
			JBSbatCHIFM179.KYOSEI_MADOGUCHI_FLG,		// 強制窓口フラグ
			JBSbatCHIFM179.BANK_CD,						// 金融機関コード
			JBSbatCHIFM179.BANK_SHITEN_CD,				// 金融機関支店コード
			JBSbatCHIFM179.YOKIN_SHUMOKU_CD,			// 預金種目コード
			JBSbatCHIFM179.KOZA_NO,						// 口座番号
			JBSbatCHIFM179.NEW_CD,						// 新規コード
			JBSbatCHIFM179.KOZA_MEIGIN_KANA,			// 口座名義人カナ名
			JBSbatCHIFM179.TSUCHO_NO,					// 通帳番号
			JBSbatCHIFM179.CRECARD_NO,					// クレジットカード番号
			JBSbatCHIFM179.CRECARD_YK_KIGEN,			// クレジットカード有効期限
			JBSbatCHIFM179.CREDIT_KOKAN_CD,				// クレジット交換コード
			JBSbatCHIFM179.CRECARD_NM_KANA,				// クレジットカード名義カナ名
			JBSbatCHIFM179.CRECARD_NM_ROMAJI,			// クレジットカード名義ローマ字

			// 2015/11/10 ANK-2565-00-00 Mod Start //
//			JBSbatCHIFM179.SHANAIUSE_SKBT_FLG			// 社内使用識別フラグ
			JBSbatCHIFM179.SHANAIUSE_SKBT_FLG,			// 社内使用識別フラグ
			JBSbatCHIFM179.CRECARD_NO_AZKRI_ID,			// クレジットカード番号預りＩＤ
			JBSbatCHIFM179.SHIKOSAKI_COMP_CD,			// 仕向先会社コード
			// 2015/11/10 ANK-2565-00-00 Add End //
			// OM-2017-0001068 ADD START
			JBSbatCHIFM179.TSUCHO_SYMBOL,				// 通帳記号
			JBSbatCHIFM179.CRECARD_COMP_CD,				// クレジットカード会社コード
			// OM-2017-0001068 ADD END

// 2018/04/03 ANK-3366-00-00 ADD STA
			JBSbatCHIFM179.ORSJGS_CD,					// 卸先事業者コード 
// 2018/04/03 ANK-3366-00-00 ADD END

	};
	
	/**
	 * 初期処理
	 * @param 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, "[L][initial][freeItem=" + super.freeItem + "]");
		
		// 当月算出（請求収納業務共通クラス使用）
		JCHbatSeikyKaknoBusinessUtil seikyBusinessUtil = new JCHbatSeikyKaknoBusinessUtil(super.commonItem);
		this.togtu = seikyBusinessUtil.getSeikyYm(super.opeDate);
		seikyBusinessUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][togtu=" + this.togtu + "]");
		
		// 料金計算当月を取得
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		this.prcCalcTogtu = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		
		// 料金計算日を取得
		String prcCalcDayList[] = schdlUtil.getUseStrEnd(this.prcCalcTogtu, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		schdlUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcCalcDay=" + prcCalcDayList[1] + "]");
		
		// 料金計算日判定
		// 運用日が料金計算日の場合
		if(prcCalcDayList[1].equals(super.opeDate))
		{
			// 料金計算日フラグ ← true
			this.prcCalDayFlg = true;
		}
		
		// 請求収納業務共通クラス 
		this.chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		
		// フリー項目リスト
		String[] freeItemList = super.freeItem.split(JACStrConst.SEMI_COLON);
		
		// 強制窓口抑止情報ファイル定義
		String fileDef = freeItemList[0];

		// 強制窓口抑止情報ファイルパス
		String filePath = freeItemList[1];
		
		// 強制窓口抑止情報取得
		getInputFileInfo(fileDef, filePath);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 強制窓口抑止情報の読み込みを行います。
	 * @param ファイル定義
	 * @param ファイルパス
	 * @return ファイル内容
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getInputFileInfo(String fileDef, String filePath) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getInputFileInfo]");
		
		// 強制窓口抑止情報ファイルオープン
		JBSbatInputFileUtil inFileObj = new JBSbatInputFileUtil(filePath);
		
		// ファイル定義オブジェクト作成
		JBSbatDefFileUtil defFileUtl =
			new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue("IND") + fileDef, inFileObj);
		inFileObj.setEncode(JACStrConst.ENCODE_MS932);
		inFileObj.createReader();
		
		// 強制窓口抑止情報Set初期化
		this.kyseMdgYoksInfoMap = new HashMap<String, String>();
		
		// ファイル件数
		int recCnt = 0;
		
		// 強制窓口抑止情報を取得する
		while(true)
		{
			// １行読み込み
			String lineDate = inFileObj.readLine();
			if(null == lineDate)
			{
				break;
			}
			recCnt++;
			
			// DEFファイルを使用し、入力データを分割
			JBSbatServiceInterfaceMap recMap = defFileUtl.lineToObject(lineDate, inFileObj, recCnt);
			
			// 請求契約番号
			String seikyKeiNo = recMap.getString(JBSbatCHIFM065.SEIKY_KEI_NO);
			
			// 発行抑止コード
			String hakYoksiCd = recMap.getString(JBSbatCHIFM065.HAK_YOKSI_CD);
			
			// 強制窓口抑止情報Setに取得した請求契約番号を格納する
			this.kyseMdgYoksInfoMap.put(seikyKeiNo, hakYoksiCd);
		}
		// ファイルクローズ
		inFileObj.close();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getInputFileInfo]");
		return;
	}
	
	/**
	 * 主処理
	 * @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;
		
		JBSbatOutputItem outputItem = null;

		// 抑止情報作成判定フラグ初期化
		this.yoksiInfoSksJudge = false;
		
		if(mastMap == null)
		// 請求契約インターフェースがNullの場合
		{
			// 比較先がないため、処理を終了する
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力MのみNull]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			return outputInItem;
		}
		else if(tranMap == null)
		// 請求登録前アンロードがNullの場合
		{
			// 比較先がないため、処理を終了する
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力TのみNull]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			return outputInItem;
		}
		else
		{
			// 出力対象チェック
			// 請求契約インターフェースの請求契約番号と、請求登録前アンロードの請求契約番号を比較
			String mastSeikyKeiNo = mastMap.getString(JBSbatCHIFM048.SEIKY_KEI_NO);
			String tranSeikyKeiNo = tranMap.getString(JBSbatCHIFM179.SEIKY_KEI_NO);
			
			// マッチした場合
			if(mastSeikyKeiNo.equals(tranSeikyKeiNo))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ　＝　入力Ｔ]");
				
				//契約請求方法コード退避
				mastMap.setString(JBSbatCHIFM143.KEI_SEIKY_WAY_CD, mastMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD));
				
				//請求方法コード変更
				mastMap.setString(JBSbatCHIFM048.SEIKY_WAY_CD, changeSeikyWayCd(mastMap));
				
				// 強制窓口フラグ
				String kyoseiFlg = mastMap.getString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG);
				// 強制窓口フラグ＝　""（空）
				if( kyoseiFlg.equals(JACStrConst.KARA_MOJI) )
				{
					mastMap.setString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG, "0");
				}
				
				// 抑止情報作成判定フラグ = true の場合
				if(this.yoksiInfoSksJudge)
				{
					// 強制窓口フラグ変更
					mastMap.setString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG, JACStrConst.KYOSEI_MADO_FLG_OFF);
				}
				
				// 比較処理を実行し、差異が存在する場合に出力を行う
				if (compareSeiky(mastMap, tranMap))
				{
					// 請求情報（フロアリミットチェック結果付与）作成
					outputItem = makeSeikyuInfoHenkoBunData(mastMap);
					
					// 抑止情報作成判定フラグ = true の場合
					if(this.yoksiInfoSksJudge)
					{
						// 抑止情報（料金計算日強制窓口）を作成する
						JBSbatServiceInterfaceMap outputItem_2 = makeYoksInfo(tranSeikyKeiNo);
						outputItem.addOutMapList_2(outputItem_2);
					}
				}
				else
				{
					outputItem = outputInItem;
				}
				
				// マスタファイル処理フラグを設定する
				this.setMastProcFlg(true);
				
				// トランファイル処理フラグを設定する
				this.setTranProcFlg(true);
				
			}
			// マスタ＞トランの場合
			else if(mastSeikyKeiNo.compareTo(tranSeikyKeiNo) > 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ　＞　入力Ｔ]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
				
				// トランファイル処理フラグを設定する
				this.setTranProcFlg(true);
				return outputInItem;
			}
			// 上記以外の場合（マスタ＜トランの場合）
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ　＜　入力Ｔ]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
				
				// マスタファイル処理フラグを設定する
				this.setMastProcFlg(true);
				return outputInItem;
			}
		}
		
		
		assert outputItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputItem=" + outputItem.getOutMapList().toString() + "]"):JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputItem=null]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputItem;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 請求情報（フロアリミットチェック結果付与）作成
	 * 
	 * @param inMap 入力電文
	 * @return 出力共通電文
	 * @throws Exception 
	 */
	private JBSbatOutputItem makeSeikyuInfoHenkoBunData(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeSeikyuInfoHenkoBunData]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][inMap=" + inMap.getMap().toString() + "]");
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		outputMap.setString(JBSbatCHIFM143.SEIKY_KEI_NO,				inMap.getString(JBSbatCHIFM048.SEIKY_KEI_NO));					// 請求契約番号
		outputMap.setString(JBSbatCHIFM143.SKHK_SVKEI_STAT_CD,			inMap.getString(JBSbatCHIFM048.SKHK_SVKEI_STAT_CD));			// 請求契約配下サービス契約状態コード
		outputMap.setString(JBSbatCHIFM143.SYSID,						inMap.getString(JBSbatCHIFM048.SYSID));							// ＳＹＳＩＤ
		outputMap.setString(JBSbatCHIFM143.MANSION_OWNR_ID,				inMap.getString(JBSbatCHIFM048.MANSION_OWNR_ID));				// マンションオーナーＩＤ
		outputMap.setString(JBSbatCHIFM143.SEIKY_WAY_CD,				inMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD));					// 請求方法コード
		outputMap.setString(JBSbatCHIFM143.NEXT_SEIKY_WAY_DIV,			inMap.getString(JBSbatCHIFM048.NEXT_SEIKY_WAY_DIV));			// 次回請求方法コード
		outputMap.setString(JBSbatCHIFM143.SKHK_SVKEI_DLRE_SKBT_CD,		inMap.getString(JBSbatCHIFM048.SKHK_SVKEI_DLRE_SKBT_CD));		// 請求契約配下サービス契約解約理由識別コード
		outputMap.setString(JBSbatCHIFM143.SEIKY_CYCLE_CD,				inMap.getString(JBSbatCHIFM048.SEIKY_CYCLE_CD));				// 請求サイクルコード
		outputMap.setString(JBSbatCHIFM143.GUN_CD,						inMap.getString(JBSbatCHIFM048.GUN_CD));						// 群コード
		outputMap.setString(JBSbatCHIFM143.SEIKYUS_HAKKO_YH,			inMap.getString(JBSbatCHIFM048.SEIKYUS_HAKKO_YH));				// 請求書発行要否
		outputMap.setString(JBSbatCHIFM143.SHS_HOJIN_SBT_CD,			inMap.getString(JBSbatCHIFM048.SHS_HOJIN_SBT_CD));				// 送付先法人格種別コード
		outputMap.setString(JBSbatCHIFM143.SHS_HOJIN_ZENGO_SHITEI_CD,	inMap.getString(JBSbatCHIFM048.SHS_HOJIN_ZENGO_SHITEI_CD));		// 送付先法人格前後指定コード
		outputMap.setString(JBSbatCHIFM143.SHS_KANA,					inMap.getString(JBSbatCHIFM048.SHS_KANA));						// 送付先カナ名
		outputMap.setString(JBSbatCHIFM143.SOHUS_NM,					inMap.getString(JBSbatCHIFM048.SOHUS_NM));						// 送付先名
		outputMap.setString(JBSbatCHIFM143.SOHUS_BKM,					inMap.getString(JBSbatCHIFM048.SOHUS_BKM));						// 送付先部課名
		outputMap.setString(JBSbatCHIFM143.SOHUS_TNTSHA_NM,				inMap.getString(JBSbatCHIFM048.SOHUS_TNTSHA_NM));				// 送付先担当者名
		outputMap.setString(JBSbatCHIFM143.SOHUS_AD_CD,					inMap.getString(JBSbatCHIFM048.SOHUS_AD_CD));					// 送付先住所コード
		outputMap.setString(JBSbatCHIFM143.SOHUS_PCD,					inMap.getString(JBSbatCHIFM048.SOHUS_PCD));						// 送付先郵便番号
		outputMap.setString(JBSbatCHIFM143.SOHUS_STATE_NM,				inMap.getString(JBSbatCHIFM048.SOHUS_STATE_NM));				// 送付先都道府県名
		outputMap.setString(JBSbatCHIFM143.SOHUS_CITY_NM,				inMap.getString(JBSbatCHIFM048.SOHUS_CITY_NM));					// 送付先市区町村名
		outputMap.setString(JBSbatCHIFM143.SOHUS_OAZTSU_NM,				inMap.getString(JBSbatCHIFM048.SOHUS_OAZTSU_NM));				// 送付先大字通称名
		outputMap.setString(JBSbatCHIFM143.SOHUS_AZCHO_NM,				inMap.getString(JBSbatCHIFM048.SOHUS_AZCHO_NM));				// 送付先字丁目名
		outputMap.setString(JBSbatCHIFM143.SOHUS_ADRTTM,				inMap.getString(JBSbatCHIFM048.SOHUS_ADRTTM));					// 送付先住所補記・建物名
		outputMap.setString(JBSbatCHIFM143.SOHUS_ADRRM,					inMap.getString(JBSbatCHIFM048.SOHUS_ADRRM));					// 送付先住所補記・部屋番号
		outputMap.setString(JBSbatCHIFM143.SOHUS_BNCHIGO,				inMap.getString(JBSbatCHIFM048.SOHUS_BNCHIGO));					// 送付先番地号
		outputMap.setString(JBSbatCHIFM143.SOHUS_TELNO,					inMap.getString(JBSbatCHIFM048.SOHUS_TELNO));					// 送付先電話番号
		outputMap.setString(JBSbatCHIFM143.SOHUS_FAX_NO,				inMap.getString(JBSbatCHIFM048.SOHUS_FAX_NO));					// 送付先ＦＡＸ番号
		outputMap.setString(JBSbatCHIFM143.SOHUS_MLAD,					inMap.getString(JBSbatCHIFM048.SOHUS_MLAD));					// 送付先メールアドレス
		outputMap.setString(JBSbatCHIFM143.KYOSEI_MADOGUCHI_FLG,		inMap.getString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG));			// 強制窓口フラグ
		outputMap.setString(JBSbatCHIFM143.IDO_DIV,						inMap.getString(JBSbatCHIFM048.IDO_DIV));						// 異動区分
		outputMap.setString(JBSbatCHIFM143.RSV_APLY_YMD,				inMap.getString(JBSbatCHIFM048.RSV_APLY_YMD));					// 適用年月日
		outputMap.setString(JBSbatCHIFM143.USE_KEISHA_DIV,				inMap.getString(JBSbatCHIFM048.USE_KSH_DIV));					// 利用契約者区分
		outputMap.setString(JBSbatCHIFM143.KOZA_STAT,					inMap.getString(JBSbatCHIFM048.KOZA_STAT));						// 口座ステータス
		outputMap.setString(JBSbatCHIFM143.BANK_CD,						inMap.getString(JBSbatCHIFM048.BANK_CD));						// 金融機関コード
		outputMap.setString(JBSbatCHIFM143.BANK_SHITEN_CD,				inMap.getString(JBSbatCHIFM048.BANK_SHITEN_CD));				// 金融機関支店コード
		outputMap.setString(JBSbatCHIFM143.YOKIN_SHUMOKU_CD,			inMap.getString(JBSbatCHIFM048.YOKIN_SHUMOKU_CD));				// 預金種目コード
		outputMap.setString(JBSbatCHIFM143.KOZA_NO,						inMap.getString(JBSbatCHIFM048.KOZA_NO));						// 口座番号
		outputMap.setString(JBSbatCHIFM143.NEW_CD,						inMap.getString(JBSbatCHIFM048.NEW_CD));						// 新規コード
		outputMap.setString(JBSbatCHIFM143.KOZA_MEIGIN_KANJI,			inMap.getString(JBSbatCHIFM048.KOZA_MEIGIN_KANJI));				// 口座名義人漢字
		outputMap.setString(JBSbatCHIFM143.KOZA_MEIGIN_KANA,			inMap.getString(JBSbatCHIFM048.KOZA_MEIGIN_KANA));				// 口座名義人カナ名
		outputMap.setString(JBSbatCHIFM143.TSUCHO_SYMBOL,				inMap.getString(JBSbatCHIFM048.TSUCHO_SYMBOL));					// 通帳記号
		outputMap.setString(JBSbatCHIFM143.TSUCHO_NO,					inMap.getString(JBSbatCHIFM048.TSUCHO_NO));						// 通帳番号
		outputMap.setString(JBSbatCHIFM143.CRECARD_STAT,				inMap.getString(JBSbatCHIFM048.CRECARD_STAT));					// クレジットカードステータス
		outputMap.setString(JBSbatCHIFM143.CRECARD_JIGYO_CD,			inMap.getString(JBSbatCHIFM048.CRECARD_JIGYO_CD));				// クレジットカード事業コード
		outputMap.setString(JBSbatCHIFM143.CRECARD_COMP_CD,				inMap.getString(JBSbatCHIFM048.CRECARD_COMP_CD));				// クレジットカード会社コード
		outputMap.setString(JBSbatCHIFM143.CRECARD_NO,					inMap.getString(JBSbatCHIFM048.CRECARD_NO));					// クレジットカード番号
		outputMap.setString(JBSbatCHIFM143.CRECARD_YK_KIGEN,			inMap.getString(JBSbatCHIFM048.CRECARD_YK_KIGEN));				// クレジットカード有効期限
		outputMap.setString(JBSbatCHIFM143.CREDIT_KOKAN_CD,				inMap.getString(JBSbatCHIFM048.CREDIT_KOKAN_CD));				// クレジット交換コード
		outputMap.setString(JBSbatCHIFM143.CRECARD_NM_ROMAJI,			inMap.getString(JBSbatCHIFM048.CRECARD_NM_ROMAJI));				// クレジットカード名義ローマ字
		outputMap.setString(JBSbatCHIFM143.CRECARD_NM_KANA,				inMap.getString(JBSbatCHIFM048.CRECARD_NM_KANA));				// クレジットカード名義カナ名
		outputMap.setString(JBSbatCHIFM143.CRECA_MK_YM,					inMap.getString(JBSbatCHIFM048.CRECA_MK_YM));					// クレジットカード無効年月
		outputMap.setString(JBSbatCHIFM143.SEIKY_WAY_APLY_ADJ_YMD,		inMap.getString(JBSbatCHIFM048.SEIKY_WAY_APLY_ADJ_YMD));		// 請求方法適用調整年月日
		outputMap.setString(JBSbatCHIFM143.TOKUSOKU_NO,					inMap.getString(JBSbatCHIFM048.TOKUSOKU_NO));					// 督促番号
		outputMap.setString(JBSbatCHIFM143.PAY_KIGEN_YMD,				inMap.getString(JBSbatCHIFM048.PAY_KIGEN_YMD));					// 支払期限年月日
// OM-2019-0000047 2019/01/21 MOD START
//		outputMap.setString(JBSbatCHIFM143.KEI_SEIKY_WAY_CD,			inMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD));
		outputMap.setString(JBSbatCHIFM143.KEI_SEIKY_WAY_CD,			inMap.getString(JBSbatCHIFM143.KEI_SEIKY_WAY_CD));
// OM-2019-0000047 2019/01/21 MOD END
		
		// 2015/11/10 ANK-2565-00-00 Add Start //
		outputMap.setString(JBSbatCHIFM143.CRECARD_NO_AZKRI_ID,			inMap.getString(JBSbatCHIFM048.CRECARD_NO_AZKRI_ID));			// クレジットカード番号預りＩＤ
		outputMap.setString(JBSbatCHIFM143.SHIKOSAKI_COMP_CD,			inMap.getString(JBSbatCHIFM048.SHIKOSAKI_COMP_CD));				// 仕向先会社コード
		
// 2018/04/03 ANK-3366-00-00 ADD STA
		outputMap.setString(JBSbatCHIFM143.ORSJGS_CD,					inMap.getString(JBSbatCHIFM048.ORSJGS_CD));						// 卸先事業者コード 
//2018/04/03 ANK-3366-00-00 ADD END

		// 2015/11/10 ANK-2565-00-00 Add End //
		// 出力フラグON
		outputMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][seikyuInfoHenkoBunDataMap=" + inMap.getMap().toString() + "]");
		
		// 出力共通電文設定
		outputItem.addOutMapList(outputMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputItem=" + outputItem.getOutMapList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeSeikyuInfoHenkoBunData]");
		
		return outputItem;
	}
	
	/**
	 * 抑止情報（料金計算日強制窓口）作成
	 * 
	 * @param seikyKeiNo 請求契約番号
	 * @return 出力電文
	 * @throws Exception 
	 */
	private JBSbatServiceInterfaceMap makeYoksInfo(String seikyKeiNo) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeYoksInfo]");
		
		JBSbatServiceInterfaceMap fileMap = new JBSbatServiceInterfaceMap();
		
		// 請求契約番号
		fileMap.set(JBSbatCHIFM065.SEIKY_KEI_NO, 		seikyKeiNo);
		// 請求年月
		fileMap.set(JBSbatCHIFM065.SEIKY_YM, 			this.prcCalcTogtu);
		// 発行抑止コード
		fileMap.set(JBSbatCHIFM065.HAK_YOKSI_CD, 		this.kyseMdgYoksInfoMap.get(seikyKeiNo));
	
		// 出力フラグON
		fileMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeYoksInfo]");
		return fileMap;
	}

	
	
	
	/**
	 * 請求情報に差異が存在するか比較を行い、
	 * 差異がある場合はtrueを返します。
	 * @param mastMap 請求契約インターフェース情報
	 * @param tranMap 請求登録前アンロード情報
	 * @return 差異がある場合true 差異がない場合false
	 * @throws Exception 
	 */
	private boolean compareSeiky(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][compareSeiky]");
		
		// 比較対象データを一時保存する変数（最後まで使い回す）
		String tmpMastData = null;
		String tmpTranData = null;
		
		// 比較対象項目のデータを取得→比較し、一か所でも差異があった時点でtrueを返す
		for (int i = 0; i < checkMastTargetNm.length; i++)
		{
			// 比較対象の項目を各入力ファイルより取得
			tmpMastData = mastMap.getString(checkMastTargetNm[i]);
			tmpTranData = tranMap.getString(checkTranTargetNm[i]);
			
			tmpMastData = tmpMastData.trim();
			tmpTranData = tmpTranData.trim();
			
			// 比較を行い、差異がある場合はアンマッチとしてtrueを返す
			if (!tmpMastData.equals(tmpTranData))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][compareSeiky][比較アンマッチ][項目=" + checkMastTargetNm[i] + "][mastData=" + tmpMastData + "][tranData=" + tmpTranData + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][compareSeiky]");
				return true;
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][compareSeiky]");
		
		// 最後まで差異がなかった場合、差異なし(false)を返す
		return false;
	}
	
	/**
	 * 請求方法コードを変更します
	 * @param inMap 入力マップ
	 * @return seikyWayCdAf 変更後請求方法コード
	 * @throws Exception
	 */
	private String changeSeikyWayCd(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][changeSeikyWayCd]");

		// 請求契約番号
		String seikyKeiNo = inMap.getString(JBSbatCHIFM048.SEIKY_KEI_NO);
		
		// 強制窓口フラグ
		String kyoseiMadGuchiFlg = inMap.getString(JBSbatCHIFM048.KYOSEI_MADOGUCHI_FLG);
		
		// 変更後請求方法コード
		String seikyWayCdAf = JACStrConst.KARA_MOJI;
		
		// 請求方法判定
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][請求方法判定]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][判定前請求方法コード：" + inMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD) + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][口座ステータス：" + inMap.getString(JBSbatCHIFM048.KOZA_STAT) + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][クレジットカードステータス：" + inMap.getString(JBSbatCHIFM048.CRECARD_STAT) + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][クレジットカード無効年月：" + inMap.getString(JBSbatCHIFM048.CRECA_MK_YM) + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][請求年月：" + togtu + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSeikyuInfoHenkoBunData][請求方法適用調整年月日：" + inMap.getString(JBSbatCHIFM048.SEIKY_WAY_APLY_ADJ_YMD) + "]");
		
		seikyWayCdAf = chUtil.seikyWayJudge(inMap.getString(JBSbatCHIFM048.SEIKY_WAY_CD)
										  , inMap.getString(JBSbatCHIFM048.KOZA_STAT)
										  , inMap.getString(JBSbatCHIFM048.CRECARD_STAT)
										  , inMap.getString(JBSbatCHIFM048.CRECA_MK_YM)
										  , togtu
										  , inMap.getString(JBSbatCHIFM048.SEIKY_WAY_APLY_ADJ_YMD));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][changeSeikyWayCd][判定後請求方法コード：" + seikyWayCdAf + "]");

		// 料金計算日の場合
		if(this.prcCalDayFlg)
		{
			// 請求方法コード ≠ "1"(窓口)　且つ　強制窓口フラグ ＝ "1"(強制窓口対象) の場合
			if(!JACStrConst.SEIKY_MADOGUCHI.equals(seikyWayCdAf)
							&& JACStrConst.KYOSEI_MDGC_FLG_SET_ARI.equals(kyoseiMadGuchiFlg))
			{
				// 強制窓口抑止情報に存在している場合
				if(this.kyseMdgYoksInfoMap.containsKey(seikyKeiNo))
				{
					// 抑止情報作成判定フラグ ← true
					this.yoksiInfoSksJudge = true;
				}
				// 強制窓口抑止情報に未存在の場合
				else
				{
					// 請求方法を"1"(窓口)に設定する
					seikyWayCdAf = JACStrConst.SEIKY_MADOGUCHI;
				}
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][changeSeikyWayCd]");
		return seikyWayCdAf;
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		// 請求収納業務共通クラスをクローズする
		chUtil.close();
		
		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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
