2252 lines
89 KiB
PHP
2252 lines
89 KiB
PHP
|
|
<?
|
|||
|
|
namespace themes\merakomis;
|
|||
|
|
|
|||
|
|
use common\Image;
|
|||
|
|
use core\columns\structure\eFilterType;
|
|||
|
|
use core\db\structure\Column as C;
|
|||
|
|
use core\db\structure\eColumnType;
|
|||
|
|
use ModuleBZ\Form\Input\DatePicker;
|
|||
|
|
use ModuleBZ\Form\Input\ImagePicker;
|
|||
|
|
use ModuleBZ\Form\Input\Password;
|
|||
|
|
use ModuleBZ\Form\Input\Radio;
|
|||
|
|
use ModuleBZ\Form\Input\Select;
|
|||
|
|
use ModuleBZ\Form\Input\Submit;
|
|||
|
|
use ModuleBZ\Form\Input\Switcher;
|
|||
|
|
use ModuleBZ\Form\Input\Text;
|
|||
|
|
use ModuleBZ\Form\Input\Textarea;
|
|||
|
|
use ModuleBZ\Layout\Column;
|
|||
|
|
use ModuleBZ\Layout\Row;
|
|||
|
|
use ModuleBZ\Layout\Title;
|
|||
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions\F;
|
|||
|
|
use themes\Merakomis;
|
|||
|
|
use themes\merakomis\dictionary\City;
|
|||
|
|
use themes\merakomis\dictionary\Department;
|
|||
|
|
use themes\merakomis\dictionary\EmpStatus;
|
|||
|
|
use themes\merakomis\dictionary\Org;
|
|||
|
|
use themes\merakomis\dictionary\OrgType;
|
|||
|
|
use themes\merakomis\dictionary\Staffing;
|
|||
|
|
use themes\merakomis\emp\Group;
|
|||
|
|
use themes\merakomis\emp\Rules;
|
|||
|
|
use themes\merakomis\Emp\structure\eEmpGroup;
|
|||
|
|
use themes\merakomis\Emp\structure\eEmpType;
|
|||
|
|
use themes\merakomis\input\Children as InputChildren;
|
|||
|
|
use themes\merakomis\structure\merakomisModuleTable;
|
|||
|
|
use themes\merakomis\team\Member;
|
|||
|
|
use themes\merakomis\time\Absence;
|
|||
|
|
use themes\vhl\school\Staff;
|
|||
|
|
use ui\form\structure\eInputType;
|
|||
|
|
use ui\Form;
|
|||
|
|
use ui\input\Input;
|
|||
|
|
use core\lang\structure\LangVariable as V;
|
|||
|
|
use ms\ms\structure\msModuleTable;
|
|||
|
|
use themes\merakomis\emp\structure\tMerakomisEmpLang as Vars;
|
|||
|
|
use \themes\merakomis\emp\Children;
|
|||
|
|
use \themes\merakomis\dictionary\Absence as DAbsence;
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Emp extends merakomisModuleTable {
|
|||
|
|
static $self;
|
|||
|
|
static $cache = [];
|
|||
|
|
static $table_name = 'tMerakomisEmp';
|
|||
|
|
static $controller = 'themes.merakomis.emp';
|
|||
|
|
|
|||
|
|
static $ID = 'id';
|
|||
|
|
static $NAME = 'name';
|
|||
|
|
static $LOGIN = 'login';
|
|||
|
|
static $EMAIL = 'email';
|
|||
|
|
static $PASSWORD = 'pass';
|
|||
|
|
static $TYPE = 'type';
|
|||
|
|
static $ARCHIVE = 'archive';
|
|||
|
|
static $ACTIVE = 'active';
|
|||
|
|
static $ACCEPT = 'accept';
|
|||
|
|
static $PORTAL = 'portal';
|
|||
|
|
static $ACCOUNT = 'account';
|
|||
|
|
static $CREATED = 'created';
|
|||
|
|
static $UPDATED = 'updated';
|
|||
|
|
static $IMAGE = 'image';
|
|||
|
|
static $DATE_HIRE = 'date_hire';
|
|||
|
|
static $BIRTHDATE = 'birthdate';
|
|||
|
|
static $CITY = 'city';
|
|||
|
|
static $PHONE = 'phone';
|
|||
|
|
static $SKYPE = 'skype';
|
|||
|
|
static $IS_FREELANCER = 'is_freelancer';
|
|||
|
|
static $STAFFING = 'staffing';
|
|||
|
|
static $DESCRIPTION = 'description';
|
|||
|
|
|
|||
|
|
static $ORG = 'org';
|
|||
|
|
static $ORG_TYPE = 'org_type';
|
|||
|
|
static $EDUCATION = 'education';
|
|||
|
|
static $DIPLOMA = 'diploma';
|
|||
|
|
static $DIPLOMA_DATE = 'diploma_date';
|
|||
|
|
static $DIPLOMA_POST = 'diploma_post';
|
|||
|
|
static $NOPRIZ = 'nopriz_text';
|
|||
|
|
static $NOSTROI = 'nostroi_text';
|
|||
|
|
static $TECHNADZOR = 'technadzor_text';
|
|||
|
|
static $STATUS = 'status';
|
|||
|
|
static $COMMENT = 'comment';
|
|||
|
|
|
|||
|
|
static $REMOVED = 'removed';
|
|||
|
|
static $ARCHIVE_DATE = 'archive_date';
|
|||
|
|
static $DISCORD = 'discrod';
|
|||
|
|
static $SEX = 'sex';
|
|||
|
|
static $SALARY = 'salary';
|
|||
|
|
static $HAS_CHILDREN = 'has_children';
|
|||
|
|
static $TG_ACC = 'tg_acc';
|
|||
|
|
|
|||
|
|
//--
|
|||
|
|
static $FOT = 'fot';
|
|||
|
|
static $ROLES = 'roles';
|
|||
|
|
static $GROUP = 'group';
|
|||
|
|
static $ABSENCE = 'absence';
|
|||
|
|
static $DEP_SEP = '→';
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
static $IS_SUPER_ADMIN = true;
|
|||
|
|
static $IS_AUTH = true;
|
|||
|
|
static $AUTH_ID = 2;
|
|||
|
|
/*/
|
|||
|
|
static $IS_SUPER_ADMIN = false;//true;
|
|||
|
|
static $IS_AUTH = false;//true;
|
|||
|
|
static $AUTH_ID = null;//2;
|
|||
|
|
/**/
|
|||
|
|
|
|||
|
|
//--
|
|||
|
|
static $CACHE;
|
|||
|
|
|
|||
|
|
|
|||
|
|
static $cookieIDKey = 'fg_emp_id';
|
|||
|
|
static $cookieHashKey = 'fg_emp_h';
|
|||
|
|
|
|||
|
|
static $data = null;
|
|||
|
|
|
|||
|
|
static function getTgCode(){
|
|||
|
|
$key = (time());
|
|||
|
|
return self::getTgStartHash($key,self::$data);
|
|||
|
|
}
|
|||
|
|
static function getTgStartHash($key,$data){
|
|||
|
|
return $key.'-'.self::$data[self::$ID].'-'.self::getTgHash($key,$data);
|
|||
|
|
}
|
|||
|
|
static function getTgHash($key,$data){
|
|||
|
|
return md5($key.SALT.$data[self::$ID].$key);
|
|||
|
|
}
|
|||
|
|
static function getTgStartLink(){
|
|||
|
|
return Telegram::getStartLink(self::getTgCode());
|
|||
|
|
}
|
|||
|
|
static function getAuthCode($emp,$key){
|
|||
|
|
$xx = md5($key.$emp[Emp::$LOGIN].SALT);
|
|||
|
|
$xx = preg_replace('/[^\d]/','',$xx);
|
|||
|
|
return substr($xx,0,5);
|
|||
|
|
}
|
|||
|
|
static function sendAuthCode($emp,$key){
|
|||
|
|
if(is_numeric($emp)) $emp = self::getByID(intval($emp));
|
|||
|
|
$code = self::getAuthCode($emp,$key);
|
|||
|
|
file_put_contents(__DIR__.'/log.txt',je($emp)."\n\n");
|
|||
|
|
//return Telegram::send($emp[Emp::$TG_ACC],"Ваш код для авторизации ```".$code.'```');
|
|||
|
|
return Telegram::send($emp[Emp::$TG_ACC],"Ваш код для авторизации **".$code.'**');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
|
|||
|
|
static function getSystemLangValues():array{ return Vars::getArray(); }
|
|||
|
|
public function _update(\Where $w, array $values) {
|
|||
|
|
$values[self::$UPDATED] = time();
|
|||
|
|
if($values[self::$DATE_HIRE]=='0000-00-00') unset($values[self::$DATE_HIRE]);
|
|||
|
|
if($values[self::$BIRTHDATE]=='0000-00-00') unset($values[self::$BIRTHDATE]);
|
|||
|
|
if($values[self::$DIPLOMA_DATE]=='0000-00-00') unset($values[self::$DIPLOMA_DATE]);
|
|||
|
|
return parent::_update($w, $values);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public function _insert(array $values, array $options = array()) {
|
|||
|
|
if($values[self::$DATE_HIRE]=='0000-00-00') unset($values[self::$DATE_HIRE]);
|
|||
|
|
if($values[self::$BIRTHDATE]=='0000-00-00') unset($values[self::$BIRTHDATE]);
|
|||
|
|
if($values[self::$DIPLOMA_DATE]=='0000-00-00') unset($values[self::$DIPLOMA_DATE]);
|
|||
|
|
$res = parent::_insert($values, $options); // TODO: Change the autogenerated stub
|
|||
|
|
Project::checkAllProjectsForAllEmps();
|
|||
|
|
|
|||
|
|
self::generateFot($res->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,"Кликните <a href='".self::getAcceptLink($emp)."'>ссылку</a> для подтверждения 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();
|
|||
|
|
|
|||
|
|
|
|||
|
|
///
|
|||
|
|
|