/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom *
**********************************************************************
*<プログラム内容>
* システム名 :eo顧客基幹システム
* モジュール名 :JBSbatACWribAmntCalc
* ソースファイル名 :JBSbatACWribAmntCalc.java
* 作成者 :富士通
* 作成日 :2011年06月22日
*<機能概要>
* 割引額計算部品です。
*<修正履歴>
* バージョン 修正日 修正者 修正内容
* v1.00.00 2011/06/22 富士通 新規作成
* v4.00.00 2013/03/11 FJ)浜口 マンション違約金対応 割引率の計算式を修正
* v5.00.00 2013/07/09 FJ) 桑島 【TG1-2013-0000662】請求年月対応
* v8.00.00 2014/03/07 FJ) 後藤 【TG1-2014-0000002】料金項目コード上1桁での判定追加
* v45.00.00 2019/08/09 FJ) 星野 【ANK-3636-14-00】100ML 即割の金額変更対応
* v59.00.00 2022/06/08 FJ) 麻生 【IT2-2022-0000003】割引値置き換え処理の適用期間判定不備対応
*********************************************************************/
package eo.business.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM058;
import eo.business.util.file.JBSbatACIFM061;
import eo.business.util.table.JBSbatAC_M_WRIB_PRC;
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;
/**
* (クラスの機能概要)
*
* @author 富士通
*/
public class JBSbatACWribAmntCalc extends JBSbatBusinessService
{
/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
/** テーブル(割引料金)*/
private static final String D_TBL_NAME_AC_M_WRIB_PRC = "AC_M_WRIB_PRC";
/** SQL定義キー(AC_SELECT_001)*/
private static final String AC_M_WRIB_PRC_AC_SELECT_001 = "AC_SELECT_001";
/** テーブルアクセスクラス(割引料金)*/
private JBSbatSQLAccess db_AC_M_WRIB_PRC = null;
/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
/** 割引料金マスタ 検索結果 */
private HashMap> waribPrcInfoMap = new HashMap>();
// ANK-3636-14-00対応 20190809 星野 ADD START
/** 業務パラメータ 検索結果(割引料金マスタ置き換え用) */
private HashMap workParamWaribPrcInfoMap = new HashMap();
// ANK-3636-14-00対応 20190809 星野 ADD END
private static final BigDecimal hundred = new BigDecimal("100");
private static final BigDecimal minone = new BigDecimal("-1");
// ANK-3636-14-00対応 20190809 星野 ADD START
/** 集計先料金サービスコード(100Mライト) */
private List SHUK_PRC_SVC_CD_100ML = Arrays.asList(new String[]{
"PA0311 " // 100Mライトコース
, "PA0811 " // メゾンタイプ100Mライトコース
});
/** 料金サービスコード(即割) */
private List PRC_SVC_CD_SOKUWARI = Arrays.asList(new String[]{
"WST000000014", // 即割(HT)
"WST000000024" // 即割(MZ)
});
// ANK-3636-14-00対応 20190809 星野 ADD END
/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
/**
* 初期処理
* @param JBSbatCommonItem commonItem バッチ共通パラメータ電文
* @throws Exception
*/
public void initial(JBSbatCommonItem commonItem) throws Exception
{
/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
// 共通パラメータを設定します
super.setCommonInfo(commonItem);
// DBアクセスクラスを生成します
db_AC_M_WRIB_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_WRIB_PRC);
/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
// 請求年月取得
JACbatSchdlUtil schdUtil = new JACbatSchdlUtil(commonItem);
// 群締め日
String wk_GunEnd = "";
try
{
// 料金スケジュール定義アクセス部品を使用する。
String wk_SkyuYM = schdUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
// 群月初日、群締め日 ← JACbatSchdlUtil.getUseStrEnd(請求年月, イベントコード("01"(利用開始日)), イベントコード("02"(利用終了日)))
String[] rtn = schdUtil.getUseStrEnd(wk_SkyuYM, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
// 群締め日
wk_GunEnd = rtn[1];
}
finally
{
// クローズ
schdUtil.close();
}
// DBアクセス用のパラメータ定義
JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
// パラメータ設定
dbList.setValue(super.systemCode); // システムコード
dbList.setValue(wk_GunEnd); // 群締め日
// SELECT文発行
executeAC_M_WRIB_PRC_AC_SELECT_001(dbList.getList().toArray());
// 結果を取得
JBSbatCommonDBInterface dbMap = db_AC_M_WRIB_PRC.selectNext();
// 検索結果がなくなるまで繰り返す
while (dbMap != null)
{
StringBuilder key = new StringBuilder();
key.append(dbMap.getString(JBSbatAC_M_WRIB_PRC.PCRS_CD))
.append(dbMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD))
.append(dbMap.getString(JBSbatAC_M_WRIB_PRC.AITAI_NO))
.append(dbMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_FLR_CD));
ArrayList mstList = waribPrcInfoMap.get(key.toString());
if(mstList == null)
{
mstList = new ArrayList();
}
mstList.add(dbMap);
waribPrcInfoMap.put(key.toString(), mstList);
// 次レコード取得
dbMap = db_AC_M_WRIB_PRC.selectNext();
}
// アクセスクラスをクローズする
db_AC_M_WRIB_PRC.close();
// ANK-3636-14-00対応 20190809 星野 ADD START
// 業務パラメータ取得
HashMap paramMap = new HashMap();
JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
try
{
paramMap = paramUtil.getGyoumuParameterMap2(JACStrConst.WKPRA_AC_WRIVAL_REPLACE_, super.opeDate);
}
finally
{
paramUtil.close();
}
// 割引料金マスタ置き換え用に加工して保持
for(String value : paramMap.values()){
if(!JCCBatCommon.isNotNull(value)){
continue;
}
String[] values = value.split(":");
if(values.length != 4){
continue;
}
String key = values[0];
String tstaYmd = values[1];
String tendYmd = values[2];
BigDecimal wribValue = new BigDecimal(values[3]);
// 群締め日が適用開始日以降であることを確認
// IT2-2022-0000003 MOD START
// if(wk_GunEnd.compareTo(tstaYmd) <= 0 || wk_GunEnd.compareTo(tendYmd) >= 0 ){
if(wk_GunEnd.compareTo(tstaYmd) < 0 || wk_GunEnd.compareTo(tendYmd) > 0 ){
// IT2-2022-0000003 MOD END
// 適用期間が合わなければノーヒット扱い
continue;
}
// 割引料金マスタ置き換え用にマップ格納
JBSbatCommonDBInterface workParamWaribPrcInfo = new JBSbatCommonDBInterface();
workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_PRC_TSTAYMD, tstaYmd);
workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_PRC_TENDYMD, tendYmd);
workParamWaribPrcInfo.setValue(JBSbatAC_M_WRIB_PRC.WRIB_VALUE, wribValue);
workParamWaribPrcInfoMap.put(key, workParamWaribPrcInfo);
}
// ANK-3636-14-00対応 20190809 星野 ADD END
/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
}
/**
* 主処理
* @param inMap 入力電文
* @return JBSbatOutputItem 出力情報
* @throws Exception
*/
public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
{
/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
JBSbatOutputItem outputBean = new JBSbatOutputItem(); // 出力共通電文
// 入力情報終了判定
if (inMap == null)
{
return outputBean;
}
// マスタ検索用の相対番号の設定をする
String aitiNo = null;
// 相対識別(請求先相対契約)の場合
if (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM061.AIT_DIV)))
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対識別(請求先相対契約)");
aitiNo = inMap.getString(JBSbatACIFM061.SEIKY_KEI_NO); // 請求先番号
// ログ出力
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号に請求番号が設定されました。(" + aitiNo + ")");
}
// 相対識別(サービス相対契約)
else if(JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM061.AIT_DIV)))
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対識別(サービス相対契約)");
aitiNo = inMap.getString(JBSbatACIFM061.SVC_NO); // サービス番号
// ログ出力
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にサービス番号が設定されました。(" + aitiNo + ")" );
}
else
{
aitiNo = JACStrConst.AITAINO_SPACE; // 相対番号(ALLスペース)
// ログ出力
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。");
}
// 割引料金情報を検索する
ArrayList mstList = this.getBYWbryokinMstBean(inMap, aitiNo);
// 相対識別(請求先相対契約)または相対識別(サービス相対契約)の場合で、該当データなしの場合、相対番号をスペースでパディングして再検索
if (JBSbatInterface.isNull(mstList) && (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM061.AIT_DIV))
|| JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM061.AIT_DIV))))
{
// 対象キー:相対番号の設定
aitiNo = JACStrConst.AITAINO_SPACE; // 相対番号(ALLスペース)
// ログ出力
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。");
// 割引料金情報を取得する
mstList = this.getBYWbryokinMstBean(inMap, aitiNo);
}
// 割引料金情報が存在しない場合
if (mstList == null)
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引料金情報なし");
return outputBean;
}
String prcKmkCd = inMap.getString(JBSbatACIFM061.SHUK_PRC_KMK_CD);
if(prcKmkCd != JACStrConst.KARA_MOJI)
{
// マスタ件数分ループ
for(JBSbatCommonDBInterface mstMap : mstList)
{
JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
// 料金項目コード上1桁が異なる場合出力対象外
if(!prcKmkCd.substring(0, 1).equals(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIBPRC_KMK_CD).substring(0, 1)))
{
continue;
}
outMap.getMap().putAll(inMap.getMap());
// 出力情報設定処理
this.setOutputCmnData(outMap, mstMap);
// 割引料金の算出と設定
this.setWribPrc(outMap, mstMap);
// レコード出力判定フラグの設定
outMap.setOutFlg(true);
// 出力レコード情報を設定する
outputBean.addOutMapList(outMap);
}
}
return outputBean;
/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
}
/**
* 業務サービス終了処理
* @throws Exception
*/
public void terminal() throws Exception
{
/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
// DBアクセスクラスをクローズします
db_AC_M_WRIB_PRC.close();
/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
}
/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
/**
* 割引料金を算出し、算出した割引料金を出力情報に設定します。
*
* @param returnMap 出力情報
* @param inMap 入力電文
* @param mstMap 割引料金情報
* @throws Exception 業務サービス内で発生した例外全般
*/
private void setWribPrc(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstMap) throws Exception
{
// ANK-3636-14-00対応 20190809 星野 MOD START
// BigDecimal wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); // 割引値
// 入力電文から集計料金サービスコードを取得
String shukPrcSvcCd = inMap.getString(JBSbatACIFM061.SHUK_PRC_SVC_CD);
// 割引料金マスタから料金サービスコードを取得
String prcSvcCd = mstMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD);
BigDecimal wribValue; // 割引値
// 集計料金サービスコードが100Mライト かつ 料金サービスコードが即割の場合
if( SHUK_PRC_SVC_CD_100ML.contains(shukPrcSvcCd) && PRC_SVC_CD_SOKUWARI.contains(prcSvcCd)){
// 100Mライト即割に対応するため、割引額の置き換えを考慮する
wribValue = getReplacedWribValue(mstMap, shukPrcSvcCd);
// 上記以外はこれまでどおり割引料金マスタから取得
}else{
wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE);
}
// ANK-3636-14-00対応 20190809 星野 MOD END
String wribCalcWay = mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_CALC_WAY_CD); // 割引計算方法コード
BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM061.PRC); // 料金
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引値:" + wribValue );
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引計算方法コード:" + wribCalcWay );
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金:" + prc );
// 割引計算方法コード = "1"(置換割引_置換型)または"2"(置換割引_値引型)の場合
if (JACStrConst.WRIB_CALC_CD_CW_CKN.equals(wribCalcWay)
|| JACStrConst.WRIB_CALC_CD_CW_NBK.equals(wribCalcWay))
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "置換割引");
// 割引後料金が対象料金以上だった場合
if (wribValue.compareTo(prc) >= 0)
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引後料金が対象料金以上 割引額<- 0");
inMap.setBigDecimal(JBSbatACIFM058.PRC, BigDecimal.ZERO); // 割引額
}
else
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金(" + prc + ") - 割引額(" + wribValue + ") * -1" );
inMap.setBigDecimal(JBSbatACIFM058.PRC, prc.subtract(wribValue).negate()); // 対象料金と割引後料金の差異を料金(割引額)に設定
// prc - wribValue * -1
}
}
// 割引計算方法コード = "3"(金額割引_置換型)または"4"(金額割引_値引型)の場合
else if (JACStrConst.WRIB_CALC_CD_PW_CKN.equals(wribCalcWay)
|| JACStrConst.WRIB_CALC_CD_PW_NBK.equals(wribCalcWay))
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "金額割引");
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "金額割引適用 (" + wribValue + ")");
inMap.setBigDecimal(JBSbatACIFM058.PRC, wribValue); // 料金(割引額)
}
// 割引計算方法コード = "5"(率割引_置換型)または"6"(率割引_値引型)の場合
else
{
// 割引額算出(小数点第一位切上げ)
BigDecimal wribAmnt = JACbatRknBusinessUtil.round(JACStrConst.ROUND_UP,
(prc.multiply(wribValue).divide(hundred)).multiply(minone),
0);
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "率割引からの割引額:" + wribAmnt );
// 割引額の設定
inMap.setBigDecimal(JBSbatACIFM058.PRC, wribAmnt); // 料金(割引額)
}
}
// ANK-3636-14-00対応 20190809 星野 ADD START
/**
* 割引料金マスタに対応する業務パラメータの設定を確認し、設定があれば業務パラメータから取得した割引値を返却します。
* @param mstMap 割引料金マスタ
* @param shukPrcSvcCd 集計料金サービスコード
* @return 業務パラメータから取得した割引値 設定がなければ割引料金マスタから取得した割引値
* @throws Exception
*/
private BigDecimal getReplacedWribValue(JBSbatCommonDBInterface mstMap, String shukPrcSvcCd) throws Exception{
BigDecimal wribValue = mstMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE); // 割引値
// 割引料金マスタのキー項目と集計料金サービスコードを結合してキーとする
StringBuilder key = new StringBuilder();
key.append(mstMap.getString(JBSbatAC_M_WRIB_PRC.PCRS_CD))
.append(mstMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD))
.append(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_SHUK_CD))
.append(mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_FLR_CD))
.append(shukPrcSvcCd)
;
// 業務パラメータから対応するレコードを取得
JBSbatCommonDBInterface workParamMap = workParamWaribPrcInfoMap.get(key.toString());
if(workParamMap != null){
// 該当があれば、割引料金マスタから取得した割引値を業務パラメータ取得値で置き換える
wribValue = workParamMap.getBigDecimal(JBSbatAC_M_WRIB_PRC.WRIB_VALUE);
}
return wribValue;
}
/**
* 出力情報を設定します。
*
* @param returnMap 出力情報
* @param inMap 入力電文
* @param mstMap 割引料金情報
* @throws Exception 業務サービス内で発生した例外全般
*/
private void setOutputCmnData(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstMap) throws Exception
{
// 割引料金情報の設定
inMap.setString(JBSbatACIFM058.SVC_CD, inMap.getString(JBSbatACIFM061.WRIB_SVC_SKBT)); // サービス識別
inMap.setString(JBSbatACIFM058.PRC_GRP_CD, inMap.getString(JBSbatACIFM061.SHUK_PRC_GRP_CD)); // 料金グループコード
inMap.setString(JBSbatACIFM058.PCRS_CD, inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD)); // 料金コースコード
inMap.setString(JBSbatACIFM058.PRC_SVC_CD, inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD)); // 料金サービスコード
inMap.setString(JBSbatACIFM058.PRC_KMK_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIBPRC_KMK_CD)); // 料金項目コード
inMap.setString(JBSbatACIFM058.COLLECT_PATTERN_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.COLLECT_PATTERN_CD)); // 徴収パターンコード
inMap.setString(JBSbatACIFM058.USE_FAIL_APLY_KH, mstMap.getString(JBSbatAC_M_WRIB_PRC.USE_FAIL_APLY_WAY_CD)); // 利用不可適用可否
inMap.setString(JBSbatACIFM058.MAEUKE_SOSAI_YUSEN_JUN, "0"); // 前受相殺優先順位
inMap.setString(JBSbatACIFM058.WRIB_KKSHI_KH, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_KKSHI_KH)); // 割引繰越可否
inMap.setString(JBSbatACIFM058.WRIB_CALC_WAY_CD, mstMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_CALC_WAY_CD)); // 割引計算方法コード
inMap.setString(JBSbatACIFM058.UPPL_JUDGE_YUSEN_JUN, mstMap.getString(JBSbatAC_M_WRIB_PRC.UPPL_JUDGE_YUSEN_JUN)); // 上限判定優先順位
}
/**
* 割引料金情報を取得します。
*
* @param inMap 割引対象情報
* @param aitiNo 相対番号
* @return ArrayList 割引料金情報
* @throws Exception 業務サービス内で発生した例外全般
*/
private ArrayList getBYWbryokinMstBean(JBSbatServiceInterfaceMap inMap, String aitiNo) throws Exception
{
assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S] getBYWbryokinMstBean");
StringBuilder key = new StringBuilder();
key.append(inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD))
.append(inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD))
.append(aitiNo)
.append(inMap.getString(JBSbatACIFM061.WRIB_FLR_CD));
return waribPrcInfoMap.get(key.toString());
}
/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
/**
* SQLKEY(AC_SELECT_001)でDBアクセスを行います。
*
* 処理フロー
*
* 1.引数でバイント変数を設定します。
*
* 2.DBアクセスを実行します。
*
* 3.メソッドの呼び出し方です。
* 引数:
* param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
* システムコード
* バッチ運用日
*
*
* @param param バイント変数の値配列。
* @throws Exception 業務サービス内で発生した例外全般。
*/
private void executeAC_M_WRIB_PRC_AC_SELECT_001(Object[] param) throws Exception
{
// バイント変数のリストを生成します
JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
paramList.setValue(param[0].toString());
paramList.setValue(param[1].toString());
// DBアクセスを実行します
db_AC_M_WRIB_PRC.selectBySqlDefine(paramList, AC_M_WRIB_PRC_AC_SELECT_001);
}
/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}