/*
 * Copyright (c) 2007 NTT DATA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.terasoluna.batch.functionsample.sample001;

import jp.terasoluna.fw.batch.core.JobException;
import jp.terasoluna.fw.batch.openapi.BLogic;
import jp.terasoluna.fw.batch.openapi.BLogicResult;
import jp.terasoluna.fw.batch.openapi.ReturnCode;
import jp.terasoluna.fw.dao.QueryDAO;
import jp.terasoluna.fw.dao.UpdateDAO;
import jp.terasoluna.batch.functionsample.common.NyusyukkinData;
import jp.terasoluna.batch.functionsample.common.ZandakaData;

/**
 * ビジネスロジッククラス
 * <p>残高テーブルを更新する。<br>
 * 起動1回目の場合、処理件数が例外発生ポイントに達した時点でJobExceptionをスローする。<br>
 * 起動2回目の場合、リスタートポイントから最終まで処理を行う。</p>
 */
public class Sample001BLogic02 implements BLogic<NyusyukkinData, Sample001JobContext02> {

    /**
     * DAOクラス。
     * Springによりインスタンス生成され設定される。
     */
    private QueryDAO queryDAO;
   
    /**
     * DAOクラス。
     * Springによりインスタンス生成され設定される。
     */
    private UpdateDAO updateDAO;

    //入出金区分の「入金」
    private static final int NYUKIN = 0;
    
    public BLogicResult execute(NyusyukkinData nyusyukkin, Sample001JobContext02 jobContext) {
    
    //1回目の起動で処理件数が例外発生ポイントに達した場合、JobExceptionをスローする。
    if(!jobContext.isRestarted() 
        && jobContext.getExceptionPoint() == jobContext.getCount()){
        throw new JobException("例外発生ポイント:" + jobContext.getExceptionPoint());
    }
    
    //残高テーブルから入出金データの顧客CDにひもづくデータを取得する
    ZandakaData zandakaData
        = queryDAO.executeForObject("SAMPLE001.getZandakaDataByKokyakucd", 
            nyusyukkin.getKokyakucd(), ZandakaData.class);

    //入出金区分をチェックし、残高計算を行う
    int zandaka = 0;
    if(nyusyukkin.getNyusyukkincd() == NYUKIN){
        zandaka = nyusyukkin.getKingaku();
    }else{
        zandaka = zandaka - nyusyukkin.getKingaku();
    }
    
    //レコード追加
    if(zandakaData != null){
        zandaka = zandaka + zandakaData.getZandaka();
        zandakaData.setZandaka(zandaka);
        zandakaData.setSaisyutorihikibi(nyusyukkin.getTorihikibi());
        updateDAO.execute("SAMPLE001.updateZandakaData", zandakaData);
    
    //レコード更新
    }else{
        zandakaData = new ZandakaData();
        zandakaData.setKokyakucd(nyusyukkin.getKokyakucd());
        zandakaData.setZandaka(zandaka);
        zandakaData.setSaisyutorihikibi(nyusyukkin.getTorihikibi());
        updateDAO.execute("SAMPLE001.insertZandakaData", zandakaData);
    }
    
    //処理件数をインクリメント
    jobContext.incrementCount();
    
    return new BLogicResult(ReturnCode.NORMAL_CONTINUE);
    }

    /**
     * QueryDAOを設定する。
     * @param queryDAO 設定するQueryDAO
     */
    public void setQueryDAO(QueryDAO queryDAO) {
        this.queryDAO = queryDAO;
    }
    
    /**
     * UpdateDAOを設定する。
     * @param updateDAO 設定するUpdateDAO
     */
    public void setUpdateDAO(UpdateDAO updateDAO) {
        this.updateDAO = updateDAO;
    }
}
