421 lines
16 KiB
PHP
421 lines
16 KiB
PHP
|
|
<?
|
|||
|
|
namespace themes\merakomis\team;
|
|||
|
|
|
|||
|
|
use core\columns\structure\eFilterType;
|
|||
|
|
use core\db\structure\Column as C;
|
|||
|
|
use core\db\structure\eColumnType;
|
|||
|
|
use core\lang\structure\LangVariable as V;
|
|||
|
|
use ModuleBZ\Form\Input\Hidden;
|
|||
|
|
use ModuleBZ\Form\Input\Select;
|
|||
|
|
use ModuleBZ\Layout\Column;
|
|||
|
|
use ModuleBZ\Layout\Title;
|
|||
|
|
use ms\ms\structure\msModuleTable;
|
|||
|
|
use common\Image;
|
|||
|
|
use ModuleBZ\Form\Input\ImagePicker;
|
|||
|
|
use ModuleBZ\Form\Input\Switcher;
|
|||
|
|
use ModuleBZ\Form\Input\Text;
|
|||
|
|
use ModuleBZ\Form\Input\Textarea;
|
|||
|
|
use ModuleBZ\Layout\Row;
|
|||
|
|
use themes\Merakomis;
|
|||
|
|
use themes\merakomis\dictionary\Absence as DAbsence;
|
|||
|
|
use themes\merakomis\dictionary\EmpStatus;
|
|||
|
|
use themes\merakomis\dictionary\Section;
|
|||
|
|
use themes\merakomis\Emp;
|
|||
|
|
use themes\merakomis\emp\Role;
|
|||
|
|
use themes\merakomis\emp\Rules;
|
|||
|
|
use themes\merakomis\input\Save as InputSave;
|
|||
|
|
use themes\merakomis\Post;
|
|||
|
|
use themes\merakomis\Project;
|
|||
|
|
use themes\merakomis\project\Section as ProjectSection;
|
|||
|
|
use themes\merakomis\structure\merakomisModuleTable;
|
|||
|
|
use themes\merakomis\Team;
|
|||
|
|
use themes\merakomis\team\Member\structure\eMemberRole;
|
|||
|
|
use themes\merakomis\team\member\structure\lang as Vars;
|
|||
|
|
use themes\merakomis\emp\structure\tMerakomisEmpLang as EmpVars;
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Member extends merakomisModuleTable {
|
|||
|
|
static $self;
|
|||
|
|
static $cache = [];
|
|||
|
|
static $table_name = 'tMerakomisTeamMember';
|
|||
|
|
static $controller = 'themes.merakomis.team.member';
|
|||
|
|
|
|||
|
|
static $ID = 'id';
|
|||
|
|
static $TEAM = 'team';
|
|||
|
|
static $EMP = 'emp';
|
|||
|
|
static $SECTION = 'section';
|
|||
|
|
static $ROLE = 'role';
|
|||
|
|
static $PORTAL = 'portal';
|
|||
|
|
static $TEXT = 'text';
|
|||
|
|
static $ACTIVE = 'active';
|
|||
|
|
|
|||
|
|
|
|||
|
|
static $_SKYPE = 'skype';
|
|||
|
|
static $_EMAIL = 'email';
|
|||
|
|
static $_DISCORD= 'discord';
|
|||
|
|
static $_PHONE = 'phone';
|
|||
|
|
static $_STATUS = 'status';
|
|||
|
|
|
|||
|
|
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
|
|||
|
|
static function getSystemLangValues():array{ return Vars::getArray(); }
|
|||
|
|
|
|||
|
|
public static function whereSearch($s) {
|
|||
|
|
return \Where::_operator(Emp::$NAME,'LIKE','%'.$s.'%');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static function installUniques() {
|
|||
|
|
\DB::addUnique(self::$table_name,self::$table_name.'_unique',[
|
|||
|
|
self::$TEAM,self::$EMP,
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public function _insert(array $values, array $options = array()) {
|
|||
|
|
//$values[self::$EMP] = $values['emp'];
|
|||
|
|
//$values[self::$ROLE] = $values['role'];
|
|||
|
|
return parent::_insert($values, $options); // TODO: Change the autogenerated stub
|
|||
|
|
}
|
|||
|
|
public function _updateById(int $id, array $values) {
|
|||
|
|
//$values[self::$EMP] = $values['emp'];
|
|||
|
|
//$values[self::$ROLE] = $values['role'];
|
|||
|
|
return parent::_updateById($id, $values); // TODO: Change the autogenerated stub
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
static function getMyPostForTeam($team_id){
|
|||
|
|
$team_id = intval($team_id);
|
|||
|
|
$r = self::select([
|
|||
|
|
\Query::WHERE =>new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(self::$TEAM,'=',$team_id),
|
|||
|
|
\Where::_operator(self::$EMP,'=',Emp::$AUTH_ID),
|
|||
|
|
])),
|
|||
|
|
\Query::COUNT=> 1,
|
|||
|
|
]);
|
|||
|
|
$l = \DB::fetch($r);
|
|||
|
|
return intval($l[self::$SECTION]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getByEmpAndProject($emp_id,$project_id){
|
|||
|
|
$emp_id = intval($emp_id);
|
|||
|
|
$project_id = intval($project_id);
|
|||
|
|
$project = Project::getByID($project_id);
|
|||
|
|
$r = self::select([
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(self::$EMP,'=',$emp_id),
|
|||
|
|
\Where::_operator(self::$TEAM,'=',$project[Project::$TEAM]),
|
|||
|
|
])),
|
|||
|
|
\Query::COUNT => 1,
|
|||
|
|
]);
|
|||
|
|
return \DB::fetch($r);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public static function beforeUadd(array $values = []): array
|
|||
|
|
{
|
|||
|
|
$res = [];
|
|||
|
|
|
|||
|
|
if(!$values[self::$ROLE]) {
|
|||
|
|
$res[self::$ROLE][] = 'Укажите роль в проекте';
|
|||
|
|
}
|
|||
|
|
if(!$values[self::$SECTION]) {
|
|||
|
|
$res[self::$SECTION][] = 'Укажите подраздел';
|
|||
|
|
}
|
|||
|
|
if(!$values[self::$EMP]) {
|
|||
|
|
$res[self::$EMP][] = 'Укажите сотрудника';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) {
|
|||
|
|
|
|||
|
|
$team_id = $C[self::$TEAM] ;
|
|||
|
|
if($isEdit) {
|
|||
|
|
$project = Team::getProjectByTeamID( $team_id );
|
|||
|
|
$project_id = $project[Project::$ID];
|
|||
|
|
} else {
|
|||
|
|
$project_id = intval($data['params']['id']);
|
|||
|
|
$project = Project::getByID($project_id);
|
|||
|
|
$team_id = $project[Project::$TEAM];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
$sections = [];
|
|||
|
|
$section_ids = ProjectSection::get($project[Project::$ID]);
|
|||
|
|
$sections = [];
|
|||
|
|
if($section_ids) {
|
|||
|
|
$a = Section::select([
|
|||
|
|
\Query::WHERE => new \Where(\Where::_in(Section::$ID, $section_ids))
|
|||
|
|
]);
|
|||
|
|
foreach ($a as $v){
|
|||
|
|
$sections[] = [
|
|||
|
|
'id'=>intval($v[Section::$ID]),
|
|||
|
|
'title'=>Section::getFullName($v),
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
$isCanEdit = Rules::isRwMember($team_id,$C[Member::$ID]);
|
|||
|
|
|
|||
|
|
//if(Emp::isSuperView() || Emp::$AUTH_ID==$project[Project::$DIRECTOR] || Emp::isMeAnyDepartmentDirector()) {
|
|||
|
|
if($isCanEdit) {
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
$form
|
|||
|
|
->addInput((new Hidden())->setName(self::$TEAM)->setValue($team_id))
|
|||
|
|
->addRow((new Row())
|
|||
|
|
->addColumn((new Column())->setClassAll('c-40 ')->addRow((new Row())))
|
|||
|
|
->addColumn(
|
|||
|
|
(new Column())->setClassAll('c-20 ')->addRow((new Row())
|
|||
|
|
/*
|
|||
|
|
->addColumn(((new Select())
|
|||
|
|
->setName('emp')
|
|||
|
|
->setValue(intval($C[self::$EMP]))
|
|||
|
|
->setClassAll('c-50')
|
|||
|
|
->setLabel($c = V::get(Vars::$EMP))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
->setSearch(true)
|
|||
|
|
->setOptions(Emp::getNameList())
|
|||
|
|
))
|
|||
|
|
->addColumn(((new Select())
|
|||
|
|
->setName('role')
|
|||
|
|
->setValue(intval($C[self::$ROLE]))
|
|||
|
|
->setClassAll('c-50')
|
|||
|
|
->setLabel($c = V::get(Vars::$ROLE))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
->setSearch(true)
|
|||
|
|
->setOptions($roles)
|
|||
|
|
//->setAjax(true)
|
|||
|
|
//->setAjaxUrl(true)
|
|||
|
|
))
|
|||
|
|
*/
|
|||
|
|
->addColumn(((new Select())
|
|||
|
|
->setName(self::$EMP)
|
|||
|
|
->setValue(intval($C[self::$EMP]))
|
|||
|
|
->setClassAll('c-100')
|
|||
|
|
->setLabel($c = V::get(Vars::$EMP))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
->setSearch(true)
|
|||
|
|
->setOptions(Emp::getNameList([
|
|||
|
|
|
|||
|
|
\Query::WHERE => new \Where(
|
|||
|
|
\Where::_and([
|
|||
|
|
\Where::_or([
|
|||
|
|
\Where::_and([
|
|||
|
|
\Where::_operator(Emp::$ARCHIVE, '=', 0),
|
|||
|
|
\Where::_operator(Emp::$REMOVED, '=', 0),
|
|||
|
|
]),
|
|||
|
|
$isEdit ? \Where::_operator(Emp::$ID, '=', $C[self::$EMP]) : null,
|
|||
|
|
]),
|
|||
|
|
|
|||
|
|
Emp::isMeAnyDepartmentDirector() ? \Where::_in(Emp::$ID,Rules::getSubEmps()?:[0]) : null
|
|||
|
|
|
|||
|
|
])
|
|||
|
|
)
|
|||
|
|
]))
|
|||
|
|
))
|
|||
|
|
->addColumn(((new Select())
|
|||
|
|
->setName(self::$ROLE)
|
|||
|
|
->setValue(intval($C[self::$ROLE]))
|
|||
|
|
->setClassAll('c-100')
|
|||
|
|
->setLabel($c = V::get(Vars::$ROLE))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
->setSearch(true)
|
|||
|
|
->setOptions(eMemberRole::getRealNameList(intval($C[self::$ROLE])))
|
|||
|
|
//->setAjax(true)
|
|||
|
|
//->setAjaxUrl(true)
|
|||
|
|
))
|
|||
|
|
->addColumn(((new Select())
|
|||
|
|
->setName(self::$SECTION)
|
|||
|
|
->setValue(intval($C[self::$SECTION]))
|
|||
|
|
->setClassAll('c-50')
|
|||
|
|
->setLabel($c = V::get(Vars::$SECTION))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
->setSearch(true)
|
|||
|
|
->setOptions($sections)
|
|||
|
|
))
|
|||
|
|
->addColumn(((new Switcher())
|
|||
|
|
->setName(self::$ACTIVE)
|
|||
|
|
->setClassAll('c-50 green_switcher')
|
|||
|
|
->setLabel(' ')
|
|||
|
|
->setPlaceholder(V::get(Vars::$ACTIVE))
|
|||
|
|
->setChecked(boolval($isEdit ? $C[self::$ACTIVE] : true))
|
|||
|
|
))
|
|||
|
|
->addColumn(((new Textarea())
|
|||
|
|
->setName(self::$TEXT)
|
|||
|
|
->setValue($C[self::$TEXT])
|
|||
|
|
->setClassAll('c-100')
|
|||
|
|
->setLabel($c = V::get(Vars::$TEXT))
|
|||
|
|
->setPlaceholder($c)
|
|||
|
|
))
|
|||
|
|
)->addRow((new Row())
|
|||
|
|
->addColumn(((new InputSave())->setClassAll('c-100')->setName('save')))
|
|||
|
|
)
|
|||
|
|
));
|
|||
|
|
} else {
|
|||
|
|
$form->addRow((new Row)->addColumn((new Column())->addTitle(new Title("Нет доступа"))));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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::$EMP,
|
|||
|
|
C::TYPE =>eColumnType::INT,
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
C::DEFAULT =>0,
|
|||
|
|
C::TH =>V::get(Vars::$EMP),
|
|||
|
|
C::NO_SORT =>false,
|
|||
|
|
C::FUNC_VALUE_DATA =>function($v){
|
|||
|
|
$emp_id = intval($v[self::$EMP]);
|
|||
|
|
$a = Emp::getAbsencesToday()[$emp_id];
|
|||
|
|
return [
|
|||
|
|
'id'=>$emp_id,
|
|||
|
|
'name'=>Emp::getName( Emp::getByID($emp_id)),
|
|||
|
|
'absence'=>$a ? $a[DAbsence::$NAME] : '',
|
|||
|
|
"a"=>$a,
|
|||
|
|
];
|
|||
|
|
},
|
|||
|
|
C::FUNC_FILTER_QUERY=>function($v){
|
|||
|
|
return \Where::_operator(Emp::$NAME,'LIKE ','%'.$v.'%');
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$TEAM,
|
|||
|
|
C::TYPE =>eColumnType::INT,
|
|||
|
|
C::DEFAULT =>0,
|
|||
|
|
C::TH =>V::get(Vars::$TEAM),
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$TEXT,
|
|||
|
|
C::TYPE =>eColumnType::TEXT,
|
|||
|
|
C::TH =>V::get(Vars::$TEXT),
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$ROLE,
|
|||
|
|
C::TYPE =>eColumnType::INT,
|
|||
|
|
C::FILTER_TYPE =>eFilterType::SELECT,
|
|||
|
|
C::NO_SORT =>false,
|
|||
|
|
C::DEFAULT =>0,
|
|||
|
|
C::TH =>V::get(Vars::$ROLE),
|
|||
|
|
C::FUNC_FILTER_SELECT_OPTIONS =>function(){
|
|||
|
|
return eMemberRole::getRealNameList();
|
|||
|
|
},
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return eMemberRole::getName($v[self::$ROLE]);
|
|||
|
|
/*
|
|||
|
|
return Post::getName(
|
|||
|
|
Post::getByID(
|
|||
|
|
intval(Role::getByID(intval($v[self::$ROLE]))[Role::$POST])
|
|||
|
|
)
|
|||
|
|
);
|
|||
|
|
*/
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$SECTION,
|
|||
|
|
C::TYPE =>eColumnType::INT,
|
|||
|
|
C::NO_SORT =>false,
|
|||
|
|
C::DEFAULT =>0,
|
|||
|
|
C::TH =>V::get(Vars::$SECTION),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return Section::getFullName( Section::getByID(intval($v[self::$SECTION])) );
|
|||
|
|
//return eMemberRole::getName($v[self::$SECTION]);
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$_SKYPE,
|
|||
|
|
C::TYPE =>eColumnType::NONE,
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
C::TH =>V::get(EmpVars::$SKYPE),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return $v[Emp::$SKYPE];
|
|||
|
|
},
|
|||
|
|
C::FUNC_FILTER_QUERY=>function($v){
|
|||
|
|
return \Where::_operator(Emp::$SKYPE,'LIKE ','%'.$v.'%');
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$_DISCORD,
|
|||
|
|
C::TYPE =>eColumnType::NONE,
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
C::TH =>V::get(EmpVars::$DISCORD),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return $v[Emp::$DISCORD];
|
|||
|
|
},
|
|||
|
|
C::FUNC_FILTER_QUERY=>function($v){
|
|||
|
|
return \Where::_operator(Emp::$DISCORD,'LIKE ','%'.$v.'%');
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$_EMAIL,
|
|||
|
|
C::TYPE =>eColumnType::NONE,
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
C::TH =>V::get(EmpVars::$EMAIL),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return Emp::getEmail($v);
|
|||
|
|
},
|
|||
|
|
C::FUNC_FILTER_QUERY=>function($v){
|
|||
|
|
return \Where::_operator(Emp::$EMAIL,'LIKE ','%'.$v.'%');
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$_PHONE,
|
|||
|
|
C::TYPE =>eColumnType::NONE,
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
C::TH =>V::get(EmpVars::$PHONE),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return $v[Emp::$PHONE];
|
|||
|
|
},
|
|||
|
|
C::FUNC_FILTER_QUERY=>function($v){
|
|||
|
|
return \Where::_operator(Emp::$PHONE,'LIKE ','%'.$v.'%');
|
|||
|
|
}
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$ACTIVE,
|
|||
|
|
C::TYPE =>eColumnType::TINYINT,
|
|||
|
|
C::FILTER_TYPE => eFilterType::BOOLEAN,
|
|||
|
|
C::DEFAULT =>1,
|
|||
|
|
C::COL_DEFAULT =>1,
|
|||
|
|
C::TH =>V::get(Vars::$ACTIVE),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return Merakomis::boolString($v[self::$ACTIVE]);
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
/*
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$STATUS,
|
|||
|
|
C::TYPE =>eColumnType::NONE,
|
|||
|
|
C::TH =>V::get(EmpVars::$STATUS),
|
|||
|
|
C::FUNC_VALUE_DATA => function($v){
|
|||
|
|
return EmpStatus::getName(EmpStatus::getByID(intval($v[Emp::$STATUS])));
|
|||
|
|
},
|
|||
|
|
]),
|
|||
|
|
*/
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$PORTAL,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::DEFAULT => intval(\Site::$portal_id),
|
|||
|
|
c::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
new Member();
|