/**
 * 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.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.UIUserListCond;
import jp.co.sint.beans.mallmgr.UIRegUserEdit;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
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 org.apache.log4j.Category;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SICodeToName;

/**
 * @version $Id: SIRegManUserSrv.java,v 1.0 2003/07/25 Exp $
 * <br>Description: 管理用ユーザーマスタの管理を行うサーブレット
 */

public class SIRegManUserSrv 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);
    UIRegUserEdit userEdit = new UIRegUserEdit();
    
    try {
      String actionName=this.getActionName(urlParam);//画面からのアクション
      String editMode = this.getEditMode(urlParam); //DBへの編集モード
      
      UIUserListCond UserListCond=new UIUserListCond();
      
      if(SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)){//一覧と検索などの画面
      //データの取得とデータのチェック
        SICodeToName codeToName = new SICodeToName();
        codeToName.srchShopName(databaseConnection.getConnection(),(String)urlParam.getParam("shopCodeTxt"));
        UserListCond=new UIUserListCond(request,urlParam);
        UserListCond.setShopNameTxt(codeToName.getMallShopName());
        UserListCond.validate(request);
        session.setAttribute(SIConfig.SISESSION_MAN_USER_LIST_NAME,UserListCond);
        forwardKey(request,response,"webshop.jsp.manager.user.list");
      }else if(SIConfig.SIACTION_BACK.equalsIgnoreCase(actionName)){
        forwardKey(request,response,"webshop.jsp.manager.user.list");
      }else if(SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//登録画面へ
        userEdit.init(request, urlParam, manLogin);
        userEdit.reset(databaseConnection.getConnection());
        SICodeToName codeToName = new SICodeToName();
        codeToName.srchShopName(databaseConnection.getConnection(),userEdit.getShopCode());
        userEdit.setShopName(codeToName.getMallShopName());
        session.setAttribute(SIConfig.SISESSION_MAN_REG_USER_EDIT_NAME,userEdit);
        forwardKey(request,response,"webshop.jsp.manager.user.edit");
      }else if(SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)){//登録確認画面へ
        userEdit.init(request, urlParam, manLogin);
        SICodeToName codeToName = new SICodeToName();
        codeToName.srchShopName(databaseConnection.getConnection(),userEdit.getShopCode());
        userEdit.setShopName(codeToName.getMallShopName());
        session.setAttribute(SIConfig.SISESSION_MAN_REG_USER_EDIT_NAME,userEdit);
        if(userEdit.validate(request, databaseConnection.getConnection())){
          forwardKey(request,response,"webshop.jsp.manager.user.confirm");
        }else{
          forwardKey(request,response,"webshop.jsp.manager.user.edit");
        }
      }else if(SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)){//再度登録画面へ
        userEdit =(UIRegUserEdit)session.getAttribute(SIConfig.SISESSION_MAN_REG_USER_EDIT_NAME);
        forwardKey(request,response,"webshop.jsp.manager.user.edit");
      }else if(SIConfig.SIACTION_REGIST.equalsIgnoreCase(actionName)){//DBに登録
        try{
          //データレコードの作製
          userEdit =(UIRegUserEdit)session.getAttribute(SIConfig.SISESSION_MAN_REG_USER_EDIT_NAME);
          if(userEdit.isModifyMode()){
            updateTableData(databaseConnection.getConnection(),userEdit);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.update"));
          }else{
            insertTableData(databaseConnection.getConnection(),userEdit);
            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.user.result");
        }catch(SIDuplicateKeyException e){
          try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
          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.user.list");
        }catch(SIDBAccessException e){
          try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
          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.user.edit");
        }catch(SQLException e){
          try{databaseConnection.getConnection().rollback();}catch(SQLException sqle){}
          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.user.edit");
        }
      }else if(SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)){
        userEdit.init(request, urlParam, manLogin);
        session.setAttribute(SIConfig.SISESSION_MAN_REG_USER_EDIT_NAME,userEdit);
        forwardKey(request,response,"webshop.jsp.manager.user.edit");
      }else if(SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)){//レコードの削除
        userEdit.initDelete(request,urlParam);
        try{
          //レコードの削除
          deleteTableData(databaseConnection.getConnection(),userEdit);
          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.user.list");
        }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.user.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 regUserInfo 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void insertTableData(Connection lConnection,UIRegUserEdit userEdit) throws SIDuplicateKeyException,SIDBAccessException{
    SIInsertRec lRec=new SIInsertRec("MNGUSERMTBL");
    lRec.add("MallShopCode", userEdit.getShopCode());//ショップコード
    lRec.add("UserCode",userEdit.getUserCode());//個人コード
    lRec.add("UserName",userEdit.getUserName());//名前
    lRec.add("Password",userEdit.getPassWord());//名前
    lRec.add("Memo",userEdit.getMemo());
    lRec.add("MngOrder",userEdit.getMngOrder());
    lRec.add("MngOrderCsv",userEdit.getMngOrderCsv());
    lRec.add("MngOrderPdf",userEdit.getMngOrderPdf());
    lRec.add("MngCust",userEdit.getMngCust());
    lRec.add("MngCustCsv",userEdit.getMngCustCsv());
    lRec.add("MngCustPdf",userEdit.getMngCustPdf());
    lRec.add("MngCustDelPoint",userEdit.getMngCustDelPoint());
    lRec.add("MngCustAddPoint",userEdit.getMngCustAddPoint());
    lRec.add("MngBaseInfo",userEdit.getMngBaseInfo());
    lRec.add("MngUserMst",userEdit.getMngUserMst());
    lRec.add("MngAccesslog",userEdit.getMngAccesslog());
    lRec.add("MngCmdty",userEdit.getMngCmdty());
    lRec.add("MngCmdtyCsv",userEdit.getMngCmdtyCsv());
    lRec.add("MngAnalysis",userEdit.getMngAnalysis());
    lRec.add("MngAnalysisCsv",userEdit.getMngAnalysisCsv());
    lRec.add("MngCmn",userEdit.getMngCmn());
    lRec.add("MngDataIo",userEdit.getMngDataIo());
    lRec.add("MngDataInputCsv",userEdit.getMngDataInputCsv());
    lRec.add("MngDataOutputCsv",userEdit.getMngDataOutputCsv());
    lRec.add("MngStock",userEdit.getMngStock());
    lRec.add("MngCmdtyLevel",userEdit.getMngCmdtyLevel());
    lRec.add("MngDataIoExcel",userEdit.getMngDataIoExcel());
    lRec.add("LoginErrorCount ",userEdit.getLoginErrCount());
    lRec.add("MngCmdtyPoint",userEdit.getMngCmdtyPoint());
    lRec.add("MngNews", userEdit.getMngNews());
    lRec.add("MngCmdtyDisable", userEdit.getMngCmdtyDisable());
    lRec.add("MngCmdtyStock", userEdit.getMngCmdtyStock());
    lRec.add("MngPurchase", userEdit.getMngPurchase());
    lRec.add("MngPurchaseExecute", userEdit.getMngPurchaseExecute());
    lRec.add("MngPurchaseLevel", userEdit.getMngPurchaseLevel());
    lRec.add("MngDataInputManager", userEdit.getMngDataInputManager());
    lRec.add("MngDataInputWarehouse", userEdit.getMngDataInputWarehouse());
    lRec.add("MngDataOutputWarehouse", userEdit.getMngDataOutputWarehouse());
    lRec.add("MngOrderCard", userEdit.getMngOrderCard());
    lRec.add("MngCmdtyJan", userEdit.getMngCmdtyJan());
    lRec.add("MngOrderReserve", userEdit.getMngOrderReserve());
    lRec.add("UserType", userEdit.getUserType());
    lRec.add("BranchCode", userEdit.getBranchCode());
    lRec.add("StorageCode", userEdit.getStorageCode());
    lRec.add("LoginErrorDateTime",new SISpcType("TO_CHAR(now(),'YYYY/MM/DD HH24:MI:SS')::timestamp"));
    //データの更新
    lRec.execute(lConnection);
  }
  
  /**
   * <b>updateTableData</b>
   * データベースのレコードを修正します。
   * @param lConnection DBへのコネクション
   * @param regStndrdName 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void updateTableData(Connection lConnection,UIRegUserEdit userEdit)throws SIDBAccessException{
    SIModifyRec lRec=new SIModifyRec("MNGUSERMTBL");
    lRec.addCondition("MallShopCode", userEdit.getShopCode());
    lRec.addCondition("UserCode",userEdit.getUserCode());
    lRec.add("UserName",userEdit.getUserName());
    lRec.add("Password",userEdit.getPassWord());
    lRec.add("Memo",userEdit.getMemo());
    lRec.add("MngOrder",userEdit.getMngOrder());
    lRec.add("MngOrderCsv",userEdit.getMngOrderCsv());
    lRec.add("MngOrderPdf",userEdit.getMngOrderPdf());
    lRec.add("MngCust",userEdit.getMngCust());
    lRec.add("MngCustCsv",userEdit.getMngCustCsv());
    lRec.add("MngCustPdf",userEdit.getMngCustPdf());
    lRec.add("MngCustDelPoint",userEdit.getMngCustDelPoint());
    lRec.add("MngCustAddPoint",userEdit.getMngCustAddPoint());
    lRec.add("MngBaseInfo",userEdit.getMngBaseInfo());
    lRec.add("MngUserMst",userEdit.getMngUserMst());
    lRec.add("MngAccesslog",userEdit.getMngAccesslog());
    lRec.add("MngCmdty",userEdit.getMngCmdty());
    lRec.add("MngCmdtyCsv",userEdit.getMngCmdtyCsv());
    lRec.add("MngAnalysis",userEdit.getMngAnalysis());
    lRec.add("MngAnalysisCsv",userEdit.getMngAnalysisCsv());
    lRec.add("MngCmn",userEdit.getMngCmn());
    lRec.add("MngDataIo",userEdit.getMngDataIo());
    lRec.add("MngDataInputCsv",userEdit.getMngDataInputCsv());
    lRec.add("MngDataOutputCsv",userEdit.getMngDataOutputCsv());
    lRec.add("MngStock",userEdit.getMngStock());
    lRec.add("MngCmdtyLevel",userEdit.getMngCmdtyLevel());
    lRec.add("MngDataIoExcel",userEdit.getMngDataIoExcel());
    lRec.add("LoginErrorCount ",userEdit.getLoginErrCount());
    lRec.add("MngCmdtyPoint",userEdit.getMngCmdtyPoint());
    lRec.add("MngNews", userEdit.getMngNews());
    lRec.add("MngCmdtyDisable", userEdit.getMngCmdtyDisable());
    lRec.add("MngCmdtyStock", userEdit.getMngCmdtyStock());
    lRec.add("MngPurchase", userEdit.getMngPurchase());
    lRec.add("MngPurchaseExecute", userEdit.getMngPurchaseExecute());
    lRec.add("MngPurchaseLevel", userEdit.getMngPurchaseLevel());
    lRec.add("MngDataInputManager", userEdit.getMngDataInputManager());
    lRec.add("MngDataInputWarehouse", userEdit.getMngDataInputWarehouse());
    lRec.add("MngDataOutputWarehouse", userEdit.getMngDataOutputWarehouse());
    lRec.add("MngOrderCard", userEdit.getMngOrderCard());
    lRec.add("MngCmdtyJan", userEdit.getMngCmdtyJan());
    lRec.add("MngOrderReserve", userEdit.getMngOrderReserve());
    lRec.add("LoginErrorDateTime",new SISpcType("TO_CHAR(now(),'YYYY/MM/DD HH24:MI:SS')::timestamp"));
    try{
      lRec.execute(lConnection);
    }catch (SIDuplicateKeyException e){
      e.printStackTrace();
      throw new SIDBAccessException();
    }
  }
  
  /**
   * <b>deleteTableData</b>
   * データベースのレコードを削除します。
   * @param lConnection DBへのコネクション
   * @param regUserInfo 削除するデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void deleteTableData(Connection lConnection,UIRegUserEdit userEdit) throws SIDBAccessException{
    try{
      SIDeleteRec lRec=new SIDeleteRec("MNGUSERMTBL");
      lRec.addCondition("MallShopCode", userEdit.getShopCode());
      lRec.addCondition("UserCode",userEdit.getUserCode());
      lRec.execute(lConnection);
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException("delete data error.");
    }
  }
  
  public void destroy() {
  }
}
