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

import java.sql.Connection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SILogin;
import jp.co.sint.basic.SICompany;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;

import org.apache.log4j.Category;

public class UIRegCompany extends SICompany {
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  // 修正と削除用の支店コード
  private String regCompanyCodeTxt = "";
  
  // 修正と削除用の支店名
  private String regCompanyNameTxt = "";
  
  // 修正と削除用のメールアドレス
  private String regCompanyMailTxt = "";
  
  // 修正と削除用の支店区分
  private String regCompanyTypeTxt = "0";
  
  // 修正用の公開フラグ
  private String regPublicFlgTxt = "";
  
  // 修正用の引き当て優先順位ベース
  private String regPriorityBase = "";
  
  // 修正用の住所１
  private String regAddress1 = "";
  
  // 修正用の住所２
  private String regAddress2 = "";
  
  // 修正用の住所３
  private String regAddress3 = "";
  
  // 修正用の郵便番号１
  private String regPostCode1 = "";
  
  // 修正用の郵便番号２
  private String regPostCode2 = "";
  
  // 修正用の電話番号１
  private String regTel1 = "";
  
  // 修正用の電話番号２
  private String regTel2 = "";
  
  // 修正用のFAX番号１
  private String regFax1 = "";
  
  // 修正用のFAX番号２
  private String regFax2 = "";
  
  // 更新するレコードの行号
  private String regRowNumTxt = "";
  
  /**
   * UIRegCompany コンストラクタ
   * 
   * @param なし
   * @return なし
   * @throws なし
   */
  public UIRegCompany() {}
  
  // setter of 修正と削除用の支店コード
  public void setRegCompanyCodeTxt(String lRegCompanyCodeTxt) {
    if (SIUtil.isNull(lRegCompanyCodeTxt)) lRegCompanyCodeTxt = "";
    this.regCompanyCodeTxt = SIUtil.changeTo(lRegCompanyCodeTxt.trim(), this.encode);
  }
  
  // setter of 修正と削除用の支店名
  public void setRegCompanyNameTxt(String lRegCompanyNameTxt) {
    if (SIUtil.isNull(lRegCompanyNameTxt)) lRegCompanyNameTxt = "";
    this.regCompanyNameTxt = SIUtil.changeTo(lRegCompanyNameTxt.trim(), this.encode);
  }
  
  // setter of 修正と削除用のメールアドレス
  public void setRegCompanyMailTxt(String lRegCompanyMailTxt) {
    if (SIUtil.isNull(lRegCompanyMailTxt)) lRegCompanyMailTxt = "";
    this.regCompanyMailTxt = SIUtil.changeTo(lRegCompanyMailTxt.trim(), this.encode);
  }
  
  // setter of 削除と新規作成用の支店区分
  public void setRegCompanyTypeTxt(String lRegCompanyTypeTxt) {
    if (SIUtil.isNull(lRegCompanyTypeTxt)) lRegCompanyTypeTxt = "";
    this.regCompanyTypeTxt = SIUtil.changeTo(lRegCompanyTypeTxt.trim(), this.encode);
  }
  
  // setter of 修正用の公開フラグ
  public void setRegPublicFlgTxt(String lRegPublicFlgTxt) {
    if (SIUtil.isNull(lRegPublicFlgTxt)) lRegPublicFlgTxt = "0";
    this.regPublicFlgTxt = SIUtil.changeTo(lRegPublicFlgTxt.trim(), this.encode);
  }
  
  // setter of 修正用の引き当て優先順位ベース
  public void setRegPriorityBase(String lPriorityBase) {
    if (SIUtil.isNull(lPriorityBase)) lPriorityBase = "0";
    this.regPriorityBase = SIUtil.changeTo(lPriorityBase.trim(), this.encode);
  }
  
  // setter of 修正用の住所１
  public void setRegAddress1(String regAddress1) {
    if (SIUtil.isNull(regAddress1)) regAddress1 = "";
    this.regAddress1 = regAddress1;
  }
  
  // setter of 修正用の住所２
  public void setRegAddress2(String regAddress2) {
    if (SIUtil.isNull(regAddress2)) regAddress2 = "";
    this.regAddress2 = regAddress2;
  }
  
  // setter of 修正用の住所３
  public void setRegAddress3(String regAddress3) {
    if (SIUtil.isNull(regAddress3)) regAddress3 = "";
    this.regAddress3 = regAddress3;
  }
  
  // setter of 修正用の郵便番号１
  public void setRegPostCode1(String regPostCode1) {
    if (SIUtil.isNull(regPostCode1)) regPostCode1 = "";
    this.regPostCode1 = regPostCode1;
  }
  
  // setter of 修正用の郵便番号２
  public void setRegPostCode2(String regPostCode2) {
    if (SIUtil.isNull(regPostCode2)) regPostCode2 = "";
    this.regPostCode2 = regPostCode2;
  }
  
  // setter of 修正用の電話番号１
  public void setRegTel1(String regTel1) {
    if (SIUtil.isNull(regTel1)) regTel1 = "";
    this.regTel1 = regTel1;
  }
  
  // setter of 修正用の電話番号２
  public void setRegTel2(String regTel2) {
    if (SIUtil.isNull(regTel2)) regTel2 = "";
    this.regTel2 = regTel2;
  }
  
  // setter of 修正用のFAX番号１
  public void setRegFax1(String regFax1) {
    if (SIUtil.isNull(regFax1)) regFax1 = "";
    this.regFax1 = regFax1;
  }
  
  // setter of 修正用のFAX番号２
  public void setRegFax2(String regFax2) {
    if (SIUtil.isNull(regFax2)) regFax2 = "";
    this.regFax2 = regFax2;
  }
  
  // setter of 修正と削除用の行号
  public void setRegRowNumTxt(String lRegRowNumTxt) {
    if (SIUtil.isNull(lRegRowNumTxt)) lRegRowNumTxt = "";
    this.regRowNumTxt = SIUtil.changeTo(lRegRowNumTxt.trim(), this.encode);
  }
  
  // getter of 修正と削除用の支店コード
  public String getRegCompanyCodeTxt() {
    return this.regCompanyCodeTxt;
  }
  
  // getter of 修正と削除用の支店名
  public String getRegCompanyNameTxt() {
    return this.regCompanyNameTxt;
  }
  
  // getter of 修正と削除用のメールアドレス
  public String getRegCompanyMailTxt() {
    return this.regCompanyMailTxt;
  }
  
  // getter of 削除用の支店区分
  public String getRegCompanyTypeTxt() {
    return this.regCompanyTypeTxt;
  }
  
  // getter of 修正用の公開フラグ
  public String getRegPublicFlgTxt() {
    return this.regPublicFlgTxt;
  }
  
  // getter of 修正用の引き当て優先順位ベース
  public String getRegPriorityBase() {
    return this.regPriorityBase;
  }
  
  // getter of 修正用の住所１
  public String getRegAddress1() {
    return regAddress1;
  }
  
  // getter of 修正用の住所２
  public String getRegAddress2() {
    return regAddress2;
  }
  
  // getter of 修正用の住所３
  public String getRegAddress3() {
    return regAddress3;
  }
  
  // getter of 修正用の郵便番号１
  public String getRegPostCode1() {
    return regPostCode1;
  }
  
  // getter of 修正用の郵便番号２
  public String getRegPostCode2() {
    return regPostCode2;
  }
  
  // getter of 修正用の電話番号１
  public String getRegTel1() {
    return regTel1;
  }
  
  // getter of 修正用の電話番号２
  public String getRegTel2() {
    return regTel2;
  }
  
  // getter of 修正用のFAX番号１
  public String getRegFax1() {
    return regFax1;
  }
  
  // getter of 修正用のFAX番号２
  public String getRegFax2() {
    return regFax2;
  }
  // getter of 修正と削除用の行号
  public String getRegRowNumTxt() {
    return this.regRowNumTxt;
  }
  
  /**
   * <b>initInsert</b> 入力した新規レコードのデータを取得します。
   * 
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void initInsert(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setRegCompanyCodeTxt((String) lUrlParam.getParam("companyCode"));// 支店コード
    this.setRegCompanyNameTxt((String) lUrlParam.getParam("companyName"));// 支店名
    this.setRegCompanyMailTxt((String) lUrlParam.getParam("companyMail"));// メールアドレス
    this.setRegPublicFlgTxt((String) lUrlParam.getParam("companyPublicity"));// 公開フラグ
    this.setRegPriorityBase((String) lUrlParam.getParam("priorityBase"));// 引き当て優先順位ベース
    this.setRegCompanyTypeTxt("0");
  }
  
  /**
   * <b>initModify</b> 入力した既存レコードのデータを取得します。
   * 
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void initModify(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setRegCompanyCodeTxt((String) lUrlParam.getParam("regCompanyCodeTxt"));// 支店コード
    this.setRegRowNumTxt((String) lUrlParam.getParam("regRowNumTxt"));// 行号
    if (SIUtil.isNotNull(this.getRegRowNumTxt())) {// 支店名、メールアドレス
      this.setRegCompanyNameTxt((String) lUrlParam.getParam(SIConfig.SIPREFIX_COMPANY_NAME_TEXT + this.getRegRowNumTxt() + "Txt"));
      this.setRegCompanyMailTxt((String) lUrlParam.getParam(SIConfig.SIPREFIX_COMPANY_MAIL_TEXT + this.getRegRowNumTxt() + "Txt"));
      this.setRegPublicFlgTxt((String) lUrlParam.getParam("publicFlg" + this.getRegRowNumTxt()));// 公開フラグ
      this.setRegPriorityBase((String) lUrlParam.getParam("priorityBase" + this.getRegRowNumTxt()));// 引き当て優先順位ベース
      this.setRegAddress1((String) lUrlParam.getParam("address1" + this.getRegRowNumTxt() + "Txt"));// 住所１
      this.setRegAddress2((String) lUrlParam.getParam("address2" + this.getRegRowNumTxt() + "Txt"));// 住所２
      this.setRegAddress3((String) lUrlParam.getParam("address3" + this.getRegRowNumTxt() + "Txt"));// 住所３
      this.setRegPostCode1((String) lUrlParam.getParam("postCode1" + this.getRegRowNumTxt() + "Txt"));// 郵便番号１
      this.setRegPostCode2((String) lUrlParam.getParam("postCode2" + this.getRegRowNumTxt() + "Txt"));// 郵便番号２
      this.setRegTel1((String) lUrlParam.getParam("tel1" + this.getRegRowNumTxt() + "Txt"));// 電話番号１
      this.setRegTel2((String) lUrlParam.getParam("tel2" + this.getRegRowNumTxt() + "Txt"));// 電話番号２
      this.setRegFax1((String) lUrlParam.getParam("fax1" + this.getRegRowNumTxt() + "Txt"));// FAX番号１
      this.setRegFax2((String) lUrlParam.getParam("fax2" + this.getRegRowNumTxt() + "Txt"));// FAX番号２
    }
  }
  
  /**
   * <b>initDelete</b> 入力した既存レコードのデータを取得します。
   * 
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void initDelete(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    SILogin lLogin = SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setRegCompanyCodeTxt((String) lUrlParam.getParam("regCompanyCodeTxt"));// 支店コード
    this.setRegCompanyTypeTxt((String) lUrlParam.getParam("regCompanyType"));// 支店区分
    
  }
  
  /**
   * <b>validateInsert</b 入力した新規レコードのデータをチェックします。
   * 
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  
  public boolean validateInsert(HttpServletRequest lRequest, Connection lConnection) {
    SICustomErrors errors = new SICustomErrors();
    
    // 支店コード
    SICheckValid.checkValid(errors, "支店コード", getRegCompanyCodeTxt(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "支店コード", getRegCompanyCodeTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    // 支店名
    SICheckValid.checkValid(errors, "支店名", getRegCompanyNameTxt(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "支店名", getRegCompanyNameTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 30);
    // メールアドレス
    SICheckValid.checkValid(errors, "メールアドレス", getRegCompanyMailTxt(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス", getRegCompanyMailTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    
    // 引き当て優先順位ベース
    SICheckValid.checkValid(errors, "引き当て優先順位ベース", getRegPriorityBase(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "引き当て優先順位ベース", getRegPriorityBase(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    
    // 電話番号・FAX番号
    SICheckValid.checkValid(errors, "電話番号１", getRegTel1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "電話番号１", getRegTel1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "電話番号２", getRegTel2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "電話番号２", getRegTel2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "FAX番号１", getRegFax1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "FAX番号１", getRegFax1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "FAX番号２", getRegFax2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "FAX番号２", getRegFax2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    // 郵便番号・住所
    SICheckValid.checkValid(errors, "郵便番号１", getRegPostCode1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号１", getRegPostCode1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    SICheckValid.checkValid(errors, "郵便番号２", getRegPostCode2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号２", getRegPostCode2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 4);
    SICheckValid.checkValid(errors, "住所１", getRegAddress1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "住所２", getRegAddress2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "住所３", getRegAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    return errors.isEmpty();
  }
  
  /**
   * <b>validateModify</b 入力した新規レコードのデータをチェックします。
   * 
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean validateModify(HttpServletRequest lRequest) {
    return validateModify(lRequest, null);
  }
  
  public boolean validateModify(HttpServletRequest lRequest, Connection lConnection) {
    SICustomErrors errors = new SICustomErrors();
    
    // 支店名
    SICheckValid.checkValid(errors, "支店名", getRegCompanyNameTxt(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "支店名", getRegCompanyNameTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 30);
    // メールアドレス
    SICheckValid.checkValid(errors, "メールアドレス", getRegCompanyMailTxt(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス", getRegCompanyMailTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    
    // 引き当て優先順位ベース
    SICheckValid.checkValid(errors, "引き当て優先順位ベース", getRegPriorityBase(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "引き当て優先順位ベース", getRegPriorityBase(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    
    // 電話番号・FAX番号
    SICheckValid.checkValid(errors, "電話番号１", getRegTel1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "電話番号１", getRegTel1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "電話番号２", getRegTel2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "電話番号２", getRegTel2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "FAX番号１", getRegFax1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "FAX番号１", getRegFax1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    SICheckValid.checkValid(errors, "FAX番号２", getRegFax2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "FAX番号２", getRegFax2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    // 郵便番号・住所
    SICheckValid.checkValid(errors, "郵便番号１", getRegPostCode1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号１", getRegPostCode1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    SICheckValid.checkValid(errors, "郵便番号２", getRegPostCode2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号２", getRegPostCode2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 4);
    SICheckValid.checkValid(errors, "住所１", getRegAddress1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "住所２", getRegAddress2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "住所３", getRegAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    
    return errors.isEmpty();
  }
  
  /**
   * <b>validateDelete</b 外部のキーのデータレコードをチェックします。
   * 
   * @param lRequest クライアントからのリクエスト
   * @param lConnection データベースへのコネクション
   * @return エラーがあるかどうかを指す状態
   * @throws なし
   */
  public boolean validateDelete(HttpServletRequest lRequest, Connection lConnection) {
    SICustomErrors errors = new SICustomErrors();
    
    // 外部のキーのデータレコードのチェック用のSQL文の作成
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf.append("SELECT BelongingBranchCode FROM ChargeTbl ");
    lSqlBuf.append("WHERE BelongingBranchCode=" + SIDBUtil.SQL2Str(getRegCompanyCodeTxt()));
    
    try {
      boolean isLocked = SIDBUtil.hasData(lConnection, lSqlBuf.toString());
      if (isLocked) {
        errors.addError(new SICustomError("database.query.exist", "支店に紐づく担当者"));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      errors.addError(new SICustomError("database.execute.error"));
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    
    return errors.isEmpty();
  }
}
