/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHKnkMoveDataChsht
*	ソースファイル名	：JBSbatCHKnkMoveDataChsht.java
*	作成者				：富士通
*	作成日				：2011年10月14日
*＜機能概要＞
*　金庫移動データ抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/14   富士通		新規作成
*	v5.00.00	2013/09/09	FJ)早崎		【OM-2013-0001684】抽出元を金庫スキーマから料金対応記録へ変更
*	v68.00.00	2023/12/05	FJ)美濃原	【ANK-4475-00-00】インボイス対応 STEP2 新規作成（IT1-2023-0000075）
*********************************************************************/
package eo.business.service;


import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM214;
import eo.business.util.table.JBSbatCH_T_KNK;
import eo.business.util.table.JBSbatCH_T_PRC_TAIOKRK;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHKnkMoveDataChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(金庫)*/
	private static final String D_TBL_NAME_CH_T_KNK = "CH_T_KNK";

	/** SQL定義キー(CH_SELECT_004)*/
	private static final String CH_T_KNK_CH_SELECT_004 = "CH_SELECT_004";

	/** SQL定義キー(CH_SELECT_010)*/
	private static final String CH_T_KNK_CH_SELECT_010 = "CH_SELECT_010";

	/** SQL定義キー(CH_SELECT_011)*/
	private static final String CH_T_KNK_CH_SELECT_011 = "CH_SELECT_011";

	/** テーブルアクセスクラス(金庫)*/
	private JBSbatSQLAccess db_CH_T_KNK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．金庫番号*/
	private String bkKnkNo = null;

	/** 出力．金庫情報リスト*/
	private ArrayList<JBSbatCommonDBInterface> knkInfoList = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_CH_T_KNK 			= new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_KNK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		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 JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]");
		
		// 金庫番号
		String knkNo = inMap.getString(JBSbatCH_T_PRC_TAIOKRK.KNK_NO);
		
		// 料金対応記録種別詳細コード
		String prcTaioKirokSbtDtlCd = inMap.getString(JBSbatCH_T_PRC_TAIOKRK.PRC_TAIO_KIROK_SBT_DTL_CD);

		// 出力．金庫情報リストの初期化
		knkInfoList = new ArrayList<JBSbatCommonDBInterface>();

		// 料金対応記録種別詳細コード = "1401"(金庫登録) の場合
		if(JACStrConst.TKRK_SBTD_KNK_ADD.equals(prcTaioKirokSbtDtlCd))
		{
			// 金庫情報を取得
			getKnkInf(knkNo);
		}
// v68.00.00 ANK-4475-00-00 MOD START
//		// 料金対応記録種別詳細コード = "1402"(仮受金移動) または "1403"(預り金移動) または "1406"(処理済金移動) の場合
//		else if(JACStrConst.TKRK_SBTD_KARIUKE_IDO.equals(prcTaioKirokSbtDtlCd)
//				|| JACStrConst.TKRK_SBTD_AZUKIN_IDO.equals(prcTaioKirokSbtDtlCd)
//				|| JACStrConst.TKRK_SBTD_ZUMI_AMNT_IDO.equals(prcTaioKirokSbtDtlCd))
//		{
		// 料金対応記録種別詳細コード = "1402"(仮受金移動) または "1403"(預り金移動) または "1406"(処理済金移動) 
		//                              または "1407"(預り金移動バッチ) または "1408"(処理済金移動バッチ) の場合
		else if(JACStrConst.TKRK_SBTD_KARIUKE_IDO.equals(prcTaioKirokSbtDtlCd)
				|| JACStrConst.TKRK_SBTD_AZUKIN_IDO.equals(prcTaioKirokSbtDtlCd)
				|| JACStrConst.TKRK_SBTD_ZUMI_AMNT_IDO.equals(prcTaioKirokSbtDtlCd)
				|| JACStrConst.TKRK_SBTD_AZUKIN_IDO_BATCH.equals(prcTaioKirokSbtDtlCd)
				|| JACStrConst.TKRK_SBTD_ZUMI_AMNT_IDO_BATCH.equals(prcTaioKirokSbtDtlCd))
		{
// v68.00.00 ANK-4475-00-00 MOD END
			// 1レコード目 または 退避．金庫番号 ≠ 金庫番号
			if(bkKnkNo == null || !bkKnkNo.equals(knkNo))
			{
				// 金庫情報(金庫移動)を取得
				getKnkIdoInf(knkNo);
				
				// 退避．金庫番号 ← 金庫
				bkKnkNo = knkNo;
			}
			else
			{
				// 退避．金庫番号 ← 金庫
				bkKnkNo = knkNo;
				
				// 出力対象外
				return null;
			}
			
		}
		// 料金対応記録種別詳細コード = "1404"(金庫統合) の場合
		else if(JACStrConst.TKRK_SBTD_KNK_TOGO.equals(prcTaioKirokSbtDtlCd))
		{
			// 金庫情報(金庫統合)を取得
			getKnkTogoInf(knkNo);
			
		}
		//  料金対応記録種別詳細コード = "1405"(金庫取消) の場合
		else if(JACStrConst.TKRK_SBTD_KNK_DEL.equals(prcTaioKirokSbtDtlCd))
		{
			// 金庫情報(金庫移動)を取得
			getKnkIdoInf(knkNo);
		}
		// 上記以外の場合
		else
		{
			// 出力対象外
			return null;
		}

		// 金庫移動抽出データ作成
		JBSbatOutputItem outputInf = makeOutputInf(inMap, prcTaioKirokSbtDtlCd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][outputInf=" + outputInf.getOutMapList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInf;	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 出力電文(金庫移動抽出データ)を取得します。
	 * 
	 * @param inMap 入力電文
	 * @param prcTaioKirokSbtDtlCd 料金対応記録種別詳細コード
	 * @return outputInf 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutputInf(JBSbatServiceInterfaceMap inMap, String prcTaioKirokSbtDtlCd) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInf]");

		JBSbatOutputItem outputInf = new JBSbatOutputItem();
		JBSbatCommonDBInterface outDbData = new JBSbatCommonDBInterface();
		
		JBSbatServiceInterfaceMap outmap = null;
		
		// 金庫情報取得件数分下記処理を行う
		for(int i = 0; i < knkInfoList.size(); i++)
		{
			outmap = new JBSbatServiceInterfaceMap();
			outDbData = knkInfoList.get(i);
		

			// 料金対応記録種別詳細コード = "1405"(金庫取消) の場合
			if(JACStrConst.TKRK_SBTD_KNK_DEL.equals(prcTaioKirokSbtDtlCd))
			{
			
				// 金庫番号
				outmap.setString(JBSbatCHIFM214.KNK_NO,		JACStrConst.KARA_MOJI);
				
				// 請求契約番号
				outmap.setString(JBSbatCHIFM214.SEIKY_KEI_NO,		JACStrConst.KARA_MOJI);
				
				// 金庫料金項目コード
				outmap.setString(JBSbatCHIFM214.KNK_PRC_KMK_CD,		JACStrConst.KARA_MOJI);
				
			}
			// 上記以外の場合
			else
			{
				// 金庫番号
				outmap.setString(JBSbatCHIFM214.KNK_NO,		outDbData.getString(JBSbatCH_T_KNK.KNK_NO));
				
				// 請求契約番号
				outmap.setString(JBSbatCHIFM214.SEIKY_KEI_NO,		outDbData.getString(JBSbatCH_T_KNK.SEIKY_KEI_NO));
				
				// 金庫料金項目コード
				outmap.setString(JBSbatCHIFM214.KNK_PRC_KMK_CD,		outDbData.getString(JBSbatCH_T_KNK.KNK_PRC_KMK_CD));
				
			}
			
			// 料金対応記録種別詳細コード = "1401"(金庫登録) の場合
			if(JACStrConst.TKRK_SBTD_KNK_ADD.equals(prcTaioKirokSbtDtlCd))
			{
				// 移動元請求先番号
				outmap.setString(JBSbatCHIFM214.MV_MT_SEIKY_KEI_NO,		JACStrConst.KARA_MOJI);
			
				// 移動元金庫ステータス
				outmap.setString(JBSbatCHIFM214.MV_MT_KNK_STAT,		JACStrConst.KARA_MOJI);
			
				// 移動元金庫ID
				outmap.setString(JBSbatCHIFM214.MV_MT_KNK_ID,		JACStrConst.KARA_MOJI);
			}
			// 上記以外の場合
			else
			{
				// 移動元請求先番号
				outmap.setString(JBSbatCHIFM214.MV_MT_SEIKY_KEI_NO,		inMap.getString(JBSbatCH_T_PRC_TAIOKRK.SEIKY_KEI_NO));
			
				// 移動元金庫ステータス
				outmap.setString(JBSbatCHIFM214.MV_MT_KNK_STAT,		inMap.getString(JBSbatCH_T_PRC_TAIOKRK.CHG_BF_PRC_KMK_CD));
			
				// 移動元金庫ID
				outmap.setString(JBSbatCHIFM214.MV_MT_KNK_ID,		inMap.getString(JBSbatCH_T_PRC_TAIOKRK.KNK_NO));

			}
			
			// 入金番号
			outmap.setString(JBSbatCHIFM214.NYUKIN_NO,		outDbData.getString(JBSbatCH_T_KNK.NYUKIN_NO));
			
			// 金庫金額
			outmap.setString(JBSbatCHIFM214.KNK_AMNT,		outDbData.getString(JBSbatCH_T_KNK.KNK_AMNT));
			
			// 精算方法コード
			outmap.setString(JBSbatCHIFM214.SSN_WAY_CD,		outDbData.getString(JBSbatCH_T_KNK.SSN_WAY_CD));

			// 金庫移動コード
			outmap.setString(JBSbatCHIFM214.KNK_MOVE_CD,		outDbData.getString(JBSbatCH_T_KNK.KNK_MOVE_CD));
			
			// 更新年月日時分秒
			outmap.setString(JBSbatCHIFM214.UPD_DTM,		inMap.getString(JBSbatCH_T_PRC_TAIOKRK.UPD_DTM));

			// 更新オペレータアカウント
			outmap.setString(JBSbatCHIFM214.UPD_OPEACNT,		inMap.getString(JBSbatCH_T_PRC_TAIOKRK.UPD_OPEACNT));

			// ファイル出力する
			outmap.setOutFlg(true);

			// 出力共通電文に設定
			outputInf.addOutMapList(outmap);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf][outmap=" + outmap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf]");

		return outputInf;
	}
	
	/**
	 * 金庫情報を取得します。
	 * @param knkNo 金庫番号
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getKnkInf(String knkNo) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKnkInf]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		paramList.setValue(knkNo);		// 金庫番号

		// SQL実行
		executeCH_T_KNK_CH_SELECT_004(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_T_KNK.selectNext();
		
		// 取得結果判定
		if (dbMap == null)
		{
			// マスタ未存在エラー
			String[] msgParam = new String[]
			{
				JBSbatCH_T_KNK.TABLE_NAME,
				paramList.getList().toString()
			};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0240CW, msgParam);
		}
		
		while(dbMap != null)
		{
			knkInfoList.add(dbMap);
			
			dbMap = db_CH_T_KNK.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKnkInf]");
	}

	
	/**
	 * 金庫情報(金庫移動)を取得します。
	 * @param knkNo 金庫番号
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getKnkIdoInf(String knkNo) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKnkIdoInf]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		paramList.setValue(knkNo);		// 金庫番号

		// SQL実行
		executeCH_T_KNK_CH_SELECT_010(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_T_KNK.selectNext();
		
		// 取得結果判定
		if (dbMap == null)
		{
			// マスタ未存在エラー
			String[] msgParam = new String[]
			{
				JBSbatCH_T_KNK.TABLE_NAME,
				paramList.getList().toString()
			};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0240CW, msgParam);
		}

		while(dbMap != null)
		{
			knkInfoList.add(dbMap);
			
			dbMap = db_CH_T_KNK.selectNext();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKnkIdoInf]");
	}
	
	/**
	 * 金庫情報(金庫統合)を取得します。
	 * @param knkNo 金庫番号
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getKnkTogoInf(String knkNo) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKnkTogoInf]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		paramList.setValue(knkNo);		// 金庫番号

		// SQL実行
		executeCH_T_KNK_CH_SELECT_011(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_T_KNK.selectNext();
		
		// 取得結果判定
		if (dbMap == null)
		{
			// マスタ未存在エラー
			String[] msgParam = new String[]
			{
				JBSbatCH_T_KNK.TABLE_NAME,
				paramList.getList().toString()
			};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0240CW, msgParam);
		}

		while(dbMap != null)
		{
			knkInfoList.add(dbMap);
			
			dbMap = db_CH_T_KNK.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKnkTogoInf]");
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_KNK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_010)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	移動元金庫番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_KNK_CH_SELECT_010(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CH_T_KNK.selectBySqlDefine(paramList, CH_T_KNK_CH_SELECT_010);
	}
	
	/**
	 * SQLKEY(CH_SELECT_011)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	金庫番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_KNK_CH_SELECT_011(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CH_T_KNK.selectBySqlDefine(paramList, CH_T_KNK_CH_SELECT_011);
	}
	
	/**
	 * SQLKEY(CH_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	金庫番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_KNK_CH_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CH_T_KNK.selectBySqlDefine(paramList, CH_T_KNK_CH_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
