#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：契約管理
#
# シェル名      ：ｅｏＩＤ会員情報当日分ファイル作成
#
# 機能          ：ｅＰＯＰへ連携するeoID会員情報を、サービス契約，お客様より抽出し、eoID会員情報（ｅＰＯＰ用）を作成する。
#
# コマンド形式  ：EO21T0110J0.sh
#
# 実行環境      ：.../app/shl
#
# 終了ステータス：ゼロ以外異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
# v10.00         2014/10/14  FJ）大山      ST4-2014-0000071
# v10.01         2014/10/15  FJ）大山      ST4-2014-0000071
#
##############################################################

##############################################################
# 環境変数定義
##############################################################

#
#---ツール格納場所
#
G_TOOLSH=.

#
#---環境変数定義Shell呼び出し
#
. EOK010110J0.sh

#
#---ＪＯＢ名
#
JOBNAME=`basename $0 | sed -e "s/\.sh//g"`

#
#---サービス（業務プロセス）
#
SVC=$JOBNAME

#
#---OPD
#
OPD=$1

#
#---業務で必要な変数定義
#
SQL_FILE_U_KK0081_35=${SQL_DIR}/KK_U_KK0081_35.sql
SQL_FILE_U_KK0791_03=${SQL_DIR}/KK_U_KK0791_03.sql
SQL_FILE_U_CK0011_11=${SQL_DIR}/KK_U_CK0011_12.sql
UNLOAD_OUTFILE=${MID_DIR_KK}/${JOBNAME}.ULD_WORK.csv
MATCH_OTF=${MID_DIR_KK}/${JOBNAME}.MATCH_WORK.csv

KK0081_UNLOAD_OUTFILE=${MID_DIR_KK}/KKIFM630001.csv
##############################################################
# 業務処理
##############################################################
sh ${G_TOOLSH}/EOK010210J0.sh CS00025I $JOBNAME

#
#--- アンロード関数
#       p1：テーブル名／クエリファイル名
EXEC_UNLOAD()
{
	sh ${G_TOOLSH}/EOKULD02.sh $1 $2
	
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " unload error($2:rc=$rc) "
		echo $JOBNAME " unload error($2:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi
}

#
#--- クエリ編集
#       p1：ＳＱＬ定義ファイル名
#       p2：バインド変数置換文字
EDIT_ULD_QUERY()
{
	SQL_FILE=$1
	SQL_WORK_FILE=${ULD_WORK_DIR}/${JOBNAME}_QUERY.tmp
	cat /dev/null > ${SQL_WORK_FILE}
	
	# SQL定義ファイルの編集
	if [ ! -r ${SQL_FILE} ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist(${SQL_FILE}:rc=$rc) "
		echo $JOBNAME " File is nonexist(${SQL_FILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# バインド変数を置き換える
	cat ${SQL_FILE} > ${SQL_WORK_FILE}
	
	for bind in $2
	do
		sed -i, -e 0,/?/s/?/"'"$bind"'"/ ${SQL_WORK_FILE}
	done
	
	export SQL_WORK_FILE
}

#
#--- クエリ編集
#       p1：ＳＱＬ定義ファイル名
#       p2：バインド変数置換文字
EDIT_MATCHING_QUERY()
{
	MATCHING_FILE=$1
	MATCHING_QUERY_WORK=${ULD_WORK_DIR}/${JOBNAME}_MATCH_QUERY.tmp
	
	cat /dev/null > ${MATCHING_QUERY_WORK}
	
	# SQL定義ファイルの編集
	if [ ! -r ${MATCHING_FILE} ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist(${MATCHING_FILE}:rc=$rc) "
		echo $JOBNAME " File is nonexist(${MATCHING_FILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# バインド変数を置き換える
	cat ${MATCHING_FILE} > ${MATCHING_QUERY_WORK}
	
	for bind in $2
	do
		bind_escape=`echo $bind | sed "s/\//\\\\\\\\\//g"`
		sed -i, -e 0,/#FILE#/s/#FILE#/$bind_escape/ ${MATCHING_QUERY_WORK}
	done
	
	export MATCHING_QUERY_WORK
}

#
#--- マッチング処理
#      p1：出力ファイルパス
#      p2：マッチングクエリファイルパス
EXEC_MATCHING()
{
	# 出力ファイルの初期化
	OUTFILE=$1
	cat /dev/null > ${OUTFILE}
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File cat error(${OUTFILE}:rc=$rc) "
		echo $JOBNAME " File cat error(${OUTFILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# マッチング実行
	export ZTLOUTFILE=${OUTFILE}
	${G_TOOLSH}/util/bin/ZTLMAT01 $2
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " matching error($2:rc=$rc) "
		echo $JOBNAME " matching error($2:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi
}

#
#--- ファイル定義
#
# *** ファイル説明 ***
# KK0081_CUR：サービス契約のカレント且つ、ステータスが照査済以降のデータ
# CK0011_CUR：お客様のカレント且つ契約者タイプコードが「保守用以外」且つ会員種別コードが「マスター（個人）」「マスター（法人）」且つ入会年月日が「20991231/null」以外のデータ
# KK0081_WK：上記「KK0081_CUR」のデータの内、更新年月日が「前回実行日」から「今回実行日」に当てはまるもの
# CK0011_WK：上記「CK0011_CUR」のデータの内、更新年月日が「前回実行日」から「今回実行日」に当てはまるもの
#
KK0081_CUR=${MID_DIR_KK}/${JOBNAME}.KK0081_CUR.csv
CK0011_CUR=${MID_DIR_KK}/${JOBNAME}.CK0011_CUR.csv
KK0081_WK=${MID_DIR_KK}/${JOBNAME}.KK0081_WK.csv
CK0011_WK=${MID_DIR_KK}/${JOBNAME}.CK0011_WK.csv
KK0791_CUR=${MID_DIR_KK}/${JOBNAME}.KK0791_CUR.csv

#
#--- 各ファイルの存在チェックを行う
#
if [ ! -r $SQLFILE ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist($SQLFILE) "
    echo $JOBNAME " File is nonexist($SQLFILE) "
    exit ${G_RTN_ERROR}
fi

#
#--- アンロードファイルのクリアを行う
#
cat /dev/null > $UNLOAD_OUTFILE

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File cat error($UNLOAD_OUTFILE:rc=$rc) "
    echo $JOBNAME " File cat error($UNLOAD_OUTFILE:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# 運用日付取得
. EOK010310J0.sh BDATE
OPEDATE=`echo $RSLT_OPEDATE`

# 運用日付の前日取得
. EOK010310J0.sh BDATE DEC 0 0 1
ZN_DATE=`echo $RSLT_OPEDATE`

#
# 連携ファイル制御（KK_T_RNKI_FILE_CTRL）から前回処理実行年月日を取得する。
#
SQL_FILE_U_KK1281_04=${SQL_DIR}/KK_U_KK1281_04.sql
KK1281_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK1281_OUT.csv
BUTSURI_BAT_ID=KKPRC06501

EDIT_ULD_QUERY ${SQL_FILE_U_KK1281_04} "${ZN_DATE} ${BUTSURI_BAT_ID} ${BUTSURI_BAT_ID}"
EXEC_UNLOAD ${SQL_WORK_FILE} ${KK1281_OUTFILE}

read EXECDATE_DQ < ${KK1281_OUTFILE}

# ダブルクォーテーション削除
EXECDATE=`echo ${EXECDATE_DQ} | sed -e 's/"//g'`

rm ${KK1281_OUTFILE}

if [ -z ${EXECDATE} ]; then
    EXECDATE=`echo ${ZN_DATE}`
fi

echo "前回実行年月日：${EXECDATE}"

# *******************************************************************
#  変更のあったサービス契約の取得
# *******************************************************************

#
#--- UNLOAD処理
#
#EXEC_UNLOAD ${SQL_FILE_U_KK0081_35} ${UNLOAD_OUTFILE}

# KK0081の共通アンロード処理よりの絞込み
#  - SELECT(reconst)項目は以下
#      0 - 0.10 ：サービス契約番号
#      1 - 3.17 ：世代登録年月日時分秒
#      2 - 7.3  ：サービス契約ステータス
#      3 - 8.10 ：SYSID
#      4 - 4.8  ：予約適用年月日
#      5 - 5.1  ：予約適用コード
#      6 - 6.1  ：無効フラグ
#      7 - 9.8  ：登録年月日
#      8 - 10.8  ：更新年月日
#      9 - 11.3  ：料金コースコード
bsortex -copy -record recform=txtcsv -input file=${KK0081_UNLOAD_OUTFILE} reclen=330 -output file=${UNLOAD_OUTFILE} reconst="0.10,3.17,7.3,8.10,4.8,5.1,6.1,9.8,10.8,11.3"

# KK0081のカレントデータ取得
#  KK0081のカレント AND サービス契約ステータス IN ('020','030','100','210','220','910','920') 
#  - SELECT(reconst)項目は以下
#      0 - 0.10 ：サービス契約番号
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.3  ：サービス契約ステータス
#      3 - 3.10 ：SYSID
#      4 - 4.8  ：予約適用年月日
#      5 - 5.1  ：予約適用コード
#      6 - 6.1  ：無効フラグ
#      7 - 7.8  ：登録年月日
#      8 - 8.8  ：更新年月日
#      9 - 9.3  ：料金コースコード
bsortex -sort key="0.10asc,4.8asc,1.17asc" -record recform=txtcsv -input reclen=100 include="6.1asc.eq.'0'.and.5.1asc.eq.'2'.and.4.8asc.le.'${OPEDATE}'" < ${UNLOAD_OUTFILE} \
  | bsortex -merge key="0.10asc" -record recform=txtcsv -input reclen=100 -summary suppress last \
  | bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=100 include="(2.3asc.eq.'100'.or.2.3asc.eq.'210'.or.2.3asc.eq.'220'.or.2.3asc.eq.'910'.or.2.3asc.eq.'920'.or.2.3asc.eq.'020'.or.2.3asc.eq.'030')" -output file=${KK0081_CUR}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# KK0081のカレントデータ取得
#  KK0081のカレント AND 登録年月日 >= 処理日 AND 更新年月日 >= 処理日
#  - SELECT(reconst)項目は以下
#      0 - 0.10 ：サービス契約番号
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.3  ：サービス契約ステータス
#      3 - 3.10 ：SYSID
#      4 - 4.8  ：予約適用年月日
#      5 - 5.1  ：予約適用コード
#      6 - 6.1  ：無効フラグ
#      7 - 7.8  ：登録年月日
#      8 - 8.8  ：更新年月日
#      9 - 9.3  ：料金コースコード
bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=100 include="8.8asc.ge.'${EXECDATE}'" -output file=${KK0081_WK} < ${KK0081_CUR}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# 一時データの削除
rm ${UNLOAD_OUTFILE}

# *******************************************************************
#  変更のあったお客様の取得
# *******************************************************************

#
#--- UNLOAD処理
#
EXEC_UNLOAD ${SQL_FILE_U_CK0011_11} ${UNLOAD_OUTFILE}

# CK0011のカレントデータ取得
#  CK0011のカレント AND 契約者タイプコード IN ('1', '2', '4') AND 会員種別コード IN ('10', '20') AND お客様ステータス = '010'
#  - SELECT(reconst)項目は以下
#      0 - 0.10 ：SYSID
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.80 ：eoID ※ NULL時は「 （半角スペース）」で取得
#      3 - 3.8  ：入会年月日 ※ NULL時は「20991231」で取得
#      4 - 4.1  ：契約者タイプコード
#      5 - 5.2  ：会員種別コード
#      6 - 6.8  ：予約適用年月日
#      7 - 7.1  ：予約適用コード
#      8 - 8.1  ：無効フラグ
#      7 - 9.8  ：登録年月日 ※ 先頭８桁（年月日）
#      10- 10.8 ：更新年月日 ※ 先頭８桁（年月日）
#      11- 11.3 ：お客様ステータス
#      12- 12.1 ：入退会コード
bsortex -sort key="0.10asc,6.8asc,1.17asc" -record recform=txtcsv -input reclen=200 include="8.1asc.eq.'0'.and.7.1asc.eq.'2'.and.6.8asc.le.'${OPEDATE}'" < ${UNLOAD_OUTFILE} \
  | bsortex -merge key="0.10asc" -record recform=txtcsv -input reclen=200 -summary suppress last \
  | bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=200 include="11.3asc.eq.'010'.and.(4.1asc.eq.'1'.or.4.1asc.eq.'2'.or.4.1asc.eq.'4').and.(5.2asc.eq.'10'.or.5.2asc.eq.'20')" -output file=${CK0011_CUR}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# CK0011のカレントデータ取得
#  CK0011のカレント AND 契約者タイプコード IN ('1', '2', '4') AND 会員種別コード IN ('10', '20') AND お客様ステータス = '010' AND 入退会コード='0' AND 更新年月日 >= 前回実行日
#  - SELECT(reconst)項目は以下
#      0 - 0.10 ：SYSID
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.80 ：eoID ※ NULL時は「 （半角スペース）」で取得
#      3 - 3.8  ：入会年月日 ※ NULL時は「20991231」で取得
#      4 - 4.1  ：契約者タイプコード
#      5 - 5.2  ：会員種別コード
#      6 - 6.8  ：予約適用年月日
#      7 - 7.1  ：予約適用コード
#      8 - 8.1  ：無効フラグ
#      7 - 9.8  ：登録年月日 ※ 先頭８桁（年月日）
#      10- 10.8 ：更新年月日 ※ 先頭８桁（年月日）
bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=200 include="10.8asc.ge.'${EXECDATE}'.and.12.1asc.eq.'0'" -output file=${CK0011_WK} < ${CK0011_CUR}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# ***************************************************************************
#  対象データの取得（マッチング）
# ***************************************************************************

#
#--- UNLOAD処理（料金コース）
#     ※ ID通知書発行識別コードが「0（発行なし）」以外のデータをアンロード
#        データは１件以上抽出される想定
#
EDIT_ULD_QUERY ${SQL_FILE_U_KK0791_03} "${OPEDATE}"
EXEC_UNLOAD ${SQL_WORK_FILE} ${KK0791_CUR}

# ワークファイル
cat /dev/null > ${MID_DIR_KK}/${JOBNAME}.WORK.csv

# *** サービス契約に紐づくお客様の取得 ***
if [ `cat ${KK0081_WK} | wc -l` -ne 0 ]
then
	EDIT_MATCHING_QUERY ${G_TOOLSH}/util/def/KK_CM_0133.def "${KK0081_WK} ${CK0011_CUR} ${KK0791_CUR}"
	EXEC_MATCHING ${MATCH_OTF} ${MATCHING_QUERY_WORK}
	# 出力ファイルへマージ
	cat ${MATCH_OTF} > ${KK0081_WK}
else
	cat /dev/null > ${KK0081_WK}
fi

# *** お客様に紐づくサービス契約の取得 ***
if [ `cat ${CK0011_WK} | wc -l` -ne 0 ]
then
	# サービス契約を照査済以降の有効（キャンセル済・解約済を除く）な対象のみとする。
	cat /dev/null > ${MID_DIR_KK}/${JOBNAME}.WORK.csv
	bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=100 include="(2.3asc.eq.'100'.or.2.3asc.eq.'210'.or.2.3asc.eq.'220'.or.2.3asc.eq.'020'.or.2.3asc.eq.'030')" -output file=${MID_DIR_KK}/${JOBNAME}.WORK.csv < ${KK0081_CUR}
	
	if [ `cat ${MID_DIR_KK}/${JOBNAME}.WORK.csv | wc -l` -ne 0 ]
	then
		EDIT_MATCHING_QUERY ${G_TOOLSH}/util/def/KK_CM_0133.def "${MID_DIR_KK}/${JOBNAME}.WORK.csv ${CK0011_WK} ${KK0791_CUR}"
		EXEC_MATCHING ${MATCH_OTF} ${MATCHING_QUERY_WORK}
		# 出力ファイルへマージ
		cat ${MATCH_OTF} > ${CK0011_WK}
	else
		cat /dev/null > ${CK0011_WK}
	fi
else
	cat /dev/null > ${CK0011_WK}
fi

# ワークファイルの削除
rm ${MID_DIR_KK}/${JOBNAME}.WORK.csv

#
# 出力ファイルの重複データ削除
#  お客様及びサービス契約のデータそれぞれから抽出しているため、重複データが存在する
#  そのデータをマージする。
#  
bsortex -merge key="0.10asc,1.3asc,2.10asc,3.80asc" -record recform=txtcsv -input file=${KK0081_WK},${CK0011_WK} reclen=140 -summary suppress last -output file=${MID_DIR_KK}/KKIFM029002.csv
cat ${MID_DIR_KK}/KKIFM029002.csv | sed -e 's/"//g' > ${MID_DIR_KK}/KKIFM029001.csv

#
# 一時ファイルの削除
#
rm ${UNLOAD_OUTFILE}
rm ${MATCH_OTF}
rm ${KK0081_CUR}
rm ${CK0011_CUR}
rm ${KK0081_WK}
rm ${CK0011_WK}
rm ${KK0791_CUR}
rm ${MID_DIR_KK}/KKIFM029002.csv

#
#---ＡＰＬ起動
#
sh ${G_TOOLSH}/EOK010210J0.sh CS00027I $JOBNAME

#
#---パラメタ定義
#
P1="OPD=$OPD,"
P2="SVCCTL=JBSbatMultiServiceControl,"
P3="JOB=EO21T0110J0,"
P4="IND1=KKIFM029.def,"
P5="INF1=${MID_DIR_KK}/KKIFM029002.csv,"
P6="IND2=,"
P7="INF2=,"
P8="OTD1=KKIFM029.def,"
P9="OTF1=${MID_DIR_KK}/KKIFM029001.csv,"
P10="OTD2=,"
P11="OTF2=,"
P12="TABLENAME=,"
P13="SQLKEY=,"
P14="SQLPARAM=,"
P15="ERRFILE=,"
P16="RECOVERY=,"
P17="BREAKPTN=,"
P18="FREE="
PARA="$P1$P2$P3$P4$P5$P6$P7$P8$P9$P10$P11$P12$P13$P14$P15$P16$P17$P18"

#java ${JAVA_OPTION} -jar ${JAR_DIR}/koptBatch.jar $PARA

rc=$?
ERR_FLG=0
if [ $rc -ne 0 ]
then
   if [ $rc -ne 4 ]
   then
       if [ $rc -ne 8 ]
       then
           if [ $rc -ne 127 ]
           then
              sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " PROGRAM Error($SVC program:rc=$rc) "
              echo $JOBNAME " PROGRAM Error($SVC program:rc=$rc) "
              exit ${G_RTN_ERROR}
           fi
       fi
    fi
    ERR_FLG=1
fi

exit_rc=$rc

#
#--- ジョブの終了メッセージを出力する
#
sh ${G_TOOLSH}/EOK010210J0.sh CS00028I $JOBNAME
sh ${G_TOOLSH}/EOK010210J0.sh CS00026I $JOBNAME

exit $exit_rc
