/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSknSikySchDel
*	ソースファイル名	：JBSbatCHSknSikySchDel.java
*	作成者				：富士通　
*	作成日				：2013年07月22日
*＜機能概要＞
*　債権請求スキーマ削除更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v6.00.00	2013/11/21  FJ)伊藤		【】新規作成
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatCHIFM193;
import eo.business.util.file.JBSbatCHIFM194;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHSknSikySchDel extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(債権)*/
	private final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** テーブル(請求)*/
	private final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";
	
	/** テーブル(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;

	/** テーブル(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 削除対象固定値マップ */
	private JBSbatCommonDBInterface delValueMap = new JBSbatCommonDBInterface ();
	
	/** 固定値：無効フラグID*/
	private final String MK_FLG = "MK_FLG";
	
	/** 固定値：削除運用日*/
	private final String DEL_UNYO_YMD = "DEL_UNYO_YMD";
	
	/** 退避：請求契約番号*/
	private String escpSeikyKeyNo = JACStrConst.KARA_MOJI;
	
	/** 作業レコード件数 */
	private BigDecimal workCount;
	
	/** コミットを行うレコード件数 */
	private BigDecimal commitCount;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		db_CH_T_SAIKEN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SAIKEN);
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][unyoYmd=" + super.opeDate + "]");
		
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);
		
		//更新請求契約番号カウント数初期化
		workCount = new BigDecimal("0");
		
		//コミットカウント数設定
		commitCount = new BigDecimal(freeItems[0]);
		
		//無効フラグと削除運用日をセット
		delValueMap.setValue(MK_FLG, JACStrConst.MK_FLG_MK);
		delValueMap.setValue(DEL_UNYO_YMD, super.opeDate);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @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][入力Ｍのみ存在する]");
			
			// マッチングキー（請求契約番号）取得
			String mastSeikyKeiNo = mastMap.getString(JBSbatCHIFM193.SEIKY_KEI_NO);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][escp_SEIKY_KEI_NO=" + escpSeikyKeyNo + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][mast_SEIKY_KEI_NO=" + mastSeikyKeiNo + "]");
			
			if(escpSeikyKeyNo == null | escpSeikyKeyNo.equals(JACStrConst.KARA_MOJI))
			{
				escpSeikyKeyNo = mastSeikyKeiNo;
			}
			
			if(!escpSeikyKeyNo.equals(mastSeikyKeiNo))
			{
				executeCommit();
				
				escpSeikyKeyNo = mastSeikyKeiNo;
			}
			
			setDeleteFlagSaiken(mastMap);
			
			// 次の削除候補入金情報読み込み
			this.setMastProcFlg(true);
		}
		// 削除請求情報のみ存在する
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
			
			// マッチングキー（請求契約番号）取得
			String tranSeikyKeiNo = tranMap.getString(JBSbatCHIFM194.SEIKY_KEI_NO);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][escp_SEIKY_KEI_NO=" + escpSeikyKeyNo + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][tran_SEIKY_KEI_NO=" + tranSeikyKeiNo + "]");
			
			if(escpSeikyKeyNo == null | escpSeikyKeyNo.equals(JACStrConst.KARA_MOJI))
			{
				escpSeikyKeyNo = tranSeikyKeiNo;
			}
			
			if(!escpSeikyKeyNo.equals(tranSeikyKeiNo))
			{
				executeCommit();
				
				escpSeikyKeyNo = tranSeikyKeiNo;
			}
			
			setDeleteFlagSeiky(tranMap);
			
			// 次の金庫入金番号読み込み
			this.setTranProcFlg(true);
		}
		// 削除債権情報、削除請求情報ともに存在する
		else
		{
			// マッチングキー（請求契約番号）取得
			String mastSeikyKeiNo = mastMap.getString(JBSbatCHIFM193.SEIKY_KEI_NO);
			String tranSeikyKeiNo = tranMap.getString(JBSbatCHIFM194.SEIKY_KEI_NO);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][escp_SEIKY_KEI_NO=" + escpSeikyKeyNo + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][mast_SEIKY_KEI_NO=" + mastSeikyKeiNo + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][tran_SEIKY_KEI_NO=" + tranSeikyKeiNo + "]");
			
			// マッチ
			int retCompare = mastSeikyKeiNo.compareTo(tranSeikyKeiNo);
			
			if(escpSeikyKeyNo == null | escpSeikyKeyNo.equals(JACStrConst.KARA_MOJI))
			{
				if (retCompare <= 0)
				{
					escpSeikyKeyNo = mastSeikyKeiNo;
				}
				else
				{
					escpSeikyKeyNo = tranSeikyKeiNo;
				}
			}
			
			if(!escpSeikyKeyNo.equals(mastSeikyKeiNo) && !escpSeikyKeyNo.equals(tranSeikyKeiNo))
			{
				executeCommit();
				
				if (retCompare <= 0)
				{
					escpSeikyKeyNo = mastSeikyKeiNo;
				}
				else
				{
					escpSeikyKeyNo = tranSeikyKeiNo;
				}
			}

			if (retCompare == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");
				
				setDeleteFlagSaiken(mastMap);
				setDeleteFlagSeiky(tranMap);
				
				// 次の削除債権情報読み込み
				this.setMastProcFlg(true);
				// 次の削除請求情報読み込み
				this.setTranProcFlg(true);
			}
			// 入力Ｍ＜入力Ｔ
			else if (retCompare < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");
				
				setDeleteFlagSaiken(mastMap);
				
				// 次の削除債権情報読み込み
				this.setMastProcFlg(true);
			}
			// 入力Ｍ＞入力Ｔ
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");
				
				setDeleteFlagSeiky(tranMap);
				
				// 次の削除請求情報読み込み
				this.setTranProcFlg(true);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		db_CH_T_SAIKEN.clearBatch();
		db_CH_T_SEIKY.clearBatch();
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_CH_T_SAIKEN.close();
		db_CH_T_SEIKY.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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 
	 */
	private void setDeleteFlagSaiken(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface ();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSaiken][SAIKEN_NO=" + mastMap.getString(JBSbatCHIFM193.SAIKEN_NO) + "]");
		whereMap.setValue(JBSbatCHIFM193.SAIKEN_NO,mastMap.getString(JBSbatCHIFM193.SAIKEN_NO));
		
		db_CH_T_SAIKEN.updateByPrimaryKeysBatch(whereMap, delValueMap, 2);
	}
	
	/**
	 * 
	 */
	private void setDeleteFlagSeiky(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface ();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][SEIKY_NO=" + tranMap.getString(JBSbatCHIFM194.SEIKY_NO) + "]");
		whereMap.setValue(JBSbatCHIFM194.SEIKY_NO,tranMap.getString(JBSbatCHIFM194.SEIKY_NO));
		
		db_CH_T_SEIKY.updateByPrimaryKeysBatch(whereMap, delValueMap, 2);
	}
	
	private void executeCommit() throws Exception
	{
		//レコード数を増加。
		workCount = workCount.add(BigDecimal.ONE);
		
		if(workCount.compareTo(commitCount) == 0)
		{
			db_CH_T_SAIKEN.clearBatch();
			db_CH_T_SEIKY.clearBatch();
			
			super.commit();
			
			//レコード数クリア
			workCount = BigDecimal.ZERO;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setDeleteFlagSeiky][COMMIT]");
		}
	}
}
