<?php
if (!defined('IN_DZZ')) {
exit('Access Denied');
}
class table_organization extends dzz_table
{
private $_uids = array();
public function __construct()
{
$this->_table = 'organization';
$this->_pk = 'orgid';
$this->_pre_cache_key = 'organization_';
parent::__construct();
}
public function fetch_all_by_forgid($forgid, $count = 0, $type = 0)
{
if ($count) $sql = 'SELECT COUNT(*) FROM %t WHERE forgid= %d';
else $sql = 'SELECT * FROM %t WHERE forgid= %d';
$param = array($this->_table, $forgid);
if ($type > -1) {
$sql .= ' and `type`=%d';
$param[] = $type;
}
if ($count) return DB::result_first($sql, $param);
return DB::fetch_all($sql . ' ORDER BY disp', $param, 'orgid');
}
public function fetch_all_by_uid($uid,$type=-1){
if(empty($uid)) $uid=getglobal('uid');
if(!$uid) return array();
if($orgids=C::t('organization_user')->fetch_orgids_by_uid($uid,$type)){
parent::fetch_all($orgids);
}
return array();
}
public function insert($arr){
if($orgid=parent::insert($arr)){
if(intval($arr['aid'])) C::t('attachment')->add_by_aid(intval($arr['aid']));
}
}
return $orgid;
}
public function fetch_all_orggroup($uid,$getmember = true)
{
global $_G;
$groups = array();
if($_G['adminid'] == 1){
$orgids = DB::fetch_all("select orgid from %t where `type`=%d and forgid = %d",array($this->_table,0,0));
foreach($orgids as $v){
$groups['org'][]= parent::fetch($v['orgid']);
}
}else{
if ($uid) {
$orgids = C::t('organization_user')->fetch_org_by_uid($uid);
$orgids = array_unique($orgids);
$toporgids = array();
foreach (parent::fetch_all($orgids) as $v) {
if ($v['type'] == 0) {
$patharr = explode('-', $v['pathkey']);
$toporgid = intval(str_replace('_', '', $patharr[0]));
if (in_array($toporgid, $toporgids)) {
continue;
}
$orginfo=parent::fetch($toporgid);
if (C::t('organization_admin')->chk_memberperm($toporgid, $uid) > 0) {
if($orginfo['syatemon'] == 1){
if($getmember){
$orginfo['usernum'] = C::t('organization_user')->fetch_num_by_toporgid($toporgid);
$orginfo['adminer'] = C::t('organization_admin')->fetch_adminer_by_orgid($toporgid);
}
$groups['org'][] = $orginfo;
}
} else {
if ($orginfo['syatemon'] == 1 && $orginfo['manageon'] == 1 && $orginfo['diron'] == 1) {
if($getmember){
$orginfo['usernum'] = C::t('organization_user')->fetch_num_by_toporgid($toporgid);
$orginfo['adminer'] = C::t('organization_admin')->fetch_adminer_by_orgid($toporgid);
}
$groups['org'][] = $orginfo;
}
}
$toporgids[] = $toporgid;
}
}
}
}
return $groups;
}
public function fetch_group_by_uid($uid, $foreces = false)
global $_G;
if (!$uid) return false;
$groups = array();
$orgids = C::t('organization_user')->fetch_orgids_by_uid($uid,1);
foreach (DB::fetch_all("select * from %t where `orgid` IN(%n) order by disp", array($this->_table, $orgids)) as $orginfo) {
if ($foreces) {
if ($orginfo['syatemon'] == 0) continue;
} elseif ($orginfo['diron'] == 0 && C::t('organization_admin')->chk_memberperm($orginfo['orgid'], $uid) == 0) continue;
}
}
if(!$foreces){
$orginfo['usernum'] = C::t('organization_user')->fetch_usernums_by_orgid($orginfo['orgid']);
$orginfo['creater'] = C::t('organization_admin')->fetch_group_creater($orginfo['orgid']);
}
if ($orginfo['aid'] > 0) {
$orginfo['imgs'] = 'index.php?mod=io&op=thumbnail&width=24&height=24&path=' . dzzencode('attach::' . $orginfo['aid']);
}
$groups[] = $orginfo;
}
return $groups;
}
public function delete_by_orgid($orgid)
{
if (!$org = parent::fetch($orgid)) {
return array('error' => lang('remove_error_object_inexistence'));
}
if (self::fetch_all_by_forgid($org['orgid'], true) || ($org['fid'] && DB::result_first("select count(*) from %t where pfid = %d and isdelete < 1", array('resources', $org['fid'])))) {
return array('error' => lang('remove_error_check_the_content'));
}
if ($org['fid']) {
C::t('folder')->delete_by_fid($org['fid'],true);
}
C::t('resources_event')->delete_by_gid($orgid);
C::t('organization_user')->delete_by_orgid($orgid);
C::t('organization_admin')->delete_by_orgid($orgid);
if (parent::delete($orgid)) {
if (intval($org['aid']) != 0) {
C::t('attachment')->addcopy_by_aid($org['aid'], -1);
}
if( $org["type"]==0) self::syn_organization($org['orgid'],'delete');
}
return $org;
} else {
return array('error' => lang('delete_error'));
}
}
public function ismember($orgid,$uid=0,$onlychild = false)
{
if(!$uid) $uid=getglobal('uid');
$pathkey = '_' . $orgid . '_';
$orgids = array();
if($onlychild){
$pathkey = $pathkey . '.+';
}else{
$pathkey = $pathkey . '.*';
}
foreach (DB::fetch_all("select orgid from %t where pathkey regexp %s", array($this->_table, $pathkey)) as $v) {
$orgids[] = $v['orgid'];
}
if (DB::result_first("select count(*) from %t where uid = %d and orgid in (%n) ", array('organization_user', $uid, $orgids)) > 0) {
return true;
}
return false;
}
public function fetch_org_by_uidorgid($uid, $orgid)
{
$resultarr = array();
if (C::t('organization_admin')->chk_memberperm($orgid, $uid)) $resultarr = self::fetch_all_by_forgid($orgid,0,0);
} elseif ($this->ismember($orgid,$uid,true)) $orgids = C::t('organization_user')->fetch_orgids_by_uid($uid,0);
$pathkeyarr = DB::fetch_all("select pathkey from %t where orgid in (%n) ", array($this->_table, $orgids));
$porgids = array();
foreach ($pathkeyarr as $v) {
$vs = str_replace('_', '', $v['pathkey']);
$varr = explode('-', $vs);
$porgids = array_merge($porgids,$varr);
}
$orgsarr = self::fetch_all_by_forgid($orgid,0,0);
$orgidarr = array();
foreach ($orgsarr as $v) {
if (!in_array($v['orgid'], $orgidarr) && in_array($v['orgid'], $porgids)) {
if (C::t('organization_admin')->chk_memberperm($v['orgid'], $uid) > 0 && $v['syatemon'] == 1) {
$resultarr[] = $v;
} elseif ($v['syatemon'] && $v['manageon'] && $v['diron']) {
$resultarr[] = $v;
}
$orgidarr[] = $v['orgid'];
}
}
}
return $resultarr;
}
public function get_all_contaionchild_orgid($orgid, $uid)
{
$orgids = array();
if (!$org = self::fetch($orgid)) {
return $orgids;
}
if ($org['type'] > 0) {
$orgids[] = $orgid;
return $orgids;
}
if (C::t('organization_admin')->chk_memberperm($orgid, $uid)) $orgids = self::get_childorg_by_orgid($orgid);
} elseif ($this->ismember($uid, $orgid,true)) $orgidarrs = array();
foreach (DB::fetch_all("select o.orgid,o.pathkey,o.manageon,o.diron from %t u left join %t o on o.orgid = u.orgid where u.uid = %d and o.type = 0", array('organization_user', 'organization', $uid)) as $v) {
$pathkey = $v['pathkey'];
$orgidarr = explode('-', str_replace('_', '', $pathkey));
if (in_array($orgid, $orgidarr)) {
foreach ($orgidarr as $v) {
$orgidarrs[] = $v;
}
}
}
$orgids = array_unique($orgidarrs);
}
return $orgids;
}
public function get_childorg_by_orgid($orgid)
{
$orgidarr = array();
if (!$orgid) return $orgidarr;
$pathkey = DB::result_first("select pathkey from %t where orgid = %d", array($this->_table, $orgid));
$orgids = DB::fetch_all("select orgid from %t where pathkey regexp %s ", array($this->_table, '^' . $pathkey . '.*'));
foreach ($orgids as $v) {
$orgidarr[] = $v['orgid'];
}
return $orgidarr;
}
public function fetch_parent_by_orgid($orgid,$onlyid=true)
{
$pathkey = DB::result_first("select pathkey from %t where orgid = %d", array($this->_table, $orgid));
$path = str_replace('_', '', $pathkey);
$patharr = explode('-', $path);
if($onlyid){
return $patharr;
}else{
return parent::fetch_all($patharr);
}
}
public function setFolderAvailableByOrgid($orgid, $available=0)
{
if (!$org = parent::fetch($orgid)) return false;
if ($available > 0 && $org['forgid'] > 0) $parent = parent::fetch($org['forgid']);
if ($parent['diron'] < 1) return false;
}
if (parent::update($orgid, array('diron' => $available))) {
return true;
}
return false;
}
public function setgroupByOrgid($orgid, $groupon=0)
{
if (!$org = parent::fetch($orgid)) return false;
if (parent::update($orgid, array('manageon' => $groupon))) {
return true;
}
return false;
}
public function setIndeskByOrgid($orgid, $indesk)
{
if (!$org = parent::fetch($orgid)) return false;
if ($indesk > 0) {
if ($org['available'] < 1) return false;
}
if (parent::update($orgid, array('indesk' => $indesk))) {
return true;
}
return false;
}
public function setFolderByOrgid($orgid)
{
if (!$org = parent::fetch($orgid)) return false;
if ($org['forgid'] == 0) {
$pfid = 0;
} else {
$pfid = DB::result_first("select fid from " . DB::table($this->_table) . " where orgid='{$org['forgid']}'");
}
if ($fid = DB::result_first("select fid from " . DB::table('folder') . " where gid='{$orgid}' and flag='organization'")) {
if(C::t('folder')->rename_by_fid($fid,$org['orgname'])){
self::update($orgid, array('fid' => $fid));
}
} else {
$folder = array('fname' => C::t('folder')->getFolderName($org['orgname'],$pfid,$org['fid']),
'pfid' => $pfid,
'display' => $org['disp'],
'flag' => 'organization',
'gid' => $org['orgid'],
'innav' => $org['available'],
'uid' => getglobal('uid'),
'username' => getglobal('username'),
'perm' => perm_binPerm::getGroupPower('read')
);
$fid = C::t('folder')->insert($folder, 0);
}
if ($fid) {
self::update($org['orgid'], array('fid' => $fid));
return $fid;
}
return false;
}
public function setDispByOrgid($orgid, $disp, $forgid = 0)
{
if (!$org = parent::fetch($orgid)) return false;
if ($torg = DB::fetch_first("select disp,orgid from %t where forgid=%d and orgid!=%d order by disp limit %d,1", array($this->_table, $forgid, $orgid, $disp))) {
$disp = $torg['disp'];
foreach (DB::fetch_all("select orgid,disp from %t where disp>%d and forgid=%d", array($this->_table, $disp, $forgid)) as $value) {
parent::update($value['orgid'],array('disp'=>$value['disp']+1));
}
} else {
$disp = DB::result_first("select max(disp) from %t where forgid=%d", array($this->_table, $forgid)) + 1;
}
if ($return = parent::update($orgid, array('disp' => $disp, 'forgid' => $forgid))) {
if ($org['forgid'] != $forgid) {
$orgname = self::get_uniqueName_by_forgid($forgid, $org['orgname'], $org['orgid']);
if ($orgname != $org['orgname']) self::update_by_orgid($org['orgid'], array('orgname' => $orgname));
}
if ($pathkey = self::setPathkeyByOrgid($orgid)) {
$like = '^' . $pathkey;
foreach (DB::fetch_all("select orgid from %t where pathkey REGEXP %s", array($this->_table, $like)) as $value) {
self::setFolderByOrgid($value['orgid']);
}
}
}
if ($disp > 10000) {
foreach (DB::fetch_all("select orgid ,disp from %t where forgid=%d", array($this->_table, $forgid)) as $value) {
parent::update($value['orgid'],array('disp'=>$value['disp']-9000));
}
}
return $return;
} else {
return false;
}
}
public function getDispByOrgid($borgid)
{
$data = parent::fetch($borgid);
$disp = $data['disp'] + 1;
return $disp;
}
public function chk_by_orgname($orgname,$type = 0,$forgid=0)
{
if (DB::result_first("select count(*) from %t where orgname = %s and `type` = %d and forgid = %d", array($this->_table, $orgname,$type,$forgid)) > 0) {
return false;
}
return true;
}
public function insert_by_orgid($setarr, $synwx = 1)
{
$setarr['orgname'] = self::get_uniqueName_by_forgid($setarr['forgid'], $setarr['orgname']);
if ($setarr['orgid'] = parent::insert($setarr, true)) {
$uid = getglobal('uid');
$username = getglobal('username');
$fid = self::setFolderByOrgid($setarr['orgid']) if ($setarr['type'] !=0) {
C::t('organization_user')->insert_by_orgid($setarr['orgid'],$uid);
C::t('organization_admin')->insert($uid, $setarr['orgid'], 2);
}
$eventdata = array('groupname' => $setarr['orgname'], 'uid' => getglobal('uid'), 'username' => getglobal('username'));
C::t('resources_event')->addevent_by_pfid($fid, 'create_group', 'create', $eventdata, $setarr['orgid']);
self::setPathkeyByOrgid($setarr['orgid']);
return $setarr['orgid'];
}
return false;
}
public function insert_by_forgid($setarr, $borgid)
{
if ($borgid) {
$setarr['disp'] = self::getDispByOrgid($borgid);
}
$setarr['orgname'] = self::get_uniqueName_by_forgid($setarr['forgid'], $setarr['orgname']);
if ($setarr['orgid'] = parent::insert($setarr, true)) {
self::setFolderByOrgid($setarr['orgid']);
if (isset($setarr['type']) && $setarr['type'] != 0) {
$uid = getglobal('uid');
C::t('organization_admin')->insert($uid, $setarr['orgid'], 1);
}
self::setPathkeyByOrgid($setarr['orgid']);
if(isset($setarr['type']) && $setarr['type'] == 0 ) self::syn_organization($setarr['orgid']);
return $setarr;
}
return false;
}
public function syn_organization( $data=array(),$type="update" ){
if( $type=="update"){
Hook::listen('syntoline_department',$data) }else if( $type=="delete"){
Hook::listen('syntoline_department',$data,"del") }
}
public function update_by_orgid($orgid, $setarr, $synwx = 1)
{
if (!$org = self::fetch($orgid)) return false;
if (isset($setarr['orgname'])) {
$fid = $org['fid'];
$name = self::get_uniqueName_by_forgid($org['forgid'], getstr($setarr['orgname']), $orgid);
if (C::t('folder')->rename_by_fid($fid, $name)) {
if (parent::update($orgid, array('orgname' => $name))) {
$body_data = array('username' => getglobal('username'), 'oldname' => $org['orgname'], 'newname' => $name);
$event_body = 'update_group_name';
C::t('resources_event')->addevent_by_pfid($org['fid'], $event_body, 'update_groupname', $body_data, $orgid, '', $org['orgname']) if( $synwx && $org['type']==0) self::syn_organization($orgid);
}
unset($setarr['orgname']);
}
}
if (isset($setarr['perm']) && $setarr['perm']) {
$fid = $org['fid'];
C::t('folder')->update($fid, array('perm' => $setarr['perm']));
unset($setarr['perm']);
}
if (isset($setarr['desc'])) {
$setarr['desc'] = htmlspecialchars($setarr['desc']);
}
if (empty($setarr)) return true;
if (parent::update($orgid, $setarr)) {
if(isset($setarr['aid'])){
$oaid=intval($org['aid']);
$aid=intval($setarr['aid']);
if($oaid){
C::t('attachment')->addcopy_by_aid($oaid,-1);
}
if($aid){
C::t('attachment')->addcopy_by_aid($aid);
}
}
$org = array_merge($org, $setarr);
self::setFolderByOrgid($org['orgid']);
$body_data = array('username' => getglobal('username'));
$event_body = 'update_group_setting';
C::t('resources_event')->addevent_by_pfid($org['fid'], $event_body, 'update_setting', $body_data, $orgid, '', $org['orgname']) self::setPathkeyByOrgid($orgid);
if( $synwx && $org['type']==0 ) self::syn_organization($orgid);
return true;
}
return true;
}
public function getTopOrgid($orgid)
{
include_once libfile('function/organization');
$ids = self::fetch_parent_by_orgid($orgid);
return $ids[0];
}
public function getUpOrgidTree($orgid,$pids=array()){
global $_G;
if($org=C::t('organization')->fetch($orgid)){
array_unshift($pids,$orgid);
$pids=self::getUpOrgidTree($org['forgid'],$pids);
}
return ($pids);
}
public function setPathkeyByOrgid($orgid, $force = 0)
{ @set_time_limit(0);
if (!$org = parent::fetch($orgid)) return false;
if($org['type'] > 0){
$pathkey = '_'.$orgid.'_';
if (parent::update($org['orgid'], array('pathkey' => $pathkey))) return $pathkey;
return false;
}else{
if ($force || empty($org['pathkey'])) if($ids=self::getUpOrgidTree($org['orgid'])){
$pathkey='_'.implode('_-_',$ids).'_';
if( parent::update($org['orgid'],array('pathkey'=>$pathkey))) return $pathkey;
}
return false;
}
if ($org['forgid'] && ($porg = parent::fetch($org['forgid']))) {
$npathkey = $porg['pathkey'] . '-' . '_' . $orgid . '_';
} else {
$npathkey = '_' . $orgid . '_';
}
if ($org['pathkey'] == $npathkey) return $npathkey; $like = '^' . $org['pathkey'];
foreach(DB::fetch_all("select orgid,pathkey from %t where pathkey REGEXP %s", array($this->_table, $like)) as $value){
parent::update($value['orgid'],array('pathkey'=>str_replace($org['pathkey'],$npathkey,$value['pathkey'])));
}
}
}
public function wx_update($orgid)
{
global $_G;
if (!$this->_wxbind) return;
if (!$org = parent::fetch($orgid)) return false;
if ($org['type'] > 0) return false;
}
$wx = new qyWechat(array('appid' => $_G['setting']['CorpID'], 'appsecret' => $_G['setting']['CorpSecret'], 'agentid' => 0));
$wd = array();
if ($wxdepart = $wx->getDepartment()) {
foreach ($wxdepart['department'] as $value) {
$wd[$value['id']] = $value;
}
} else {
return false;
}
if ($org['forgid']) {
if (($forg = parent::fetch($org['forgid'])) && !$forg['worgid']) {
if ($worgid = self::wx_update($forg['orgid'])) {
$forg['worgid'] = $worgid;
} else {
return;
}
}
}
$parentid = ($org['forgid'] == 0 ? 1 : $forg['worgid']);
if ($org['worgid'] && $wd[$org['worgid']] && $parentid == $wd[$org['worgid']]['parentid']) $data = array("id" => $org['worgid']);
if ($wd[$org['worgid']]['name'] != $org['orgname']) $data['name'] = $org['orgname'];
if ($wd[$org['worgid']]['parentid'] != $parentid) $data['parentid'] = $parentid;
if ($wd[$org['worgid']]['order'] != $org['order']) $data['order'] = $org['order'];
if ($data) $data['id'] = $org['worgid'];
if ($data) {
if (!$wx->updateDepartment($data)) {
$message = 'updateDepartment:errCode:' . $wx->errCode . ';errMsg:' . $wx->errMsg;
runlog('wxlog', $message);
return false;
}
}
return $org['worgid'];
} else {
$data = array(
"name" => $org['orgname'], "parentid" => $org['forgid'] == 0 ? 1 : $forg['worgid'], "order" => $org['disp'] + 1, );
if ($ret = $wx->createDepartment($data)) {
parent::update($orgid, array('worgid' => $ret['id']));
return $ret['id'];
} else {
if ($wx->errCode == '60008') foreach ($wd as $value) {
if ($value['name'] == $data['name'] && $value['parentid'] = $data['parentid']) {
C::t('organization')->update($org['orgid'], array('worgid' => $value['id']));
return $value['id'];
}
}
}
$message = 'createDepartment:errCode:' . $wx->errCode . ';errMsg:' . $wx->errMsg;
runlog('wxlog', $message);
return false;
}
}
return false;
}
public function getPathByOrgid($orgid,$space='-')
{
$ret = array();
if ($org = parent::fetch($orgid)) {
$ids = explode('-', str_replace('_', '', $org['pathkey']));
$arr = parent::fetch_all($ids);
foreach ($ids as $id) {
if ($arr[$id]) $ret[] = $arr[$id]['orgname'];
}
}
if($space) $ret=implode($space,$ret);
return $ret;
}
public function fetch_all_orgid()
{
global $_G;
$uid = $_G['uid'];
$orgids = array();
$orgids_admin = array();
$orgids_member = array();
$explorer_setting = get_resources_some_setting();
if($_G['adminid'] == 1){
$orgdatas = DB::fetch_all("select orgid,`type` from %t where 1", array('organization'));
}else{
$orgdatas = DB::fetch_all("select u.orgid,o.`type` from %t u left join %t o on u.orgid=o.orgid where uid = %d", array('organization_user', 'organization', $uid));
}
foreach ($orgdatas as $v) {
if (!$explorer_setting['grouponperm'] && $v['type'] == 1) {
continue;
}
if (!$explorer_setting['orgonperm'] && $v['type'] == 0) {
continue;
}
$orgids[] = $v['orgid'];
}
foreach ($orgids as $val) {
if (C::t('organization_admin')->chk_memberperm($val, $uid)) {
$path = DB::result_first("select pathkey from %t where orgid = %d", array($this->_table, $val));
$patharr = DB::fetch_all("select pathkey from %t where pathkey regexp %s and available = %d", array($this->_table, '^' . $path . '.*', 1));
foreach ($patharr as $v) {
$pathstr = str_replace('_', '', $v['pathkey']);
if ($orgidarr = explode('-', $pathstr)) $orgids_admin = array_merge($orgids_admin, $orgidarr);
}
} else $path = DB::result_first("select pathkey from %t where orgid = %d and available = %d and diron = %d", array($this->_table, $val, 1, 1));
$pathstr = str_replace('_', '', $path);
if ($orgidarr = explode('-', $pathstr)) $orgids_member = array_merge($orgids_member, $orgidarr);
}
}
$member_orgids = array();
foreach (DB::fetch_all('select manageon,diron,orgid from %t where orgid in(%n)', array($this->_table, $orgids_member)) as $v) {
if ($v['manageon'] && $v['diron']) {
$member_orgids[] = $v['orgid'];
}
}
return array('orgids' => array_unique(array_merge($orgids_admin, $member_orgids)), 'orgids_admin' => array_unique($orgids_admin), 'orgids_member' => array_unique(array_diff($member_orgids, $orgids_admin)));
}
public function fetch_all_manage_orgid()
{
global $_G;
$uid = $_G['uid'];
$explorer_setting = get_resources_some_setting();
$manageorgid = DB::fetch_all("select orgid from %t where uid = %d", array('organization_admin', $uid));
$orgids = array();
$orgarr = array();
foreach ($manageorgid as $v) {
if (!in_array($v['orgid'], $orgarr)) {
$info = DB::fetch_first("select pathkey,type from %t where orgid = %d", array($this->_table, $v['orgid']));
if (!$explorer_setting['grouponperm'] && $info['type'] == 1) {
continue;
}
if (!$explorer_setting['orgonperm'] && $info['type'] == 0) {
continue;
}
$pathkey = $info['pathkey'];
$orgidarr = DB::fetch_all("select orgid,orgname from %t where pathkey regexp %s ", array($this->_table, '^' . $pathkey . '.*'));
foreach ($orgidarr as $val) {
$orgids[$val['orgid']] = array('orgid' => $val['orgid'], 'orgname' => $val['orgname']);
$orgarr[] = $val['orgid'];
}
}
}
return $orgids;
}
public function fetch_all_part_org()
{
$uid = getglobal('uid');
$orgid = array();
foreach (DB::fetch_all("select orgid from %t where uid = %d", array('organization_user', $uid)) as $v) {
$orgid[] = $v['orgid'];
}
$orgid = array_unique($orgid);
$explorer_setting = get_resources_some_setting();
$orgarr = array();
foreach (DB::fetch_all("select * from %t where orgid in(%n)", array($this->_table, $orgid)) as $v) {
if (!$explorer_setting['grouponperm'] && $v['type'] == 1) {
continue;
}
if (!$explorer_setting['orgonperm'] && $v['type'] == 0) {
continue;
}
$org = array('orgid' => $v['orgid'], 'orgname' => $v['orgname']);
$orgarr[] = $org;
}
return $orgarr;
}
public function get_grouptype_by_orgid($orgid)
{
if (!is_array($orgid)) {
return DB::result_first("select `type` from %t where orgid = %d", array($this->_table, $orgid));
} else {
$orgtypes = array();
foreach (DB::fetch_all("select orgid,`type` from %t where orgid in(%n)", array($this->_table, $orgid)) as $v) {
if ($v['type'] == 0) {
$orgtypes['org'][] = $v['orgid'];
} else {
$orgtypes['group'][] = $v['orgid'];
}
}
return $orgtypes;
}
}
public function get_uniqueName_by_forgid($forgid, $orgname = '', $orgid = 0)
{
static $i = 0;
if (empty($orgname)) $orgname = lang('new_department');
if (DB::result_first("select COUNT(*) from %t where orgname=%s and forgid=%d and orgid!=%d", array($this->_table, $orgname, $forgid, $orgid))) {
$orgname = preg_replace("/\(\d+\)/i", '', $orgname) . '(' . ($i + 1) . ')';
$i += 1;
return self::get_uniqueName_by_forgid($forgid, $orgname);
} else {
return $orgname;
}
}
public function get_orgallotspace_by_orgid($orgid, $allotspace = 0, $owner = true)
{
$org = self::fetch($orgid);
if ($org['maxspacesize'] > 0 && $owner) {
$allotspace += $org['maxspacesize'] * 1024 * 1024;
} else
$allotspace += intval($org['usesize']);
foreach (DB::fetch_all("select orgid from %t where forgid = %d", array($this->_table, $orgid)) as $val) {
$allotspace += self::get_orgallotspace_by_orgid($val['orgid']);
}
}
return $allotspace;
}
public function get_system_allowallot_space()
{
global $_G;
$systemspace = isset($_G['setting']['systemSpace']) ? intval($_G['setting']['systemSpace']) : 0;
if ($systemspace == 0) {
$allowallotspace = 0;
} elseif ($systemspace < 0)
$allowallotspace = -1;
} elseif ($systemspace > 0)
$fpathkey = DB::fetch_all("select maxspacesize,orgid from %t where forgid = 0", array($this->_table));
$allotspace = 0;
foreach ($fpathkey as $v) {
if ($v['maxspacesize'] > 0) {
$allotspace += intval($v['maxspacesize']) * 1024 * 1024;
} else $allotspace += self::get_orgallotspace_by_orgid($v['orgid']);
}
}
$allotspace += C::t('user')->get_allotspace();
$allowallotspace = $systemspace * 1024 * 1024 - $allotspace;
if ($allowallotspace <= 0) {
$allowallotspace = -2;
}
}
return $allowallotspace;
}
public function get_parent_maxspacesize_by_pathkey($pathkey, $currentorgid)
{
$arr = array('orgid' => '', 'maxspacesize' => '');
$pathkeys = explode('-', $pathkey);
$pathkeys = array_reverse($pathkeys);
foreach ($pathkeys as $v) {
$orgid = intval(str_replace('_', '', $v));
if ($orgid == $currentorgid) {
continue;
} else {
$result = DB::result_first("select maxspacesize from %t where orgid = %d", array($this->_table, $orgid));
if ($result > 0 || $result == -1) {
$arr['maxspacesize'] = $result * 1024 * 1024;
$arr['orgid'] = $orgid;
break;
}
}
}
if ($arr['maxspacesize'] == '') {
$arr['maxspacesize'] = self::get_system_allowallot_space();
}
return $arr;
}
public function get_allowallotspacesize_by_orgid($orgid)
{
$currentallowsetsize = 0;
$org = C::t('organization')->fetch($orgid);
if (!$org) return;
$topmaxspacesizeinfo = $this->get_parent_maxspacesize_by_pathkey($org['pathkey'], $orgid);
if ($org['maxspacesize'] > 0) {
$oldmaxspacesize = $org['maxspacesize'] * 1024 * 1024;
} else
$oldmaxspacesize = $this->get_orgallotspace_by_orgid($orgid);
}
if ($topmaxspacesizeinfo['maxspacesize'] > 0) {
if ($topmaxspacesizeinfo['orgid'])
$topallotapce = $this->get_orgallotspace_by_orgid($topmaxspacesizeinfo['orgid'], 0, false);
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'] - $topallotapce + $oldmaxspacesize;
} else
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'] + $oldmaxspacesize;
}
} else
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'];
}
return $currentallowsetsize;
}
public function get_usespace_size_by_orgid($orgid)
{
$allowusespace = 0;
if (!$org = C::t('organization')->fetch($orgid)) {
return -1;
}
if ($org['maxspacesize'] > 0) {
$currentallotspace = $this->get_orgallotspace_by_orgid($orgid, 0, false);
$allowusespace = $org['maxspacesize'] * 1024 * 1024 - $currentallotspace;
if ($allowusespace <= 0) {
$allowusespace = -2;
}
} elseif ($org['maxspacesize'] < 0)
$allowusespace = -1;
} elseif ($org['maxspacesize'] == 0)
$allowusespace = self::get_allowallotspacesize_by_orgid($orgid);
}
return $allowusespace;
}
public function fetch_all_manage_orgids_by_uid($uids,$sub=true){
if(!is_array($uids)) $uids=(array)$uids;
if(!$orgids=C::t('organization_admin')->fetch_orgids_by_uid($uids)) return array();
$sql="1";
$param=array($this->_table);
$sqlarr=array();
if($sub){
foreach(parent::fetch_all($orgids) as $value){
$sqlarr[]='pathkey regexp %s';
$param[]='^'.$value['pathkey'].'.*';
}
if($sqlarr){
$sql.=' and (' . implode(' OR ',$sqlarr).')';
foreach(DB::fetch_all("select orgid from %t where $sql",$param) as $value){
$orgids[]=$value['orgid'];
}
}
}
return array_unique($orgids);
}
}