/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCKDslAfSkssnsInfoExtrctn
*	ソースファイル名	：JBSbatCKDslAfSkssnsInfoExtrctn.java
*	作成者				：FJ)柳
*	作成日				：2017年06月12日
*＜機能概要＞
*　解約後請求書参照情報抽出処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v33.00.00	2017/06/12	FJ)柳		【ANK-3179-00-00】解約済み契約の請求明細表示
*	v33.01.00	2017/07/31	FJ)柳		【IT2-2017-0000045】督促なし判定変更対応
*	v38.00.00	2018/07/25	FJ)舘山		【OM-2018-0000603】性能障害
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.common.JZMBatConst;
import eo.business.util.file.JBSbatCKIFM010;
import eo.business.util.file.JBSbatCKIFM011;
import eo.common.constant.JACStrConst;
import eo.common.util.JKKCommonUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatDateUtil;

/**
* 対象会員抽出ファイルより過去の請求明細が参照可能な期間を経過した会員を抽出する。
*<BR>
* @author FJ)柳
*/
public class JBSbatCKDslAfSkssnsInfoExtrctn extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	/** 出力ファイル定義 */
	private static final String PARAM_OTD = "OTD";
	
	/** 業務パラメータID(CK_SKSSNS_PSB_MCNT:解約後請求書参照可能月数 */
	private static final String PARAM_ID_CK_SKSSNS_PSB_MCNT = "CK_SKSSNS_PSB_MCNT";
	
	/** 対象会員抽出ファイル */
	private JBSbatInputFileUtil trgtMmbExtrctnFile = null;
	/** 対象会員抽出ファイル定義 */
	private JBSbatDefFileUtil trgtMmbExtrctnFileDef = null;
	/** 解約後請求書参照情報抽出ファイル */
	private JBSbatOutputFileUtil dslAfSkssnsInfoExtrctnFile = null;
	/** 解約後請求書参照情報抽出ファイル定義 */
	private JBSbatDefFileUtil dslAfSkssnsInfoExtrctnFileDef = null;
	
	/** 参照期間フラグ(true：参照期間内、false：参照期間外) */
	private boolean snsPrdFlg = false;
	/** 参照期間経過リスト */
	private ArrayList<HashMap<String, String>> outSnsPrdList = new ArrayList<HashMap<String, String>>();

// ▼▼▼ 2018/7/25 OM-2018-0000603 ADD START
	/* 解約後請求書参照可能月数 */
	private int skssnsPsbMcnt = 0;
//△△△ 2018/7/25 OM-2018-0000603 ADD END
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目より以下を取得
		// ・入力ファイルパス
		// ・入力ファイル定義
		// ・出力ファイルパス
		// ・出力ファイル定義
		String[] freeParam = commonItem.getFreeItem().split(";");
		String inputFilePath = freeParam[0];
		String inputDef = freeParam[1];
		String outputFilePath = freeParam[2];
		String outputDef = freeParam[3];
		
		// 入力ファイルオブジェクトの生成
		trgtMmbExtrctnFile = new JBSbatInputFileUtil(inputFilePath);
		// 入力定義ファイルオブジェクトの生成
		String trgtMmbExtrctnFileDefNm = JBSbatAplConst.getAplConstValue(PARAM_IND) + inputDef;
		trgtMmbExtrctnFileDef = new JBSbatDefFileUtil(trgtMmbExtrctnFileDefNm, trgtMmbExtrctnFile);
		
		trgtMmbExtrctnFile.createReader();
		
		// 出力ファイルオブジェクトの生成
		dslAfSkssnsInfoExtrctnFile = new JBSbatOutputFileUtil(outputFilePath);
		// 文字コードの設定
		dslAfSkssnsInfoExtrctnFile.setEncode(JKKBatConst.S_CHR_CODE);
		// 改行コードの設定
		dslAfSkssnsInfoExtrctnFile.setLine(JZMBatConst.CRLF);
		// ジョブIDの設定
		dslAfSkssnsInfoExtrctnFile.setJobID(commonItem.getJobid());
		// 出力定義ファイルオブジェクトの生成
		String dslAfSkssnsInfoExtrctnFileDefNm = JBSbatAplConst.getAplConstValue(PARAM_OTD) + outputDef;
		dslAfSkssnsInfoExtrctnFileDef = new JBSbatDefFileUtil(dslAfSkssnsInfoExtrctnFileDefNm, dslAfSkssnsInfoExtrctnFile);
		
		dslAfSkssnsInfoExtrctnFile.createWriter();
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * (最新債権充当年月日は領収年月日に読み替える)
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 一行前のSYSID
		String bfSysid = "";
// ▼▼▼ 2018/7/25 OM-2018-0000603 ADD START
		// 業務パラメータ管理より解約後請求書参照可能月数を取得する
		skssnsPsbMcnt = Integer.parseInt(JKKBatCommon.getWorkParamSetteValue(commonItem, PARAM_ID_CK_SKSSNS_PSB_MCNT));
// △△△ 2018/7/25 OM-2018-0000603 ADD END
		
		while (trgtMmbExtrctnFile.ready())
		{
			// 1レコードを取得
			JBSbatServiceInterfaceMap trgtMmbExtrctnFileLine =
					trgtMmbExtrctnFileDef.lineToObject(trgtMmbExtrctnFile.readLine(), trgtMmbExtrctnFile, 0);
			
			// SYSID
			String sysid = trgtMmbExtrctnFileLine.getString(JBSbatCKIFM010.SYSID);
			// 会員種別コード
			String memberSbtCd = trgtMmbExtrctnFileLine.getString(JBSbatCKIFM010.MEMBER_SBT_CD);
			// 最新債権充当年月日
			String rcntSaikenJutoYmd = trgtMmbExtrctnFileLine.getString(JBSbatCKIFM010.RCNT_SAIKEN_JUTO_YMD);
			// 督促ステータス
			String tokusokuStat = trgtMmbExtrctnFileLine.getString(JBSbatCKIFM010.TOKUSOKU_STAT);
			// 貸倒処理年月日
			String kashidTranYmd = trgtMmbExtrctnFileLine.getString(JBSbatCKIFM010.KASHID_TRAN_YMD);
			
			// 一行前のSYSIDと同じ場合
			if (bfSysid.equals(sysid))
			{
				// 参照期間経過確認
				chkOutSnsPrd(sysid, memberSbtCd, rcntSaikenJutoYmd, tokusokuStat, kashidTranYmd);
			}
			// 一行前のSYSIDと異なる場合
			else
			{
				// 参照期間フラグを参照期間外とする
				snsPrdFlg = false;
				
				// 解約後請求書参照情報抽出ファイル出力処理
				output();
				
				// 参照期間経過リストをクリアする
				outSnsPrdList.clear();
				
				// 参照期間経過確認
				chkOutSnsPrd(sysid, memberSbtCd, rcntSaikenJutoYmd, tokusokuStat, kashidTranYmd);
			}
			
			// SYSIDを一行前のSYSIDとする
			bfSysid = sysid;
		}
		
		// 解約後請求書参照情報抽出ファイル出力処理
		// (最後のSYSIDはループ内の出力処理に入らないため、別途 出力処理を行う)
		output();
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// ファイルクローズ
		trgtMmbExtrctnFile.close();
		dslAfSkssnsInfoExtrctnFile.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 解約後請求書参照情報抽出ファイル出力処理.
	 * @throws Exception
	 */
	private void output() throws Exception
	{
		// 参照期間経過リストの中身が存在する場合、
		// 最初の一行のみ解約後請求書参照情報抽出ファイルに出力
		// (参照期間経過リストには同一SYSIDのデータが複数 格納されているが、
		//  解約後請求書参照情報抽出ファイルに同一SYSIDのデータは一つで良い)
		if (outSnsPrdList != null && 0 < outSnsPrdList.size())
		{
			// 参照期間経過リストの一行を取得
			HashMap<String, String> outSnsPrdLine = outSnsPrdList.get(0);
			
			// 解約後請求書参照情報抽出ファイルの1レコード
			JBSbatServiceInterfaceMap dslAfSkssnsInfoExtrctnFileLine = new JBSbatServiceInterfaceMap();
			
			// 解約後請求書参照情報抽出ファイルのマップに設定
			// SYSID
			dslAfSkssnsInfoExtrctnFileLine.setString(JBSbatCKIFM011.SYSID, outSnsPrdLine.get(JBSbatCKIFM010.SYSID));
			// 会員種別コード
			dslAfSkssnsInfoExtrctnFileLine.setString(JBSbatCKIFM011.MEMBER_SBT_CD, outSnsPrdLine.get(JBSbatCKIFM010.MEMBER_SBT_CD));
			
			// 解約後請求書参照情報抽出ファイルの1レコード分を出力
			dslAfSkssnsInfoExtrctnFile.print(dslAfSkssnsInfoExtrctnFileLine, dslAfSkssnsInfoExtrctnFileDef);
		}
	}
	
	/**
	 * 参照期間経過確認処理.
	 * (最新債権充当年月日は領収年月日に読み替える)
	 * @param sysid　SYSID
	 * @param memberSbtCd　会員種別コード
	 * @param rcntSaikenJutoYmd　最新債権充当年月日
	 * @param tokusokuStat　督促ステータス
	 * @param kashidTranYmd　貸倒処理年月日
	 * @throws Exception
	 */
	private void chkOutSnsPrd(String sysid, String memberSbtCd,
			String rcntSaikenJutoYmd, String tokusokuStat, String kashidTranYmd) throws Exception
	{
		// 参照期間フラグが参照期間外である場合
		if (!snsPrdFlg)
		{
			// 督促ステータスが00(督促なし) または null または ""の場合
// IT2-2017-0000045 2017/07/31 MOD START
//			if (JACStrConst.TOKUSOKU_STAT_NASHI.equals(tokusokuStat))
			if (JACStrConst.TOKUSOKU_STAT_NASHI.equals(tokusokuStat) || JKKCommonUtil.isNull(tokusokuStat))
// IT2-2017-0000045 2017/07/31 MOD END
			{
				// 参照期間経過判定(最新債権充当年月日を使用)
				jdgOutSnsPrd(sysid, memberSbtCd, rcntSaikenJutoYmd);
			}
			// 督促ステータスが90(貸倒登録済)の場合
			else if (JACStrConst.TOKUSOKU_STAT_KASHID_ZUMI.equals(tokusokuStat))
			{
				// 参照期間経過判定(貸倒処理年月日を使用)
				jdgOutSnsPrd(sysid, memberSbtCd, kashidTranYmd);
			}
			// 督促ステータスが上記以外の場合
			// (同一SYSID内で未収納が存在すれば、
			//  そのSYSIDは解約後請求書参照情報抽出ファイルの出力対象とならない)
			else
			{
				// 参照期間フラグを参照期間内とする
				snsPrdFlg = true;
				
				// 参照期間経過リストをクリアする
				outSnsPrdList.clear();
			}
		}
		// 参照期間フラグが参照期間内である場合
		else
		{
			// 何もしない
		}
	}
	
	/**
	 * 参照期間経過判定処理.
	 * @param sysid　SYSID
	 * @param memberSbtCd　会員種別コード
	 * @param ymd　年月日
	 * @throws Exception
	 */
	private void jdgOutSnsPrd(String sysid, String memberSbtCd, String ymd) throws Exception
	{
// ▼▼▼ 2018/7/25 OM-2018-0000603 DELETE START
//		// 業務パラメータ管理より解約後請求書参照可能月数を取得する
//		int skssnsPsbMcnt = Integer.parseInt(JKKBatCommon.getWorkParamSetteValue(commonItem, PARAM_ID_CK_SKSSNS_PSB_MCNT));
// △△△ 2018/7/25 OM-2018-0000603 DELETE END
		
		// パラメータ.年月日の翌月初日を取得(参照期間開始年月日)
		String strSnsPrdStaYmd = JBSbatDateUtil.adjustMonth(ymd, 1).substring(0, 6).concat("01");
		// 参照期間開始年月日＋解約後請求書参照可能月数の結果から月末日を取得(参照期間終了年月日)
		String snsPrdEndYm = JBSbatDateUtil.adjustMonth(strSnsPrdStaYmd, skssnsPsbMcnt).substring(0, 6);
		String snsPrdEndDd = JBSbatDateUtil.getEndOfMonth(snsPrdEndYm);
		String snsPrdEndYmd = snsPrdEndYm.concat(snsPrdEndDd);
		
		// 運用日
		String opeDate = commonItem.getOpeDate();
		
		// 解約後請求書参照可能期間を経過している場合
// IT2-2017-0000045 2017/08/02 MOD START
//		if (0 < opeDate.compareTo(snsPrdEndYmd))
		if (0 <= opeDate.compareTo(snsPrdEndYmd))
// IT2-2017-0000045 2017/08/02 MOD END
		{
			HashMap<String, String> outSnsPrdLine = new HashMap<String, String>();
			
			// SYSID
			outSnsPrdLine.put(JBSbatCKIFM010.SYSID, sysid);
			// 会員種別コード
			outSnsPrdLine.put(JBSbatCKIFM010.MEMBER_SBT_CD, memberSbtCd);
			
			// 参照期間経過リストに追加
			outSnsPrdList.add(outSnsPrdLine);
		}
		else
		// 解約後請求書参照可能期間を経過していない場合
		// (同一SYSID内で一つでも参照期間内である請求先が存在すれば、
		//  そのSYSIDは解約後請求書参照情報抽出ファイルの出力対象とならない)
		{
			// 参照期間フラグを参照期間内とする
			snsPrdFlg = true;
			
			// 参照期間経過リストをクリアする
			outSnsPrdList.clear();
		}
	}
}
