/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKojihiKapKeiUtzeiEdit
*	ソースファイル名	：JBSbatACKojihiKapKeiUtzeiEdit.java
*	作成者				：富士通　
*	作成日				：2018年08月21日
*＜機能概要＞
*　標準工事費（うち消費税）更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v38.00.00	2018/08/21  FJ）寺園	【OM-2018-0000744】新規
*	v45.00.00	2019/08/16  FJ) 王  	【ANK-3636-00-00】消費増税対応（8%⇒10%）
*	v45.00.01	2019/09/05  FJ) 舘山    【IT2-2019-0000027】税率が複数ある場合の標準工事費の消費税分の差引不正
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM142;
import eo.business.util.file.JBSbatACIFM306;
import eo.business.util.file.JBSbatACIFM310;
import eo.common.constant.JACStrConst;
import eo.common.util.JACTaxCalcShikibetuCodeUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKojihiKapKeiUtzeiEdit extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 業務共通クラスインスタンス */
	private JACbatRknBusinessUtil	rknBusinessUtil			= null;

	/** 税計算識別コード（消費税(内税)）8% */
	public static final String TAX_CALC_SKBT_CD_UTZEI = "03";
// ANK-3636-00-00 ADD START
	/** 税計算識別コード管理クラス */
	private JACTaxCalcShikibetuCodeUtil jACTaxCalcShikibetuCodeUtil = null;
// ANK-3636-00-00 ADD END

// ▽▽▽ IT2-2019-0000027 ADD START
	/** 標準工事費計算対象外の消費税除外項目リスト */
	private ArrayList<String> excludeCalcTaxPrcKmkList = null;
	
	/** 業務パラメータ取得キー（計算対象外消費料金項目） */
	private static final String EXCLUDE_TAX_PRC_KMK = "AC_EXCL_RC_TAX_PKMK";
// △△△ IT2-2019-0000027 ADD END
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		this.rknBusinessUtil = new JACbatRknBusinessUtil(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 + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
// ▽▽▽ IT2-2019-0000027 ADD START
		// 変数を初期化
		excludeCalcTaxPrcKmkList = new ArrayList<String>();
		
		// 標準工事費計算対象外の消費税除外項目リスト
		String prcKmkCds = new JACbatParamUtil(commonItem).getGyoumuParameter(EXCLUDE_TAX_PRC_KMK);
		if (prcKmkCds != null)
		{
			excludeCalcTaxPrcKmkList.addAll(Arrays.asList(prcKmkCds.split(",")));
		}
// △△△ IT2-2019-0000027 ADD END
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @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][入力Ｍのみ存在する]");
			
			// 会計用売掛金情報作成
			this.makeOutputInfo(mastMap, outputInItem);
			// フラグ．マスタ ← true
			this.setMastProcFlg(true);
		}
		// 入力Ｔのみ存在する
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
			
			// 請求内訳（標準工事費）情報（Tのみ）
			// 何もしない
			// フラグ．トラン ← true
			this.setTranProcFlg(true);
		}
		// 入力Ｍ、入力Ｔともに存在する
		else
		{
			// マッチングキー（請求契約番号）取得
			String mastSeikyKeiNo = mastMap.getString(JBSbatACIFM142.SEIKY_KEI_NO);
			String tranSeikyKeiNo = tranMap.getString(JBSbatACIFM310.SEIKY_KEI_NO);
			
			// 入力Ｍ＝入力Ｔ（マッチ）
			if (mastSeikyKeiNo.compareTo(tranSeikyKeiNo) == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");
				
// ▽▽▽ IT2-2019-0000027 ADD START
				// それぞれの料金項目コードを取得する。
				String mastPrcKmkCd = mastMap.getString(JBSbatACIFM142.PRC_KMK_CD);
				String tranPrcKmkCd = tranMap.getString(JBSbatACIFM310.PRC_KMK_CD);
// △△△ IT2-2019-0000027 ADD END
				
// ▽▽▽ IT2-2019-0000027 Modify START
//				// 会計用売掛金情報の会計内訳種別コードがうち消費税の場合、消費税の更新を行う。
//				if (JACStrConst.KAIK_UCWK_SBT_DTL_CD_UTZEI.equals(mastMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)))

				// 会計用売掛金情報の会計内訳種別コードがうち消費税かつ、標準工事費と同一税率の場合、消費税の更新を行う。
				if (JACStrConst.KAIK_UCWK_SBT_DTL_CD_UTZEI.equals(mastMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)) 
					&& isReCalcTax(mastPrcKmkCd, tranPrcKmkCd)
					)
// △△△ IT2-2019-0000027 Modify END
				{
					// 会計用売掛金情報作成（うち消費税更新）
					this.makeOutputInfoUtzei(mastMap, tranMap, outputInItem);
				}
				else
				{
					// 会計用売掛金情報作成
					this.makeOutputInfo(mastMap, outputInItem);
				}
				// フラグ．マスタ ← true
				this.setMastProcFlg(true);
			}
			// 入力Ｍ＜入力Ｔ
			else if (mastSeikyKeiNo.compareTo(tranSeikyKeiNo) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");
				
				// 会計用売掛金情報作成
				this.makeOutputInfo(mastMap, outputInItem);
				// フラグ．マスタ ← true
				this.setMastProcFlg(true);
			}
			// 入力Ｍ＞入力Ｔ
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");
				
				// 請求内訳（標準工事費）情報（Tのみ）
				// 何もしない
				// フラグ．トラン ← true
				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]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 会計用売掛金情報を出力します。
	 * 
	 * @param inMap 入力電文（会計用売掛金情報ソート済み）
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 入力電文コピー
		outMap.setMap(inMap.getMap());
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
	
	/**
	 * 会計用売掛金情報を出力します。
	 * 
	 * @param inMap 入力電文（会計用売掛金情報ソート済み）
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfoUtzei(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// 金額
		// 税額計算により消費税額を算出
		BigDecimal mastAmnt = new BigDecimal(mastMap.getString(JBSbatACIFM142.AMNT));
		BigDecimal tranAmnt = new BigDecimal(tranMap.getString(JBSbatACIFM310.AMNT));
// ANK-3636-00-00 ADD START
		// 税計算識別コード管理クラスのインスタンス
		this.jACTaxCalcShikibetuCodeUtil  = new JACTaxCalcShikibetuCodeUtil(JACStrConst.CALLER_BATCH, commonItem.getConnection());
		
		// 料金項目コード（請求内訳）の上１桁
		String taxRateCd = tranMap.getString(JBSbatACIFM310.PRC_KMK_CD).substring(0, 1);
		String taxSkbtCd = this.jACTaxCalcShikibetuCodeUtil.getTaxSkbtCd(taxRateCd, JACStrConst.UZEI_SZEI_SKBT_UCHI, super.opeDate);
// ANK-3636-00-00 ADD END
// ANK-3636-00-00 MOD START
//		BigDecimal[] tax = this.rknBusinessUtil.calcTaxCharge(TAX_CALC_SKBT_CD_UTZEI, tranAmnt, super.opeDate);
		BigDecimal[] tax = this.rknBusinessUtil.calcTaxCharge(taxSkbtCd, tranAmnt, super.opeDate);
// ANK-3636-00-00 MOD END
		mastAmnt = mastAmnt.subtract(tax[0]);

		// 入力電文コピー
		outMap.setMap(mastMap.getMap());

		outMap.setString(JBSbatACIFM306.AMNT, mastAmnt.toString());
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
// ▽▽▽ IT2-2019-0000027 ADD START
	/**
	 * 消費税を再計算するかどうか判定する
	 * <br>
	 * @param mastPrcKmkCd	マスタ料金項目コード（消費税料金項目）
	 * @param tranPrcKmcCd トラン料金項目コード（工事費割賦用）
	 * @return
	 */
	private boolean isReCalcTax(String mastPrcKmkCd, String tranPrcKmcCd)
	{
		// 除外された料金項目かどうかを判断する。
		if (mastPrcKmkCd != null && tranPrcKmcCd != null && !excludeCalcTaxPrcKmkList.contains(mastPrcKmkCd))
		{
			// 先頭１バイト目を比較する（消費税の税率が同一の料金項目）
			if (mastPrcKmkCd.substring(0, 1).equals(tranPrcKmcCd.substring(0, 1)))
			{
				return true;
			}
		}
		return false;
	}
// △△△ IT2-2019-0000027 ADD END
}
