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();
|