/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.servlet.mallmgr;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UIPayMethodListCond;
import jp.co.sint.beans.mallmgr.UIRegPayMethod;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SIDatabaseConnection;
import jp.co.sint.database.SIDeleteRec;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIInsertRec;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.database.SISpcType;
import jp.co.sint.servlet.SIServlet;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;

import org.apache.log4j.Category;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

/**
 * @version $Id: SIRegPayMethodSrv.java,v 1.0 2003/12/03 Exp $
 * @author  Jinwang Chen
 * <br>Description:
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 *  ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Jinwang Chen   2003/11/12  Original
 */
public class SIRegPayMethodSrv extends SIServlet {

  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  /**
   * <b>doUpdate</b>
   * HTTP リクエストの処理
   * @param  request　リクエスト
   * @param  response
   * @return なし
   * @throws ServletException
   * @throws IOException
   */
  public void doUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    SILogin manLogin=SIHTMLUtil.getLogin(request);
    if (!manLogin.isLogin()){
      forwardKey(request,response,"webshop.jsp.manager.login");
      return;
    }

    HttpSession session = request.getSession(true); //セッションの取得
    SIDatabaseConnection databaseConnection = new SIDatabaseConnection(); //DBへのコネクションの作成
	SIURLParameter urlParam = new SIURLParameter(request);//7.1.1 ST0236 追加

    try {

	  String actionName=this.getActionName(urlParam);//画面からのアクション	//7.1.1 ST0236 修正
	  String editMode = this.getEditMode(urlParam); //DBへの編集モード	//7.1.1 ST0236 修正

      UIRegPayMethod paymethodName = new UIRegPayMethod();
      session.removeAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_EDIT_NAME);
      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)) { //一覧と検索などの画面
		UIPayMethodListCond payMethodList = new UIPayMethodListCond(request,urlParam);//7.1.1 ST0236 修正
		payMethodList.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
        forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
      } else if (SIConfig.SIACTION_REFRESH.equalsIgnoreCase(actionName)){ //支払区分の変更
        //新規レコードの保存
		UIPayMethodListCond payMethodList = new UIPayMethodListCond(request,urlParam);//7.1.1 ST0236 修正
		payMethodList.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
        //修正中のレコードの保存
		paymethodName.initModify(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_EDIT_NAME, paymethodName);
        forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
      } else if (SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)) { //レコードの修正
        //データの取得とデータのチェック
		paymethodName.initModify(request,urlParam);//7.1.1 ST0236 修正
        if (!paymethodName.validateModify(request,databaseConnection.getConnection())) { //エラーがあれば
          session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_EDIT_NAME, paymethodName);
          forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
        } else { //エラーがなければ
          try {
            //レコードの修正
            updateTableData(databaseConnection.getConnection(), paymethodName);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.modify"));
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          } catch (SIDBAccessException e) {
            session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_EDIT_NAME, paymethodName);
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          }
        }
      } else if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)) { //新規のレコード
		UIPayMethodListCond payMethodList = new UIPayMethodListCond(request,urlParam);//7.1.1 ST0236 修正
        //データの取得とデータのチェック
		paymethodName.initInsert(request,urlParam);//7.1.1 ST0236 修正
        if (!paymethodName.validateInsert(request, databaseConnection.getConnection())) { //エラーがあれば
          //画面の値を取得
		  payMethodList.init(request,urlParam);//7.1.1 ST0236 修正
          session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
          forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
        } else { //エラーがなければ
          try {
            //データレコードの作成
            insertTableData(databaseConnection.getConnection(), paymethodName);
            try {
              databaseConnection.getConnection().commit();
            } catch (SQLException sqle) {
              throw new SIDBAccessException("insert data error.");
            }
            session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.insert"));
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          } catch (SIDuplicateKeyException e) {
            //画面の値を取得
			payMethodList.init(request,urlParam);//7.1.1 ST0236 修正
            session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.insert.duplicate"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          } catch (SIDBAccessException e) {
            //画面の値を取得
			payMethodList.init(request,urlParam);//7.1.1 ST0236 修正
            session.setAttribute(SIConfig.SISESSION_MAN_PAYMETHOD_LIST_NAME,payMethodList);
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          }
        }
      } else if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)) { //レコードの削除
        //キーデータの取得とデータのチェック
		paymethodName.initModify(request,urlParam);//7.1.1 ST0236 修正

        if (!paymethodName.validateDelete(request, databaseConnection.getConnection())) { //エラーがあれば
          forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
        } else { //エラーがなければ
          try {
            //レコードの削除
            deleteTableData(databaseConnection.getConnection(), paymethodName);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.delete"));
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          } catch (SIDBAccessException e) {
            e.printStackTrace();
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
            forwardKey(request, response, "webshop.jsp.manager.paymethod.list");
          }
        }
      }
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }
  }

  /**
   * <b>insertTableData</b>
   * データベースにレコードを作成します。
   * @param lConnection DBへのコネクション
   * @param paymethodName 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public void insertTableData(Connection lConnection, UIRegPayMethod paymethodName) throws SIDuplicateKeyException, SIDBAccessException {
    SISpcType lSpcType = new SISpcType();
    SIInsertRec lRec = null;

	//payMethodFeeMTblにデフォルトデータ作成
	if(paymethodName.getPaymentFlg().equals("2")){
		lRec = new SIInsertRec("payMethodFeeMTbl");
		lRec.add("mallShopCode", paymethodName.getMallShopCode());
		lRec.add("payMethodCode", paymethodName.getPayMethodCode());
		lRec.add("priceTo", "99999999");
		lRec.add("fee", "0");
		lRec.execute(lConnection);
	}

	lRec = new SIInsertRec("payMethodMTbl");
    lRec.add("mallShopCode", paymethodName.getMallShopCode());
    lRec.add("payMethodCode", paymethodName.getPayMethodCode());
    lRec.add("payMethodName", paymethodName.getPayMethodName().trim());
    lRec.add("paymentFlg", paymethodName.getPaymentFlg());
  //7.3.0 PI-NES0501 修正 ここから
	//支払区分が代金引換の時は0をセットする。
  /*
	if(paymethodName.getPaymentFlg().equals("2")){
		lRec.add("fee", "0");

	}else{
		lRec.add("fee", paymethodName.getFee());
	}
  */
    lRec.add("fee", "0");
  //7.3.0 PI-NES0501 修正 ここまで
    //データの更新
    lRec.execute(lConnection);

  }

  /**
   * <b>updateTableData</b>
   * データベースにレコードを修正します。
   * @param lConnection DBへのコネクション
   * @param paymethodName 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void updateTableData(Connection lConnection, UIRegPayMethod paymethodName) throws SIDBAccessException {
    SIModifyRec lRec = new SIModifyRec("payMethodMTbl");

    lRec.addCondition("mallShopCode", paymethodName.getRegMallShopCode());
    lRec.addCondition("payMethodCode", paymethodName.getRegPayMethodCode());
    lRec.add("payMethodName", paymethodName.getRegPayMethodName().trim());
    lRec.add("paymentFlg", paymethodName.getRegPaymentFlg());
    //支払区分が代金引換の時は0をセットする。
    //7.3.0 PI-NES0501 修正 ここから
    /*
    if(paymethodName.getRegPaymentFlg().equals("2")){
		lRec.add("fee", "0");
    }else{
		lRec.add("fee", paymethodName.getRegFee());
    }
    */
    lRec.add("fee", "0");
    //7.3.0 PI-NES0501 修正 ここまで


    Statement lStatement=null;
    ResultSet lResultSet=null;
    try {
	  //支払い区分が代引き以外ならPAYMETHODFEEMTBLを削除
	  if(!paymethodName.getRegPaymentFlg().equals("2")){
		SIDeleteRec lDelRec = new SIDeleteRec("PayMethodFeeMtbl");
		lDelRec.addCondition("mallShopCode", paymethodName.getRegMallShopCode());
		lDelRec.addCondition("payMethodCode", paymethodName.getRegPayMethodCode());
		lDelRec.execute(lConnection);
	  }else{//payMethodFeeMTblにデフォルトデータ作成

		//既存レコードが無いとき
	  	String str = "SELECT priceTo FROM payMethodFeeMTbl "
	  			   + "WHERE mallShopCode = '" + paymethodName.getRegMallShopCode() + "' "
	  			   + "AND payMethodCode = " + paymethodName.getRegPayMethodCode();
    lStatement=lConnection.createStatement();
    lResultSet=lStatement.executeQuery(str);
		if(!lResultSet.next()){
			SIInsertRec insRec = new SIInsertRec("payMethodFeeMTbl");
			insRec.add("mallShopCode", paymethodName.getRegMallShopCode());
			insRec.add("payMethodCode", paymethodName.getRegPayMethodCode());
			insRec.add("priceTo", "99999999");
			insRec.add("fee", "0");
			insRec.execute(lConnection);
		}
	  }
	  lRec.execute(lConnection);
      lConnection.commit();
    } catch (SIDuplicateKeyException e) {
    } catch (SQLException sqle) {
      sqle.printStackTrace();
      throw new SIDBAccessException("modify data error.");
    }finally{
      SIDBUtil.close(lStatement,lResultSet);
    }
  }

  /**
   * <b>deleteTableData</b>
   * データベースにレコードを削除します。
   * @param lConnection DBへのコネクション
   * @param paymethodName 削除するデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public void deleteTableData(Connection lConnection, UIRegPayMethod paymethodName) throws SIDBAccessException {
  	try {

  	  //ひもづくPAYMETHODFEEMTBLを削除
  	  SIDeleteRec lRecFee = new SIDeleteRec("PayMethodFeeMtbl");
  	  lRecFee.addCondition("mallShopCode", paymethodName.getRegMallShopCode());
  	  lRecFee.addCondition("payMethodCode", paymethodName.getRegPayMethodCode());
  	  lRecFee.execute(lConnection);

  	  //CustTblの支払方法を"0"にセットする。
  	  if(paymethodName.getRegMallShopCode().equals("0")
  	  && !paymethodName.getRegPayMethodCode().equals("0")){
    		SIModifyRec modRec = new SIModifyRec("custTbl");
    		modRec.addCondition("payMethodCode",paymethodName.getRegPayMethodCode());
    		modRec.add("payMethodCode","0");
    		modRec.execute(lConnection);
  	  }

      //payeeInfoTblを削除
      SIDeleteRec lRec = new SIDeleteRec("payeeInfoMTbl");
      lRec.addCondition("mallShopCode", paymethodName.getRegMallShopCode());
      lRec.addCondition("payMethodCode", paymethodName.getRegPayMethodCode());
      lRec.execute(lConnection);

  	  //payMethodMTblを削除
      lRec = new SIDeleteRec("payMethodMTbl");
      lRec.addCondition("mallShopCode", paymethodName.getRegMallShopCode());
      lRec.addCondition("payMethodCode", paymethodName.getRegPayMethodCode());
  	  lRec.execute(lConnection);

      lConnection.commit();

    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException("delete data error.");
    } catch (SQLException sqle) {
      throw new SIDBAccessException("delete data error.");
    }
  }

  /**
   * <b>insertTableData_payMethod</b>
   * ショップが登録されたときにデータベースにレコードを作成します。
   * @param lConnection DBへのコネクション
   * @param paymethodName 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public void insertTableData_payMethod(Connection lConnection, UIRegPayMethod paymethodName) throws SIDuplicateKeyException, SIDBAccessException {
	SISpcType lSpcType = new SISpcType();
	SIInsertRec lRec = new SIInsertRec("payMethodMTbl");

	lRec.add("mallShopCode", paymethodName.getMallShopCode());
	lRec.add("payMethodCode", paymethodName.getPayMethodCode());
	//データの更新
	lRec.execute(lConnection);
  }

  public void destroy() {
  }

}
