/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatCHStumpDutyInfoOutput
 *	ソースファイル名	：JBSbatCHStumpDutyInfoOutput.java
 *	作成者				：富士通　
 *	作成日				：2020年10月13日
 *＜機能概要＞
 *　印紙税情報出力部品です。
 *＜修正履歴＞
 *	バージョン		修正日		修正者			修正内容
 * v52.00		2020/10/13	GDC)ニール		【ANK-3838-00-00】窓口払い手数料の顧客負担方式導入
 * v52.01		2021/01/27	FJ)星野			【IT2-2021-0000004】
 * v52.02		2021/02/22	FJ)星野			【IT2-2021-0000012】
 *********************************************************************/

package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM088;
import eo.business.util.file.JBSbatCHIFM359;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JACStrConst;
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;
import eo.framework.util.JBSbatStringUtil;

/**
 * 
 * @author n.alcoseba
 * 
 */
public class JBSbatCHStumpTaxInfoOutput extends JBSbatBusinessService {

	private List<Map<String, Object>> stampKbnMaps = new ArrayList<Map<String, Object>>();

	private static final String STAMP_KBN = "STAMP_KBN";
	private static final String MIN_AMNT = "MIN_AMNT";
	private static final String MAX_AMNT = "MAX_AMNT";
	private static final String STAMP_TAX_AMNT = "STAMP_TAX_AMNT";

	/** テーブル(料金スケジュール定義) */
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";
	/** テーブルアクセスクラス(コンテンツ契約) */
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;

	/** SQL定義キー(CH_SELECT_002) */
	private static final String ZM_M_WORK_PARAM_KNRI_CH_SELECT_002 = "CH_SELECT_002";

	private static final String CH_STAMP_DIV = "CH_STAMP_DIV";

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	@Override
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		super.setCommonInfo(commonItem);
		// 1. ZM_M_WORK_PARAM_KNRI_CH_SELECT_002
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		executeZM_M_WORK_PARAM_KNRI_CH_SELECT_002(super.opeDate);

		JBSbatCommonDBInterface dbMap = db_ZM_M_WORK_PARAM_KNRI.selectNext();

		while (dbMap != null) {
			// 2. WORK_PARAM_SETTE_VALUE の取得と分割
			String workParamSetteValue = dbMap.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
			String[] workParamSetteValues = workParamSetteValue.split(",");

			String stampKBN = workParamSetteValues[0];
			String minAMNT = workParamSetteValues[1];
			String maxAMNT = workParamSetteValues[2];
			String stampTaxAMNT = workParamSetteValues[3];

			// 3. stampKbnMapの作成と追加
			Map<String, Object> stampKbnMap = new HashMap<String, Object>();
			stampKbnMap.put(STAMP_KBN, stampKBN);
			stampKbnMap.put(MIN_AMNT, new BigDecimal(minAMNT));
			stampKbnMap.put(MAX_AMNT, new BigDecimal(maxAMNT));
			stampKbnMap.put(STAMP_TAX_AMNT, new BigDecimal(stampTaxAMNT));
			stampKbnMaps.add(stampKbnMap);

			dbMap = db_ZM_M_WORK_PARAM_KNRI.selectNext();
		}
	}

	/**
	 * 
	 * @param inMap
	 * @return JBSbatOutputItem
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception {

		// 出力共通電文を生成
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();
		String payWay = inMap.getString(JBSbatCHIFM088.PAY_WAY);
		String receiptFlg = inMap.getString(JBSbatCHIFM088.RECEIPT_FLG);
		BigDecimal receiptAmnt = asAmnt( inMap.getString(JBSbatCHIFM088.RECEIPT_AMNT) );
		BigDecimal receiptStaxAmnt = asAmnt( inMap.getString(JBSbatCHIFM088.RECEIPT_STAX_AMNT) );

		// 1. 処理対象判定
		// 支払方法が、口座振替、郵便自動振込で、領収金額が設定されているデータを、出力対象とする。
		// また、領収のみフラグが、"1"(領収のみ)で、領収金額が設定されているデータを、出力対象とする。
		if (
				( 
					JACStrConst.SEIKY_KHRI.equals(payWay) 
					|| JACStrConst.SEIKY_YUFUIRI.equals(payWay)
					|| JACStrConst.RECEIPT_ONLY_Y.equals(receiptFlg)
				)
				&& receiptAmnt.compareTo(BigDecimal.ZERO) > 0
		) {

			for (Map<String, Object> stampKbnMap : stampKbnMaps) {
				JBSbatServiceInterfaceMap outInfoMap = new JBSbatServiceInterfaceMap();


				BigDecimal minAMNT = (BigDecimal) stampKbnMap.get(MIN_AMNT);
				BigDecimal maxAMNT = (BigDecimal) stampKbnMap.get(MAX_AMNT);
				// 2.2 金額判定
				if (minAMNT.compareTo(receiptAmnt) <= 0 && maxAMNT.compareTo(receiptAmnt) >= 0) {
					// 3. 出力ファイル編集
					outInfoMap.set(JBSbatCHIFM359.HASSO_KBN, null);
					outInfoMap.set(JBSbatCHIFM359.SEIKY_KEI_NO, inMap.getString(JBSbatCHIFM088.SEIKY_KEI_NO));
					outInfoMap.set(JBSbatCHIFM359.SEIKY_YM, inMap.getString(JBSbatCHIFM088.SEIKY_YM));
// IT2-2021-0000012対応 20210222 星野 MOD START
//					outInfoMap.set(JBSbatCHIFM359.NM_1, inMap.getString(JBSbatCHIFM088.NM1));
//					outInfoMap.set(JBSbatCHIFM359.NM_2, inMap.getString(JBSbatCHIFM088.NM2));
//					outInfoMap.set(JBSbatCHIFM359.NM_3, inMap.getString(JBSbatCHIFM088.NM3));
					outInfoMap.set(JBSbatCHIFM359.NM_1, JBSbatStringUtil.Rtrim( inMap.getString(JBSbatCHIFM088.NM1) ) );
					outInfoMap.set(JBSbatCHIFM359.NM_2, JBSbatStringUtil.Rtrim( inMap.getString(JBSbatCHIFM088.NM2) ) );
					outInfoMap.set(JBSbatCHIFM359.NM_3, JBSbatStringUtil.Rtrim( inMap.getString(JBSbatCHIFM088.NM3) ) );
// IT2-2021-0000012対応 20210222 星野 MOD END
					outInfoMap.set(JBSbatCHIFM359.BANK_CD, inMap.getString(JBSbatCHIFM088.BANK_CD));
					outInfoMap.set(JBSbatCHIFM359.BANK_SHITEN_CD, inMap.getString(JBSbatCHIFM088.BANK_SHITEN_CD));
					outInfoMap.set(JBSbatCHIFM359.YOKIN_SHUMOKU_CD, inMap.getString(JBSbatCHIFM088.YOKIN_SHUMOKU_CD));
					outInfoMap.set(JBSbatCHIFM359.KOZA_NO, inMap.getString(JBSbatCHIFM088.KOZA_NO));

					outInfoMap.set(JBSbatCHIFM359.RECEIPT_AMNT, receiptAmnt);
					outInfoMap.set(JBSbatCHIFM359.RECEIPT_STAX_AMNT, receiptStaxAmnt);
					outInfoMap.set(JBSbatCHIFM359.RECEIPT_NOTAX_AMNT, receiptAmnt.subtract(receiptStaxAmnt));
					
					outInfoMap.set(JBSbatCHIFM359.STAMP_KBN, stampKbnMap.get(STAMP_KBN));
					outInfoMap.set(JBSbatCHIFM359.STAMP_CNT, "1");
					outInfoMap.set(JBSbatCHIFM359.STAMP_TAX_AMNT, stampKbnMap.get(STAMP_TAX_AMNT));
// IT2-2021-0000004対応 20210127 星野 ADD START
					outInfoMap.set(JBSbatCHIFM359.RECEIPT_FLG, inMap.getString(JBSbatCHIFM088.RECEIPT_FLG));
// IT2-2021-0000004対応 20210127 星野 ADD END

					outInfoMap.setOutFlg(true);
					outputInItem.addOutMapList(outInfoMap);
				}
			}
		} else {
			return null;
		}

		return outputInItem;
	}

	private BigDecimal asAmnt(String amntStr) {
		// 未設定は0円扱い
		if( amntStr == null || amntStr.trim().isEmpty() )
		{
			return BigDecimal.ZERO;
		}
		// 領収金額に"*"が設定されている場合は、領収金額なしとして0円扱い
		if( amntStr.contains("*") )
		{
			return BigDecimal.ZERO;
		}
		
		// 領収金額からカンマ編集を外す
		String replacedAmntStr = amntStr.trim().replaceAll(",", "");
		
		// 数値以外が残ってたら何かが変なので0円扱い
		if( !replacedAmntStr.matches("[0-9]+") )
		{
			return BigDecimal.ZERO;
		}
		
		return new BigDecimal(replacedAmntStr);
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	@Override
	public void terminal() throws Exception {
		if (db_ZM_M_WORK_PARAM_KNRI != null) {
			db_ZM_M_WORK_PARAM_KNRI.close();
		}
	}

	/**
	 * (1)ZM_M_WORK_PARAM_KNRI_CH_SELECT_002
	 * 
	 * @param opeDate
	 * @throws Exception
	 */
	private void executeZM_M_WORK_PARAM_KNRI_CH_SELECT_002(String opeDate) throws Exception {
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(CH_STAMP_DIV);
		paramList.setValue(opeDate);
		paramList.setValue(opeDate);

		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_CH_SELECT_002);
	}
}
