/**
 * @version $Id : UIShopListCond.java,v 1.0 Exp $
 * @author      :yamauchi
 * <br>Description :受注新規登録管理の一覧・検索の画面に対するbeansクラスを作成します。
 * <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>
 * yamauchi	  2004/01/22
 */
package jp.co.sint.beans.mallmgr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SICust;
import jp.co.sint.basic.SILogin;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableCondition;
import jp.co.sint.database.SITableConditionManager;
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;// 7.1.1 ST0236 追加

import org.apache.log4j.Category;

public class UIRegNewOrderCust extends SIBasic {
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  // 全ての条件を保存する用
  SITableConditionManager tableConditionMan = new SITableConditionManager();
  
  private String custCode = "";
  
  private String memberLevelCodeUI = "";
  
  private String custCompanyFlg = "";
  
  private String custName = "";
  
  private String custPronName = "";
  
  private String tel = "";
  
  private String salon = "";
  
  private String company = "";
  
  private String pageNumberTxt_Order = "1";
  
  private String email = "";
  
  // チェックした顧客コード
  private String checkCustCode = "";
  
  private boolean searchFlg = true;
  
  public UIRegNewOrderCust() {
  }
  
  public UIRegNewOrderCust(boolean posFlg) {
    if (posFlg)
      this.setCheckCustCode("10");
  }
  
  /**
   * @return
   */
  public String getCustCode() {
    return custCode;
  }
  
  /**
   * @return
   */
  public String getCustName() {
    return custName;
  }
  
  /**
   * @return
   */
  public String getCustPronName() {
    return custPronName;
  }
  
  /**
   * @return
   */
  public String getDiscountRate() {
    return custPronName;
  }
  
  /**
   * @return
   */
  public String getPageNumberTxt_Order() {
    return pageNumberTxt_Order;
  }
  
  /**
   * @return
   */
  public String getCheckCustCode() {
    return checkCustCode;
  }
  
  /**
   * @return
   */
  public String getEmailTxt() {
    return email;
  }
  
  /**
   * @return
   */
  public String getMemberLevelCodeUI() {
    return memberLevelCodeUI;
  }
  
  /**
   * @return
   */
  public String getCustCompanyFlg() {
    return custCompanyFlg;
  }
  
  /**
   * @param string
   */
  public void setCustCode(String string) {
    if (string == null) {
      string = "";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    custCode = string;
  }
  
  /**
   * @param string
   */
  public void setCustName(String string) {
    if (string == null) {
      string = "";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    custName = string;
  }
  
  /**
   * @param string
   */
  public void setCustPronName(String string) {
    if (string == null) {
      string = "";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    custPronName = string;
  }
  
  /**
   * @param string
   */
  public void setMemberLevelCodeUI(String string) {
    memberLevelCodeUI = string;
  }
  
  /**
   * @param string
   */
  public void setCustCompanyFlg(String string) {
    custCompanyFlg = string;
  }
  
  /**
   * @param string
   */
  public void setPageNumberTxt_Order(String string) {
    if (string == null) {
      string = "1";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    pageNumberTxt_Order = string;
  }
  
  /**
   * @param string
   */
  public void setCheckCustCode(String string) {
    if (string == null) {
      string = "";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    checkCustCode = string;
  }
  
  /**
   * @param string
   */
  public void setEmailTxt(String string) {
    if (string == null) {
      string = "";
    }
    string = SIUtil.changeTo(string.trim(), this.encode);
    email = string;
  }
  
  public String getCompany() {
    return company;
  }
  
  public void setCompany(String company) {
    this.company = company;
  }
  
  public String getSalon() {
    return salon;
  }
  
  public void setSalon(String salon) {
    this.salon = salon;
  }
  
  public String getTel() {
    return tel;
  }
  
  public void setTel(String tel) {
    this.tel = tel;
  }
  
  /**
   * init 入力したデータを基づいて、このbeansを設定します。
   * 
   * @param request データベースへのコネンクション
   * @param lUrlParam
   * @return void
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setCustCode((String) lUrlParam.getParam("custCode_S"));
    this.setMemberLevelCodeUI((String) lUrlParam.getParam("memberLevelCodeUI_S"));
    this.setCustCompanyFlg((String) lUrlParam.getParam("custCompanyFlgTxt_S"));
    this.setCustName((String) lUrlParam.getParam("custName_S"));
    this.setCustPronName((String) lUrlParam.getParam("custPronName_S"));
    this.setPageNumberTxt_Order((String) lUrlParam.getParam("pageNumberTxt_order"));
    this.setEmailTxt((String) lUrlParam.getParam("email_S"));
    this.setTel((String) lUrlParam.getParam("tel_S"));
    this.setSalon((String) lUrlParam.getParam("salon_S"));
    this.setCompany((String) lUrlParam.getParam("company_S"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  // 7.1.1 ST0236 修正 ここから
  public void initCustCode(SIURLParameter lUrlParam) {
    this.setCheckCustCode((String) lUrlParam.getParam("custcode"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  /**
   * validate 入力チェックを行います。
   * 
   * @param request データベースへのコネンクション
   * @return true:不正なデータがない false:不正なデータがある
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    
    SICheckValid.checkValid(errors, "顧客コード", this.getCustCode(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "顧客コード", this.getCustCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    SICheckValid.checkValid(errors, "顧客名", this.getCustName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 40);// 7.2.0 ST0670 修正
    
    SICheckValid.checkValid(errors, "顧客名カナ", this.getCustPronName(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
    SICheckValid.checkValid(errors, "顧客名カナ", this.getCustPronName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
    
    SICheckValid.checkValid(errors, "メールアドレス", this.getEmailTxt(), SICheckDataConf.SICHECK_DATA_ASCII_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス", this.getEmailTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    
    SICheckValid.checkValid(errors, "サロン名", this.getSalon(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    SICheckValid.checkValid(errors, "会社名", this.getCompany(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    SICheckValid.checkValid(errors, "連絡先電話番号", this.getTel(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "連絡先電話番号", this.getTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      this.searchFlg = false;
    }
    
    return errors.isEmpty();
  }
  
  public SICust reset(Connection dbConnection) throws SIDBAccessException {
    SICust cust = new SICust();
    cust.setCustCode(this.getCheckCustCode());
    cust.reset(dbConnection);
    return cust;
  }
  
  /**
   * getCollection
   * 
   * @param Connection
   * @return Collection
   * @throws SIDBAccessException
   */
  public Collection getCollection(Connection lConnection, SILogin lLogin) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SICust currCustomer = new SICust();
    StringBuffer lSqlBuf = new StringBuffer();
    Collection customer = new ArrayList();
    StringBuffer lCountSqlBuf = new StringBuffer();// レコード数を求める
    
    if (searchFlg == false) {
      return customer;
    }
    
    // 出力項目
    lSqlBuf.append(" SELECT a.CustCode,a.custName,a.custPronName,a.Email,a.StoreTel,a.tel,a.companyname,a.corporationname,a.receivableflg ");
    lSqlBuf.append(" FROM custtbl a ");
    lSqlBuf.append(" WHERE 1=1");
    
    lCountSqlBuf.append("SELECT count(a.CustCode) from custtbl a WHERE 1=1 ");
    lCountSqlBuf.append(this.getCondtionSQL());
    
    // 結合の条件
    lSqlBuf.append(this.getCondtionSQL());
    // 出力順
    lSqlBuf.append(" ORDER BY a.custcode ASC ");
    // 実行
    try {
      int lRecordCount = Integer.parseInt(SIDBUtil.getFirstData(lConnection, lCountSqlBuf.toString()));// レコード数の取得
      int lPageSize = this.getPageSize();// ページサイズ
      int lPageNumber = this.getPageNumer();// ページ番号
      int lMaxPage = lRecordCount / lPageSize;
      if (lRecordCount % lPageSize > 0) {
        lMaxPage++;
      }
      if (lPageNumber > lMaxPage)
        lPageNumber = lMaxPage;
      
      // 開始レコードの番号の設定
      int lFromInx = (lPageNumber - 1) * lPageSize;
      // 終止のレコード番号の設定
      int lToInx = lFromInx + lPageSize - 1;
      if (lFromInx < 0)
        lFromInx = 0;
      if (lToInx < 0)
        lToInx = 0;
      
      log.debug("getCollection:lFromInx=" + lFromInx + ",lToInx=" + lToInx + ",lRecordCount=" + lRecordCount);
      
      lStatement = lConnection.createStatement();
      lSqlBuf.append(" LIMIT ").append(lPageSize);
      if(lFromInx>0) lSqlBuf.append(" OFFSET ").append(lFromInx);
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      for (int jj = 0; jj < lFromInx; jj++)
        customer.add(null);
      int lIndex = 0;
      
      // 商品レコードのセットの作成
      while (lResultSet.next() && lIndex < lPageSize) {
        currCustomer = new SICust();
        currCustomer.setEncode(SIConfig.SIENCODE_NONE);
        currCustomer.setCustCode(lResultSet.getString("CustCode"));
        currCustomer.setCustName(lResultSet.getString("custName"));
        currCustomer.setCustPronName(lResultSet.getString("custPronName"));
        currCustomer.setEmail(lResultSet.getString("Email"));
        currCustomer.setStoreTel(lResultSet.getString("StoreTel"));
        currCustomer.setTel(lResultSet.getString("Tel"));
        currCustomer.setCompanyName(lResultSet.getString("CompanyName"));
        currCustomer.setCorporationName(lResultSet.getString("corporationName"));
        currCustomer.setReceivableFlg(lResultSet.getString("receivableflg"));
        customer.add(currCustomer);
        lIndex++;
      }
      for (int jj = lFromInx + lPageSize; jj < lRecordCount; jj++)
        customer.add(null);
    } catch (Exception ex) {
      log.debug("exception sql = " + lSqlBuf.toString());
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    return customer;
  }
  
  /**
   * getCondtionSQL 検索条件に使用します。
   * 
   * @param
   * @return String
   * @throws
   */
  public String getCondtionSQL() {
    SITableConditionManager lConditionMan = new SITableConditionManager();
    
    SITableCondition DD = new SITableCondition("a", "custCode", this.custCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    DD = new SITableCondition("a", "custName", this.custName, SIConfig.SICONDITION_TYPE_LIKE, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("a", "custPronName", this.custPronName, SIConfig.SICONDITION_TYPE_LIKE, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("a", "email", this.email, SIConfig.SICONDITION_TYPE_LIKE, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("a", "DelFlg", SIConfig.SIDEL_FLG_DELETE, SIConfig.SICONDITION_TYPE_NOT_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("a", "companyName", this.salon, SIConfig.SICONDITION_TYPE_LIKE, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("a", "corporationName", this.company, SIConfig.SICONDITION_TYPE_LIKE, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition(" AND (a.tel LIKE '%"+SIDBUtil.SQL2Like(this.tel)+"%' OR a.StoreTel LIKE '%"+SIDBUtil.SQL2Like(this.tel)+"%') ");
    lConditionMan.add(DD);
    
    return lConditionMan.getCondtionSQL();
  }
  
}
