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

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

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.UIRegCharge;
import jp.co.sint.beans.mallmgr.UIChargeListCond;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
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 jp.co.sint.tools.SIDateTime;

import org.apache.log4j.Category;
import jp.co.sint.tools.SIURLParameter;


public class SIRegChargeSrv 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);
    
    try {
      String actionName = this.getActionName(urlParam);//画面からのアクション
      String editMode = this.getEditMode(urlParam);//DBへの編集モード
      
      UIChargeListCond chargeList = new UIChargeListCond();
      session.removeAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME);
      
      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)){
        chargeList.init(request,urlParam);
        chargeList.validate(request, databaseConnection.getConnection());
        session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_LIST_NAME,chargeList);
        forwardKey(request,response,"webshop.jsp.manager.charge");
      } else if (SIConfig.SIACTION_BACK.equalsIgnoreCase(actionName)){
        forwardKey(request,response,"webshop.jsp.manager.charge");
      } else if (SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//レコードの更新
        //データの取得とデータのチェック
        UIRegCharge regCharge = new UIRegCharge();
        regCharge.initModify(request,urlParam);
        if (!regCharge.validateModify(request)){//エラーがあれば
          session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME,regCharge);
          forwardKey(request,response,"webshop.jsp.manager.charge");
        }else{//エラーがなければ
          try {
            //レコードの修正
            updateTableData(databaseConnection.getConnection(),regCharge);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                  SIErrorFactory.getErrorMsg("manager.message.success.modify"));
            try{databaseConnection.getConnection().commit();}catch(SQLException sqle){}
            forwardKey(request,response,"webshop.jsp.manager.charge");
          }catch (SIDBAccessException e){
            try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
            session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME,regCharge);
            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.charge");
          }
        }
      }else if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)){//レコードの新規作成
        //データの取得とデータのチェック
        UIRegCharge regCharge = new UIRegCharge();
        regCharge.initInsert(request,urlParam);
        chargeList.initInsert(request, urlParam);
        if (!regCharge.validateInsert(request,databaseConnection.getConnection())){//エラーがあれば
          session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_LIST_NAME,chargeList);
          session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME,regCharge);
          forwardKey(request,response,"webshop.jsp.manager.charge");
        }else{//エラーがなければ
          try {
            //データレコードの作製
            insertTableData(databaseConnection.getConnection(),regCharge);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                  SIErrorFactory.getErrorMsg("manager.message.success.insert"));
            try{databaseConnection.getConnection().commit();}catch(SQLException sqle){}
            forwardKey(request,response,"webshop.jsp.manager.charge");
          }catch (SIDuplicateKeyException e){
            try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
            session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME,regCharge);
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.insert.duplicate2","担当者マスタ"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
            forwardKey(request,response,"webshop.jsp.manager.charge");
          }catch (SIDBAccessException e){
            try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
            session.setAttribute(SIConfig.SISESSION_MAN_CHARGE_EDIT_NAME,regCharge);
            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.charge");
          }
        }
      }else if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)){//レコードの削除
        //キーデータの取得とデータのチェック
        UIRegCharge regCharge = new UIRegCharge();
        regCharge.initDelete(request,urlParam);
        if (!regCharge.validateDelete(request,databaseConnection.getConnection())){//エラーがあれば
          forwardKey(request,response,"webshop.jsp.manager.charge");
        }else{//エラーがなければ
          try {
            //レコードの削除
            deleteTableData(databaseConnection.getConnection(),regCharge);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                  SIErrorFactory.getErrorMsg("manager.message.success.delete"));
            try{databaseConnection.getConnection().commit();}catch(SQLException sqle){}
            forwardKey(request,response,"webshop.jsp.manager.charge");
          }catch (SIDBAccessException e){
            try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
            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.charge");
          }
        }
      }
    }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 regCharge 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void insertTableData(Connection lConnection,UIRegCharge regCharge) throws SIDuplicateKeyException,SIDBAccessException{
    SIDateTime lDateTime = new SIDateTime();
    
    SIInsertRec lRec = new SIInsertRec("ChargeTbl");
    lRec.add("ChargeCode",regCharge.getRegChargeCodeTxt());//担当者コード
    lRec.add("ChargeName",regCharge.getRegChargeNameTxt());//担当者名
    lRec.add("Email",regCharge.getRegEmailTxt());//メールアドレス
    lRec.add("BelongingBranchCode",regCharge.getRegBelongingBranchCodeTxt());//所属支店コード
    lRec.add("InitDatetime",lDateTime.getFullDateTime());//登録日時
    lRec.add("UpdateDatetime",lDateTime.getFullDateTime());//更新日時
    
    //データの更新
    lRec.execute(lConnection);
  }
  
  /**
   * <b>updateTableData</b>
   * データベースのレコードを修正します。
   * @param lConnection DBへのコネクション
   * @param regCharge 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void updateTableData(Connection lConnection,UIRegCharge regCharge)throws SIDBAccessException{
    SIModifyRec lRec = new SIModifyRec("ChargeTbl");
    SIDateTime lDateTime = new SIDateTime();
    
    lRec.addCondition("ChargeCode",regCharge.getRegChargeCodeTxt());//担当者コード
    lRec.add("ChargeName",regCharge.getRegChargeNameTxt());//担当者名
    lRec.add("Email",regCharge.getRegEmailTxt());//メールアドレス
    lRec.add("EnableFlg",regCharge.getRegEnableFlg());//表示フラグ
    lRec.add("OtherAddrFlg",regCharge.getRegOtherAddrFlg());//本社フラグ
    lRec.add("UpdateDatetime",lDateTime.getFullDateTime());//更新日時
    
    try {
      lRec.execute(lConnection);
    }catch(SIDuplicateKeyException e){
      e.printStackTrace();
      throw new SIDBAccessException();
    }
  }
  
  /**
   * <b>deleteTableData</b>
   * データベースからレコードを削除します。
   * @param lConnection DBへのコネクション
   * @param regCharge 削除するデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  
  private void deleteTableData(Connection lConnection,UIRegCharge regCharge) throws SIDBAccessException{
    try {
      SIDeleteRec lRec = new SIDeleteRec("ChargeTbl");
      lRec.addCondition("ChargeCode",regCharge.getRegChargeCodeTxt());//担当者コード
      lRec.execute(lConnection);
      
    }catch(SIDuplicateKeyException e){
      throw new SIDBAccessException("delete data error.");
    }
  }
  
  public void destroy() {
  }
}
