1433 lines
58 KiB
PHP
1433 lines
58 KiB
PHP
<?
|
|
namespace themes\merakomis;
|
|
|
|
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 common\Image;
|
|
use ModuleBZ\Form\Input\DatePicker;
|
|
use ModuleBZ\Form\Input\ImagePicker;
|
|
use ModuleBZ\Form\Input\Select;
|
|
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 themes\Merakomis;
|
|
use themes\merakomis\dictionary\Contractor;
|
|
use themes\merakomis\dictionary\contractor\Status;
|
|
use themes\merakomis\dictionary\Objtype;
|
|
use themes\merakomis\dictionary\Org;
|
|
use themes\merakomis\dictionary\OrgType;
|
|
use themes\merakomis\dictionary\Section;
|
|
use themes\merakomis\dictionary\Step;
|
|
use themes\merakomis\emp\Rules;
|
|
use themes\merakomis\Emp\structure\eEmpGroup;
|
|
use themes\merakomis\project\Section as ProjectSection;
|
|
use themes\merakomis\project\structure\eStatus;
|
|
use themes\merakomis\project\structure\lang as Vars;
|
|
use themes\merakomis\structure\merakomisModuleTable;
|
|
use themes\merakomis\team\Member;
|
|
use themes\merakomis\team\Member\structure\eMemberRole;
|
|
use themes\sova\Contact;
|
|
|
|
|
|
class Project extends merakomisModuleTable {
|
|
static $self;
|
|
static $cache = [];
|
|
static $table_name = 'tMerakomisProject';
|
|
static $controller = 'themes.merakomis.project';
|
|
|
|
static $ID = 'id';
|
|
static $IMG = 'img';
|
|
static $NAME = 'name';
|
|
static $CODE = 'code';
|
|
static $ADDRESS = 'address';
|
|
static $LINK = 'link';
|
|
static $DATE = 'date';
|
|
static $TEAM = 'team';
|
|
static $CONTRACTOR = 'contractor';
|
|
static $STATUS = 'status';
|
|
static $ARCHIVE = 'archive';
|
|
static $REMOVED = 'removed';
|
|
static $PORTAL = 'portal';
|
|
static $ACCOUNT = 'account';
|
|
static $TEXT = 'text';
|
|
|
|
static $DATE_END = 'date_end';
|
|
static $DIRECTOR = 'director';
|
|
static $STEP = 'step';
|
|
static $ARCHIVE_DATE = 'archive_date';
|
|
static $ORG = 'org';
|
|
static $DOC_FOLDER = 'doc_folder';
|
|
static $ORG_TYPES = 'org_types';
|
|
static $AREA = 'area';
|
|
static $VOLUME = 'volume';
|
|
static $HEIGHT = 'height';
|
|
static $IS_ALL_EMP = 'is_all_emp';
|
|
static $CONTRACT = 'contract'; // договор
|
|
|
|
//--
|
|
static $SECTIONS = 'sections';
|
|
static $LEFT = 'left';
|
|
static $PROJECT_TITLE = 'project_title';
|
|
|
|
|
|
static $NUM_ROWS = [];
|
|
|
|
|
|
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
|
|
static function getSystemLangValues():array{ return Vars::getArray(); }
|
|
|
|
static function getCode($v){
|
|
$step = Step::getByID(intval($v[self::$STEP]));
|
|
return trim($v[self::$CODE]).'-'.$step[Step::$NAME];
|
|
}
|
|
static function getCodeName($v){
|
|
return self::getCode($v).'_'.self::getName($v);
|
|
}
|
|
|
|
|
|
public function _deleteByIDS(array $ids)
|
|
{
|
|
foreach ($ids as $id){
|
|
self::_deleteById($id);
|
|
}
|
|
}
|
|
|
|
public function _deleteById(int $id) {
|
|
self::updateById($id,[
|
|
self::$REMOVED=>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).', м<sup>2</sup>')
|
|
->setPlaceholder($c)
|
|
))
|
|
->addColumn(((new Text())
|
|
->setName(self::$VOLUME)
|
|
->setValue($C[self::$VOLUME])
|
|
->setClassAll('c-100')
|
|
->setLabel($c = V::get(Vars::$VOLUME).', м<sup>3</sup>')
|
|
->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 = '<span class="text bold orange">-'.($interval->days).'</span>';
|
|
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();
|
|
|
|
|
|
///
|