/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNAuthoriSalesSelect
*	ソースファイル名	：JBSbatCNAuthoriSalesSelect.java
*	作成者				：富士通　
*	作成日				：2022年05月02日
*＜機能概要＞
*　売上オーソリチェック対象データ作成処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v58.00.00	2022/05/02  FJ)北村		新規作成
*	v58.00.00	2022/06/16  FJ)北村		IT1-2022-0000033
*   v65.00.00	2024/01/26  FJ)張	   【ANK-4346-00-00】【eo定期】CCMG再構築対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCNIFM003001;
import eo.business.util.file.JBSbatCNIFM015;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCNAuthoriSalesSelect extends JBSbatBusinessService
{

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// IT1-2022-0000033 MOD START
//		if (inMap != null) {
//			super.logPrint.printDebugLog("execute_START");
//			// ファイル出力
//			outputInItem.addOutMapList(createCnifm015001(inMap));
//
//			super.logPrint.printDebugLog("execute_END");
//		}
		// IT1-2022-0000033 MOD END

		// IT1-2022-0000033 ADD START
		// 1件目（退避リストが空のとき）
		if (!outputInItem.isOutMapList()) {
			// 出力用Mapを作成(初期値)
			JBSbatServiceInterfaceMap outMap = makeOutputData(inMap);
			// 集計処理
			shukei(inMap, outMap);
			// 出力電文を作成(出力フラグはfalse)
			outputInItem.addOutMapList(outMap);
			return outputInItem;
		}

		JBSbatServiceInterfaceMap tmpBean = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(0);
		
		// 最終行の場合は集計結果を出力する。
		if (inMap == null)
		{
//ANK-4346-00-00 ADD START
			long seikyAmnt = Long.parseLong(tmpBean.getString(JBSbatCNIFM015.SEIKY_AMNT));

			// 請求金額が0円を下回る場合、集計内容をクリアし、ファイルへの出力を取りやめる。
			if (seikyAmnt <= 0) {
				outputInItem.clearOutMapList();
			}
			// 請求金額が0円を上回る場合、ファイルへ出力する。
			else
			{
				// 集計結果を出力する。
				tmpBean.setOutFlg(true);
			}
//ANK-4346-00-00 ADD END
			tmpBean.setOutFlg(true);
			return outputInItem;
		}

		// 集計キーを取得する（SYSID + クレジットカード番号預りＩＤ）
		String key = inMap.getString(JBSbatCNIFM003001.SYSID) + 
						inMap.getString(JBSbatCNIFM003001.CRECARD_NO);
		
		String keyBuf = tmpBean.getString(JBSbatCNIFM015.SYSID) + 
							tmpBean.getString(JBSbatCNIFM015.CRECARD_NO);
		
		// 退避.キー情報 ＝ キー情報の場合
		if (key.equals(keyBuf))
		{
			// 集計
			shukei(inMap, tmpBean);
		}
		// 退避.キー情報 ≠ キー情報の場合
		else
		{
			// 集計をした請求金額を取得
			long seikyAmnt = Long.parseLong(tmpBean.getString(JBSbatCNIFM015.SEIKY_AMNT));

			// 請求金額が0円を下回る場合、集計内容をクリアし、ファイルへの出力を取りやめる。
			if (seikyAmnt <= 0) {
				outputInItem.clearOutMapList();
			}
			// 請求金額が0円を上回る場合、ファイルへ出力する。
			else
			{
				// 集計結果を出力する。
				tmpBean.setOutFlg(true);
			}

			// 次のキー項目の集計を開始する。
			// 出力用Mapを作成(初期値)
			JBSbatServiceInterfaceMap outMap = makeOutputData(inMap);
			// 集計処理
			shukei(inMap, outMap);
			// 出力電文を作成(出力フラグはfalse)
			outputInItem.addOutMapList(outMap);
		}
		// IT1-2022-0000033 ADD END

		return outputInItem;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

// IT1-2022-0000033 ADD START
	/**
	 * 出力データを作成します。
	 * 
	 * @param inMap 入力電文
	 * @return outMap 出力電文
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap makeOutputData(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputData]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][inMap=" + inMap.getMap().toString() + "]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 請求年月
		outMap.setString(JBSbatCNIFM015.CHRG_TRGT_YM, inMap.getString(JBSbatCNIFM003001.CHRG_TRGT_YM));
		// カード会社コード
		outMap.setString(JBSbatCNIFM015.CREDIT_KOKAN_CD, inMap.getString(JBSbatCNIFM003001.CREDIT_KOKAN_CD));
		// 預かりＩＤ
		outMap.setString(JBSbatCNIFM015.CRECARD_NO, inMap.getString(JBSbatCNIFM003001.CRECARD_NO));
		// 有効期限
		outMap.setString(JBSbatCNIFM015.CRECARD_YK_KIGEN, inMap.getString(JBSbatCNIFM003001.CRECARD_YK_KIGEN));
		// SYSID
		outMap.setString(JBSbatCNIFM015.SYSID, inMap.getString(JBSbatCNIFM003001.SYSID));
		// オーソリ承認番号
		outMap.setString(JBSbatCNIFM015.AUTHORI_SHONIN_NO, inMap.getString(JBSbatCNIFM003001.AUTHORI_SHONIN_NO));
		// 課金額
		outMap.setString(JBSbatCNIFM015.CHRG_AMNT, 0);
		// 売上減額
		outMap.setString(JBSbatCNIFM015.SALES_REDUCED, 0);
		// 補償費
		outMap.setString(JBSbatCNIFM015.COMP_COST, 0);
		// クレジットカードID
		outMap.setString(JBSbatCNIFM015.CRECARD_ID, inMap.getString(JBSbatCNIFM003001.CRECARD_ID));
		// マーチャント取引ID
		outMap.setString(JBSbatCNIFM015.MERCHANT_DEAL_ID, inMap.getString(JBSbatCNIFM003001.MERCHANT_DEAL_ID));
		// 決済ID
		outMap.setString(JBSbatCNIFM015.KSSAI_ID, inMap.getString(JBSbatCNIFM003001.KSSAI_ID));
		// カードブランド会社コード
		outMap.setString(JBSbatCNIFM015.CARD_BRAND_COMP_CD, inMap.getString(JBSbatCNIFM003001.CARD_BRAND_COMP_CD));
		// 請求額
		outMap.setString(JBSbatCNIFM015.SEIKY_AMNT, 0);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][outputInItem=" + outMap.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputData]");
		return outMap;
	}

	/**
	 * 金額の集計を行います。
	 * 
	 * @param inMap 入力電文
	 * @param outMap 出力電文
	 * @throws Exception
	 */
	private void shukei(JBSbatServiceInterfaceMap inMap, JBSbatServiceInterfaceMap outMap) throws Exception
	{
		// 請求金額
		long seikyKingaku = Long.parseLong(outMap.getString(JBSbatCNIFM015.SEIKY_AMNT));
		// 課金額
		long chrgAmnt = inMap.getLong(JBSbatCNIFM003001.CHRG_AMNT);
		// 売上減額
		long salesReduced = inMap.getLong(JBSbatCNIFM003001.SALES_REDUCED);
		// 補償費
		long compCost = inMap.getLong(JBSbatCNIFM003001.COMP_COST);

		// ファイル出力内容.課金額を加算する。
		outMap.setString(JBSbatCNIFM015.CHRG_AMNT, Long.parseLong(outMap.getString(JBSbatCNIFM003001.CHRG_AMNT)) + chrgAmnt);
		// ファイル出力内容.売上減額を加算する。
		outMap.setString(JBSbatCNIFM015.SALES_REDUCED, Long.parseLong(outMap.getString(JBSbatCNIFM003001.SALES_REDUCED)) + salesReduced);
		// ファイル出力内容.補償費を加算する。
		outMap.setString(JBSbatCNIFM015.COMP_COST, Long.parseLong(outMap.getString(JBSbatCNIFM003001.COMP_COST)) + compCost);

		// 請求額 ＝ 請求額(前行以前を含めた金額) + 課金額 − 売上減額 − 補償費
		seikyKingaku = seikyKingaku + chrgAmnt - salesReduced - compCost;
		// 合計金額を加算する。
		outMap.setString(JBSbatCNIFM015.SEIKY_AMNT, seikyKingaku);
	}
	// IT1-2022-0000033 ADD END

	// IT1-2022-0000033 MOD START
	/**
	 * 
	 *  売上オーソリ対象チェックデータファイルの作成を行います。
	 * @param inMap 中間ファイルの値。
	 * @return outMap JBSbatServiceInterfaceMap
	 * @throws Exception メソッド内で発生した例外全般。
	 */
//	private JBSbatServiceInterfaceMap createCnifm015001(JBSbatServiceInterfaceMap inMap) throws Exception 
//	{
//		// 入出力インターフェースオブジェクトを生成
//		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
//
//		// 請求額の計算を実施
//		long seikyKingaku = 0;
//		long chrgAmnt = inMap.getLong(JBSbatCNIFM003001.CHRG_AMNT);
//		long salesReduced = inMap.getLong(JBSbatCNIFM003001.SALES_REDUCED);
//		long compCost = inMap.getLong(JBSbatCNIFM003001.COMP_COST);
//
//		// 請求額 ＝ 課金額 − 売上減額 − 補償費
//		seikyKingaku = chrgAmnt - salesReduced - compCost;
//
//		// 請求金額が0円を上回る場合、ファイルへ出力する。
//		if (seikyKingaku > 0) {
//			//項目を設定
//			outMap.setString(JBSbatCNIFM015.CHRG_TRGT_YM, inMap.getString(JBSbatCNIFM003001.CHRG_TRGT_YM));				// 請求年月
//			outMap.setString(JBSbatCNIFM015.CREDIT_KOKAN_CD, inMap.getString(JBSbatCNIFM003001.CREDIT_KOKAN_CD));		// カード会社コード
//			outMap.setString(JBSbatCNIFM015.CRECARD_NO, inMap.getString(JBSbatCNIFM003001.CRECARD_NO));					// 預かりＩＤ
//			outMap.setString(JBSbatCNIFM015.CRECARD_YK_KIGEN, inMap.getString(JBSbatCNIFM003001.CRECARD_YK_KIGEN));		// 有効期限
//			outMap.setString(JBSbatCNIFM015.SYSID, inMap.getString(JBSbatCNIFM003001.SYSID));							// SYSID
//			outMap.setString(JBSbatCNIFM015.AUTHORI_SHONIN_NO, inMap.getString(JBSbatCNIFM003001.AUTHORI_SHONIN_NO));	// オーソリ承認番号
//			outMap.setString(JBSbatCNIFM015.CHRG_AMNT, chrgAmnt);			// 課金額
//			outMap.setString(JBSbatCNIFM015.SALES_REDUCED, salesReduced);	// 売上減額
//			outMap.setString(JBSbatCNIFM015.COMP_COST, compCost);			// 補償費
//			outMap.setString(JBSbatCNIFM015.CRECARD_ID, inMap.getString(JBSbatCNIFM003001.CRECARD_ID));					// クレジットカードID
//			outMap.setString(JBSbatCNIFM015.MERCHANT_DEAL_ID, inMap.getString(JBSbatCNIFM003001.MERCHANT_DEAL_ID));		// マーチャント取引ID
//			outMap.setString(JBSbatCNIFM015.KSSAI_ID, inMap.getString(JBSbatCNIFM003001.KSSAI_ID));						// 決済ID	
//			outMap.setString(JBSbatCNIFM015.CARD_BRAND_COMP_CD, inMap.getString(JBSbatCNIFM003001.CARD_BRAND_COMP_CD));	// カードブランド会社コード	
//			outMap.setString(JBSbatCNIFM015.SEIKY_AMNT, seikyKingaku);		// 請求額
//			//出力フラグを設定
//			outMap.setOutFlg(true);
//		}
//
//		//出力共通電文を返却
//		return outMap;
//	}
// IT1-2022-0000033 MOD END

}
