#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：請求収納
#
# シェル名      ：クレジット請求データ結果チェック（オーソリ無）
#
# 機能          ：コンシューマクレジット請求結果受信（オーソリ無）ファイルのレコード内にある「処理結果」が
#                 異常であるデータがないかをチェックする。また、いずれのファイルにしかないデータをファイル出力する。
#
# コマンド形式  ：EO60D0420J0.sh
#
# 実行環境      ：.../app/shl
#
# 終了ステータス：ゼロ以外異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
# v58.0.0         2022/05/24  FJ）中原     【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
#
##############################################################

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

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

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

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

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

#
#---OPD
#
OPD=$1
#
#---運用日付取得
#
if [ "${OPD}" = "" ]; then
   . EOK010310J0.sh "NDATE"
   OPD=${RSLT_OPEDATE}
else
   RSLT_OPEDATE=${OPD}
fi

#
#---業務で必要な変数定義
#
##############################################################
# 業務処理
##############################################################
sh ${G_TOOLSH}/EOK010210J0.sh CS00025I $JOBNAME

# エラーフラグ定義
ERR_FLG=0

##############################################################
# 共通関数
##############################################################

#
#--- マッチング実行時のエラー処理
#      p1：マッチングの終了コード
#      p2：マッチングの定義ファイル
#
MATCHING_ERROR()
{
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " MATCHING error($2 matching:rc=$1) "
    echo $JOBNAME " MATCHING error($2 matching:rc=$1) "
    exit ${G_RTN_ERROR}
}

#-------------------------------------------------------------
#--- ファイル定義
#-------------------------------------------------------------
#-- 入力ファイル
# クレジット請求情報
INPUTFILE_SEND=${MID_DIR_CH}/CHIFM004001.csv
INPUTFILE_SEND_WORK=${LOC_DIR_CH}/${JOBNAME}_CHIFM004001_WORK.csv
INPUTFILE_SEND_MATCH=${LOC_DIR_CH}/${JOBNAME}_CHIFM004001_MATCH.csv
INPUTFILE_SEND_MATCH_FLG=${LOC_DIR_CH}/${JOBNAME}_CHIFM004001_MATCH_FLG.csv
INPUTFILE_SEND_FLG=${LOC_DIR_CH}/${JOBNAME}_CHIFM004001_FLG.csv
INPUTFILE_SEND_JOIN=${LOC_DIR_CH}/${JOBNAME}_CHIFM004001_JOIN.csv
# コンシューマクレジット請求結果受信（オーソリ無）ファイル
INPUTFILE_RECV=${MID_DIR_CH}/CHIFM410010.csv
INPUTFILE_RECV_FLG=${LOC_DIR_CH}/${JOBNAME}_CHIFM410010_FLG.csv
INPUTFILE_RECV_JOIN=${LOC_DIR_CH}/${JOBNAME}_CHIFM410010_JOIN.csv

#-- Java入力ファイル
INPUTFILE_JAVA=${MID_DIR_CH}/CHIFM414001.csv
INPUTFILE_JAVA_WORK=${LOC_DIR_CH}/${JOBNAME}_CHIFM414001_WORK.csv

#-- 出力ファイル
# コンシューマクレジット請求結果未受信データ
OUTPUTFILE_MIRECV=${MID_DIR_CH}/CHIFM415001.csv
OUTPUTFILE_MIRECV_TMP=${LOC_DIR_CH}/${JOBNAME}_CHIFM415001_TMP.csv

#-- 一時ファイル
CHIFM004_TMP=${LOC_DIR_CH}/${JOBNAME}_CHIFM004_TMP.csv
CHIFM409_TMP=${LOC_DIR_CH}/${JOBNAME}_CHIFM409_TMP.csv

# マッチングツール定義ファイル
# マーチャント取引IDが一致(オーソリ無ベース）
MATCHDEF_CH0263=${G_TOOLSH}/util/def/CH_CM_0263.def
# マーチャント取引IDが一致(クレジット請求情報ベース）
MATCHDEF_CH0264=${G_TOOLSH}/util/def/CH_CM_0264.def

# ファイル長さ
FILE_LEN=500

#-------------------------------------------------------------
#---ファイルマッチング処理
#-------------------------------------------------------------

#--- マッチングツール環境変数
export ZTLOUTFILE=${INPUTFILE_JAVA}
export INPUTFILE_RECV=${INPUTFILE_RECV}
export INPUTFILE_JAVA=${INPUTFILE_JAVA}

# ファイル初期化
cat /dev/null > ${OUTPUTFILE_MIRECV}

##############################################################
# ①マーチャント取引IDが一致ファイル作成
##############################################################
# マッチングをおこなうため、改行コードをCRLF→LFにおこなう
nkf -Lu  ${INPUTFILE_SEND} >  ${INPUTFILE_SEND_WORK}
export INPUTFILE_SEND=${INPUTFILE_SEND_WORK}

#--- ファイルマッチング
${G_TOOLSH}/util/bin/ZTLMAT01 ${MATCHDEF_CH0263}

rc=$?
if [ $rc -ne 0 ]
then
    MATCHING_ERROR $rc ${MATCHDEF_CH0263}
fi

##############################################################
#  オーソリ無ファイルにしかないデータの作成
##############################################################
#  ①で出力したファイルにマッチング一致のフラグを立てる。
bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN} file=${INPUTFILE_JAVA} \
reconst="'1'.1ascA,1.END" -output file=${INPUTFILE_JAVA_WORK}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM410010 COPY Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

#  オーソリ無の元ファイルにマッチング不一致のフラグを立てる。
bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN} file=${INPUTFILE_RECV} \
reconst="'0'.1ascA,0.END" -output file=${INPUTFILE_RECV_FLG}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM410010 COPY Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# マッチング一致フラグ１とマッチング不一致フラグ０を結合する
cat ${INPUTFILE_RECV_FLG} ${INPUTFILE_JAVA_WORK} > ${INPUTFILE_RECV_JOIN}

# 結合したファイルにソート、マージ、分割をおこなう
bsortex -sort key=3.25asc,0.1asc -record recform=txtcsv -input  reclen=${FILE_LEN} < ${INPUTFILE_RECV_JOIN} \
  | bsortex -merge key="3.25asc" -record recform=txtcsv -input reclen=${FILE_LEN} -summary suppress last \
  | bsortex -sort key="3.25asc" -record recform=txtcsv -input reclen=${FILE_LEN} include="0.1asc.eq.'0'" \
  | bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN}  reconst="1.END" -output file=${CHIFM409_TMP}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM410010 SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM410010 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi


##############################################################
#  クレジット請求情報ファイルにしかないデータの作成
##############################################################
# ②マーチャント取引IDが一致しない（クレジット請求情報のみに存在）
#--- マッチングツール環境変数
export ZTLOUTFILE=${INPUTFILE_SEND_MATCH}

#--- ファイルマッチング
${G_TOOLSH}/util/bin/ZTLMAT01 ${MATCHDEF_CH0264}

rc=$?
if [ $rc -ne 0 ]
then
    MATCHING_ERROR $rc ${MATCHDEF_CH0264}
fi

#  ①で出力したファイルにマッチング一致のフラグを立てる。
bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN} file=${INPUTFILE_SEND_MATCH} \
reconst="'1'.1ascA,0.END" -output file=${INPUTFILE_SEND_MATCH_FLG}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM004001 COPY Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

#  クレジット請求情報の元ファイルにマッチング不一致のフラグを立てる。かつオーソリ有分のデータは出力しない(決済ＩＤが設定あり)。
bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN} file=${INPUTFILE_SEND_WORK} \
include="12.18asc.lt.' '" reconst="'0'.1ascA,0.END" -output file=${INPUTFILE_SEND_FLG}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM004001 COPY Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# マッチング一致フラグ１とマッチング不一致フラグ０を結合する
cat ${INPUTFILE_SEND_FLG} ${INPUTFILE_SEND_MATCH_FLG} > ${INPUTFILE_SEND_JOIN}

# 結合したファイルにソート、マージ、分割をおこなう
bsortex -sort key=14.25asc,0.1asc -record recform=txtcsv -input  reclen=${FILE_LEN} < ${INPUTFILE_SEND_JOIN} \
  | bsortex -merge key="14.25asc" -record recform=txtcsv -input reclen=${FILE_LEN} -summary suppress last \
  | bsortex -sort key="14.25asc" -record recform=txtcsv -input reclen=${FILE_LEN}  include="0.1asc.eq.'0'" \
  | bsortex -copy -record recform=txtcsv -input reclen=${FILE_LEN}  reconst="1.END" -output file=${CHIFM004_TMP}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " CHIFM004001 SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

##############################################################
#  コンシューマクレジット請求結果未受信データの作成
##############################################################
# クレジット請求情報にしか存在しない、もしくはコンシューマクレジット請求結果受信（オーソリ無）にしか存在しないファイルを結合
# クレジット請求情報のヘッダー
echo "請求契約番号,請求番号,請求年月,売上年月日,クレジットカード番号,請求クレジット会社コード,クレジット交換コード,請求金額,消費税額,加盟店番号,オーソリ承認番号,クレジットカード有効期限,決済ID,マーチャント取引ID" | nkf -x -s > ${OUTPUTFILE_MIRECV_TMP}
# クレジット請求結果受信（オーソリ無）のヘッダー
cat ${CHIFM004_TMP} >> ${OUTPUTFILE_MIRECV_TMP}
echo "レコードID,サイトID,マーチャント取引ID,決済ID,決済金額,カード番号,カード有効期限,支払区分,予備項目,予備項目,分割回数,参照マーチャント取引ＩＤ,カード情報お預りモード,顧客ID,顧客カードID,同時売上モード,利用者請求日,処理結果,レスポンスコード,レスポンス詳細,イシュア区分,取扱カード会社コード,取扱カード会社名,カード発行会社コード,カード発行会社名,承認番号" | nkf -x -s >> ${OUTPUTFILE_MIRECV_TMP}
cat ${CHIFM409_TMP} >> ${OUTPUTFILE_MIRECV_TMP}
# 改行コードをLF→CRLF、SJISに変換
nkf -Lw ${OUTPUTFILE_MIRECV_TMP}  | nkf -x -s  > ${OUTPUTFILE_MIRECV}


# ファイル行数をカウントし、ヘッダー部以外のデータが存在する場合、ワーニング出力
LINECOUNT=`wc -l ${OUTPUTFILE_MIRECV} | awk '{printf $1}'`
if [ ${LINECOUNT} -ne 2 ] 
then
    ERR_FLG=8
fi

#
#---パラメタ定義
#

P1="OPD=${RSLT_OPEDATE},"
P2="SVCCTL=JBSbatMultiServiceControl,"
P3="JOB=EO60D0420J0,"
P4="IND1=CHIFM414.def,"
P5="INF1=${INPUTFILE_JAVA},"
P6="IND2=,"
P7="INF2=,"
P8="OTD1=,"
P9="OTF1=,"
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"

sh ${G_TOOLSH}/EOK010210J0.sh CS00027I $JOBNAME

#
#---ＡＰＬ起動
#

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

rc=$?
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
fi

exit_rc=0

# ファイルマッチング結果とJavaの結果を比較し、エラーレベルが高い値を設定
if [ $rc -lt ${ERR_FLG} ]
then
   exit_rc=${ERR_FLG}
else
   exit_rc=${rc}
fi


# 一時ファイル削除
rm -f ${INPUTFILE_JAVA}
rm -f ${INPUTFILE_SEND_WORK}
rm -f ${INPUTFILE_SEND_MATCH}
rm -f ${INPUTFILE_SEND_MATCH_FLG}
rm -f ${INPUTFILE_SEND_FLG}
rm -f ${INPUTFILE_SEND_JOIN}
rm -f ${INPUTFILE_RECV_FLG}
rm -f ${INPUTFILE_RECV_JOIN}
rm -f ${INPUTFILE_JAVA_WORK}
rm -f ${OUTPUTFILE_MIRECV_TMP}
rm -f ${CHIFM004_TMP}
rm -f ${CHIFM409_TMP}

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

exit $exit_rc
