
package jp.co.sint.beans.mallmgr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIStock;
import jp.co.sint.config.SIConfig;
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.SIDateTime;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;

import org.apache.log4j.Category;


public class UIRegStock extends SIStock {
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  public UIRegStock() {
  }
  
  public UIRegStock(String lStockCode) {
    this.setStockCode(lStockCode);
  }
  
  /**
   * init 入力したデータから、このbeansを設定します。
   * 
   * @param HttpServletRequest
   * @param SIURLParameter
   * @return なし
   * @throws なし
   */
  public void init(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    super.init(lRequest, lUrlParam);
    this.setStockCode((String) lUrlParam.getParam("stockCode"));
    this.setStockName((String) lUrlParam.getParam("stockName"));
    this.setStockPronName((String) lUrlParam.getParam("stockPronName"));
    this.setPresidentName((String) lUrlParam.getParam("presidentName"));
    this.setPresidentPronName((String) lUrlParam.getParam("presidentPronName"));
    this.setAddress1((String) lUrlParam.getParam("address1"));
    this.setAddress2((String) lUrlParam.getParam("address2"));
    this.setAddress3((String) lUrlParam.getParam("address3"));
    this.setPostCode1((String) lUrlParam.getParam("postCode1"));
    this.setPostCode2((String) lUrlParam.getParam("postCode2"));
    this.setEmail((String) lUrlParam.getParam("email"));
    this.setEmail2((String) lUrlParam.getParam("email2"));
    this.setEmail3((String) lUrlParam.getParam("email3"));
    this.setFax((String) lUrlParam.getParam("fax"));
    this.setTel((String) lUrlParam.getParam("tel"));
    this.setDealerStation((String) lUrlParam.getParam("dealerStation"));
    this.setDealerStaff((String) lUrlParam.getParam("dealerStaff"));
    this.setChargeCode((String) lUrlParam.getParam("chargeCode"));
    this.setCapital((String) lUrlParam.getParam("capital"));
    this.setEstablishDateYear((String) lUrlParam.getParam("establishDateYear"));
    this.setEstablishDateMonth((String) lUrlParam.getParam("establishDateMonth"));
    this.setEstablishDateDay((String) lUrlParam.getParam("establishDateDay"));
    this.setAccountingPeriod((String) lUrlParam.getParam("accountingPeriod"));
    this.setFinancialInst((String) lUrlParam.getParam("financialInst"));
    this.setFinancialBranch((String) lUrlParam.getParam("financialBranch"));
    this.setAccountHolder((String) lUrlParam.getParam("accountHolder"));
    this.setAccountType((String) lUrlParam.getParam("accountType"));
    this.setAccountNumber((String) lUrlParam.getParam("accountNumber"));
    this.setCloseType((String) lUrlParam.getParam("closeType"));
    this.setCloseLimit((String) lUrlParam.getParam("closeLimit"));
    this.setPayType((String) lUrlParam.getParam("payType"));
    this.setPayLimit((String) lUrlParam.getParam("payLimit"));
    this.setMemo((String) lUrlParam.getParam("memo"));
  }
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection , SIURLParameter
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    StringBuffer lSqlBuf = new StringBuffer();
    
    SICheckValid.checkValid(errors, "仕入先コード", this.getStockCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "仕入先コード", this.getStockCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    SICheckValid.checkValid(errors, "仕入先名", this.getStockName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_CMDTYNAME_TYPE);
    SICheckValid.checkValid(errors, "仕入先名", this.getStockName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "仕入先名カナ", this.getStockPronName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
    SICheckValid.checkValid(errors, "仕入先名カナ", this.getStockPronName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    //SICheckValid.checkValid(errors, "代表者名", this.getPresidentName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "代表者名", this.getPresidentName(), SICheckDataConf.SICHECK_DATA_CMDTYNAME_TYPE);
    SICheckValid.checkValid(errors, "代表者名", this.getPresidentName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    //SICheckValid.checkValid(errors, "代表者名カナ", this.getPresidentPronName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "代表者名カナ", this.getPresidentPronName(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
    SICheckValid.checkValid(errors, "代表者名カナ", this.getPresidentPronName(), 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_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "FAX番号", this.getFax(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_TYPE, 9, 16);
    SICheckValid.checkValid(errors, "メールアドレス１", this.getEmail(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス１", this.getEmail(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 1, 128);
    SICheckValid.checkValid(errors, "メールアドレス２", this.getEmail2(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス２", this.getEmail2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 1, 128);
    SICheckValid.checkValid(errors, "メールアドレス３", this.getEmail3(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス３", this.getEmail3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 1, 128);
    SICheckValid.checkValid(errors, "仕入担当者", this.getChargeCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    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 (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);
    SICheckValid.checkValid(errors, "住所3(ビル名・階など)", this.getAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "営業担当部署", this.getDealerStation(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "営業担当者名", this.getDealerStaff(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "取引先金融機関", this.getFinancialInst(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "金融機関支店名", this.getFinancialBranch(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "口座名義人", this.getAccountHolder(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
    SICheckValid.checkValid(errors, "口座名義人", this.getAccountHolder(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "口座番号", this.getAccountNumber(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "口座番号", this.getAccountNumber(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 7);
    
    //SICheckValid.checkValid(errors, "締め日（月）", this.getCloseType(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    //SICheckValid.checkValid(errors, "締め日（日）", this.getCloseLimit(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    //SICheckValid.checkValid(errors, "支払日（月）", this.getPayType(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    //SICheckValid.checkValid(errors, "支払日（日）", this.getPayLimit(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    SICheckValid.checkValid(errors, "設立年月日", this.getEstablishDate(), SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    
    SICheckValid.checkValid(errors, "資本金", this.getCapital(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "資本金", this.getCapital(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 12);
    
    if (SIConfig.SIEDIT_MODE_INSERT.equalsIgnoreCase(this.getEditModeTxt().trim())) {
      // 重複レコードの存在をチェックします
      lSqlBuf = new StringBuffer(" SELECT StockCode FROM StockMtbl WHERE StockCode=");
      lSqlBuf.append(SIDBUtil.SQL2Str(this.getStockCode()));
      
      SICheckValid.checkDuplicate(errors, lConnection, "同じ仕入先コード", lSqlBuf.toString());
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    else {
      try {
        this.setChargeName(SIDBUtil.getFirstData(lConnection, "SELECT chargeName FROM chargeTbl WHERE chargeCode="+SIDBUtil.SQL2Str(this.getChargeCode())));
      } catch (Exception e) {
        errors.addError(new SICustomError("database.execute.error"));
        lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      }
    }
    
    return errors.isEmpty();
  }
  
  public boolean reset(Connection lConnection){
    boolean lResult=false;
    if (SIUtil.isNull(this.getStockCode())) return lResult;
    
    Statement lStatement=null;
    ResultSet lResultSet=null;
    
    StringBuffer lSqlBuf=new StringBuffer("SELECT * FROM StockMTbl WHERE StockCode=").append(SIDBUtil.SQL2Str(this.getStockCode()));
    log.debug("reset:lSqlBuf="+lSqlBuf.toString());
    try {
      lStatement=lConnection.createStatement();
      lResultSet=lStatement.executeQuery(lSqlBuf.toString());
      
      if (lResultSet.next()){
        this.setEncode(SIConfig.SIENCODE_NONE);
        this.setStockName(lResultSet.getString("StockName"));
        this.setStockPronName(lResultSet.getString("StockPronName"));
        this.setPresidentName(lResultSet.getString("PresidentName"));
        this.setPresidentPronName(lResultSet.getString("PresidentPronName"));
        this.setAddress1(lResultSet.getString("Address1"));
        this.setAddress2(lResultSet.getString("Address2"));
        this.setAddress3(lResultSet.getString("Address3"));
        this.setPostCode1(lResultSet.getString("PostCode1"));
        this.setPostCode2(lResultSet.getString("PostCode2"));
        this.setEmail(lResultSet.getString("Email"));
        this.setEmail2(lResultSet.getString("Email2"));
        this.setEmail3(lResultSet.getString("Email3"));
        this.setFax(lResultSet.getString("Fax"));
        this.setTel(lResultSet.getString("Tel"));
        this.setDealerStation(lResultSet.getString("DealerStation"));
        this.setDealerStaff(lResultSet.getString("DealerStaff"));
        this.setChargeCode(lResultSet.getString("ChargeCode"));
        this.setCapital(lResultSet.getString("Capital"));
        if (SIUtil.isNotNull(lResultSet.getString("EstablishDate"))) {
          SIDateTime lDateTime = new SIDateTime(lResultSet.getTimestamp("EstablishDate"));
          this.setEstablishDateYear(lDateTime.getYearStr());
          this.setEstablishDateMonth(lDateTime.getMonthStr());
          this.setEstablishDateDay(lDateTime.getDayStr());
        }
        this.setAccountingPeriod(lResultSet.getString("AccountingPeriod"));
        this.setFinancialInst(lResultSet.getString("FinancialInst"));
        this.setFinancialBranch(lResultSet.getString("FinancialBranch"));
        this.setAccountHolder(lResultSet.getString("AccountHolder"));
        this.setAccountType(lResultSet.getString("AccountType"));
        this.setAccountNumber(lResultSet.getString("AccountNumber"));
        this.setCloseType(lResultSet.getString("CloseType"));
        this.setCloseLimit(lResultSet.getString("CloseLimit"));
        this.setPayType(lResultSet.getString("PayType"));
        this.setPayLimit(lResultSet.getString("PayLimit"));
        this.setMemo(lResultSet.getString("Memo"));
        
        lResult=true;
      }else {
        log.error("not find record for stockCode="+getStockCode());
      } 
    }catch(SQLException sqle){
      sqle.printStackTrace();
    }finally{
      SIDBUtil.close(lStatement,lResultSet);
    }
    return lResult;
  }
}
