/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*  システム名               ：eo顧客基幹システム
*  モジュール名              ：JBSbatCHMineoCicTrgtSaikenInfoFileMake
*  ソースファイル名            ：JBSbatCHMineoCicTrgtSaikenInfoFileMake.java
*  作成者                 ：富士通　
*  作成日                 ：2021年07月07日
*＜機能概要＞
*  mineoCIC対象債権情報ファイル作成
*＜修正履歴＞
*  バージョン               修正日            修正者              修正内容              障害／仕様変更No.
*  v54.00.00            2021/07/07       GDC)ジョバニー           【ANK-4064-00-00】CIC連携の自動化対応
*  v54.01.00            2021/08/02       FJ)星野                  【IT1-2021-0000065】
*  v54.02.00            2021/09/06       FJ)星野                  【ANK-4064-02-00】CIC連携の自動化対応(債権情報ファイルへの出力変更対応)
*  v58.00.00            2022/04/19       FJ)星野                  【ANK-4204-00-00】CIC連携情報の抽出条件見直し
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFE093;
import eo.business.util.file.JBSbatCHIFE095;
import eo.business.util.file.JBSbatCHIFM408;
import eo.business.util.table.JBSbatCH_T_JUTO;
import eo.business.util.table.JBSbatCH_T_NYUKIN;
import eo.business.util.table.JBSbatCH_T_SAIKEN;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.common.util.JCHStringUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;


/**
* mineoCIC対象債権情報ファイル作成です。<p>
* <BR>
* @author 富士通
* 
*/
public class JBSbatCHMineoCicTrgtSaikenInfoFileMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";
	
	/** テーブル(請求債権関連)*/
	private static final String D_TBL_NAME_CH_T_SEIKY_SKN_KNRN = "CH_T_SEIKY_SKN_KNRN";
	
// ANK-4204-00-00対応 20220419 星野 ADD START
	/** テーブル(充当)*/
	private static final String D_TBL_NAME_CH_T_JUTO = "CH_T_JUTO";
// ANK-4204-00-00対応 20220419 星野 ADD END
	
	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;

	/** テーブルアクセスクラス(請求債権関連)*/
	private JBSbatSQLAccess db_CH_T_SEIKY_SKN_KNRN = null;

// ANK-4204-00-00対応 20220419 星野 ADD START
	/** テーブルアクセスクラス(充当)*/
	private JBSbatSQLAccess db_CH_T_JUTO = null;
// ANK-4204-00-00対応 20220419 星野 ADD END
	
	/** SQL定義キー(CH_SELECT_008)*/
	private static final String KK_T_KAKINS_CH_SELECT_008 = "CH_SELECT_008";

	/** SQL定義キー(CH_SELECT_006)*/
	private static final String CH_T_SEIKY_SKN_KNRN_CH_SELECT_006 = "CH_SELECT_006";
	
// ANK-4204-00-00対応 20220419 星野 ADD START
	/** SQL定義キー(CH_SELECT_005)*/
	private static final String CH_T_JUTO_CH_SELECT_005 = "CH_SELECT_005";
// ANK-4204-00-00対応 20220419 星野 ADD END
	
	/** 債権ステータス 030:リアル収納 */
	private static final String SAIKEN_STAT_REAL_KAKNO = "030";
	
	/** 債権ステータス 040:仮収納 */
	private static final String SAIKEN_STAT_KARI_KAKNO = "040";
	
// ANK-4064-02-00対応 20210906 星野 ADD START
	/** 債権ステータス 050:収納済 */
	private static final String SAIKEN_STAT_SHUNO_ZUMI = "050";
// ANK-4064-02-00対応 20210906 星野 ADD END
	
	/** 督促ステータス 090:貸倒登録済 */
	private static final String TOKUSOKU_STAT_KASHID_ZUMI = "90";
	
	/** CIC連携内容コード 00:通常連携 */
	private static final String CIC_RNKI_NAIYO_CD_TUJYO_RNK = "00";
	
	/** 督促ステータス 00:督促なし */
	private static final String TOKUSOKU_STAT_NASHI = "00";
	
	/** 空の文字列 */
	private static final String EMPTY_STRING = "";
	
	/** 更新運用年月日 */
	private static final String UPD_UNYO_YMD = "UPD_UNYO_YMD";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_CH_T_SEIKY_SKN_KNRN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY_SKN_KNRN);
// ANK-4204-00-00対応 20220419 星野 ADD START
		db_CH_T_JUTO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_JUTO);
// ANK-4204-00-00対応 20220419 星野 ADD END

		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		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 + "]");

		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert 	inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		// 利用停止予告対象データ作成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		//入力ファイル(CIC対象一時ファイル).お客様ID
		String custId = inMap.getString(JBSbatCHIFE093.CUST_ID);
		
		// (1)CIC対象債権情報ファイルの連携項目「請求契約番号」「債権年月」「債権ｽﾃｰﾀｽ」「支払期限年月日」「督促ｽﾃｰﾀｽ」「CIC連携内容発生日」の算出
		executeKK_T_KAKINS_CH_SELECT_008(custId);

		JBSbatCommonDBInterface dataMapKkTKakins = db_KK_T_KAKINS.selectNext();
		
		// (1)で取得したレコードの分、下記の処理(2)〜(5)までを繰り返す。
		while(null != dataMapKkTKakins)
		{
			JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
			
			// (2)連携項目「充当完了年月日」の算出
			// (1)で取得した債権ｽﾃｰﾀｽを取得
			String workSaikenStat = dataMapKkTKakins.getString(JBSbatCH_T_SAIKEN.SAIKEN_STAT);
			
			// 充当完了年月日
			String jutoFinYmd = "";
			
			// (a)(1)で取得した債権ｽﾃｰﾀｽ = "030"：リアル収納、"040"：仮収納　の場合
			if (SAIKEN_STAT_REAL_KAKNO.equals(workSaikenStat) || SAIKEN_STAT_KARI_KAKNO.equals(workSaikenStat))
			{
				// 入力ファイル(CIC対象一時ファイル).債権番号
				String saikenNo = dataMapKkTKakins.getString(JBSbatCH_T_SAIKEN.SAIKEN_NO);
				
				// 「充当完了年月日」に設定をする。
				executeCH_T_SEIKY_SKN_KNRN_CH_SELECT_006(saikenNo);
				
				JBSbatCommonDBInterface dataMapChTSeikySknKnrn = db_CH_T_SEIKY_SKN_KNRN.selectNext();
				
				while(dataMapChTSeikySknKnrn!= null)
				{
					String outOrgShunoYmd = dataMapChTSeikySknKnrn.getString(JBSbatCH_T_NYUKIN.OUT_ORG_SHUNO_YMD);
					String cvstoreRealShokoTchYmd = dataMapChTSeikySknKnrn.getString(JBSbatCH_T_NYUKIN.CVSTORE_REAL_SOKHO_TCH_YMD);
					String cvstoreSokhoTchYmd = dataMapChTSeikySknKnrn.getString(JBSbatCH_T_NYUKIN.CVSTORE_SOKHO_TCH_YMD);
					
					// 取得した３項目(「外部組織収納年月日」,「コンビニリアル速報通知年月日」,「コンビニ速報通知年月日」)から最古の日付の項目を「充当完了年月日」に設定をする。
					if(outOrgShunoYmd != null && !outOrgShunoYmd.isEmpty())
					{
						if(jutoFinYmd.isEmpty() || outOrgShunoYmd.compareTo(jutoFinYmd) < 0)
						{
							jutoFinYmd = outOrgShunoYmd;
						}
					}
					if(cvstoreRealShokoTchYmd != null && !cvstoreRealShokoTchYmd.isEmpty())
					{
						if(jutoFinYmd.isEmpty() || cvstoreRealShokoTchYmd.compareTo(jutoFinYmd) < 0)
						{
							jutoFinYmd = cvstoreRealShokoTchYmd;
						}
					}
					if(cvstoreSokhoTchYmd != null && !cvstoreSokhoTchYmd.isEmpty())
					{
						if(jutoFinYmd.isEmpty() || cvstoreSokhoTchYmd.compareTo(jutoFinYmd) < 0)
						{
							jutoFinYmd = cvstoreSokhoTchYmd;
						}
					}
					dataMapChTSeikySknKnrn = db_CH_T_SEIKY_SKN_KNRN.selectNext();
				}
				
			}
			// (b)上記以外の場合
			else
			{
				// 「充当完了年月日」に(1)で取得したで取得した債権.充当完了年月日を設定する。
				jutoFinYmd = dataMapKkTKakins.getString(JBSbatCH_T_SAIKEN.JUTO_FIN_YMD);
			}
			
// ANK-4064-02-00対応 20210906 星野 ADD START
			// 債権STが「収納済」 かつ 充当完了年月日が空白の場合
			if ( SAIKEN_STAT_SHUNO_ZUMI.equals(workSaikenStat) && JCHStringUtil.isNullBlank(jutoFinYmd) )
			{
				// 念のため、債権年月の桁数を確認 YYYYMMの6桁のはず
				String saikenYm = dataMapKkTKakins.getString(JBSbatCHIFE095.SAIKEN_YM);
				if(!JCHStringUtil.isNullBlank(saikenYm) && saikenYm.length() == 6)
				{
					// ”債権年月＋01”(当月初日)を設定する
					jutoFinYmd = saikenYm + "01";
				}
				
			}
// ANK-4064-02-00対応 20210906 星野 ADD END
			
			// (3)連携項目「督促ｽﾃｰﾀｽ更新日」の算出
			
			// 督促ｽﾃｰﾀｽ更新日
			String tokusokuStatUpdYmd = "";
			
			// (1)で取得した督促ｽﾃｰﾀｽを取得
			String workTokusokuStat = dataMapKkTKakins.getString(JBSbatCH_T_TOKUSOKU.TOKUSOKU_STAT);
			
			
			if(workTokusokuStat == null || workTokusokuStat.isEmpty())
			{
				// 「督促ステータス」に"00"を設定
				workTokusokuStat = TOKUSOKU_STAT_NASHI;
			}
			
			// (a)(1)で取得した督促ｽﾃｰﾀｽ ＝ "90"：貸倒登録済　の場合
			if(TOKUSOKU_STAT_KASHID_ZUMI.equals(workTokusokuStat))
			{
				// 「督促ｽﾃｰﾀｽ更新日」に(1)で取得したで取得した督促.督促異動年月日を設定する。
				tokusokuStatUpdYmd = dataMapKkTKakins.getString(JBSbatCH_T_TOKUSOKU.TOKUSOKU_IDO_YMD);
			}
			// (b)上記以外の場合
			else
			{
				// 「督促ｽﾃｰﾀｽ更新日」に空（''）を設定する。
				tokusokuStatUpdYmd = EMPTY_STRING;
			}
			
			// (4)連携項目「CIC連携内容CD」の算出
			// CIC連携内容C
			String cicRnkiNaiyoCd = "";
			
			// (1)で取得したCIC連携内容コード
			String workCicRnkiNaiyoCd = dataMapKkTKakins.getString(JBSbatCHIFE095.CIC_RNKI_NAIYO_CD);
			
			//(a)(1)で取得したCIC連携内容コードが取得できなかった（NULL）場合
			if(workCicRnkiNaiyoCd == null || workCicRnkiNaiyoCd.isEmpty())
			{
				// 「CIC連携内容CD」に"00"を設定
				cicRnkiNaiyoCd = CIC_RNKI_NAIYO_CD_TUJYO_RNK;
			}
			else
			{
				// 「CIC連携内容CD」に(1)で取得したCIC連携内容コードを設定
				cicRnkiNaiyoCd = workCicRnkiNaiyoCd;
			}
			
			// (5) CIC対象債権情報ファイル出力
			
			// お客さまID
			outmap.setString(JBSbatCHIFE095.CUST_ID, custId);
			// 請求契約番号
			outmap.setString(JBSbatCHIFE095.SEIKY_KEI_NO, dataMapKkTKakins.getString(JBSbatCHIFE095.SEIKY_KEI_NO));
			// 債権年月
			outmap.setString(JBSbatCHIFE095.SAIKEN_YM, dataMapKkTKakins.getString(JBSbatCHIFE095.SAIKEN_YM));
			// 債権ｽﾃｰﾀｽ
			outmap.setString(JBSbatCHIFE095.SAIKEN_STAT, dataMapKkTKakins.getString(JBSbatCHIFE095.SAIKEN_STAT));
			// 支払期限年月日
			outmap.setString(JBSbatCHIFE095.PAY_KIGEN_YMD, dataMapKkTKakins.getString(JBSbatCHIFE095.PAY_KIGEN_YMD));
			// 充当完了年月日
			outmap.setString(JBSbatCHIFE095.JUTO_FIN_YMD , jutoFinYmd);
			// 督促ｽﾃｰﾀｽ
			outmap.setString(JBSbatCHIFE095.TOKUSOKU_STAT, workTokusokuStat);
			// 督促ｽﾃｰﾀｽ更新日
			outmap.setString(JBSbatCHIFE095.TOKUSOKU_STAT_UPD_YMD, tokusokuStatUpdYmd);
			// CIC連携内容CD
			outmap.setString(JBSbatCHIFE095.CIC_RNKI_NAIYO_CD, cicRnkiNaiyoCd);
			// CIC連携内容発生日
			outmap.setString(JBSbatCHIFE095.CIC_RNKI_NAIYO_HASSEI_YMD, dataMapKkTKakins.getString(UPD_UNYO_YMD));
			outmap.setOutFlg(true);
			
			// 出力共通電文に入出力インターフェースを設定する。
			outputItem.addOutMapList(outmap); 
			
			
// ANK-4204-00-00対応 20220419 星野 ADD START
			/////////////////////////////////////////////////////////////////////
			/// mineoCIC対象債権情報重複無しファイル用項目取得ファイル の出力 ///
			/////////////////////////////////////////////////////////////////////
			outputCHIFM408(outputItem, dataMapKkTKakins);
// ANK-4204-00-00対応 20220419 星野 ADD END
			
			dataMapKkTKakins = db_KK_T_KAKINS.selectNext();
		}
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
// ANK-4204-00-00対応 20220419 星野 ADD START
	/**
	 * mineoCIC対象債権情報重複無しファイル用項目取得ファイル の出力
	 * @throws Exception 
	 */
	private void outputCHIFM408(JBSbatOutputItem outputItem, JBSbatCommonDBInterface dataMapKkTKakins) throws Exception 
	{
		
		String saikenNo = dataMapKkTKakins.getString(JBSbatCH_T_SAIKEN.SAIKEN_NO);
		
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		// 請求契約番号
		outmap.setString(JBSbatCHIFM408.SEIKY_KEI_NO, dataMapKkTKakins.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO));
		// 債権年月
		outmap.setString(JBSbatCHIFM408.SAIKEN_YM, dataMapKkTKakins.getString(JBSbatCH_T_SAIKEN.SAIKEN_YM));
		// 債権番号
		outmap.setString(JBSbatCHIFM408.SAIKEN_NO, saikenNo);
		
		String jutoYmd = "";
		BigDecimal jutoAmnt = new BigDecimal(0);
		
		// 充当を検索
		executeCH_T_JUTO_CH_SELECT_005(saikenNo);
		JBSbatCommonDBInterface dataMapJuto = db_CH_T_JUTO.selectNext();
		
		while(null != dataMapJuto)
		{
			// 充当日
			String jutoYmdTmp = dataMapJuto.getString(JBSbatCH_T_JUTO.JUTO_YMD);
			if( !JCHStringUtil.isNullBlank(jutoYmdTmp) && jutoYmdTmp.compareTo(jutoYmd)>0 )
			{
				// 最大の充当日を採用
				jutoYmd = jutoYmdTmp;
			}
			
			// 充当額
			String jutoAmntTmp =  dataMapJuto.getString(JBSbatCH_T_JUTO.JUTO_AMNT);
			if( !JCHStringUtil.isNullBlank(jutoAmntTmp) )
			{
				jutoAmnt = jutoAmnt.add(new BigDecimal(jutoAmntTmp));
			}
			
			dataMapJuto = db_CH_T_JUTO.selectNext();
		}
		
		// 充当日
		outmap.setString(JBSbatCHIFM408.JUTO_YMD, jutoYmd);
		// 充当額
		String jutoAmntStr = jutoAmnt.toString();
		// 念のため8桁に揃える（左が桁落ちする）
		if(jutoAmntStr.length() > 8)
		{
			jutoAmntStr = jutoAmntStr.substring(jutoAmntStr.length()-8);
		}
		outmap.setString(JBSbatCHIFM408.JUTO_AMNT, jutoAmntStr);
		
		outmap.setOutFlg(true);
		
		// 出力共通電文に入出力インターフェースを設定する。
		outputItem.addOutMapList_2(outmap); 
		
		
	}
// ANK-4204-00-00対応 20220419 星野 ADD END

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		if(db_KK_T_KAKINS != null)
		{
			db_KK_T_KAKINS.close();
		}
		if(db_CH_T_SEIKY_SKN_KNRN != null)
		{
			db_CH_T_SEIKY_SKN_KNRN.close();
		}
// ANK-4204-00-00対応 20220419 星野 ADD START
		if(db_CH_T_JUTO != null)
		{
			db_CH_T_JUTO.close();
		}
// ANK-4204-00-00対応 20220419 星野 ADD END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	* CH_SELECT_008（KK_T_KAKINS）を実行結果を取得する。
	* @param custID お客様ID
	* @throws Exception
	*/
	private void executeKK_T_KAKINS_CH_SELECT_008(String custId) throws Exception
	{
		// バインド変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
// IT1-2021-0000065対応 20210802 星野 ADD START
		paramList.setValue(super.opeDate);
		paramList.setValue(super.opeDate);
// IT1-2021-0000065対応 20210802 星野 ADD END
		paramList.setValue(custId);
		
		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_CH_SELECT_008);
	}
	
	/**
	* CH_T_SELECT_006（CH_T_SEIKY_SKN_KNRN）を実行結果を取得する。
	* @param saikenNo 請求番号
	* @throws Exception
	*/
	private void executeCH_T_SEIKY_SKN_KNRN_CH_SELECT_006(String saikenNo) throws Exception
	{
		// バインド変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(saikenNo);
		
		// DBアクセスを実行します
		db_CH_T_SEIKY_SKN_KNRN.selectBySqlDefine(paramList, CH_T_SEIKY_SKN_KNRN_CH_SELECT_006);
	}
	
// ANK-4204-00-00対応 20220419 星野 ADD START
	/**
	* CH_SELECT_005（CH_T_JUTO）を実行し結果を取得する。
	* @param saikenNo 債権番号
	* @throws Exception
	*/
	private void executeCH_T_JUTO_CH_SELECT_005(String saikenNo) throws Exception
	{
		// バインド変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(saikenNo);
		
		// DBアクセスを実行します
		db_CH_T_JUTO.selectBySqlDefine(paramList, CH_T_JUTO_CH_SELECT_005);
	}
// ANK-4204-00-00対応 20220419 星野 ADD END
}
