meraproject/themes/merakomis/team/member/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

421 lines
16 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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