<?php
/*
	Copyright(c) 2010 Shift Tech Inc. All Rights Reserved.
 	http://www.shift-tech.jp/

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * ユーザー情報のDBアクセスクラス
 * @author 	yamamoto
 * @version	
 */

//ユーザー情報をまとめて取得する
//特定のユーザー情報を更新・削除する
//ユーザー登録を行う
class userDB extends Model
{
	var $_form = null;
	var $erchk = 'server';//quickformエラーチェックのフラグ'client'or'server;
	var $db=null;
	//KVa => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角英数字を半角英数字に変換する
	//KVC => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角ひらがなを全角カタカナに変換する
	//n   => 全角数字を半角数字に変換する
	var $columns = array(
						array("column"=>"usr_code","conv"=>"n","tags"=>false),				//登録番号
						array("column"=>"usr_id","conv"=>"KVa","tags"=>false),				//ログインID、（PCメアド）
						array("column"=>"usr_passwd","conv"=>"KVa","tags"=>false),			//パスワード
						array("column"=>"usr_status","conv"=>"n","tags"=>false),			//状態フラグ 0：削除 1：有効
						array("column"=>"usr_kanri","conv"=>"n","tags"=>false),				//管理権限 0:担当 1:管理者
						array("column"=>"usr_sei","conv"=>"KVa","tags"=>false),				//氏名（姓）
						array("column"=>"usr_mei","conv"=>"KVa","tags"=>false),				//氏名（名）
						array("column"=>"usr_sei_kana","conv"=>"KVa","tags"=>false),		//氏名（姓）カナ
						array("column"=>"usr_mei_kana","conv"=>"KVa","tags"=>false),		//氏名（名）カナ
						array("column"=>"usr_section","conv"=>"KVa","tags"=>false),			//部署名
						array("column"=>"usr_tel","conv"=>"KVa","tags"=>false),				//連絡先
						array("column"=>"usr_note","conv"=>"KVa","tags"=>false),			//備考
						array("column"=>"usr_mail_hp","conv"=>"KVa","tags"=>false),			//メールアドレス（携帯）
						array("column"=>"usr_mimg_path","conv"=>"a","tags"=>false),			//画像パス
						array("column"=>"usr_c_date","conv"=>"","tags"=>false),				//作成日
						array("column"=>"usr_u_date","conv"=>"","tags"=>false),				//更新日
						);
	
	/**
	 * コンストラクタ php4対応・・・
	 */
	function userDB()
	{
		$this->__construct();
	}
	function __construct()
	{
		Model::__construct();
		$this->db = new DataBase();
	}
	
	//フォームエレメントの作成
	function setElements()
	{
		$this->_form->addElement('hidden','usr_code', $this->getrequest("usr_code"));
		$this->_form->addElement('text','usr_id', null, array('size'=>40,'maxlength'=>'40','id'=>'usr_id','style'=>'ime-mode:disabled'));
		if($this->getRequest("usr_code")>0) {
			$this->_form->addElement('text','usr_passwd_update', null, array('size'=>20,'maxlength'=>'10','id'=>'usr_passwd_update','style'=>'ime-mode:disabled'));
			$this->_form->addElement('text','usr_passwd_update2', null, array('size'=>20,'maxlength'=>'10','id'=>'usr_passwd_update2','style'=>'ime-mode:disabled'));
		} else {
			$this->_form->addElement('text','usr_passwd', null, array('size'=>10,'maxlength'=>'10','id'=>'usr_passwd','style'=>'ime-mode:disabled'));
		}
		global $admin_type_name;
		$this->_form->addElement('select', 'usr_kanri', null, $admin_type_name);
		$this->_form->addElement('text','usr_sei', null, array('size'=>10,'maxlength'=>'10','id'=>'usr_sei'));
		$this->_form->addElement('text','usr_mei', null, array('size'=>10,'maxlength'=>'10','id'=>'usr_mei'));
		$this->_form->addElement('text','usr_sei_kana', null, array('size'=>20,'maxlength'=>'20','id'=>'usr_sei_kana'));
		$this->_form->addElement('text','usr_mei_kana', null, array('size'=>20,'maxlength'=>'20','id'=>'usr_mei_kana'));
		$this->_form->addElement('text','usr_section', null, array('size'=>40,'maxlength'=>'40','id'=>'usr_section'));
		$this->_form->addElement('text','usr_tel', null, array('size'=>40,'maxlength'=>'40','id'=>'usr_tel','style'=>'ime-mode:disabled'));
		$this->_form->addElement('text','usr_mail_hp', null, array('size'=>50,'maxlength'=>'50','id'=>'usr_mail_hp','style'=>'ime-mode:disabled'));
		$this->_form->addElement('textarea','usr_note',null, array("cols"=>60,"rows"=>10,"id"=>"usr_note"));
		$this->_form->addElement('file', 'picture', null);//画像アップ用ボタン
		$this->_form->addElement('checkbox', 'pic_delflg', null,'この画像を削除する',null);//画像削除チェックボックス
		$this->_form->updateElementAttr('pic_delflg',array('value'=>'delete'));
		$this->_form->addElement('hidden','delcode', '');
		$this->_form->addElement('hidden','usr_mimg_path', ''); //既存画像ファイルパス
	}
	//フォーム入力エラーチェックの設定
	function setRules()
	{
		$this->_form->applyFilter('__ALL__','trim');
		$this->_form->_submitValues = DataBase::ConvColumnVals($this->_form->_submitValues,$this->columns); //ルールに従った値変換、タグの除去
		$this->_form->setJsWarnings('下記の項目が不正です。','');		
		$this->_form->registerRule('usrid_valid', 'callback','check_usr_id');
		$this->_form->registerRule('usrid_valid_diff', 'callback','check_usr_id_selladdr');
		$this->_form->registerRule('check_kana_valid', 'callback','check_kana');
		$this->_form->registerRule('usrmailhp_valid', 'callback','check_usr_mail_hp');
		$this->_form->registerRule('usrkanrin_valid', 'callback','check_usr_kanri_n');
		
		$this->_form->addRule('usr_id','・「ログインID」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('usr_id','・「ログインID」は半角英数字50文字以内です','maxlength',50,$this->erchk);
		$this->_form->addRule('usr_id','・「ログインID」はメールアドレスを正しく入力してください','email',null,$this->erchk);
		$this->_form->addRule('usr_id','・ご入力いただきました「ログインID」（PCメールアドレス）は既に登録されています','usrid_valid',$_REQUEST,$this->erchk);
		$this->_form->addRule('usr_id','・「ログインID」と「携帯メールアドレス」が同じです','usrid_valid_diff',$_REQUEST,$this->erchk);
		
		
		if($this->getRequest("usr_code")>0) {
			$this->_form->addRule('usr_passwd_update','・「新しいパスワード」は半角英数字4文字以上10文字以内で入力してください','alphanumeric',null,$this->erchk);
			$this->_form->addRule('usr_passwd_update','・「新しいパスワード」は半角英数字4文字以上10文字以内で入力してください','rangelength', array(4,10),$this->erchk);
			$this->_form->addRule(array('usr_passwd_update', 'usr_passwd_update2'), '・「新しいパスワード」が一致しません', 'compare', null, $this->erchk);
		} else {
			$this->_form->addRule('usr_passwd','・「パスワード」を入力してください','required',null,$this->erchk);
			$this->_form->addRule('usr_passwd','・「パスワード」は半角英数字4文字以上10文字以内で入力してください','alphanumeric',null,$this->erchk);
			$this->_form->addRule('usr_passwd','・「パスワード」は半角英数字4文字以上10文字以内で入力してください','rangelength', array(4,10),$this->erchk);
		}
		
		$this->_form->addRule('usr_kanri','・「管理者」が居なくなってしまうため登録できません','usrkanrin_valid',$_REQUEST,$this->erchk);
		
		$this->_form->addRule('usr_sei','・「氏名（姓）」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('usr_sei','・「氏名（姓）」は全角10文字以内です','maxlength',30,$this->erchk);
		
		$this->_form->addRule('usr_mei','・「氏名（名）」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('usr_mei','・「氏名（名）」は全角10文字以内です','maxlength',30,$this->erchk);
		
		//$this->_form->addRule('usr_sei_kana','・「氏名カナ（セイ）」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('usr_sei_kana','・「氏名カナ（セイ）」は全角20文字以内です','maxlength',60,$this->erchk);
		$this->_form->addRule('usr_sei_kana','・「氏名カナ（セイ）」は全角カナで入力してください','check_kana_valid',null,$this->erchk);
		
		//$this->_form->addRule('usr_mei_kana','・「氏名カナ（メイ）」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('usr_mei_kana','・「氏名カナ（メイ）」は全角20文字以内です','maxlength',60,$this->erchk);
		$this->_form->addRule('usr_mei_kana','・「氏名カナ（メイ）」は全角カナで入力してください','check_kana_valid',null,$this->erchk);
		
		$this->_form->addRule('usr_section','・「部署」は全角40文字以内です','maxlength',120,$this->erchk);
		
		$this->_form->addRule('usr_tel','・「連絡先Tel」は全角40文字以内です','maxlength',120,$this->erchk);
		
		$this->_form->addRule('usr_mail_hp','・「携帯メールアドレス」は半角英数字50文字以内です','maxlength',50,$this->erchk);
		$this->_form->addRule('usr_mail_hp','・「携帯メールアドレス」を正しく入力してください','email',null,$this->erchk);
		$this->_form->addRule('usr_mail_hp','・ご入力いただきました「携帯メールアドレス」は既に登録されています','usrmailhp_valid',$_REQUEST,$this->erchk);
		
		$this->_form->addRule('usr_note','・「備考」は全角400文字以内です','maxlength',1200,$this->erchk);

		//必須なら$this->_form->addRule('picture','・画像を選択してください。','uploadedfile',null,'server');
		$this->_form->addRule('picture',"・画像ファイルサイズが大きすぎます。<br>アップロード可能なファイルサイズは".MAX_FILE_SIZE/(1000*1000)."Mbyte未満となっております。",'maxfilesize',MAX_FILE_SIZE,null,'server');
		$this->_form->addRule('picture','・アップロードできるファイル形式は「JPEG, GIF, PNG」となっております。','mimetype',array("image/pjpeg","image/jpeg","image/gif","image/x-png","image/png"));
	}
	//ボタン作成
	function setButtons($frozen = false) {
		$buttons = array();
		if($frozen) {
			$buttons[] = $this->_form->createElement('submit','BTNback',' 編集に戻る ',array('id'=>'BTNback','class'=>'bBtnBack'));
			$buttons[] = $this->_form->createElement('submit','BTNsave',' 保存 ',array('id'=>'BTNsave','class'=>'bBtnSave'));
		} else {
			$buttons[] = $this->_form->createElement('submit','BTNList',' 一覧に戻る ',array('id'=>'BTNList','class'=>'bBtnListBack'));
			$buttons[] = $this->_form->createElement('submit','BTNnext',' 次へ進む ',array('id'=>'BTNnext','class'=>'bBtnNext'));
			if($this->getRequest("usr_code")>0) {
				$buttons[] = $this->_form->createElement('submit','BTNdelete',' 削除 ',array('id'=>'BTNdelete','class'=>'bBtnDelete','onClick'=>'return confirm(\'本当に削除してよろしいですか？\')'));
			}
		}
		$this->_form->addGroup($buttons,"buttons", null, '&nbsp;&nbsp;');
	}
	
	/**
	 * 一覧用のユーザーリストを取得する
	 * @param $name //氏名、またはニックネームのフリーワード
	 * @param $kanri //管理権限
	 * @return ユーザーリスト
	 */
	function getList($name=null,$kanri=null)
	{
		//リスト取得SQL
		$sql = "select * from tbl_user where usr_status=1 ";
		$whrdata = null;
		$whrsql = null;
		if ($name != null) {
			$whrdata[] = "%{$name}%";
			$whrsql[] = "usr_sei LIKE ?";
			
			$whrdata[] = "%{$name}%";
			$whrsql[] = "usr_mei LIKE ?";
			
			$whrdata[] = "%{$name}%";
			$whrsql[] = "usr_sei_kana LIKE ?";
			
			$whrdata[] = "%{$name}%";
			$whrsql[] = "usr_mei_kana LIKE ?";
			
			$sql .= " and (".implode(" or ", $whrsql).") ";
		}
		if(is_numeric($kanri)){
			$whrdata[] = $kanri;
			$sql .= " and usr_kanri = ?";
		}
		$sql .= " order by usr_c_date desc";
		if(count($whrdata) > 0) {
			$result = $this->db->prepare($sql,$whrdata);
		} else {
			$result = $this->db->query($sql);
		}
		$rtn=null;
		if($result != null) {
			//データ取得
			$data = array();
			global $admin_type_name;
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
				if(isset($row) && is_array($row) && count($row) > 0) {
					if(isset($row["usr_kanri"])){
					 	$row["usr_kanri_name"] = $admin_type_name[$row["usr_kanri"]];
					}
					if(!isset($data[$row["usr_code"]])){
						$data[$row["usr_code"]] = $row;
					}
				}
			}
		}
		return $data;
	}
	
	/**
	 * コードからユーザ情報取得
	 * @param usr_code
	 * @return	array
	 */
	function getData($usr_code)
	{
		if(isset($usr_code)&&is_numeric($usr_code)) {
			$result = $this->db->prepare("select * from tbl_user where usr_code = ?",$usr_code);
			if($result != null) {
				return $result->fetchRow(DB_FETCHMODE_ASSOC);
			}
		}
		return null;
	}
	
	/**
	 * ログインチェック
	 * @param $usr_id //ログインＩＤ（メアド）
	 * @param $passwd //パスワード
	 * @return array or null;
	 */
	function Login($usr_id=null, $usr_passwd=null)
	{
		$data = null;
		if($usr_id != null && $usr_passwd != null) {
			//データ取得SQL
			$sql = "select * from tbl_user ";
			$whrdata = null;
			$whrsql = null;
			$whrdata[] = $usr_id;
			$whrsql[] = "usr_id LIKE ?";
			$whrdata[] = sha1($usr_passwd);
			$whrsql[] = "usr_passwd = ?";
			if(is_array($whrdata) && count($whrdata)>0){
				$sql .= " where ";
				$sql .= implode(" and ", $whrsql);
				$sql .= " and usr_status = 1 ";
				$result = $this->db->prepare($sql,$whrdata);
				$data = $result->fetchRow(DB_FETCHMODE_ASSOC);
			}
		}
		return $data;
	}

	//データ保存
	function doSave($post)
	{
		foreach($this->columns as $val) {
			$records[$val["column"]] = $post[$val["column"]];
		}
		
		//新しい画像データがあるなら新ファイル名の決定
		if(isset($_SESSION["tmpImage"]['data'])&&$_SESSION["tmpImage"]['data']!=null){
			$records["usr_mimg_path"] = date("YmdHis").$_SESSION["tmpImage"]["ext"];
		}
		if(isset($records["usr_code"])&&is_numeric($records["usr_code"])) { //更新時
			//パスワードの変換
			if(isset($post["usr_passwd_update"]) && $post["usr_passwd_update"]!=null) {
				$records["usr_passwd"] = $post["usr_passwd_update"];
			}
			//画像削除フラグがあったら空白に
			if($post["pic_delflg"]!=null) {
				$records["usr_mimg_path"]=null;
			}
			$rtn = $this->update($records);
			if($rtn == null) {
				//画像削除処理
				if($post["usr_mimg_path"]!=null && (isset($_SESSION["tmpImage"])||$post["pic_delflg"]!=null)) {
					$this->Delpic($records["usr_code"], $post["usr_mimg_path"]);
				}
			}
			return $rtn;
		} else {
			return $this->insert($records);
		}
	}
	
	/**
	 * 新規登録
	 * @return	null or err_str
	 */
	function insert( $record )
	{
		$record["usr_c_date"] = "now()";
		$record["usr_u_date"] = "now()";
		$record["usr_status"] = 1;
		if ($record["usr_passwd"]) { //パスワードを暗号化
			$record['usr_passwd']	= sha1($record["usr_passwd"]);
		}
		$this->db->query('BEGIN');
		$record["usr_code"] = $this->db->getKey("tbl_user_usr_code");//登録ID
		if($this->db->insert("tbl_user",$record)) {
			if($this->setImages($record)) { //画像保存
				$this->db->query('COMMIT');
				return null;
			}
			$this->db->query('ROLLBACK');
			return "・画像データの保存に失敗しました";
		}
		$this->db->query('ROLLBACK');
		return "保存に失敗しました";
	}
	
	/**
	 * 更新内容の登録
	 * @return	null or err_str
	 */
	function update($record)
	{
		if(isset($record["usr_code"]) && is_numeric($record["usr_code"])) {
			//カラム除外
			unset($record["usr_c_date"]);
			unset($record["usr_status"]);
			$record["usr_u_date"] = "now()";
			if (isset($record["usr_passwd"])) { //パスワードを暗号化
				$record['usr_passwd']	= sha1($record["usr_passwd"]);
			} else {
				unset($record['usr_passwd']);
			}
			$this->db->query('BEGIN');
			if($this->db->update("tbl_user", $record,"usr_code=".$record["usr_code"])) {
				if($this->setImages($record)) {//画像ファイルアップ
					$this->db->query('COMMIT');
					//ログイン中のユーザだったらセッション更新/
					if($record["usr_code"] == $_SESSION['usr_info']["usr_code"]) {
						$_SESSION["usr_info"]["usr_sei"] = $record["usr_sei"];
						$_SESSION["usr_info"]["usr_mei"] = $record["usr_mei"];
						$_SESSION["usr_info"]["usr_mimg_path"] = $record["usr_mimg_path"];
					}
					return null;
				}
				$this->db->query('ROLLBACK');
				return "・画像データの保存に失敗しました";
			}
			$this->db->query('ROLLBACK');
			return "・保存に失敗しました";
		}
		return "・コードが不明です";
	}
	
	/**
	 * ユーザー削除
	 * @return	null or err_str
	 */
	function delete($post) {
		if(isset($post["usr_code"]) && is_numeric($post["usr_code"])) {
			$this->db->query('BEGIN');
			if($this->db->update("tbl_user", array("usr_status"=>0,"usr_u_date"=>"now()"),"usr_code=".$post["usr_code"])) {
				$this->db->query('COMMIT');
				return null;
			}
			$this->db->query('ROLLBACK');
			return "・削除に失敗しました";
		}
		return "・会員コードが不明です";
	}
	
	/*
	 * 画像保存
	 * 登録する画像($_SESSION["tmpImage"]['data'])が存在していれば過去の画像を削除し、書き出し
	 * 保存先は $targetPath."/".$record["PKEY"]."/".(timestamp).jpg(.gif|.png)となります
	 * @return ファイル名
	 */
	function setImages($post) {
		$targetPath = BASE_PATH.USR_PROF_IMG_PATH.$post["usr_code"]."/"; //保存先
		if(isset($post["usr_code"]) && is_numeric($post["usr_code"]) && isset($_SESSION["tmpImage"]['data']) && $_SESSION["tmpImage"]['data']!=null) {
			if(!is_dir(BASE_PATH.USR_PROF_IMG_PATH)){
				if(!mkdir(BASE_PATH.USR_PROF_IMG_PATH)) {
					return false;
				}
			}
			if(!is_dir($targetPath)) {
				if(!mkdir($targetPath)) {
					return false;
				}
			}
			return commonFile::putImage($_SESSION["tmpImage"],$targetPath,$post["usr_mimg_path"]);
		}
		return true;
	}
	
	function Delpic($code,$fname) {
		$targetPath = BASE_PATH.USR_PROF_IMG_PATH.$code."/"; //保存先
		if(isset($fname) && $fname!=null && file_exists($targetPath.$fname)) {
			@unlink($targetPath.$fname);
		}
	}
}



/*
 * ログインIDユニークチェック
 * @param $value
 */
function check_usr_id($value,$sub_ar=null) {
	$id = null;
	$mailad = nulll;
	$id = isset($sub_ar["usr_code"]) ? $sub_ar["usr_code"] : "";
	$mailad = isset($sub_ar["usr_id"]) ? $sub_ar["usr_id"] : "";
	$db = null;
	$db = DB::connect(DSN);
	if(PEAR::isError($db)) {
		die($db->getMessage());
	}
	
	$sql = "select count(*) from tbl_user where usr_id like '{$mailad}' and usr_status = 1";
	if($id != null && is_numeric($id)) {
		$sql .= " and usr_code != '{$id}'";
	}
	$cnt = $db->getOne($sql);
	//携帯メアドに無いかも確認
	$sql = "select count(*) from tbl_user where usr_mail_hp like '{$mailad}' and usr_status = 1";
	$cnt2 = 0;
	$cnt2 = $db->getOne($sql);
	$cnt = $cnt+$cnt2;
	if($cnt == 0) {
		return true;
	} else {
		return false;
	}
}

/*
 * ログインIDと携帯メアドのチェック
 */
function check_usr_id_selladdr($value,$sub_ar=null) {
	if($sub_ar["usr_id"] == $sub_ar["usr_mail_hp"]) {
		return false;
	} else {
		return true;
	}
}

/*
 * 携帯メアドユニークチェック
 * @param $value
 */
function check_usr_mail_hp($value,$sub_ar=null) {
	$id = null;
	$mailad = nulll;
	$id = isset($sub_ar["usr_code"]) ? $sub_ar["usr_code"] : "";
	$mailad = isset($sub_ar["usr_mail_hp"]) ? $sub_ar["usr_mail_hp"] : "";
	$db = null;
	$db = DB::connect(DSN);
	if(PEAR::isError($db)) {
		die($db->getMessage());
	}
	
	$sql = "select count(*) from tbl_user where usr_mail_hp like '{$mailad}' and usr_status = 1 ";
	if($id != null && is_numeric($id)) {
		$sql .= "and usr_code != '{$id}'";
	}
	$cnt = $db->getOne($sql);
	//ログインIDに無いかも確認
	$sql = "select count(*) from tbl_user where usr_id like '{$mailad}' and usr_status = 1 ";
	$cnt += $db->getOne($sql);
	if($cnt == 0) {
		return true;
	} else {
		return false;
	}
}

/*
 * サイト会員ID存在チェック
 */
function check_usr_id_exist($value,$sub_ar=null) {
	$whrdata = array();
	$whrdata[] = isset($sub_ar["usr_id"]) ? $sub_ar["usr_id"] : "";
	$db = null;
	if(count($whrdata) == 1) {
		$db = DB::connect(DSN);
		if(PEAR::isError($db)) {
			die($db->getMessage());
		}
		$sql = "select count(*) from tbl_user where usr_id like '{$whrdata[0]}' and usr_status = 1";
		$cnt = $db->getOne($sql);
		if($cnt == 1) {
			return true;
		} else {
			return false;
		}
	}
	return false;
}

function check_usr_kanri_n($value,$sub_ar=null) {
	$id = isset($sub_ar["usr_code"]) ? $sub_ar["usr_code"] : "";
	$kanri_flg = isset($sub_ar["usr_kanri"]) ? $sub_ar["usr_kanri"] : "0";
	if(!$kanri_flg || isset($sub_ar["buttons"]["BTNdelete"])) {
		$db = null;
		$db = DB::connect(DSN);
		if(PEAR::isError($db)) {
			return false;
		}
		$sql = "select count(*) from tbl_user where usr_kanri = 1 and usr_status = 1";
		if($id != null && is_numeric($id)) {
			$sql .= " and usr_code != {$id}";
		}
		$cnt = $db->getOne($sql);
		if($cnt == 0) {
			return false;
		} else {
			return true;
		}
	}
	return true;
}
?>