/**
 * Copyright (c) 2003-2004 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.SICustAddress;
import jp.co.sint.basic.SILogin;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIFlagConf;
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.SIURLMap;//7.0.1 追加
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UICustAddress.java,v 1.0 2003/12/09 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/12/09 17:53:28  Original
 */
public class UICustAddress extends SICustAddress{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //ショップコード
  private String shopCode="";
  
  //商品コード
  private String cmdtyCode="";
  
  //規格1
  private String stndrdCode1="";
  
  //エレメント1
  private String elementCode1="";
  
  //規格2
  private String stndrdCode2="";
  
  //エレメント2
  private String elementCode2="";
  
  //呼び出し元
  private String callFlag="";
  
  private String custAddress2Head = "";
  
  private String custAddress2Tail = "";
  
  private boolean closeWindow=false;
  
  public UICustAddress(){}
  
  /**
   * UIRegCmdty
   * コンストラクタ
   * @param lRequest リクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public UICustAddress(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    init(lRequest,lUrlParam);
  }
  //7.1.1 ST0236 修正 ここまで
  
  public void setCloseWindow(boolean lCloseWindow){
    this.closeWindow =lCloseWindow;
  }
  
  public void setShopCode(String lShopCode){
    if (SIUtil.isNull(lShopCode))lShopCode="";
    this.shopCode =lShopCode;
  }
  
  public void setCmdtyCode(String lCmdtyCode){
    if (SIUtil.isNull(lCmdtyCode))lCmdtyCode="";
    this.cmdtyCode =lCmdtyCode;
  }
  
  //setter of 規格1
  public void setStndrdCode1(String lStndrdCode1){
    if (SIUtil.isNull(lStndrdCode1)) lStndrdCode1="";
    this.stndrdCode1=SIUtil.changeTo(lStndrdCode1.trim(),this.encode);
  }
  
  //setter of エレメント1
  public void setElementCode1(String lElementCode1){
    if (SIUtil.isNull(lElementCode1)) lElementCode1="";
    this.elementCode1=SIUtil.changeTo(lElementCode1.trim(),this.encode);
  }
  
  //setter of 規格2
  public void setStndrdCode2(String lStndrdCode2){
    if (SIUtil.isNull(lStndrdCode2)) lStndrdCode2="";
    this.stndrdCode2=SIUtil.changeTo(lStndrdCode2.trim(),this.encode);
  }
  
  //setter of エレメント2
  public void setElementCode2(String lElementCode2){
    if (SIUtil.isNull(lElementCode2)) lElementCode2="";
    this.elementCode2=SIUtil.changeTo(lElementCode2.trim(),this.encode);
  }
  
  //setter of 呼び出し元
  public void setCallFlag(String lCallFlag){
    if (SIUtil.isNull(lCallFlag)) lCallFlag="";
    this.callFlag=SIUtil.changeTo(lCallFlag.trim(),this.encode);
  }
  
  public String getShopCode(){
    return this.shopCode;
  }
  
  public String getCmdtyCode(){
    return this.cmdtyCode;
  }
  
  //getter of 規格1
  public String getStndrdCode1(){
    return this.stndrdCode1;
  }
  
  //getter of エレメント1
  public String getElementCode1(){
    return this.elementCode1;
  }
  
  //getter of 規格2
  public String getStndrdCode2(){
    return this.stndrdCode2;
  }
  
  //getter of エレメント2
  public String getElementCode2(){
    return this.elementCode2;
  }
  
  //getter of 呼び出し元
  public String getCallFlag(){
    return this.callFlag;
  }
  
  public boolean getCloseWindow(){
    return this.closeWindow;
  }
  
  public String getQry(){
    return "&shc="+getShopCode()+"&cmc="+getCmdtyCode()+
           "&snc1="+getStndrdCode1()+"&ec1="+getElementCode1()+
           "&snc2="+getStndrdCode2()+"&ec2="+getElementCode2();
  }
  
  public String getCustAddress2Head() {
    return custAddress2Head;
  }
  
  public void setCustAddress2Head(String custAddress2Head) {
    if (SIUtil.isNull(custAddress2Head)) custAddress2Head = "";
    this.custAddress2Head = custAddress2Head;
  }
  
  public String getCustAddress2Tail() {
    return custAddress2Tail;
  }
  
  public void setCustAddress2Tail(String custAddress2Tail) {
    if (SIUtil.isNull(custAddress2Tail)) custAddress2Tail = "";
    this.custAddress2Tail = custAddress2Tail;
  }
  
  /**
   * <b>validate</b>
   * 入力したデータをチェックします。不正なデータがあったら、エラーオブジェクトに入れて、
   * 画面に表示します。
   * @param request データベースへのコネンクション
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest){
    return validate(lRequest,null);
  }
  
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    return validate(lRequest,lConnection,false);
  }
  
  public boolean validate(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck){
    return validate(lRequest,lConnection,lCsvCheck,true);
  }
  
  public boolean validate(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck,boolean lFrontFlg){
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=new StringBuffer("");
    
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"顧客コード",this.getCustCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);//顧客コードの必須
      SICheckValid.checkValid(errors,"顧客コード",this.getCustCode(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,10);
      
      if (getEditModeTxt().equals(SIConfig.SIEDIT_MODE_INSERT)){
      }else{//アドレス帳コードのチェックと顧客コード存在のチェック
        if (SIUtil.isNotNull(this.getCustCode())){//顧客コード存在のチェック
          lSqlBuf=new StringBuffer("SELECT CustCode FROM CustTbl WHERE CustCode=");
          lSqlBuf.append(SIDBUtil.SQL2Str(this.getCustCode()," "));
          SICheckValid.checkExist(errors,lConnection,"顧客コード",lSqlBuf.toString());
        }
        SICheckValid.checkValid(errors,"アドレス帳番号",this.getAddressCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
        SICheckValid.checkValid(errors,"アドレス帳番号",this.getAddressCode(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
        if (SIUtil.isNotNull(this.getCustCode())&&SIUtil.isNotNull(this.getAddressCode())&&getAddressCode().equals("0")){
          errors.addError(new SICustomError("database.query.notexist","アドレス帳番号"));
        }else if (SIUtil.isNotNull(this.getCustCode())&&SIUtil.isNotNull(this.getAddressCode())){
          lSqlBuf=new StringBuffer("SELECT CustCode FROM CustAddressTbl WHERE CustCode=");
          lSqlBuf.append(SIDBUtil.SQL2Str(this.getCustCode()," "));
          lSqlBuf.append("AND AddressCode=").append(SIDBUtil.SQL2Str(this.getAddressCode()));
          SICheckValid.checkExist(errors,lConnection,"アドレス帳番号",lSqlBuf.toString());
        }
      }
    }
    
    SICheckValid.checkValid(errors,"配送先呼称",this.getDeliveryName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors,"配送先呼称",this.getDeliveryName(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,40);//7.2.0 ST0670 修正
    
    //7.1.1 ST0162 修正 ここから
    SICheckValid.checkValid(errors,"宛名",this.getDeliveryAddressee(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);//7.3.0 PI-NES0501 修正
    SICheckValid.checkValid(errors,"宛名",this.getDeliveryAddressee(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,50);//7.3.0 PI-NES0501 修正
    //7.1.1 ST0162 修正 ここまで
    
    //呼称+宛名 のunqiueのチェック
    if (SIUtil.isNotNull(getCustCode())&&SIUtil.isNotNull(getDeliveryName())&&SIUtil.isNotNull(getDeliveryAddressee())){
      lSqlBuf=new StringBuffer("SELECT CustCode FROM CustAddressTbl ");
      lSqlBuf.append("WHERE CustCode=").append(SIDBUtil.SQL2Str(getCustCode()));
      lSqlBuf.append(" AND DeliveryName=").append(SIDBUtil.SQL2Str(getDeliveryName()));
      lSqlBuf.append(" AND DeliveryAddressee=").append(SIDBUtil.SQL2Str(getDeliveryAddressee()));
      if (getEditModeTxt().equals(SIConfig.SIEDIT_MODE_INSERT)){//新規
        SICheckValid.checkNotExist(errors,lConnection,"呼称/宛名",lSqlBuf.toString());
      }else if (SIUtil.isNotNull(getAddressCode())){
        lSqlBuf.append(" AND AddressCode<>").append(SIDBUtil.SQL2Str(getAddressCode()));
        SICheckValid.checkNotExist(errors,lConnection,"呼称/宛名",lSqlBuf.toString());
      }
    }
    
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"個人・法人区分",this.getCustCompanyFlg(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"個人・法人区分",this.getCustCompanyFlg(),SICheckDataConf.SICHECK_FLAG_TYPE,SIFlagConf.SIFLAG_CUST_COMPANY_INX);
    }
    
    SICheckValid.checkValid(errors,"メールアドレス",this.getEmail(),SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors,"メールアドレス",this.getEmail(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,128);
    
    //7.1.1 ST0162 修正 ここから
    SICheckValid.checkValid(errors, "郵便番号(上3桁)", this.getPostCode1(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号(下4桁)", this.getPostCode2(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (this.getPostCode1().toString().trim().length() != 3||this.getPostCode2().toString().trim().length() != 4) {errors.addError(new SICustomError("manager.app.postcode.form"));}
    
    SICheckValid.checkValid(errors,"住所1（都道府県）",this.getAddress1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    if (lCsvCheck&&SIUtil.isNotNull(this.getAddress1())){
      lSqlBuf=new StringBuffer("SELECT PrefectureName FROM PrefectureMTbl WHERE PrefectureName=");
      lSqlBuf.append(SIDBUtil.SQL2Str(this.getAddress1()));
      SICheckValid.checkExist(errors,lConnection,"住所1（都道府県）",lSqlBuf.toString());
    }
    
    SICheckValid.checkValid(errors,"住所2(市区町村・番地)",this.getAddress2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors,"住所2(市区町村・番地)",this.getAddress2(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    
    boolean postCodeError = false;
    if (lFrontFlg&&SIUtil.isNotNull(this.getPostCode1())&&SIUtil.isNotNull(this.getPostCode2())&&SIUtil.isNotNull(this.getAddress1())&&SIUtil.isNotNull(this.getAddress2())){
      String lEncode=this.getEncode();//既存のコードの保存
      this.setEncode(SIConfig.SIENCODE_NONE);
      String lResult=SIConfig.SIZIP.getPrefectureName(getPostCode1(),getPostCode2());//県名の検索
      if (!this.getAddress1().equals(lResult)) postCodeError = true;
      lResult=SIConfig.SIZIP.getAddressName(getPostCode1(),getPostCode2());//市区町村名の検索
      if (!this.getAddress2().startsWith(lResult)) postCodeError = true;
      this.setEncode(lEncode);////既存のコードの回復
    }
    if (postCodeError) {
      errors.addError(new SICustomError("manager.message.freeword","郵便番号と住所が一致しません。お手数ですが再度入力して下さい。"));
    }
    
    SICheckValid.checkValid(errors,"住所3(ビル名・階など)",this.getAddress3(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    //7.1.1 ST0162 修正 ここまで
    
    SICheckValid.checkValid(errors,"サロン名",this.getCompanyName(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    SICheckValid.checkValid(errors,"会社名",this.getCorporationName(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    
    SICheckValid.checkValid(errors,"連絡先電話番号",this.getTel(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"連絡先電話番号",this.getTel(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_TYPE,9,16);
    
    SICheckValid.checkValid(errors,"連絡先FAX番号",this.getFax(),SICheckDataConf.SICHECK_DATA_TEL_TYPE);
    SICheckValid.checkValid(errors,"連絡先FAX番号",this.getFax(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
    
    SICheckValid.checkValid(errors,"送信フラグ",this.getSendMailFlg(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"送信フラグ",this.getSendMailFlg(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"送信フラグ",this.getSendMailFlg(),SICheckDataConf.SICHECK_FLAG_TYPE,SIFlagConf.SIFLAG_NEW_MAIL_INX);
    }
    
    SICheckValid.checkValid(errors,"何日前",this.getDaysBeforehand(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"何日前",this.getDaysBeforehand(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,2);
    }
    SICheckValid.checkValid(errors,"お知らせ月",this.getMailMonth(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"お知らせ月",this.getMailMonth(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,2);
    }
    SICheckValid.checkValid(errors,"お知らせ日",this.getMailDay(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"お知らせ日",this.getMailDay(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,2);
    }
    
    SICheckValid.checkValid(errors,"最終配送日",this.getLastDeliveryDate(),SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    return errors.isEmpty();
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request データベースへのコネンクション
   * @param lUrlParam
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    super.init(lRequest,lUrlParam);//7.1.1 ST0236 修正
    // 7.0.1 修正 ここから
    if (SIURLMap.isAUPost(lRequest)){
      this.setEncode(SIConfig.SIENCODE_NONE);
    }else{
      this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    }
    // 7.0.1 修正 ここまで
    
    //7.1.1 ST0236 修正 ここから
    this.setShopCode((String)lUrlParam.getParam("shc"));
    this.setCmdtyCode((String)lUrlParam.getParam("cmc"));
    this.setStndrdCode1((String)lUrlParam.getParam("snc1"));//規格1
    this.setElementCode1((String)lUrlParam.getParam("ec1"));//エレメント1
    this.setStndrdCode2((String)lUrlParam.getParam("snc2"));//規格2
    this.setElementCode2((String)lUrlParam.getParam("ec2"));//エレメント2
    this.setCallFlag((String)lUrlParam.getParam("callflag"));//呼び出し元画面
    this.setCustCode((String)lUrlParam.getParam("cuc"));//顧客コード
    this.setAddressCode((String)lUrlParam.getParam("ac"));//アドレス帳番号
    this.setCustCompanyFlg((String)lUrlParam.getParam("custCompanyFlg"));//法人個人区分
    this.setDeliveryName((String)lUrlParam.getParam("deliveryName"));//配送先呼称
    this.setDeliveryAddressee((String)lUrlParam.getParam("deliveryAddressee"));//配送先正式名
    this.setEmail((String)lUrlParam.getParam("email"));//EMAIL
    this.setPostCode1((String)lUrlParam.getParam("postCode1"));//郵便番号1
    this.setPostCode2((String)lUrlParam.getParam("postCode2"));//郵便番号2
    this.setAddress1((String)lUrlParam.getParam("address1"));//住所1
    this.setAddress2((String)lUrlParam.getParam("address2"));//住所2
    this.setAddress3((String)lUrlParam.getParam("address3"));//住所3
    this.setCompanyName((String)lUrlParam.getParam("companyName"));//サロン名
    this.setCorporationName((String)lUrlParam.getParam("corporationName"));//会社名
    this.setTel((String)lUrlParam.getParam("tel"));//連絡先電話番号
    this.setFax((String)lUrlParam.getParam("fax"));//連絡先FAX番号
    this.setSendMailFlg((String)lUrlParam.getParam("sendMailFlg"));//送信フラグ
    this.setDaysBeforehand((String)lUrlParam.getParam("daysBeforehand"));//何日前
    this.setMailMonth((String)lUrlParam.getParam("mailMonth"));//お知らせ日
    this.setMailDay((String)lUrlParam.getParam("mailDay"));//お知らせ日
    this.setCustAddress2Head((String)lUrlParam.getParam("address2a"));
    this.setCustAddress2Tail((String)lUrlParam.getParam("address2b"));
    // 7.1.1 ST0236 修正 ここまで
    
    if (getActionNameTxt().equals(SIConfig.SIACTION_ZIPDIC)&&SIConfig.SIZIP!=null){//郵便番号から県名と市区町村名を検索
      String lEncode=this.getEncode();//既存のコードの保存
      this.setEncode(SIConfig.SIENCODE_NONE);
      String lResult=SIConfig.SIZIP.getPrefectureName(getPostCode1(),getPostCode2());//県名の検索
      if (SIUtil.isNotNull(lResult))this.setAddress1(lResult);//県名の設定
      else this.setAddress1("");
      lResult=SIConfig.SIZIP.getAddressName(getPostCode1(),getPostCode2());//市区町村名の検索
      if (SIUtil.isNotNull(lResult))this.setAddress2(lResult);//市区町村名の設定
      else this.setAddress2("");
      this.setEncode(lEncode);////既存のコードの回復
    }
  }
  
  //7.2.0 ST0249 追加 ここから
  /**
   * <b>resetInit</b>
   * hiddenで保持しているパラメータを設定します。
   * @param request データベースへのコネンクション
   * @param lUrlParam
   * @throws なし
   */
  public void resetInit(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    super.init(lRequest,lUrlParam);
    this.setCustCode((String)lUrlParam.getParam("cuc"));    //顧客コード
    this.setAddressCode((String)lUrlParam.getParam("ac"));  //アドレス帳番号
    this.setShopCode((String)lUrlParam.getParam("shc"));    //ショップコード
    this.setCmdtyCode((String)lUrlParam.getParam("cmc"));   //商品コード
    this.setStndrdCode1((String)lUrlParam.getParam("snc1"));//規格1
    this.setElementCode1((String)lUrlParam.getParam("ec1"));//エレメント1
    this.setStndrdCode2((String)lUrlParam.getParam("snc2"));//規格2
    this.setElementCode2((String)lUrlParam.getParam("ec2"));//エレメント2
    this.setCallFlag((String)lUrlParam.getParam("callflag"));//呼び出し元画面
    this.setCustAddress2Head((String)lUrlParam.getParam("address2a"));
    this.setCustAddress2Tail((String)lUrlParam.getParam("address2b"));
  }
  //7.2.0 ST0249 追加 ここまで
}