id,$values); return $res; } static public function generateFot($id,$values) { if(isset($values[self::$SALARY]) && $values[self::$SALARY]) { //$time = strtotime($values[self::$DATE_HIRE]); $time = time(); $month = intval(date('m',$time)); $year = date('Y',$time); $salary = cfloatval($values[self::$SALARY]); $data = [ Fot::$YEAR=>$year, Fot::$MONTH=>$month, Fot::$EMP=>$id, Fot::$FZP=>$salary, ]; $fot = Fot::getForEmp($id,$year,$month); if($fot){ Fot::updateById($fot[Fot::$ID],$data); } else { Fot::insert($data); } Fot::generate($year,$month); } } public function _updateById(int $id, array $values) { $C = self::getByID($id); if(isset($values[self::$ARCHIVE])) { if (!$values[self::$ARCHIVE] and $C[self::$ARCHIVE]) { $values[self::$STATUS] = 0; } } $res = parent::_updateById($id, $values); // TODO: Change the autogenerated stub self::generateFot($id,$values); return $res; } static function getWorkDays($emp){ if($emp[Emp::$DATE_HIRE]=='0000-00-00') return 0; if(!$emp[Emp::$DATE_HIRE]) return 0; $date1 = new \DateTime($emp[Emp::$DATE_HIRE]); $date2 = new \DateTime(date('Y-m-d')); $interval = $date1->diff($date2); return $interval->days; } static function getWorkPeriod($emp){ if($emp[Emp::$DATE_HIRE]=='0000-00-00') return ''; if(!$emp[Emp::$DATE_HIRE]) return ''; $date1 = new \DateTime($emp[Emp::$DATE_HIRE]); $date2 = new \DateTime(date('Y-m-d')); $interval = $date1->diff($date2); $res = []; $res[] = (($c = $interval->y)<10?'0':'').$c; $res[] = (($c = $interval->m)<10?'0':'').$c; $res[] = (($c = $interval->d)<10?'0':'').$c; return implode("-",$res); } static function getAge($emp){ if($emp[Emp::$BIRTHDATE]=='0000-00-00') return ''; if(!$emp[Emp::$BIRTHDATE]) return ''; $date1 = new \DateTime($emp[Emp::$BIRTHDATE]); $date2 = new \DateTime(date('Y-m-d')); $interval = $date1->diff($date2); $res = []; if($c = $interval->y) $res[] = $c; return implode(" ",$res); } static function getBirthday(){ $res = [ 'date'=>date('d.m.Y'), 'dates'=>[], ]; if(Emp::$IS_AUTH) { $r = Emp::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Emp::$BIRTHDATE,'LIKE','%'.date('-m-d')), \Where::_operator(Emp::$ARCHIVE,'=','0'), ])) ]); while($l = \DB::fetch($r)){ $emp_id = intval($l[Emp::$ID]); $staffing_names = []; $staffing = json_decode($l[Emp::$STAFFING],true)?:[]; foreach ($staffing as $staf_id){ $staffing_names[] = Staffing::getName( Staffing::getByID(intval($staf_id)) ); } $department_names = []; $r2 = Post::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Post::$EMP, '=',$emp_id) ])) ]); while ($l2 = \DB::fetch($r2)) { $department_names[] = Department::getName( Department::getByID( intval($l2[Post::$DEPARTMENT]) ) ); } $res['dates'][] = [ 'name'=>Emp::getName($l), 'text' =>implode(", ",array_merge($staffing_names,$department_names)), //'roles'=>implode(", ",$staffing_names), //'departments'=>implode(", ",$department_names), ]; } } return $res; } static function formatMyTopData(){ $img = '/pics/icon-user.svg'; if($img_id = intval(self::$data[self::$IMAGE])) { $img = Image::imageResize(Image::getByID($img_id)[Image::$URL],100,100,90,['crop'=>'center']); } return [ 'id'=>self::$data[self::$ID], 'name'=>self::$data[self::$NAME], 'is_superview'=>Emp::isSuperView(), 'avatar'=>$img, 'telegram'=> Emp::checkTelegram(), ]; } static function isMeAccept(){ return boolval(self::$data[self::$ACCEPT]); } static function getPublicData($emp_id){ $emp = Emp::getByID($emp_id); $data = Emp::format($emp); $tr = []; $tr['Имя'] = $data['name'] ; $tr['Email'] = $data['email'] ; $tr['Телефон'] = $data['phone'] ; $tr['Skype'] = $data['skype'] ; $tr['Discord'] = $data['discord'] ; $tr['Штатное расписание'] = implode($data['staffing'],"\n") ; $tr['Подразделение'] = implode($data['roles'],"\n") ; $tr['Локация'] = $data['city'] ; //$a = Project::getListFormatted($emp_id, $_POST['archive'], $_POST['active']); $a = Project::getListFormatted($emp_id, 0, 1); $projects = []; foreach ($a as $k=>$v){ $projects[] = $v['code_title']; } $children = []; $arr = Children::getForEmp($emp_id); foreach ($arr as $child){ $children[] = $child[Children::$NAME].' ['.Merakomis::fdate($child[Children::$DATE]).']'; } if(Rules::isRwCardEmpStaff($emp_id)){ $tr['Дата рождения'] = $data['birthday']; $tr['Юр. лицо'] = $data['org']; $tr['Вид сотрудничества'] = $data['org_type']; $tr['Дата приёма на работу'] = $data['hire']; $tr['Статус'] = $data['status']; $tr['Удалённая работа'] = $data['is_freelance'] ? 'Да' : 'Нет'; $tr['Архивный'] = $data['archive'] ? 'Да' : 'Нет'; $tr['ВУЗ'] = $data['education']; $tr['Диплом №'] = $data['diploma']; $tr['Специальность по диплому'] = $data['diploma_post']; $tr['Дата выдачи диплома'] = $data['diploma_date']; $tr['Дети'] = implode("\n",$children); $tr['НОПРИЗ'] = $data['nopriz']; $tr['НОСТРОЙ'] = $data['nostroi']; $tr['Технадзор'] = $data['technadzor']; $tr['Дополнительная информация'] = $emp[Emp::$COMMENT]; } if(Rules::isRwCardEmpAdmin($emp_id)){ $arr = Group::get($emp_id); $groups = []; foreach ($arr as $group){ $groups[] = eEmpGroup::getName($group); } $tr['ЗП (ross)'] = $emp[Emp::$SALARY]; $tr['Тип'] = eEmpType::getName($emp[Emp::$TYPE]); $tr['Группы'] = implode("\n",$groups); $tr['Дополнительная информация (администратор)'] = $emp[Emp::$DESCRIPTION]; $tr['Активен'] = $emp[Emp::$ACTIVE] ? 'Да' : 'Нет'; $tr['Подтвержден'] = $emp[Emp::$ACCEPT] ? 'Да' : 'Нет'; $tr['Телеграм'] = $emp[Emp::$TG_ACC] ? 'Закреплен' : 'Не закреплен'; } if(Rules::isRwCardEmpActiveProjects($emp_id)){ $tr['Активные проекты'] = implode($projects,"\n"); } return [ 'data' => $data, 'form' => $emp_id ? Emp::getMyProfileForm() : null, 'form2'=> $emp_id ? Emp::getMyProfileFormPassword() : null, 'tr' => $tr, ]; } static function SurnameIO($v){ $res = []; $a = explode(" ",trim($v[self::$NAME])); $res[] = $a[0]; if($a[1]) $res[] = substr1251($a[1],0,1).'.'; if($a[2]) $res[] = substr1251($a[2],0,1).'.'; return implode(" ",$res); } static function format($v,$isFull = true){ $roles = []; if($isFull) { $a = self::getRoles($v[self::$ID]); $s = Department::getStructure(); $roles = []; $sep = '→'; $i = 1; foreach ($a as $role){ $deps = []; foreach ($role['path'] as $dep_id){ $deps[] = Department::getName($s['base'][$dep_id]); } $roles[] = ($i++).'. '.implode(" $sep ",$deps);//." $sep ".Post::getName($role); } } $staffing = []; $ids = json_decode($v[self::$STAFFING],true); if($ids){ $a = Staffing::getByIDS($ids); foreach ($a as $vv){ $staffing[] = Staffing::getName($vv); } } $id = intval($v[Emp::$ID]); return [ 'id' => $id, 'name' => Emp::getName($v), 'login' => $v[self::$LOGIN], 'email' => self::getEmail($v), 'birthday' => Merakomis::fdate($v[self::$BIRTHDATE]), 'hire' => Merakomis::fdate($v[self::$DATE_HIRE]), 'city' => $v[self::$CITY]?City::getName( City::getByID(intval($v[self::$CITY]))):'', 'is_freelance' => boolval($v[self::$IS_FREELANCER]), 'roles' => $roles, 'staffing' => $staffing, 'avatar' => Image::format($v[self::$IMAGE]), 'org' => Org::getName(Org::getByID(intval($v[self::$ORG]))), 'org_type' => OrgType::getName(OrgType::getByID(intval($v[self::$ORG_TYPE]))), 'education' => $v[self::$EDUCATION], 'diploma' => $v[self::$DIPLOMA], 'diploma_date' => Merakomis::fdate($v[self::$DIPLOMA_DATE]), 'diploma_post' => $v[self::$DIPLOMA_POST], 'nopriz' => trim($v[self::$NOPRIZ]), 'nostroi' => trim($v[self::$NOSTROI]), 'technadzor' => trim($v[self::$TECHNADZOR]), 'status' => EmpStatus::getName(EmpStatus::getByID(intval($v[self::$STATUS]))), 'phone' => trim($v[self::$PHONE]), 'skype' => trim($v[self::$SKYPE]), 'discord' => trim($v[self::$DISCORD]), 'archive' => boolval($v[self::$ARCHIVE]), 'is_admin' => Emp::isAdmin(), 'is_superview' => Emp::isSuperView(), 'is_any_director' => Emp::isMeAnyDirector(), 'is_view_analysis_project' => Emp::isViewAnalysisProject(), 'is_any_role_director' => Emp::isMeAnyRoleDirector(), 'groups' => Group::get($id), 'download_link' => '/api/themes.merakomis.download/emp/?id='.$id, ]; } static function init(){ if(Merakomis::$IS_TEST){ self::$IS_AUTH = true; self::$AUTH_ID = 3; self::$data = Emp::getByID(self::$AUTH_ID); } else { self::$IS_AUTH = self::if_auth(); self::$AUTH_ID = intval(self::$data[self::$ID]); } //self::$IS_AUTH = true; //self::$AUTH_ID = 1; } public function _deleteByIDS(array $ids) { foreach ($ids as $id){ self::updateById($id,[ self::$REMOVED => 1, ]); } // return $res; } static function if_auth(){ if($uid = intval($_COOKIE[ self::$cookieIDKey ]) and $hash = $_COOKIE[ self::$cookieHashKey ]) { $acc = self::getByID($uid); $res = ( strcmp($acc[self::$PASSWORD],$hash)==0 && boolval($acc[self::$ACTIVE]) && !boolval($acc[self::$ARCHIVE]) && !boolval($acc[self::$REMOVED]) ) ; if($res) self::$data = $acc; return $res; } else return false; } static function prepareLogin($login) {return trim(strtolower((string)$login));} static function preparePass($pass) {return trim((string)$pass);} static function getByLogin(string $email){ return \DB::fetch(self::select( [ \Query::WHERE => new \Where (\Where::_and([ \Where::_operator(self::$LOGIN,'=',$email), //\Where::_operator(self::$PORTAL,'=',\Site::$portal_id), ])) ] )); } static function accept($id){ self::updateById($id,[ self::$ACCEPT=>1, ]); } static function getAcceptHash($emp){ return md5(md5(SALT.SALT.$emp[self::$LOGIN].SALT).SALT); } static function getAcceptLink($emp){ return \Site::sectionUrl(Merakomis::PAGE_ACCEPT.'/?id='.$emp[self::$ID].'&hash='.self::getAcceptHash($emp),true); } static function sendAccept($emp){ if(!$_COOKIE['wait_send']){ self::sendEmail($emp,"Кликните ссылку для подтверждения email",'Подтверждение email'); \Core::setCookie('wait_send',1,time()+60,null); } } static function sendEmail($emp,$html,$subject=''){ $res = Merakomis::mail( $emp[self::$LOGIN], $emp[self::$NAME], $html,$subject ); return $res; } static function checkPassword($acc,$pass):bool{ $hash = $acc[self::$PASSWORD]; $acc[self::$PASSWORD] = $pass; self::hash($acc); return strcmp($hash, self::hash($acc) )===0; } static function exit(){ History::exit(Emp::$AUTH_ID); \Core::setCookie(self::$cookieIDKey,'-'); \Core::setCookie(self::$cookieHashKey,'-'); } static function updateMyPass($acc,$pass){ $acc[self::$PASSWORD] = $pass; $c = [self::$PASSWORD => self::hash($acc) ]; self::updateById($acc[self::$ID], $c); \Core::setCookie(self::$cookieIDKey,$acc[self::$ID]); \Core::setCookie(self::$cookieHashKey,$c[self::$PASSWORD]); } static function reg($login,$pass1,$pass2){ $res = ['e'=>0]; // 1 - Такого нет в списке // 2 - Уже есть $err = ''; if($pass1!=$pass2){ $err = 'Пароли не совпадают'; } if(!$err){ $acc = self::getByLogin($login); // Если такой уже зарегистрирован if($acc[Emp::$PASSWORD]!=''){ $res['e'] = 2; } else { if($acc){ $id = $acc[self::$ID]; $r = Emp::updateById($id,[ Emp::$TYPE=>eEmpType::EMP, Emp::$PASSWORD=>$pass1, ]); $C = Emp::getByID($id); $C[Emp::$PASSWORD] = $pass1; $hash = Emp::hash($C); $r = Emp::updateById($id,[Emp::$PASSWORD=>$hash]); \Core::setCookie(self::$cookieIDKey,$id); \Core::setCookie(self::$cookieHashKey,$hash); $res['e'] = 0; History::reg($r->id); self::sendAccept($C); } else { // Такого в списках нет $res['e'] = 1; } } } $res['m'] = $err; return $res; } static function login($login,$pass){ $res = []; $res['e'] = false; $login = self::prepareLogin($login); $pass = self::preparePass($pass); $acc = self::getByLogin($login); if($acc) { if(self::checkPassword($acc,$pass)){ $isAuth = true; if(self::isTelegram($acc)){ $isAuth = false; if($key = $_POST['key']){ $code1 = $_POST['code']; $code2 = Emp::getAuthCode($acc,$key); if($code1==$code2){ $isAuth = true; } else { $res['e'] = 4; History::login_bad($acc[Emp::$ID]); } } else { $res['key'] = $key = time(); $res['e'] = 3; Emp::sendAuthCode($acc, $key); } } if($isAuth) { self::$data = $acc; self::$IS_AUTH = true; \Core::setCookie(self::$cookieIDKey, $acc[self::$ID]); \Core::setCookie(self::$cookieHashKey, $acc[self::$PASSWORD]); History::login($acc[Emp::$ID]); } } else { $res['e'] = 2; History::login_bad($acc[Emp::$ID]); } } else { $res['e'] = 1; } return $res; } static function hash($acc){return md5(\Config::$SALT.$acc[self::$ID].\Config::$SALT.\Config::$SALT.$acc[self::$PASSWORD]); } static function remind($acc){return md5(\Config::$SALT.$acc[self::$ID].\Config::$SALT.\Config::$SALT.$acc[self::$PASSWORD]); } static function getRemindHash($key,$emp) {return md5($key.SALT.$emp[\Profile::$PASSWORD].SALT.$key); } static function checkRemind($emp_id,$key,$hash){ $res = null; $emp_id = intval($emp_id); $emp = self::getByID($emp_id); $key = intval($key); $hash2 = static::getRemindHash($key,$emp); if($key + 60*60*24 < time()){ $res = 'В целях безопасности время на смену пароля ограничено и действие подтверждающих данных уже истекло. Начните восстановление пароля заново.'; } else if(strcmp($hash,$hash2)!=0) { $res = 'Неверные подтверждающие коды.'; } return $res; } static function getRemindLink($emp){ $key = time(); $id = $emp[self::$ID]; $hash = static::getRemindHash($key,$emp); return \Site::sectionUrl('new_pass/'.$id.'/'.$key.'/'.$hash.'/', true); } static function getMyProfileFormPassword(){ $data = self::$data; $form = (new \ModuleBZ\Form()) ->addRow((new Row()) ->addColumn(((new Password()) ->setName('old') ->setClassAll('c-1-3') ->setLabel($c = 'Старый пароль') ->setPlaceholder($c ) )) ->addColumn(((new Password()) ->setName('pass1') ->setClassAll('c-1-3') ->setLabel($c = 'Новый пароль') ->setPlaceholder($c ) )) ->addColumn(((new Password()) ->setName('pass2') ->setClassAll('c-1-3') ->setLabel($c = 'Новый пароль') ->setPlaceholder($c ) )) ) ->addRow((new Row()) ->addColumn(((new Submit()) ->setName('save') ->setValue('1') ->setPlaceholder('Сохранить') ->setClassName('green') ->setClassAll('c-100') )) ) ; return $form->toJSON(); } static function getMyProfileForm(){ $data = self::$data; $form = (new \ModuleBZ\Form()) ->addRow((new Row()) /* ->addColumn(((new Text()) ->setName(self::$NAME) ->setValue($data[self::$NAME]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$NAME)) ->setPlaceholder($c ) ->setDisabled(true) )) ->addColumn(((new Text()) ->setName(self::$LOGIN) ->setValue($data[self::$LOGIN]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$LOGIN)) ->setPlaceholder($c ) ->setDisabled(true) )) */ ->addColumn(((new Text()) ->setName(self::$PHONE) ->setValue($data[self::$PHONE]) ->setClassAll('c-1-3') ->setLabel($c = V::get(Vars::$PHONE)) ->setPlaceholder($c ) // ->setMask('+7 (999) 999-99-99') )) ->addColumn(((new Text()) ->setName(self::$SKYPE) ->setValue($data[self::$SKYPE]) ->setClassAll('c-1-3') ->setLabel($c = V::get(Vars::$SKYPE)) )) ->addColumn(((new Text()) ->setName(self::$DISCORD) ->setValue($data[self::$DISCORD]) ->setClassAll('c-1-3') ->setLabel($c = V::get(Vars::$DISCORD)) )) ) ->addRow((new Row()) ->addColumn(((new Submit()) ->setName('save') ->setValue('1') ->setPlaceholder('Сохранить') ->setClassName('green') ->setClassAll('c-100') )) ) ; return $form->toJSON(); } static $my_groups; static function isMeGroup($group_id){ $groups = (self::$my_groups ? : Group::get(self::$AUTH_ID)); return in_array($group_id,$groups); } static function isGroup($emp_id,$group_id){ $groups = (Group::get($emp_id)); return in_array($group_id,$groups); } static function isMeTopManager(){ return self::isMeGroup(eEmpGroup::TOP); } static function isMeAnyRoleDirector(){ $res = false; $r = Post::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Post::$EMP,'=',Emp::$AUTH_ID), \Where::_operator(Post::$IS_DIRECTOR,'=',1), ])) ],true); foreach ($r as $role){ if($role[Post::$IS_DIRECTOR]){ $res = true; } } return $res; } static function isMeAnyDirector(){ $res = false; $r = Project::select([ \Query::WHERE => new \Where(\WHere::_and([ \Where::_operator(Project::$DIRECTOR,'=',self::$AUTH_ID), \Where::_operator(Project::$REMOVED,'=',0), ])), \Query::COUNT => 1, ]); if(\DB::numRows($r)) $res = true; return $res; } static function isViewAnalysisProject(){ $res = false; $r = Member::select($qq = [ \Query::SELECT => ['COUNT(*) as cc'], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP,'=',Emp::$AUTH_ID), \Where::_operator(Member::$ACTIVE,'=',1), \Where::_in(Member::$ROLE,[ Member\structure\eMemberRole::MAIN_ARCHITECT, Member\structure\eMemberRole::MAIN_CONSTRUCTOR, Member\structure\eMemberRole::DIRECTOR_ENGINEER_EOM, Member\structure\eMemberRole::DIRECTOR_ENGINEER_SSIAK, Member\structure\eMemberRole::DIRECTOR_ENGINEER_VK, Member\structure\eMemberRole::DIRECTOR_ENGINEER_OVIK, Member\structure\eMemberRole::DIRECTOR_ENGINEER, Member\structure\eMemberRole::MAIN_ENGINEER, ]), ])), \Query::COUNT, ] ); $res = intval(\DB::fetch($r)['cc'])>0; return $res; } static function isMeAnyDepartmentDirector(){ $res = false; $r = Post::select([ \Query::WHERE => new \Where(\WHere::_and([ \Where::_operator(Post::$EMP,'=',self::$AUTH_ID), \Where::_operator(Post::$IS_DIRECTOR,'=',1), ])), \Query::COUNT => 1, ]); if(\DB::numRows($r)) $res = true; return $res; } static function isViewAll(){ return self::isMeGroup(eEmpGroup::ALL); } static function isAdmin(){ return Rules::isAdmin(); // return self::$data[self::$TYPE]==eEmpType::ADMIN; } static function isWorkInPeriod($emp,$begin,$end){ $isBegin = (($emp[self::$DATE_HIRE] && $begin && $emp[self::$DATE_HIRE]<=$begin) || !$emp[self::$DATE_HIRE]); $isEnd = (($emp[self::$ARCHIVE_DATE] && $end && $emp[self::$ARCHIVE_DATE]>=$end) || !$emp[self::$ARCHIVE_DATE]); return $isBegin || $isEnd; } static function checkTelegram(){ $res = false; if(Emp::$IS_AUTH){ if(Emp::$data[Emp::$TG_ACC]){ $res = boolval(Emp::$data[Emp::$TG_ACC]); } else { if(self::isTelegram()) { Telegram::getUpdates(); $data = Emp::getByID(intval(Emp::$AUTH_ID)); $res = boolval($data[Emp::$TG_ACC]); } } } return $res; } static function isTelegram($emp = null){ // 15 апреля 26 года выключили для всех проверку return false; //if($emp[Emp::$ID]==3) return false; if(!$emp) $emp = self::$data; $emp_id = $emp[Emp::$ID]; return Rules::isAdmin() || Emp::isMeAnyDirector() || Rules::isGroupFinanceEditor() || Rules::isGroupFinanceViewer() || Rules::isGroupProjectEditor() || Rules::isGroupProjectFinance() || Rules::isGroupStaff() ; return ( self::isGroup($emp_id,eEmpGroup::GENERAL) || self::isGroup($emp_id,eEmpGroup::STAFF) || self::isGroup($emp_id,eEmpGroup::TOP) || $emp[self::$TYPE]==eEmpType::ADMIN ); } static function isSuperView(){ return in_array(self::$data[self::$TYPE],[ eEmpType::ADMIN, self::isMeGroup(eEmpGroup::GENERAL) //eEmpType::TOP, //eEmpType::DIRECTOR, ]); } public static function afterUadd($values, $id, $result) { parent::afterUadd($values, $id, $result); $C = self::getByID($id); if($values['password'] ){ // || (isset($values[self::$EMAIL]) and $C[self::$EMAIL]!=$values[self::$EMAIL]) $C[self::$PASSWORD] = $values['password']; $hash = self::hash($C); self::updateById($id,[self::$PASSWORD=>$hash]); } if(isset($values['staffing'])){ self::updateById($id,[self::$STAFFING=>je($values['staffing'])]); } if(isset($values[self::$EMAIL])){ self::updateById($id,[self::$LOGIN=>self::getEmail($values)]); } //if(isset($values['group'])){ Group::set($id,$values['group']); //} if(isset($values[self::$ARCHIVE])){ $C = self::getByID($id); if($values[self::$ARCHIVE]) { if (!$C[self::$ARCHIVE_DATE]) { self::updateById($id, [self::$ARCHIVE_DATE => date('Y-m-d')]); Merakomis::sendMailAdmin('Сотрудник '.Emp::getName($C).' был архивирован','Архивирование сотрудника');; } } else { // НЕ НАДО!!! ИЗ-за Цезельский Демиан Сергеевич //self::updateById($id, [self::$ARCHIVE_DATE => null]); } } if(isset($values["has_children"])){ $hasChildren = intval($values["has_children"]); self::updateById($id,[ self::$HAS_CHILDREN => $values["has_children"], ]); $child_ids = []; if($hasChildren) { foreach ($values['children'] as $child) { $data = [ Children::$NAME => $child['name'], Children::$DATE => $child['date'], Children::$EMP => $id, ]; if ($child['id']) { $child_ids[] = $child['id']; Children::updateById($child['id'], $data); } else { $r = Children::insert($data); $child_ids[] = $r->id; } } } $x = Children::delete(new \Where(\Where::_and([ \Where::_operator(Children::$EMP,'=',$id), $child_ids ? \Where::_not([ \Where::_in(Children::$ID,$child_ids) ]): null ]))); } if(isset($values['posts'])){ $directors = []; $r = Post::select([ \Query::WHERE => new \Where(\Where::_operator(Post::$EMP,'=',$id)) ]); while($l = \DB::fetch($r)){ $directors[$l[Post::$DEPARTMENT]] = $l[Post::$IS_DIRECTOR]; } Post::delete(new \Where(\Where::_operator(Post::$EMP,'=',$id))); foreach ($values['posts'] as $post_id){ Post::insert([ Post::$EMP=>$id, Post::$DEPARTMENT=>$post_id, Post::$IS_DIRECTOR=>intval($directors[$post_id]), ]); } self::updateById($id,[ self::$STAFFING=>je($values['staffing']), ]); } if(isset($values['remove_tg'])){ if($values['remove_tg']){ self::updateById($id,[ self::$TG_ACC=>0, ]); } } self::generateFot($id,$values); } static function getIdsForSubEmps($pid){ $s = Department::getStructure(); $res = $s[$pid]; foreach($s[$pid] as $id){ if($s[$id]){ $res = array_merge($res,self::getIdsForSubEmps($id)); } } return $res; } static function getSubEmps($emp_id){ $res = []; $s = Department::getStructure(); $roles = self::getRoles($emp_id); $dep_ids = []; foreach ($roles as $role){ if($role[Post::$IS_DIRECTOR]) { $p = $role['path']; $id = array_pop($p); $dep_ids = array_merge($dep_ids,self::getIdsForSubEmps($id)); $dep_ids[] = $id; } } $x = ['directors','employees']; foreach ($dep_ids as $dep_id){ $d = $s['base'][$dep_id]; foreach ($x as $type) { foreach ($d[$type] as $role) { //foreach ($empList['roles'] as $role) { if ($role['emp']['id']) { $res[] = intval($role['emp']['id']); } //} } } } $res = array_unique($res); return $res; } static $CACHED_ROLES = []; static function getRolesCached($_emp_id){ if(self::$CACHED_ROLES[$_emp_id]) return self::$CACHED_ROLES[$_emp_id]; $res = []; $posts = Post::getAll(); foreach ($posts as $k=>$v){ $emp_id = intval($v[Post::$EMP]); $dep_id = $v[Post::$DEPARTMENT]; $path = Department::getPath($dep_id); $res[$emp_id][$k]['path'] = $path; } self::$CACHED_ROLES = $res; return $res[$_emp_id]; } static function getMemberRoles($emp_id){ $emp_id = intval($emp_id); $res = []; $r = Member::select([ \Query::SELECT => ['DISTINCT '.Member::$ROLE], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP,'=',$emp_id), \Where::_operator(Member::$ACTIVE,'=',1), ])) ],false); while($l = \DB::fetch($r)){ $res[] = $l[Member::$ROLE]; } return $res; } static function getRoles($emp_id){ $key = 'getRoles'.$emp_id; if(self::$CACHE[$key]) return self::$CACHE[$key]; $emp_id = intval($emp_id); $res = Post::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Post::$EMP,'=',$emp_id) ])) ],true); foreach ($res as $k=>$v){ $dep_id = $v[Post::$DEPARTMENT]; $path = Department::getPath($dep_id); $res[$k]['path'] = $path; } return self::$CACHE[$key] = $res; } static function getEmail($v){ return ($v[self::$EMAIL] ? $v[self::$EMAIL].'@merakom.ru' : '' ); } public static function beforeUadd(array $values = []): array { $res = []; if($c = $values[self::$EMAIL]){ if(strpos($c,'@')!==false){ $res[self::$EMAIL][] = 'Нельзя ввести имейл расположенный на отличных от домена @merakom.ru. Введите значение до @merakom.ru'; } } return $res; } public static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) { $s = Department::getStructure(); $img = null; if($c = $C[self::$IMAGE]) $img = Image::imageResize( Image::getByID($c)[Image::$URL], 128); $a = Staffing::select([ \Query::SORT => [Staffing::$NAME=>'ASC'] ]); $staffing = json_decode($C[self::$STAFFING],true)?:[]; $staffing_list = []; foreach ($a as $v){ $staffing_id = intval($v[Staffing::$ID]); if(in_array($staffing_id,$staffing) || $v[Staffing::$VIS]){ $staffing_list[] = ['id'=>$staffing_id,'title'=>$v[Staffing::$NAME]]; //$staffing_list[] = ['id'=>$staffing_id,'title'=>je($v)]; } } $posts = []; $post_list = [];//Post::getNameList(); $a = Post::getAll(); $s = Department::getStructure(); foreach ($s['base'] as $dep){ $title = []; $dep_id = $dep[Department::$ID]; $deps = Department::getPath($dep_id); foreach ($deps as $did){ $title[] = Department::getName($s['base'][$did]); } //$title[] = Post::getName($v); $post_list[] = [ //'id'=>$v[Post::$ID], 'id'=>$dep_id, 'title'=>implode(" ".self::$DEP_SEP." ",$title), ]; } if($C) { $r = Post::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Post::$EMP, '=',$C[Emp::$ID]) ])) ]); while ($l = \DB::fetch($r)) { $posts[] = $l[Post::$DEPARTMENT]; } } $children = []; if($isEdit) { $a = Children::getForEmp($C[Emp::$ID]); foreach ($a as $v){ $children[] = [ 'id'=>intval($v[Children::$ID]), 'name'=>$v[Children::$NAME], 'date'=>$v[Children::$DATE], ]; } } $row = ((new Row()) ->addColumn( (new Column())->setClassAll('c-20 ') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Основная информация')))) ->addColumn((new ImagePicker()) ->setClassAll('c-50') ->setName(self::$IMAGE) ->setLabel(V::get(Vars::$IMAGE)) ->setUploadUrl(\Site::sectionUrl(substr(Image::UPLOAD_URL_ACCOUNT,1),true)) ->setAjaxData(['token'=>Merakomis::getUploadToken()]) ->setSrc($img?:'') ->setValue($C[self::$IMAGE]) ->setAsBg(true) ->setClassName('btn blue') ) ->addColumn(((new Radio()) ->setName(self::$SEX) ->setValue($C[self::$SEX]) ->setClassAll('c-50') ->setLabel($c = V::get(Vars::$SEX)) ->setOptions([ ['id'=>-1,'title'=>'Женский'], ['id'=>1,'title'=>'Мужской'], ]) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$NAME) ->setValue($C[self::$NAME]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$NAME)) ->setPlaceholder($c) )) ->addColumn(((new DatePicker()) ->setName(self::$BIRTHDATE) ->setValue($C[self::$BIRTHDATE]?:null) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$BIRTHDATE)) ->setPlaceholder($c)) ) ->addColumn(((new Text()) ->setName(self::$EMAIL) ->setValue($C[self::$EMAIL]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$EMAIL).'. Значение до @merakom.ru') ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$PHONE) ->setValue($C[self::$PHONE]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$PHONE)) ->setPlaceholder($c) // ->setMask('+7 (999) 999-99-99') )) ->addColumn(((new Text()) ->setName(self::$SKYPE) ->setValue($C[self::$SKYPE]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$SKYPE)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$DISCORD) ->setValue($C[self::$DISCORD]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DISCORD)) ->setPlaceholder($c) )) ) ) ->addColumn( (new Column())->setClassAll('c-60 ') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Кадры')))) ->addColumn( (new Column())->setClassAll('c-1-3')->addTitle((new Title('Трудоустройство'))) ->addRow((new Row()) ->addColumn(((new Select()) ->setName('staffing') ->setValue($staffing) ->setClassAll('c-100') ->setLabel(V::get(Vars::$STAFFING)) ->setPlaceholder(V::get(Vars::$STAFFING)) ->setOptions($staffing_list) ->setMultiple(true) ->setSearch(true) )) ->addColumn(((new Select()) ->setName('posts') ->setValue($posts) ->setClassAll('c-100') ->setLabel(V::get(Vars::$ROLES)) ->setPlaceholder(V::get(Vars::$ROLES)) ->setOptions($post_list) ->setMultiple(true) ->setSearch(true) )) ->addColumn(((new Select()) ->setName(self::$CITY) ->setValue(intval($C[self::$CITY])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$CITY)) ->setPlaceholder($c) ->setOptions(City::getNameList([ 'zero'=>true, \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(City::$VIS,'=',1), $isEdit ? \Where::_operator(City::$ID,'=',intval($C[self::$CITY])) : null, ])) ])) ->setSearch(true) )) ->addColumn(((new Select()) ->setName(self::$ORG) ->setValue(intval($C[self::$ORG])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$ORG)) ->setPlaceholder($c) ->setOptions(Org::getNameList([ 'zero'=>true, \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(Org::$VIS,'=',1), $isEdit ? \Where::_operator(Org::$ID,'=',intval($C[self::$ORG])) : null, ])) ])) )) ->addColumn(((new Select()) ->setName(self::$ORG_TYPE) ->setValue(intval($C[self::$ORG_TYPE])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$ORG_TYPE)) ->setPlaceholder($c) ->setOptions(OrgType::getNameList([ 'zero'=>true, \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(OrgType::$VIS,'=',1), $isEdit ? \Where::_operator(OrgType::$ID,'=',intval($C[self::$ORG_TYPE])) : null, ])) ])) )) ->addColumn(((new DatePicker()) ->setName(self::$DATE_HIRE) ->setValue($C[self::$DATE_HIRE]?:null) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DATE_HIRE)) ->setPlaceholder($c)) ) ->addColumn(((new Select()) ->setName(self::$STATUS) ->setValue(intval($C[self::$STATUS])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$STATUS)) ->setPlaceholder($c) ->setOptions(EmpStatus::getNameList([ 'zero'=>true, \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(EmpStatus::$VIS,'=',1), $isEdit ? \Where::_operator(EmpStatus::$ID,'=',intval($C[self::$STATUS])) : null, ])) ])) )) ->addColumn(((new Text()) ->setName(self::$SALARY) //->setValue($C[self::$SALARY]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$SALARY)) ->setPlaceholder($c) )) ->addColumn(((new Switcher()) ->setName(self::$IS_FREELANCER) ->setClassAll('c c-50 green_switcher') ->setPlaceholder(V::get(Vars::$IS_FREELANCER)) ->setChecked(boolval($C[self::$IS_FREELANCER])) )) ->addColumn(((new Switcher()) ->setName(self::$ARCHIVE) ->setClassAll('c c-50 orange_switcher') ->setPlaceholder(V::get(Vars::$ARCHIVE)) ->setChecked(boolval($C[self::$ARCHIVE])) )) ) ) ->addColumn( (new Column())->setClassAll('c-1-3')->addTitle((new Title('Образование'))) ->addRow((new Row()) ->addColumn(((new Text()) ->setName(self::$EDUCATION) ->setValue($C[self::$EDUCATION]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$EDUCATION)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$DIPLOMA) ->setValue($C[self::$DIPLOMA]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DIPLOMA)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$DIPLOMA_POST) ->setValue($C[self::$DIPLOMA_POST]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DIPLOMA_POST)) ->setPlaceholder($c) )) ->addColumn(((new DatePicker()) ->setName(self::$DIPLOMA_DATE) ->setValue($C[self::$DIPLOMA_DATE]?:null) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DIPLOMA_DATE)) ->setPlaceholder($c) )) ->addColumn((new Column())->setClassAll('c-100')->addTitle((new Title('Дети')))) ->addColumn(((new Switcher()) ->setName('has_children') ->setChecked(boolval($C[self::$HAS_CHILDREN])) ->setClassAll('c-100 green_switcher') //->setLabel($c = V::get(Vars::$HAS_CHILDREN)) ->setPlaceholder('Есть дети') )) ->addColumn(((new InputChildren()) ->setName('children') ->setValue($children) ->setClassAll('c-100') //->setLabel($c = 'Дети') ->setPlaceholder($c) ->setVisible($isEdit ? boolval($C[self::$HAS_CHILDREN]) : true) )) ) ) ->addColumn( (new Column())->setClassAll('c-1-3')->addTitle((new Title('Аттестация'))) ->addRow((new Row()) ->addColumn(((new Text()) ->setName(self::$NOPRIZ) ->setValue($C[self::$NOPRIZ]) ->setClassAll('c-100') ->setPlaceholder($c = V::get(Vars::$NOPRIZ)) ->setLabel($c) //->setChecked(boolval($C[self::$NOPRIZ])) )) ->addColumn(((new Text()) ->setName(self::$NOSTROI) ->setValue($C[self::$NOSTROI]) ->setClassAll('c-100') ->setPlaceholder($c = V::get(Vars::$NOSTROI)) ->setLabel($c) //->setChecked(boolval($C[self::$NOSTROI])) )) ->addColumn(((new Text()) ->setName(self::$TECHNADZOR) ->setValue($C[self::$TECHNADZOR]) ->setClassAll('c-100 ') ->setPlaceholder($c = V::get(Vars::$TECHNADZOR)) ->setLabel($c) //->setChecked(boolval($C[self::$TECHNADZOR])) )) ->addColumn(((new Textarea()) ->setName(self::$COMMENT) ->setValue($C[self::$COMMENT]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$COMMENT)) ->setPlaceholder($c) ->setAutoHeight(true) )) ) ) ) ) ); //if(Emp::isSuperView()) { if(Emp::isAdmin()) { $row2 = (new Row()) ->addColumn(((new Text()) ->setName('password') // ->setValue($C[self::$PASS]) ->setClassAll('c-100') ->setLabel(V::get(Vars::$PASS) . ' (вводить, только если новый)') ->setPlaceholder(V::get(Vars::$PASS)) )) ->addColumn(((new Select()) ->setName(self::$TYPE) ->setValue(intval($C[self::$TYPE])?:($isEdit?0:eEmpType::EMP)) ->setClassAll('c-100') ->setLabel(V::get(Vars::$TYPE)) ->setPlaceholder(V::get(Vars::$TYPE)) ->setOptions(eEmpType::getNameList()) )) ->addColumn(((new Select()) ->setName('group') ->setValue($isEdit ? Group::get($C[self::$ID]) : []) ->setClassAll('c-100') ->setLabel($c = 'Группы') ->setPlaceholder($c) ->setOptions(eEmpGroup::getNameList()) ->setMultiple(true) )) ->addColumn(((new Textarea()) ->setName(self::$DESCRIPTION) ->setValue($C[self::$DESCRIPTION]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DESCRIPTION)) ->setPlaceholder($c) ->setAutoHeight(true) )) ->addColumn(((new Switcher()) ->setName(self::$ACTIVE) ->setClassAll('c c-100 green_switcher') ->setPlaceholder(V::get(Vars::$ACTIVE)) ->setChecked(boolval($C[self::$ACTIVE])) )) ->addColumn(((new Switcher()) ->setName(self::$ACCEPT) ->setClassAll('c c-100 green_switcher') ->setPlaceholder(V::get(Vars::$ACCEPT)) ->setChecked(boolval($C[self::$ACCEPT])) )); if($C[self::$TG_ACC]){ $row2 ->addColumn(((new Switcher()) ->setName('remove_tg') ->setClassAll('c c-100 green_switcher') ->setPlaceholder('Открепить телеграм аккаунт') ->setChecked(false) )); } $row->addColumn( (new Column())->setClassAll('c-20') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Администрирование')))) ->addColumn( (new Column())->setClassAll('c-100')->addTitle((new Title('Доступ'))) ->addRow($row2) ) ) ) ; } else if(Rules::isGroupStaff()){ $row2 = (new Row()) ->addColumn(((new Switcher()) ->setName(self::$ACTIVE) ->setClassAll('c c-100 green_switcher') ->setPlaceholder(V::get(Vars::$ACTIVE)) ->setChecked(boolval($C[self::$ACTIVE])) )); $row->addColumn( (new Column())->setClassAll('c-20') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Администрирование')))) ->addColumn( (new Column())->setClassAll('c-100')->addTitle((new Title('Доступ'))) ->addRow($row2) ) ) ) ; } $form->addRow($row); } static $absences_today; static function getAbsencesToday(){ if(isset(self::$absences_today)) return self::$absences_today; $a = Absence::select([ \Query::LEFT_JOINS => [ [DAbsence::$table_name,DAbsence::$ID,Absence::$ABSENCE], ], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Absence::$DATE,'=',date('Y-m-d')), ] ))],true); self::$absences_today = []; foreach ($a as $v){ self::$absences_today[$v[Absence::$EMP]] = $v; } return self::$absences_today; } static function getSexName($v){ return $v[self::$SEX]==1 ? 'Мужской' : ($v[self::$SEX]==-1?'Женский':'-'); } static function getStaffingList($v){ $a = Staffing::getAllCache(); $ids = json_decode($v[self::$STAFFING],true); $res = []; foreach ($ids as $id){ $res[] = Staffing::getName($a[$id]); } return $res; } static function getDepartmentList($v){ //$roles = self::getRoles($v[self::$ID]); $roles = self::getRolesCached($v[self::$ID]); $s = Department::getStructure(); $res = []; $sep = '→'; $i = 1; foreach ($roles as $role){ $deps = []; /* foreach ($role['path'] as $dep_id){ $deps[] = Department::getName($s['base'][$dep_id]); } $res[] = ($i++).'. '.implode(" $sep ",$deps); */ $dep_id = array_pop($role['path']); $deps[] = Department::getName($s['base'][$dep_id]); $res[] = implode(" $sep ",$deps); } return $res; //return implode("\n",$res); } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, C::HIDDEN =>true, C::TH =>V::get(Vars::$ID), ]), new C([ C::VAR_NAME => &self::$IMAGE, C::TYPE => eColumnType::INT, C::DEFAULT => 0, //C::TH => V::get(Vars::$IMAGE), C::EXPORT => false, C::TH => ' ', C::HIDDEN => !boolval($_POST['data']['my_company']), C::FUNC_VALUE_DATA => function($v){ $img_id = intval($v[self::$IMAGE]); $img = $img_id ? Image::getByID(intval($v[self::$IMAGE])) : null; return je([ 'img'=>$img_id, 'avatar'=>$img ? Image::imageResize($img[Image::$URL],100,100,90,['crop'=>'center']) : null, 'image' =>$img ? Image::imageResize($img[Image::$URL],200,0) : null, ]); } ]), new C([ C::VAR_NAME => &self::$ARCHIVE, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::COL_DEFAULT => 0, C::FILTER_TYPE => eFilterType::BOOLEAN, //C::TH => ' ',//V::get(Vars::$ARCHIVE), C::TH => V::get(Vars::$ARCHIVE), //C::HIDDEN => true, C::TH_CLASS => 'hide', C::TD_CLASS => 'hide', C::FUNC_VALUE_DATA => function($v){ return Merakomis::boolString($v[self::$ARCHIVE]); } ]), new C([ C::VAR_NAME => &self::$ABSENCE, C::TYPE => eColumnType::NONE, C::TH => ' ', C::HIDDEN => true, C::EXPORT => false, C::FUNC_VALUE_DATA => function($v){ $a = self::getAbsencesToday()[$v[self::$ID]]; return [ 'name'=>$a ? $a[DAbsence::$NAME] : '', ]; }, // C::HIDDEN => !boolval($_POST['data']['my_company']), ]), new C([ C::VAR_NAME => &self::$NAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 1023, C::TH => V::get(Vars::$NAME), C::FILTER_TYPE => eFilterType::TEXT, C::FUNC_VALUE => function($v){ return $v[self::$NAME]; }, C::FUNC_EXPORT_DATA => function($v){ return $v[self::$NAME]; }, C::FUNC_VALUE_DATA => function($v){ /* if($_POST['data']['my_company']) { return $v[self::$ID]; } */ $a = self::getAbsencesToday()[$v[self::$ID]]; return [ 'id'=>$v[self::$ID], 'name'=>$v[self::$NAME]?:"-", 'archive'=> intval($v[self::$ARCHIVE]), 'absence'=>$a ? $a[DAbsence::$NAME] : '', ]; } ]), new C([ C::VAR_NAME => &self::$LOGIN, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 127, C::HIDDEN => true, C::TH => V::get(Vars::$LOGIN), ]), new C([ C::VAR_NAME => &self::$EMAIL, C::TYPE => eColumnType::VARCHAR, C::FILTER_TYPE => eFilterType::TEXT, C::LENGTH => 127, C::HIDDEN => true, C::TH => V::get(Vars::$EMAIL), C::FUNC_VALUE_DATA => function($v){ return self::getEmail($v); } ]), new C([ C::VAR_NAME => &self::$STAFFING, C::TYPE => eColumnType::TEXT, C::DEFAULT => '[]', C::TD_CLASS => 'pre_wrap', C::TH => V::get(Vars::$STAFFING), C::FUNC_FILTER_QUERY => function($v){ return $v ? \Where::_operator(self::$STAFFING,'LIKE','%"'.$v.'"%') : null; }, C::FUNC_VALUE_DATA => function($v){ return implode("\n",self::getStaffingList($v)); /* $ids = json_decode($v[self::$STAFFING],true); $res = []; if($ids){ $a = Staffing::getByIDS($ids); foreach ($a as $vv){ $res[] = Staffing::getName($vv); } } return implode("\n",$res); //return eEmpType::getName($v[self::$TYPE]); */ }, C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Staffing::getNameList(['zero'=>true]); } ]), new C([ C::VAR_NAME => &self::$ROLES, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$ROLES), C::TD_CLASS => 'pre_wrap', C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_QUERY => function($v){ if(!$v) return null; $s = Department::getStructure(); $recurse = function($now) use ($s){ global $recurse; $res = $s[$now]?:[]; foreach ($res as $v){ if($s[$v]){ $res = array_merge($res,$recurse($v)); } } return $res; }; //$ids = $s[$v]?:[]; //$ids[] = intval($v); $ids = $recurse($v); $ids[] = $v; return \Where::_inQuery(self::$ID,[ \Query::TABLES => [Post::$table_name], \Query::SELECT => [Post::$EMP], //\Query::WHERE => new \Where(\Where::_operator(Post::$DEPARTMENT,'=',intval($v))) \Query::WHERE => new \Where(\Where::_in(Post::$DEPARTMENT,$ids)) ]); }, C::FUNC_VALUE_DATA => function($v){ return implode("\n",self::getDepartmentList($v)); $roles = self::getRoles($v[self::$ID]); $s = Department::getStructure(); $res = []; $sep = '→'; $i = 1; foreach ($roles as $role){ $deps = []; /* foreach ($role['path'] as $dep_id){ $deps[] = Department::getName($s['base'][$dep_id]); } $res[] = ($i++).'. '.implode(" $sep ",$deps); */ $dep_id = array_pop($role['path']); $deps[] = Department::getName($s['base'][$dep_id]); $res[] = implode(" $sep ",$deps); } return implode("\n",$res); return ''; }, C::FUNC_FILTER_SELECT_OPTIONS => function(){ $res = []; $s = Department::getStructure(); $sep = '→'; $i = 1; foreach ($s['base'] as $dep_id => $dep){ $path = Department::getPath($dep_id); $res[] = ['id'=>$dep_id,'title'=>Department::getName($dep)]; } return $res; //return eEmpType::getNameList(); } ]), new C([ C::VAR_NAME => &self::$GROUP, C::TYPE => eColumnType::NONE, C::TH => V::get(Vars::$GROUP), C::TD_CLASS => 'pre_wrap', C::FILTER_TYPE => eFilterType::SELECT, C::HIDDEN => true, C::FUNC_FILTER_QUERY => function($v){ if(!$v) return null; return \Where::_inQuery(self::$ID,[ \Query::TABLES => [Group::$table_name], \Query::SELECT => [Group::$EMP], \Query::WHERE => new \Where(\Where::_operator(Group::$GROUP,'=',intval($v))) ]); }, C::FUNC_VALUE_DATA => function($v){ $ids = Group::get($v[self::$ID]); if($ids){ $res = []; foreach ($ids as $id){ $res[] = eEmpGroup::getName($id); } return implode(", ",$res); } return ''; }, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return eEmpGroup::getNameList(); } ]), new C([ C::VAR_NAME => &self::$CITY, C::TYPE => eColumnType::INT, C::FILTER_TYPE => eFilterType::SELECT, C::DEFAULT => 0, C::TH => V::get(Vars::$CITY), C::FUNC_VALUE_DATA => function($v){ return City::getName( City::getByIDCached(intval($v[self::$CITY])) ); }, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return City::getNameList(); }, ]), new C([ C::VAR_NAME => &self::$IS_FREELANCER, C::TYPE => eColumnType::TINYINT, C::FILTER_TYPE => eFilterType::BOOLEAN, C::DEFAULT => 0, // C::HIDDEN => true, C::TH => V::get(Vars::$IS_FREELANCER), //C::TH => 'Удалёнка', C::FUNC_VALUE_DATA => function($v){ return Merakomis::fbool($v[self::$IS_FREELANCER]); }, ]), new C([ C::VAR_NAME => &self::$ORG, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 1, C::TH => V::get(Vars::$ORG), C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Org::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return Org::getName(Org::getByIDCached(intval($v[self::$ORG]))); }, ]), new C([ C::VAR_NAME => &self::$ORG_TYPE, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 1, //C::TH => V::get(Vars::$ORG_TYPE), C::TH => 'Вид', C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return OrgType::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return OrgType::getName(OrgType::getByIDCached(intval($v[self::$ORG_TYPE]))); }, ]), new C([ C::VAR_NAME => &self::$DATE_HIRE, C::TYPE => eColumnType::DATE, C::NULL => true, // C::HIDDEN => true, C::TH => V::get(Vars::$DATE_HIRE), C::FILTER_TYPE => eFilterType::DATE, //C::FUNC_VALUE_DATA => function($v){return Merakomis::fdate($v[self::$DATE_HIRE]);}, ]), new C([ C::VAR_NAME => &self::$STATUS, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => '0', C::TH => V::get(Vars::$STATUS), C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return EmpStatus::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return EmpStatus::getName(EmpStatus::getByIDCached(intval($v[self::$STATUS]))); }, ]), new C([ C::VAR_NAME => &self::$PASSWORD, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 127, C::TH => V::get(Vars::$PASS), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$TYPE, C::TYPE => eColumnType::TINYINT, C::DEFAULT => eEmpType::EMP, C::TH => V::get(Vars::$TYPE), C::HIDDEN => true, C::FUNC_VALUE_DATA => function($v){ return eEmpType::getName($v[self::$TYPE]); }, C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return eEmpType::getNameList(); } ]), new C([ C::VAR_NAME => &self::$BIRTHDATE, C::TYPE => eColumnType::DATE, C::NULL => true, C::HIDDEN => true, C::TH => V::get(Vars::$BIRTHDATE), C::FILTER_TYPE => eFilterType::DATE, C::FUNC_VALUE_DATA => function($v){ return Merakomis::fdate($v[self::$BIRTHDATE]); }, ]), new C([ C::VAR_NAME => &self::$PHONE, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$PHONE), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$SKYPE, C::TYPE => eColumnType::TEXT, C::FILTER_TYPE => eFilterType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$SKYPE), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$DISCORD, C::TYPE => eColumnType::TEXT, C::FILTER_TYPE => eFilterType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$DISCORD), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$EDUCATION, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$EDUCATION), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$DIPLOMA, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$DIPLOMA), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$DIPLOMA_DATE, C::TYPE => eColumnType::DATE, C::NULL => true, C::TH => V::get(Vars::$DIPLOMA_DATE), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::DATE, ]), new C([ C::VAR_NAME => &self::$DIPLOMA_POST, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::TH => V::get(Vars::$DIPLOMA_POST), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$NOPRIZ, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$NOPRIZ), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$NOSTROI, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$NOSTROI), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$TECHNADZOR, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$TECHNADZOR), C::HIDDEN => true, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$DESCRIPTION, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$DESCRIPTION), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$COMMENT, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$COMMENT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$ACCEPT, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::HIDDEN => true, C::FILTER_TYPE => eFilterType::BOOLEAN, C::TH => $_POST['data']['mini'] ? 'Подтв.' : V::get(Vars::$ACCEPT), C::FUNC_VALUE_DATA => function($v){ return Merakomis::boolString($v[self::$ACCEPT]); } ]), new C([ C::VAR_NAME => &self::$ACTIVE, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 1, C::COL_DEFAULT => 1, C::HIDDEN => true, C::FILTER_TYPE => eFilterType::BOOLEAN, C::TH => $_POST['data']['mini'] ? 'Акт.' : V::get(Vars::$ACTIVE), C::FUNC_VALUE_DATA => function($v){ return Merakomis::boolString($v[self::$ACTIVE]); } ]), new C([ C::VAR_NAME => &self::$REMOVED, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::HIDDEN => true, C::EXPORT => false, ]), new C([ C::VAR_NAME => &self::$ARCHIVE_DATE, C::TYPE => eColumnType::DATE, C::NULL => true, //C::DEFAULT => 'NULL', C::TH => V::get(Vars::$ARCHIVE_DATE), //C::FUNC_VALUE_DATA => function($v){return Merakomis::fdate($v[self::$ARCHIVE_DATE]);}, C::FILTER_TYPE => eFilterType::DATE, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$SEX, C::TYPE => eColumnType::TINYINT, C::NULL => true, //C::DEFAULT => 'NULL', C::TH => V::get(Vars::$SEX), C::FUNC_VALUE_DATA => function($v){ return self::getSexName($v); return $v[self::$SEX]===null ? '' : ($v[self::$SEX]?'Мужской':'Женский'); }, //C::FILTER_TYPE => eFilterType::DATE, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$SALARY, C::TYPE => eColumnType::DOUBLE, C::NULL => true, //C::DEFAULT => 'NULL', C::LENGTH => '10,2', C::TH => V::get(Vars::$SALARY), C::FUNC_VALUE_DATA => function($v){ return Merakomis::fprice($v[self::$SALARY]); }, C::FILTER_TYPE => eFilterType::NUMBER, C::HIDDEN => true, C::EXPORT => false, ]), new C([ C::VAR_NAME => &self::$HAS_CHILDREN, C::TYPE => eColumnType::TINYINT, C::DEFAULT => '0', C::LENGTH => '1', C::TH => V::get(Vars::$HAS_CHILDREN), C::FUNC_VALUE_DATA => function($v){ return Merakomis::fbool($v[self::$HAS_CHILDREN]); }, C::FILTER_TYPE => eFilterType::BOOLEAN, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &static::$TG_ACC, C::TYPE => eColumnType::VARCHAR, C::DEFAULT => 0, C::HIDDEN => true, C::EXPORT => false, ]), /* new C([ C::VAR_NAME => &static::$FOT, C::TYPE => eColumnType::NONE, C::DEFAULT => 0, C::HIDDEN => true, C::EXPORT => false, C::TH => ' ', C::FUNC_VALUE_DATA => function($v){ return '/money/fot/'.$v[self::$ID]; } ]), */ new C([ C::VAR_NAME => &static::$PORTAL, C::TYPE => eColumnType::INT, C::DEFAULT => intval(\Site::$portal_id), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$ACCOUNT, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$ACCOUNT), C::DEFAULT => intval(\Site::$owner_id), c::HIDDEN=>true, c::FUNC_VALUE => function($v){ if($id = $v[self::$ACCOUNT]) { return \Account::getName( \Account::getByID($id) ); } else return '-'; }, ]), new C([ C::VAR_NAME => &self::$CREATED, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$CREATED), C::DEFAULT => time(), c::FUNC_VALUE_DATA => function($v){return self::formatDate($v[self::$CREATED]);}, c::HIDDEN=>true, C::FILTER_TYPE => eFilterType::DATE, ]), new C([ C::VAR_NAME => &self::$UPDATED, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => V::get(Vars::$UPDATED), c::FUNC_VALUE_DATA => function($v){return self::formatDate($v[self::$UPDATED]);}, c::HIDDEN=>true, C::FILTER_TYPE => eFilterType::DATE, ]), ]; } } new Emp(); ///