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).', м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();
///