/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPrintPageCalc
*	ソースファイル名	：JBSbatCHPrintPageCalc.java
*	作成者				：富士通　
*	作成日				：2012年12月01日
*＜機能概要＞
*　印刷枚数計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00		2012/12/03   FJ）後藤	新規作成
*	v4.01		2013/01/22   FJ) 小柴	【ST3-2013-0000172】内訳情報組立処理・口振警告終了
*	v4.02		2013/05/13   FJ) 小柴	【TG1-2013-0000xxx】印刷枚数（総合計）の表紙ページ加算漏れを修正
*	v4.03		2013/05/14   FJ) 小柴	【TG1-2013-0000xxx】印刷枚数（総合計）の計算処理を修正
*	v4.04		2013/05/20   FJ) 小柴	【TG1-2013-0000497】印刷枚数（総合計）の計算処理を再度修正
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM051;
import eo.business.util.file.JBSbatCHIFM082;
import eo.business.util.file.JBSbatCHIFM147;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCEditString;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPrintPageCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 集計キー */
	private String bkKey = null;
	
	/** 出力情報 */
	private JBSbatServiceInterfaceMap outMap = null;
	
	/** 印刷面数（内訳書） */
	private int printCntUcwk = 0;
	
	/** 印刷面数（明細書） */
	private int printCntDtl = 0;

	/** 業務パラメータ（請求書同封印刷上限数） */
	private int sksDofuPrintUpplno = 0;
	
	/** 印刷枚数オーバーデータ．関連内容 */
	private static final String KANREN_NAIYO_VALUE = JPCEditString.fillHalfSpace(" ", 20, true);
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		sksDofuPrintUpplno = Integer.parseInt(paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_SKS_DF_PRNT_UPLNO));
		
		paramUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + inMap.getMap().toString() + "]") : true;
		
		if(inMap == null)
		{
			// 出力
			setOutPutMap(outputInItem);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			return outputInItem;
		}
		
		if(!outputInItem.isOutMapList())
		{
			// ダミーレコード作成
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// 集計キー設定
		String inKey = inMap.getString(JBSbatCHIFM082.PAY_WAY_CD).concat(inMap.getString(JBSbatCHIFM082.DOFU_CD))
																 .concat(inMap.getString(JBSbatCHIFM082.SEIKY_KEI_NO));
		
		if(!inKey.equals(bkKey))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inKey ≠ bkKey]");
			if(bkKey != null)
			{
				// 出力
				setOutPutMap(outputInItem);
			}
			// 退避
			printCntShuk(inMap, true);
			bkKey = inKey;
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inKey ＝ bkKey]");
			// 集計
			printCntShuk(inMap, false);
		}
		
		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]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 印刷面数を集計します。
	 * 
	 * @param inMap 入力情報
	 * @param breakFlg ブレイクフラグ
	 * @throws Exception
	 */
	private void printCntShuk(JBSbatServiceInterfaceMap inMap, boolean breakFlg)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][printCntShuk]");
		
		if(breakFlg)
		{
			outMap = new JBSbatServiceInterfaceMap();
			// 同封コード
			outMap.setString(JBSbatCHIFM147.DOFU_CD, inMap.getString(JBSbatCHIFM082.DOFU_CD));
			// 請求契約番号
			outMap.setString(JBSbatCHIFM147.SEIKY_KEI_NO, inMap.getString(JBSbatCHIFM082.SEIKY_KEI_NO));
			// 請求方法コード
			outMap.setString(JBSbatCHIFM147.SEIKY_WAY_CD, inMap.getString(JBSbatCHIFM082.PAY_WAY_CD));
			// 印刷面数（内訳書・明細書）
			if(inMap.getString(JBSbatCHIFM082.KAKINS_TELNO).equals(JACStrConst.KARA_MOJI))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][printCntShuk][課金先電話番号 ＝ \"\"（空）");
				printCntUcwk = Integer.parseInt(inMap.getString(JBSbatCHIFM082.DTL_MEN_CNT));
				printCntDtl = 0;
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][printCntShuk][課金先電話番号 ≠ \"\"（空）");
				printCntUcwk = 0;
				printCntDtl = Integer.parseInt(inMap.getString(JBSbatCHIFM082.DTL_MEN_CNT));
			}
		}
		else
		{
			// 印刷面数（内訳書・明細書）
			if(inMap.getString(JBSbatCHIFM082.KAKINS_TELNO).equals(JACStrConst.KARA_MOJI))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][printCntShuk][課金先電話番号 ＝ \"\"（空）");
				printCntUcwk += Integer.parseInt(inMap.getString(JBSbatCHIFM082.DTL_MEN_CNT));
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][printCntShuk][課金先電話番号 ≠ \"\"（空）");
				printCntDtl += Integer.parseInt(inMap.getString(JBSbatCHIFM082.DTL_MEN_CNT));
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][printCntShuk]");
	}
	
	/**
	 * 出力情報を設定します。
	 * 
	 * @param outputInItem 出力情報
	 * @throws Exception
	 */
	private void setOutPutMap(JBSbatOutputItem outputInItem)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutPutMap]");
		
		// 印刷面数（内訳書）
		outMap.setString(JBSbatCHIFM147.PRINT_CNT_UCWK, String.valueOf(printCntUcwk));
		
		// 印刷面数（明細書）
		outMap.setString(JBSbatCHIFM147.PRINT_CNT_DTL, String.valueOf(printCntDtl));
		
		// 印刷面数（総合計）
		int prinCntTtl = printCntUcwk + printCntDtl;
		if (prinCntTtl == 0)
		{
			prinCntTtl = 1;
		}
		outMap.setString(JBSbatCHIFM147.PRINT_CNT_TTL, String.valueOf(prinCntTtl));
		
		// 印刷枚数（総合計）
		int prinPageTtl = 0;
		
		// 印刷面数（内訳書） ＋ 印刷面数（明細書）-１ を計算
		prinPageTtl = (printCntUcwk + printCntDtl) - 1;
		
		// 計算結果÷２を行い、余りがある場合は値を切り上げる
		if (prinPageTtl % 2 >= 1)
		{
			prinPageTtl = (prinPageTtl / 2) + 1;
		}
		else
		{
			prinPageTtl = prinPageTtl / 2;
		}
		
		// 表紙の枚数（固定1ページ）を追加
		prinPageTtl += 1;
		
		outMap.setString(JBSbatCHIFM147.PRINT_PAGE_TTL, String.valueOf(prinPageTtl));
		
		// 印刷枚数オーバーフラグ
		if(prinCntTtl > sksDofuPrintUpplno)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutPutMap][印刷枚数上限以上]");
			outMap.setString(JBSbatCHIFM147.PRINT_CNT_OVER_FLG, JACStrConst.PRINT_CNT_OVER_FLG_OVER);
			
			// 印刷枚数オーバーデータ出力
			makeOverData(outMap, outputInItem);
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutPutMap][印刷枚数上限以下]");
			outMap.setString(JBSbatCHIFM147.PRINT_CNT_OVER_FLG, JACStrConst.PRINT_CNT_OVER_FLG_UNDER);
		}
		
		outMap.setOutFlg(true);
		outputInItem.addOutMapList(outMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutPutMap]");
	}
	
	/**
	 * 印刷枚数オーバーデータを作成します。
	 * 
	 * @param mastMap 入力情報
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOverData(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOverData]");
		
		JBSbatServiceInterfaceMap overMap = new JBSbatServiceInterfaceMap();
		
		overMap.setString(JBSbatCHIFM051.SEIKY_KEI_NO, 			inMap.getString(JBSbatCHIFM082.SEIKY_KEI_NO));
		overMap.setString(JBSbatCHIFM051.SEIKY_SKS_RSLT_CD, 	JACStrConst.SIKY_MAKE_RSLT_CD_PRINT_CNT_NG);
		overMap.setString(JBSbatCHIFM051.KANREN_NAIYO, 			KANREN_NAIYO_VALUE);
		
		overMap.setOutFlg(true);
		
		outputItem.addOutMapList_2(overMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOverData]");
	}
}
