1, ]); } 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] = eStatus::NONE; } } return parent::_updateById($id, $values); // TODO: Change the autogenerated stub } public static function afterUadd($values, $id, $result) { $res = parent::afterUadd($values, $id, $result); if(isset($values['step'])){ self::updateById($id,[self::$STEP=>intval($values['step'])]); } if(isset($values['section'])){ ProjectSection::set($id,$values['section']); } if(isset($values['org_types'])){ self::updateById($id, [self::$ORG_TYPES => json_encode($values['org_types'])]); } if(isset($values[self::$ARCHIVE])){ $C = self::getByID($id); if($values[self::$ARCHIVE]) { if (!$C[self::$ARCHIVE_DATE] or $C[self::$ARCHIVE_DATE]=='0000-00-00') { self::updateById($id, [self::$ARCHIVE_DATE => date('Y-m-d')]); } } else { // self::updateById($id, [self::$ARCHIVE_DATE => '0000-00-00']); self::updateById($id, [self::$ARCHIVE_DATE => NULL]); } } //if(isset($values[self::$DATE_END]) && $values[self::$DATE_END]=='0000-00-00'){ if(isset($values[self::$DATE_END]) ){ // self::updateById($id, [self::$DATE_END => NULL]); } if(isset($values[self::$DATE]) && $values[self::$DATE]=='0000-00-00'){ self::updateById($id, [self::$DATE => NULL]); } $C = self::getByID($id); if(!$C[self::$TEAM]) { $r = Team::insert([ Team::$NAME=>$C[self::$NAME], ]); self::updateById($id,[self::$TEAM=>$r->id]); } self::checkAddAllEmps($id); return $res; } static function checkAllProjectsForAllEmps(){ $r = self::select([ \Query::SELECT => [self::$ID], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$IS_ALL_EMP,'=',1), ])) ]); while ($l = \DB::fetch($r)){ self::checkAddAllEmps($l[self::$ID]); } } static function checkAddAllEmps($id){ $project = self::getByID($id); if(!$project[self::$IS_ALL_EMP]) return; $r = Member::select([ \Query::SELECT => [Member::$EMP], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$TEAM,'=',$project[self::$TEAM]), ])), ]); $member_emp_ids = []; $emp_ids = []; while ($l = \DB::fetch($r)){ $member_emp_ids[] = $l[Member::$EMP]; } $r = Emp::select([ \Query::SELECT => [Emp::$ID], \Query::COUNT => 0, ]); while ($l = \DB::fetch($r)){ $emp_ids[] = $l[Emp::$ID]; } $diff = array_diff($emp_ids,$member_emp_ids); $sections = ProjectSection::get($id); $section_id = 0; if($sections) { $section_id = $sections[0]; } foreach ($diff as $diff_id){ $r = Member::insert([ Member::$TEAM => $project[self::$TEAM], Member::$EMP => $diff_id, Member::$ROLE => Member\structure\eMemberRole::EMPLOYER, Member::$SECTION => $section_id, Member::$ACTIVE => 1, ]); } } static function format($v){ $id = intval($v[self::$ID]); $sections = []; $sectionOptions = [ ['id'=>0,'title'=>'Показать все'], ]; if($v[self::$STEP]) { $s = Step::getStructure($v[self::$STEP]); $ss = ProjectSection::get($id); foreach ($ss as $sid){ $name = Section::getFullName($s['base'][$sid]); $sections[] = $name; $sectionOptions[$sid] = [ 'id'=>$sid, 'title'=>$name, ]; } } $r = Member::select([ \Query::LEFT_JOINS => [ [Emp::$table_name,Emp::$ID,Member::$EMP] ], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$TEAM,'=',$v[self::$TEAM]), \Where::_operator(Member::$ROLE,'=',Member\structure\eMemberRole::MAIN_ENGINEER), ])), \Query::COUNT => 1, ]); $gip = null; if(\DB::numRows($r)){ $gip = \DB::fetch($r); } sort($sections); $obj_types = []; $obj_types_ids = json_decode($v[self::$ORG_TYPES],true); if($obj_types_ids) { $a = Objtype::getByIDS($obj_types_ids); foreach ($a as $objtype){ $obj_types[] = Objtype::getName($objtype); } } return [ 'id' => $id, 'title' => self::getName($v), 'code_title' => self::getCodeName($v), 'code_step' => self::getCode($v), 'date' => Merakomis::fdate($v[self::$DATE]), 'date_end' => Merakomis::fdate($v[self::$DATE_END]), 'code' => trim($v[self::$CODE]), 'status' => $v[self::$STATUS] ? eStatus::getName($v[self::$STATUS]) : '', 'team' => $v[self::$STATUS] ? Team::getName( Team::getByID( intval($v[self::$TEAM]) ) ) : '', 'link' => trim($v[self::$LINK]), 'contract' => trim($v[self::$CONTRACT]), 'address' => trim($v[self::$ADDRESS]), 'archive' => boolval($v[self::$ARCHIVE]), 'archive_date' => Merakomis::fdate($v[self::$ARCHIVE_DATE]), 'image' => Image::format($v[self::$IMG]), 'text' => $v[self::$TEXT], 'client' => dictionary\contractor::getName( dictionary\contractor::getByID(intval($v[self::$CONTRACTOR])) ), 'director_id' => intval($v[self::$DIRECTOR]), 'director' => Emp::getName( Emp::getByID(intval($v[self::$DIRECTOR])) ), 'gip' => $gip ? Emp::getName( $gip ) : '', 'step' => $v[self::$STEP] ? Step::getName(Step::getByID(intval($v[self::$STEP]))) : '', 'sections' => $sections, 'org' => trim($v[self::$ORG] ? Org::getName( Org::getByID( intval($v[self::$ORG]) ) ): ''), 'doc_folder' => trim($v[self::$DOC_FOLDER]), 'obj_types' => implode(", ",$obj_types), 'area' => trim($v[self::$AREA]), 'volume' => trim($v[self::$VOLUME]), 'height' => trim($v[self::$HEIGHT]), 'sectionOptions' => $sectionOptions, 'time_tracker_link'=>'my/time_tracker/'.$id, 'project_link'=>'my/projects/'.$id, 'team_link'=>'my/team/'.$id, 'download_link' => '/api/themes.merakomis.download/project/?id='.$id, ]; } static function getMyListFormatted(){ return self::getListFormatted(EMP::$AUTH_ID); } static function getMyDirectedFormatted($emp_id,$archive=null){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$DIRECTOR,'=',$emp_id), \Where::_operator(self::$REMOVED,'=',0), is_numeric($archive) ? \Where::_operator(self::$ARCHIVE,'=',$archive) : null, ])) ],true); $res = []; foreach ($a as $v) { $res[] = self::format($v); } return $res; } static function getListFormatted($emp_id,$archive=null,$active = null){ $a = self::getList($emp_id,['archive'=>$archive,'active'=>$active]); $res = []; foreach ($a as $v) { $res[] = self::format($v); } return $res; } static function getList($emp_id,$options = []){ $archive = $options['archive']; $active = $options['active']; $r = self::select([ \Query::WHERE => new \Where( self::getWhereForEmp($emp_id,$archive,$active) ), \Query::SORT => [self::$CODE=>'ASC'], ],true); return $r; } static function getListForMoney(){ // Есть следующие ситуации отображения списка // 1. Руководитель проекта - отображаются все проекты, в которых я руководитель. // 2. Роль в команде - отображаются все проекты, в которых я имею определенную роль в команде // 3. Роль к компании - для руководителя подразделения выводить проекты, в которых участвуют сотрудники подразделения. // 4. Группа "Проекты наблюдатели" - отображаются все проекты $res = []; if(Rules::isAdmin()){ $a = self::select([ \Query::SELECT => [Project::$ID], \Query::COUNT => 0, ], true); $res = array_merge($res, array_keys($a?:[])); } else { // 1. Если я где-то руководитель $emp_id = Emp::$AUTH_ID; if (Emp::isMeAnyDirector()) { $a = self::select([ \Query::SELECT => [Project::$ID], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$DIRECTOR, '=', $emp_id), \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), ])) ], true); $res = array_merge($res, array_keys($a?:[])); } // 4. "Проекты финансы" - if (Rules::isGroupProjectFinance()) { $a = self::select([ \Query::SELECT => [Project::$ID], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), ])) ], true); $res = array_merge($res, array_keys($a?:[])); } } return $res; } static function getListForAnalysis(){ // Есть следующие ситуации отображения списка // 1. Руководитель проекта - отображаются все проекты, в которых я руководитель. // 2. Роль в команде - отображаются все проекты, в которых я имею определенную роль в команде // 3. Роль к компании - для руководителя подразделения выводить проекты, в которых участвуют сотрудники подразделения. // 4. Группа "Проекты наблюдатели" - отображаются все проекты $res = []; if(Rules::isAdmin()){ $a = self::select([ \Query::COUNT => 0, /* \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$ARCHIVE, '=', 0), ])) */ ], true); $res = array_merge($res, $a); } else { // 1. Если я где-то руководитель $emp_id = Emp::$AUTH_ID; if (Emp::isMeAnyDirector()) { $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$DIRECTOR, '=', $emp_id), \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), ])) ], true); $res = array_merge($res, $a); } // 2. Если я где-то имею роль в команде $roles = []; if (Rules::isGIP()) $roles[] = eMemberRole::MAIN_ENGINEER; if (Rules::isGAP()) $roles[] = eMemberRole::MAIN_ARCHITECT; if (Rules::isGKP()) $roles[] = eMemberRole::MAIN_CONSTRUCTOR; if (Rules::isMainEngineer()) $roles = array_merge($roles, Rules::$mainEngineersRoles); if ($roles) { $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), \Where::_and([ \Where::_inQuery(self::$TEAM, [ \Query::TABLES => [Team::$table_name], \Query::SELECT => [Team::$ID], \Query::WHERE => new \Where( \Where::_inQuery(Team::$ID, [ \Query::TABLES => [Member::$table_name], \Query::SELECT => [Member::$TEAM], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP, '=', $emp_id), \Where::_operator(Member::$ACTIVE, '=', 1), \Where::_in(Member::$ROLE, $roles), ])) ]) ) ]) ]) ])) ], true); $res = array_merge($res, $a); } // 3. Если я руководитель подразделения // Надо получить список моих сотрудников if (Emp::isMeAnyDepartmentDirector()) { $subEmpIds = Emp::getSubEmps($emp_id); $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), \Where::_and([ \Where::_inQuery(self::$TEAM, [ \Query::TABLES => [Team::$table_name], \Query::SELECT => [Team::$ID], \Query::WHERE => new \Where( \Where::_inQuery(Team::$ID, [ \Query::TABLES => [Member::$table_name], \Query::SELECT => [Member::$TEAM], \Query::WHERE => new \Where(\Where::_and([ \Where::_in(Member::$EMP, $subEmpIds), \Where::_operator(Member::$ACTIVE, '=', 1), ])) ]) ) ]) ]) ])) ], true); $res = array_merge($res, $a); } // 4. "Проекты наблюдатели" - if (Rules::isGroupProjectViewer()) { $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED, '=', 0), //\Where::_operator(self::$ARCHIVE, '=', 0), ])) ], true); $res = array_merge($res, $a); } } $a = []; foreach ($res as $v){ $a[$v[self::$ID]] = $v; } $res = $a; return $res; } static function getListForSummary(){ return self::getListForAnalysis(); // Есть следующие ситуации отображения списка // 1. Руководитель проекта - отображаются все проекты, в которых я руководитель. // 2. Роль в команде - отображаются все проекты, в которых я имею определенную роль в команде // 3. Роль к компании - для руководителя подразделения выводить проекты, в которых участвуют сотрудники подразделения. // 4. Группа "Проекты наблюдатели" - отображаются все проекты // 1. Если я где-то руководитель /* $res = []; $emp_id = Emp::$AUTH_ID; if(Emp::isMeAnyDirector()){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$DIRECTOR,'=',$emp_id), \Where::_operator(self::$REMOVED,'=',0), \Where::_operator(self::$ARCHIVE,'=',0), ])) ],true); $res = array_merge($res,$a); } // 2. Если я где-то имею роль в команде $roles = []; if(Rules::isGIP()) $roles[] = eMemberRole::MAIN_ENGINEER; if($roles){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED,'=',0), \Where::_operator(self::$ARCHIVE,'=',0), \Where::_and([ \Where::_inQuery(self::$TEAM,[ \Query::TABLES => [Team::$table_name], \Query::SELECT => [Team::$ID], \Query::WHERE => new \Where( \Where::_inQuery(Team::$ID,[ \Query::TABLES => [Member::$table_name], \Query::SELECT => [Member::$TEAM], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP,'=',$emp_id), \Where::_operator(Member::$ACTIVE,'=',1), \Where::_in(Member::$ROLE,$roles), ])) ]) ) ]) ]) ])) ],true); $res = array_merge($res,$a); } // 4. "Проекты наблюдатели" - if(Rules::isGroupProjectViewer()){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED,'=',0), ])) ],true); $res = array_merge($res,$a); } $a = []; foreach ($res as $v){ $a[$v[self::$ID]] = $v; } $res = $a; return $res; */ } static function getListForTable(){ // Есть следующие ситуации отображения списка // 1. Руководитель проекта - отображаются все проекты, в которых я руководитель. // 2. Роль в команде - отображаются все проекты, в которых я имею определенную роль в команде // 3. Роль к компании - для руководителя подразделения выводить проекты, в которых участвуют сотрудники подразделения. // 4. Группа "Проекты наблюдатели" - отображаются все проекты // 1. Если я где-то руководитель $res = []; $emp_id = Emp::$AUTH_ID; if(Emp::isMeAnyDirector()){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$DIRECTOR,'=',$emp_id), \Where::_operator(self::$REMOVED,'=',0), \Where::_operator(self::$ARCHIVE,'=',0), ])) ],true); $res = array_merge($res,$a); } // 2. Если я где-то имею роль в команде $roles = []; if(Rules::isGIP()) $roles[] = eMemberRole::MAIN_ENGINEER; if($roles){ $a = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$REMOVED,'=',0), \Where::_operator(self::$ARCHIVE,'=',0), \Where::_and([ \Where::_inQuery(self::$TEAM,[ \Query::TABLES => [Team::$table_name], \Query::SELECT => [Team::$ID], \Query::WHERE => new \Where( \Where::_inQuery(Team::$ID,[ \Query::TABLES => [Member::$table_name], \Query::SELECT => [Member::$TEAM], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP,'=',$emp_id), \Where::_operator(Member::$ACTIVE,'=',1), \Where::_in(Member::$ROLE,$roles), ])) ]) ) ]) ]) ])) ],true); $res = array_merge($res,$a); } $a = []; foreach ($res as $v){ $a[$v[self::$ID]] = $v; } $res = $a; return $res; } static function getWhereForEmp($emp_id,$archive=null,$active=null){ $emp_id = intval($emp_id); $isRP = false; if($_POST['my_projects']) { // todo: вынестьи в переменные, если будет часто использоваться $isRP = true; } return \Where::_and([ $emp_id ? \Where::_or([ $_POST['cabinet'] ? null : \Where::_operator(self::$DIRECTOR,'=',$emp_id), \Where::_inQuery(self::$TEAM,[ \Query::TABLES => [Team::$table_name], \Query::SELECT => [Team::$ID], \Query::WHERE => new \Where( \Where::_inQuery(Team::$ID,[ \Query::TABLES => [Member::$table_name], \Query::SELECT => [Member::$TEAM], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Member::$EMP,'=',$emp_id), $active===null ? null : \Where::_operator(Member::$ACTIVE,'=',1), ])) ]) ) ]) ]) : null, is_numeric($archive) ? \Where::_operator(self::$ARCHIVE,'=',$archive) : null, \Where::_operator(self::$REMOVED,'=',0), ]); } static function getWhereForMe(){ return self::getWhereForEmp(Emp::$AUTH_ID); } public static function beforeUadd(array $values = []): array { $res = []; if(isset($values[self::$CODE])) { if ($c = $values[self::$CODE]) { $code = preg_replace('/[^\d]/', '', $c); if (strlen($code) < 8) { $res[self::$CODE][] = 'Укажите код полностью'; } else { $r = self::select([ \Query::WHERE=>new \Where(\Where::_and([ \Where::_operator(self::$CODE,'=',$c ), \Where::_operator(self::$STEP,'=',$values['step'] ), ])), \Query::COUNT =>1, ]); if (\DB::numRows($r)) { $p = \DB::fetch($r); if ($p[self::$ID] != $values[self::$ID]) { $res[self::$CODE][] = 'Такой код уже используется в другом проекте'; } } } } else { $res[self::$CODE][] = 'Укажите шифр'; } } return $res; } static function getContractName($v) { return $v[self::$CONTRACT].'_'.Contractor::getName($v[Contractor::$NAME] ? $v : Contractor::getByIDCached( intval($v[self::$CONTRACTOR]) ) ); } static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) { $img = null; if($c = $C[self::$IMG]) $img = Image::imageResize( Image::getByID($c)[Image::$URL], 128); $isCanViewForm = Rules::isRwProjectEditWithoutRp($C[self::$ID]); if(!$isCanViewForm){ $form->addRow((new Row())->addColumn((new Column())->addTitle((new Title('Редактирование недоступно'))))); return $form; } /* if(!Emp::isSuperView()) { if (Emp::isMeGroup(eEmpGroup::ALL) and $isEdit and $C[Project::$DIRECTOR] != Emp::$AUTH_ID) { $form->addRow((new Row())->addColumn((new Column())->addTitle((new Title('Редактирование недоступно'))))); return $form; } if (Emp::isMeAnyDepartmentDirector() && (!$isEdit or ($C[Project::$DIRECTOR] != Emp::$AUTH_ID))) { $form->addRow((new Row())->addColumn((new Column())->addTitle((new Title('Редактирование недоступно'))))); return $form; } } */ $PROJECT_ID = $C[self::$ID]; $isCanEditDirector = Rules::isRwProjectEditRpWrite($PROJECT_ID); $teams = []; if($team_id = $C[self::$TEAM]){ $team = Team::getByID($team_id); $teams[] = [ 'id'=>$team_id, 'title'=>Team::getName($team) ]; } $r = Team::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_not([ \Where::_inQuery(Team::$ID,[ \Query::TABLES => [Project::$table_name], \Query::SELECT => ['DISTINCT '.Project::$TEAM], ]) ]) ])) ]); while($l = \DB::fetch($r)){ $teams[] = [ 'id'=>$l[Team::$ID], 'title'=>Team::getName($l) ]; } $sections = $isEdit ? ProjectSection::get($C[self::$ID]) : []; $section_list = []; $r = Section::getAll([ // \Query::WHERE => new \Where(\Where::_operator(Section::$PORTAL,'=',\Site::$portal_id)), ]); $structure = []; while($l = \DB::fetch($r)){ $id = intval($l[Section::$ID]); $pid = intval($l[Section::$PARENT]); $structure['base'][$id] = $l; $structure['s'][$pid][] = $id; } $diff = array_diff(array_keys($structure['base']),array_keys($structure['s'])); foreach ($diff as $diff_id) { $sect = $structure['base'][$diff_id]; $section_list[] = [ 'id'=>$diff_id, 'title'=>Section::getFullName($sect), 'data'=>[ 'step'=>$sect[Section::$STEP], ], ]; } if($C[self::$DATE]=='0000-00-00') $C[self::$DATE] = ''; if($C[self::$DATE_END]=='0000-00-00') $C[self::$DATE_END] = ''; if($C[self::$ARCHIVE_DATE]=='0000-00-00') $C[self::$ARCHIVE_DATE] = ''; $org_types = []; if($C){ $org_types = json_decode($C[self::$ORG_TYPES],true); } $contracts = []; $r = Project::select([ \Query::SELECT => ['DISTINCT '.Project::$CONTRACT.' as contractList'], ]); $counter = 0; while($l = \DB::fetch($r)){ $contracts[] = [ 'id'=>$counter++, 'title'=>$l['contractList'], ]; } $details_column = (new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Характеристики')))) ->addColumn(((new Select()) ->setName('org_types') ->setValue($org_types) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$ORG_TYPES)) ->setPlaceholder($c) ->setMultiple(true) ->setOptions(Objtype::getNameList([ \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(Objtype::$VIS,'=',1), $isEdit && $org_types? \Where::_in(Objtype::$ID,$org_types) : null, ])) ])) ->setSearch(true) )) ->addColumn(((new Text()) ->setName(self::$AREA) ->setValue($C[self::$AREA]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$AREA).', м2') ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$VOLUME) ->setValue($C[self::$VOLUME]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$VOLUME).', м3') ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$HEIGHT) ->setValue($C[self::$HEIGHT]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$HEIGHT).', м') ->setPlaceholder($c) )) ->addColumn(((new Textarea()) ->setName(self::$TEXT) ->setValue($C[self::$TEXT]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$TEXT)) ->setPlaceholder($c) )) ->addColumn(((new Switcher()) ->setName(self::$ARCHIVE) ->setValue($C[self::$ARCHIVE]) ->setClassAll('c-100 orange_switcher') ->setPlaceholder($c = V::get(Vars::$ARCHIVE)) ->setChecked(boolval($C[self::$ARCHIVE])) )); if(Rules::isAdmin()){ $details_column->addColumn(((new Switcher()) ->setName(self::$IS_ALL_EMP) ->setValue($C[self::$IS_ALL_EMP]) ->setClassAll('c-100 orange_switcher') ->setPlaceholder($c = V::get(Vars::$IS_ALL_EMP)) ->setChecked(boolval($C[self::$IS_ALL_EMP])) )); } $form->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-20 ')->addRow((new Row()))) ->addColumn( (new Column())->setClassAll('c-20 image_picker_project ') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Основная информация')))) ->addColumn((new ImagePicker()) ->setClassAll('c-100') ->setName(self::$IMG) ->setLabel(V::get(Vars::$IMG)) ->setUploadUrl(\Site::sectionUrl(substr(Image::UPLOAD_URL_ACCOUNT,1),true)) ->setAjaxData(['token'=>Merakomis::getUploadToken()]) ->setSrc($img?:'') ->setValue($C[self::$IMG]) ->setAsBg(true) ->setClassName('btn blue') ) ->addColumn(((new Text()) ->setName(self::$NAME) ->setValue($C[self::$NAME]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$NAME)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$CODE) ->setValue($C[self::$CODE]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$CODE)) ->setPlaceholder('XXXX-XXXX') //->setMask('9999-9999') ->setMask('0000-0000') )) ->addColumn(((new Select()) ->setName(self::$DIRECTOR) ->setValue(intval($C[self::$DIRECTOR])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DIRECTOR)) ->setPlaceholder($c) ->setOptions(Emp::getNameList()) ->setSearch(true) ->setDisabled(!$isCanEditDirector) //->setDisabled(true) )) ->addColumn(((new Select()) ->setName('step') ->setValue(intval($C[self::$STEP])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$STEP)) ->setPlaceholder($c) ->setOptions(Step::getNameList([ \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(Step::$VIS,'=',1), $isEdit ? \Where::_operator(Step::$ID,'=',$C[self::$STEP]) : null, ])) ])) )) ->addColumn(((new Select()) ->setName('section') ->setValue($sections) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$SECTIONS)) ->setPlaceholder($c) ->setOptions($section_list) ->setMultiple(true) ->setSearch(true) )) ->addColumn(((new Select()) ->setName(self::$STATUS) ->setValue(intval($C[self::$STATUS])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$STATUS)) ->setPlaceholder($c) ->setOptions(eStatus::getNameList()) )) ) ) ->addColumn( (new Column())->setClassAll('c-20 ') ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-100 green_title')->addTitle((new Title('Договор')))) ->addColumn(((new DatePicker()) ->setName(self::$DATE) ->setValue(date('Y-m-d',strtotime($C[self::$DATE])?:'')) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DATE)) ->setPlaceholder($c) )) ->addColumn(((new DatePicker()) ->setName(self::$DATE_END) ->setValue(date('Y-m-d',strtotime($C[self::$DATE_END])?:'')) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DATE_END)) ->setPlaceholder($c) )) ->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([ \Query::WHERE => new \Where(\Where::_or([ \Where::_operator(Org::$VIS,'=',1), $isEdit ? \Where::_operator(Org::$ID,'=',$C[self::$ORG]) : null, ])) ])) )) ->addColumn(((new Select()) ->setName(self::$CONTRACTOR) ->setValue(intval($C[self::$CONTRACTOR])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$CONTRACTOR)) ->setPlaceholder($c) ->setSearch(true) ->setOptions(Contractor::getNameList([ 'zero'=>true, \Query::WHERE => new \Where(\Where::_or([ $C[self::$CONTRACTOR] ? \Where::_operator(Contractor::$ID,'=',$C[self::$CONTRACTOR]) : null, \Where::_and([ \Where::_operator(Contractor::$VIS,'=',1), \Where::_operator(Contractor::$STATUS,'=',Status::CLIENT_ID), ]) ])) ])) )) ->addColumn(((new Text()) ->setName(self::$ADDRESS) ->setValue($C[self::$ADDRESS]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$ADDRESS)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$LINK) ->setValue($C[self::$LINK]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$LINK)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$DOC_FOLDER) ->setValue($C[self::$DOC_FOLDER]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$DOC_FOLDER)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$CONTRACT) ->setValue($C[self::$CONTRACT]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$CONTRACT)) ->setPlaceholder($c) ->setOptions($contracts) )) ) ) ->addColumn( (new Column())->setClassAll('c-20 ') ->addRow($details_column) ) ) ; } 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), C::TH =>'№', // C::NO_SORT => false, C::FUNC_VALUE_DATA => function($v){ $id = $v[self::$ID]; if(isset(self::$NUM_ROWS[$id])) return self::$NUM_ROWS[$id]; self::$NUM_ROWS[$id] = count(array_keys(self::$NUM_ROWS))+1; return self::$NUM_ROWS[$id]; //self::$NUM_ROWS = array_unique(self::$NUM_ROWS); //return count(self::$NUM_ROWS); } ]), new C([ C::VAR_NAME => &self::$IMG, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$IMG), C::HIDDEN => true, C::EXPORT => false, ]), new C([ C::VAR_NAME => &self::$CODE, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 31, //C::TH => V::get(Vars::$CODE), C::TH => 'Проект', C::FILTER_TYPE => eFilterType::TEXT, C::NO_SORT => false, C::FUNC_VALUE_DATA => function($v){ return self::getCode($v)?:"Укажите шифр"; return self::getCode($v)?:"Укажите шифр"; } ]), 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, ]), new C([ C::VAR_NAME => &self::$DATE, C::TYPE => eColumnType::DATE, C::TH => 'Начало',//V::get(Vars::$DATE), //C::FUNC_VALUE_DATA => function($v){return Merakomis::fdate($v[self::$DATE]);}, C::FILTER_TYPE => eFilterType::DATE, C::NULL => true, //C::DEFAULT => 'NULL', ]), new C([ C::VAR_NAME => &self::$DATE_END, C::TYPE => eColumnType::DATE, C::NULL => true, //C::DEFAULT => 'NULL', C::TH => 'Окончание',//V::get(Vars::$DATE_END), C::FUNC_VALUE_DATA => function($v){return Merakomis::fdate($v[self::$DATE_END]);}, C::FILTER_TYPE => eFilterType::DATE, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$STEP, C::TYPE => eColumnType::INT, C::DEFAULT => 0, C::TH => V::get(Vars::$STEP), C::FUNC_VALUE_DATA => function($v){return Step::getName(Step::getByID(intval($v[self::$STEP])));}, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$SECTIONS, C::TYPE => eColumnType::NONE, C::DEFAULT => 0, //C::TH => V::get(Vars::$SECTIONS), C::TH => 'Подразделы', C::TD_CLASS => 'pre_wrap', C::FUNC_VALUE_DATA => function($v){ $ids = ProjectSection::get($v[self::$ID]); if($ids){ $a = Section::getByIDS($ids); $res = []; foreach ($a as $section){ $res[] = Section::getFullName($section); } return implode("\n",$res); } return ''; } ]), new C([ C::VAR_NAME => &self::$DIRECTOR, C::TYPE => eColumnType::INT, C::DEFAULT => 0, //C::TH => V::get(Vars::$DIRECTOR), C::TH => 'РП', C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_VALUE_DATA => function($v){ return Emp::SurnameIO(Emp::getByID(intval($v[self::$DIRECTOR]))); }, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Emp::getNameList([ \Query::WHERE => new \Where(\Where::_and([ \Where::_inQuery(Emp::$ID,[ \Query::TABLES=>[Project::$table_name], \Query::SELECT => [Project::$DIRECTOR], \Query::WHERE => \Where::_operator(Project::$DIRECTOR,'<>',0), ]) ])) ]); } ]), new C([ C::VAR_NAME => &self::$ORG, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$ORG), //C::HIDDEN => true, C::FUNC_VALUE_DATA => function($v){ return (($c = $v[self::$ORG]) ? Org::getName( Org::getByID($c) ) :""); } ]), new C([ C::VAR_NAME => &self::$LINK, C::TYPE => eColumnType::TEXT, C::TH => 'Папка',//V::get(Vars::$LINK), //C::FILTER_TYPE => eFilterType::TEXT, C::TD_CLASS => 'td_doc_folder no_wrap ', C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$CONTRACTOR, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$CONTRACTOR), C::FUNC_VALUE_DATA => function($v){return Contractor::getName(Contractor::getByID(intval($v[self::$CONTRACTOR])));}, C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Contractor::getNameList(); } ]), new C([ C::VAR_NAME => &self::$STATUS, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::TH => V::get(Vars::$STATUS), C::FUNC_VALUE_DATA => function($v){return eStatus::getName($v[self::$STATUS]);}, C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return eStatus::getNameList(); }, ]), new C([ C::VAR_NAME => &self::$LEFT, C::TYPE => eColumnType::NONE, C::TH => 'Осталось, дн', C::FUNC_VALUE_DATA => function($v){ $res = ''; if($v[self::$DATE_END] && $v[self::$DATE_END]!='0000-00-00'){ $date1 = new \DateTime(date('Y-m-d')); $date2 = new \DateTime($v[self::$DATE_END]); $interval = $date1->diff($date2); if($date2->getTimestamp() < $date1->getTimestamp()) $res = '-'.($interval->days).''; else $res = $interval->days; } //if($_POST['_is_csv']) $res = strip_tags($res); if($_POST['options']['_is_csv']) $res = strip_tags($res); return $res; }, ]), 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::$ADDRESS, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$ADDRESS), C::FILTER_TYPE => eFilterType::TEXT, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$TEXT, C::TYPE => eColumnType::LONGTEXT, C::TH => V::get(Vars::$TEXT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$DOC_FOLDER, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$DOC_FOLDER), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$ORG_TYPES, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$ORG_TYPES), C::HIDDEN => true, C::FUNC_EXPORT_DATA => function($v){ $obj_types_ids = json_decode($v[self::$ORG_TYPES],true); if($obj_types_ids) { $a = Objtype::getByIDS($obj_types_ids); foreach ($a as $objtype){ $obj_types[] = Objtype::getName($objtype); } } return implode(", ",$obj_types); } ]), new C([ C::VAR_NAME => &self::$AREA, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$AREA), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$VOLUME, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$VOLUME), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$HEIGHT, C::TYPE => eColumnType::TEXT, C::TH => V::get(Vars::$HEIGHT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$IS_ALL_EMP, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::TH => V::get(Vars::$IS_ALL_EMP), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$CONTRACT, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 127, C::TH => V::get(Vars::$CONTRACT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$TEAM, C::TYPE => eColumnType::INT, //C::TH => V::get(Vars::$TEAM), C::TH => ' ', C::EXPORT => false, C::FUNC_VALUE_DATA => function($v){ return [ 'link'=>'team/member/'.$v[self::$ID].'/' ]; //return $v[self::$TEAM]?"Редактор":'Пересохраните проект!'; //return Team::getName(Team::getByID(intval($v[self::$TEAM]))); }, //C::FILTER_TYPE => eFilterType::SELECT, /* C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Team::getNameList(); } */ ]), new C([ C::VAR_NAME => &self::$ARCHIVE, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::TH => V::get(Vars::$ARCHIVE), c::FUNC_VALUE_DATA => function($v){return self::formatBool($v[self::$ARCHIVE]);}, C::FILTER_TYPE => eFilterType::BOOLEAN, C::HIDDEN => true, C::EXPORT => false, ]), new C([ C::VAR_NAME => &self::$REMOVED, C::TYPE => eColumnType::TINYINT, C::LENGTH => 1, C::DEFAULT => 0, C::TH => V::get(Vars::$REMOVED), c::FUNC_VALUE_DATA => function($v){return self::formatBool($v[self::$REMOVED]);}, C::HIDDEN => true, C::EXPORT => false, ]), /* new C([ C::VAR_NAME => &self::$POS, C::TYPE => eColumnType::INT, C::DEFAULT => time(), c::HIDDEN => true, ]), */ new C([ C::VAR_NAME => &self::$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::DEFAULT => intval(\Site::$owner_id), //C::TH => V::get(Vars::$ACCOUNT), c::HIDDEN => true, ]), ]; } } new Project(); ///