/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSeikyusReHakIcrnSksTrnMino
*	ソースファイル名	：JBSbatCHSeikyusReHakIcrnSksTrnMino.java
*	作成者				：富士通　
*	作成日				：2021年11月19日
*＜機能概要＞
*　請求書再発行一覧作成処理（未納分）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v56.00.00	2021/11/19	FJ) 山地	【ANK-4131-00-00】窓口払い手数料の顧客負担方式導入　STEP4
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM405;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHSeikyusReHakIcrnSksTrnMino extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 再発行請求書合計 */
	private  BigDecimal ReHakkoSksGokei = BigDecimal.ZERO;
	
	/** 即時決済合計 */
	private  BigDecimal SokujiKssaiGokei = BigDecimal.ZERO;
	
	/** 処理対象月の日数（フリー項目） */
	private int LastMonthDays = 0;
	
	/** 処理済日数 */
	private int DaysCount = 0;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		// 処理対象月の日数をフリー項目から取得
		LastMonthDays = Integer.parseInt(super.freeItem);
		
		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 inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		// 出力情報
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 1行ごとに再発行請求書合計と即時決済合計を計算する
		doGoukeiSummary(inMap);
		
		// 明細行を出力電文に設定する。
		outMap = setSyukei(inMap);
		
		//最終レコードの場合、合計行を設定する
		if(DaysCount == LastMonthDays)
		{
			outputItem.addOutMapList(outMap);
			// 合計行を設定する
			outMap = setLastSyukei(inMap);
		}
		outputItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 再発行請求書合計と即時決済合計を計算します
	 * @param inMap　入力電文
	 * @return outputBean　出力マップ
	 * @throws Exception 
	 */
	private JBSbatOutputItem doGoukeiSummary(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][doMeisaiSummary]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][doMeisaiSummary][inMap=" + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 再発行請求書合計に再発行請求書件数を加算する
		ReHakkoSksGokei = ReHakkoSksGokei.add(inMap.getBigDecimal(JBSbatCHIFM405.RE_HAKKO_SKS_CNT));
		
		// 即時決済合計に即時決済件数を加算する
		SokujiKssaiGokei = SokujiKssaiGokei.add(inMap.getBigDecimal(JBSbatCHIFM405.SOKUJI_KSSAI_CNT));
		
		assert outputBean != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][doGoukeiSummary]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][doGoukeiSummary]");
		
		return outputBean;
	}
	
	/**
	 * 明細行を出力電文に設定します
	 * @param inMap　入力電文
	 * @param outMap　出力電文
	 * @param syukeiMap　集計項目マップ
	 * @throws Exception 
	 * 
	 */
	private JBSbatServiceInterfaceMap setSyukei(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setSyukei]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 処理日
		outMap.set(JBSbatCHIFM405.TRN_YMD, JACBatCommon.formatDate(super.opeDate));
		// 発行日
		outMap.set(JBSbatCHIFM405.HAKKO_YMD, JPCUtilCommon.formatDate(inMap.get(JBSbatCHIFM405.HAKKO_YMD).toString()));
		// 再発行請求書件数
		outMap.set(JBSbatCHIFM405.RE_HAKKO_SKS_CNT, JPCUtilCommon.formatNumber(inMap.get(JBSbatCHIFM405.RE_HAKKO_SKS_CNT).toString()));
		// 即時決済件数
		outMap.set(JBSbatCHIFM405.SOKUJI_KSSAI_CNT, JPCUtilCommon.formatNumber(inMap.get(JBSbatCHIFM405.SOKUJI_KSSAI_CNT).toString()));
		
		// 合計
		outMap.set(JBSbatCHIFM405.GOKEI, JACStrConst.KARA_MOJI);
		// 再発行請求書合計
		outMap.set(JBSbatCHIFM405.RE_HAKKO_SKS_GOKEI, JACStrConst.KARA_MOJI);
		// 即時決済合計 
		outMap.set(JBSbatCHIFM405.SOKUJI_KSSAI_GOKEI, JACStrConst.KARA_MOJI);
		
		DaysCount++;
		
		// 出力フラグ＝trueを設定
		outMap.setOutFlg(true);
		
		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setSyukei][outputItem = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setSyukei]");
		
		return outMap;
	}
	
	/**
	 * 合計行を出力電文に設定します
	 * @param inMap　入力電文
	 * @param outMap　出力電文
	 * @param syukeiMap　集計項目マップ
	 * @throws Exception 
	 * 
	 */
	private JBSbatServiceInterfaceMap setLastSyukei(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setLastSyukei]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 最終レコードの場合
		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setLastSyukei][最終レコード]") : true;
		
		// 処理日
		outMap.set(JBSbatCHIFM405.TRN_YMD, JACBatCommon.formatDate(super.opeDate));
		// 発行日
		outMap.set(JBSbatCHIFM405.HAKKO_YMD, JACStrConst.KARA_MOJI);
		// 再発行請求書件数
		outMap.set(JBSbatCHIFM405.RE_HAKKO_SKS_CNT, JACStrConst.KARA_MOJI);
		// 即時決済件数
		outMap.set(JBSbatCHIFM405.SOKUJI_KSSAI_CNT, JACStrConst.KARA_MOJI);
		
		// 合計
		outMap.set(JBSbatCHIFM405.GOKEI, "合計");
		// 再発行請求書合計
		outMap.set(JBSbatCHIFM405.RE_HAKKO_SKS_GOKEI, JPCUtilCommon.formatNumber(ReHakkoSksGokei.toString()));
		// 即時決済合計 
		outMap.set(JBSbatCHIFM405.SOKUJI_KSSAI_GOKEI, JPCUtilCommon.formatNumber(SokujiKssaiGokei.toString()));
		
		// 出力フラグ＝trueを設定
		outMap.setOutFlg(true);
		
		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setLastSyukei][outputItem = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setLastSyukei]");
		
		return outMap;
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
}
