$arr) { foreach ($arr as $month=>$value) { $d = explode('.',$month); Fot::insert([ Fot::$EMP=>$id, Fot::$YEAR=>2000+intval($d[1]), Fot::$MONTH=>intval($d[0]), Fot::$FZP=>$value ]); file_put_contents(__DIR__.'/report.txt',$id.':'.$m."\n",FILE_APPEND); } } foreach ($months as $m){ file_put_contents(__DIR__.'/report.txt',$m."\n",FILE_APPEND); $d = explode('.',$m); Fot::generate(2000+intval($d[1]),intval($d[0])); } } public function encrypt(){ $a = Fot::getAll(); foreach ($a as $x) { Fot::updateById($x[Fot::$ID],$x); } } public function updateFromTable() { $res = $_POST; $id = intval($_POST['id']); $data = [ Fot::$STATUS => eFotStatus::WORK, ]; switch($_POST['type']) { case 'fzp': $data[Fot::$FZP] = cfloatval($_POST['value']); break; case 'add': $data[Fot::$ADD] = cfloatval($_POST['value']); break; } $r = Fot::updateById($id,$data); $x = Fot::getById($id); Budget::mathByYearMonth($x[Fot::$YEAR], $x[Fot::$MONTH]); //Fot::math($id); $res['res'] = $r; $res['data'] = $data; echo je($res); } public function import() { $filter = $_POST['filter']; $res = []; $nowYear = $year = intval($_POST['year']?:date('Y')); $nowMonth = $month = intval($_POST['month']?:date('m')); $name = trim($_POST['name']?:''); $isBad = boolval($_POST['mark']); $time = strtotime($year.'-'.$month.'-01'); $prevTime = strtotime("-1 month", $time); $prevYear = date('Y', $prevTime); $prevMonth = date('n', $prevTime); $res['send'] = [ '$year'=>$year, '$month'=>$month, '$name'=>$name, '$isBad'=>$isBad, ]; $res['year'] = $year; $res['month'] = $month; $res['prevYear'] = $prevYear; $res['prevMonth'] = $prevMonth; $res['budget'] = [ 'other'=>0, 'edit'=>0, 'id'=>0, 'mark'=>'', ]; $periods = [ [$year,$month], [$prevYear,$prevMonth], ]; $b1 = Budget::get($year,$month); $b2 = Budget::get($prevYear,$prevMonth); Fot::generate($year,$month); Fot::generate($prevYear,$prevMonth); $budget['id'] = $b1[Budget::$ID]; $budget['edit'] = $b1[Budget::$MONEY]; $budget['mark'] = !($b1[Budget::$MONEY]==$b2[Budget::$MONEY]); //boolval($b1[Budget::$CHANGED]); $budget['other'] = $b2[Budget::$MONEY]; $res['budget'] =$budget; $filter_text = []; $emp_and = []; if($filter[$c ='name']) { $emp_and[] = \Where::_operator(Emp::$NAME,'LIKE','%'.$filter[$c].'%'); $filter_text[] = 'Имя: «'.$filter[$c].'»'; } if(is_numeric($filter[$c ='city']) and $filter[$c]>0) { $emp_and[] = \Where::_operator(Emp::$CITY,'=',intval($filter[$c])); $filter_text[] = City::getName( City::getByID($filter[$c]) ); } if(is_numeric($filter[$c ='org']) and $filter[$c]>0) { $emp_and[] = \Where::_operator(Emp::$ORG,'=',intval($filter[$c])); $filter_text[] = Org::getName( Org::getByID($filter[$c]) ); } if(is_numeric($filter[$c ='orgtype']) and $filter[$c]>0) { $emp_and[] = \Where::_operator(Emp::$ORG_TYPE,'=',intval($filter[$c])); $filter_text[] = OrgType::getName( OrgType::getByID($filter[$c]) ); } $structure = Department::getStructure(); if(is_numeric($filter[$c ='department']) and $filter[$c]>0) { $dep_emp_ids = $structure['base'][$filter[$c]]['emp_ids']; $emp_and[] = \Where::_in(Emp::$ID,$dep_emp_ids?:[0]); $filter_text[] = Department::getName( $structure['base'][$filter[$c]] ); } if(is_numeric($filter[$c ='staffing']) and $filter[$c]>0) { $emp_and[] = \Where::_operator(Emp::$STAFFING,'LIKE','%"'.$filter[$c].'"%') ; $filter_text[] = Staffing::getName( Staffing::getByID(intval($filter[$c])) );; } if(is_numeric($filter[$c ='freelance']) and $filter[$c]>=0) { $emp_and[] = \Where::_operator(Emp::$IS_FREELANCER,'=',$filter[$c]); $filter_text[] = Staffing::getName( Staffing::getByID(intval($filter[$c])) );; } $data = []; $beginDate = $year.'-'.($month<10?'0':'').$month.'-01'; $endDate = date('Y-m-d',strtotime($beginDate.' + 1 month - 1 day')); foreach($periods as $k=>$period) { $isSecond = $k==1; $year = $period[0]; $month = $period[1]; $and = $emp_and; $and[] = \Where::_operator(Fot::$YEAR, '=', $year); $and[] = \Where::_operator(Fot::$MONTH, '=', $month); if ($name) $and[] = \Where::_or([ \Where::_operator(Fot::$NAME, 'like', '%' . $name . '%'), \Where::_operator(Emp::$NAME, 'like', '%' . $name . '%'), ]); $and[] = Time::getEmpWhereAnd($beginDate, $endDate); /* $and[] = \Where::_inQuery(Emp::$ID,[ \Query::TABLES => [Time::$table_name], \Query::SELECT => ['DISTINCT '.Emp::$ID], \Query::WHERE => new \Where(\Where::_and([ \Where::_between(Time::$DATE,$beginDate,$endDate), ])) ]); */ // if ($isBad) $and[] = \Where::_operator(Fot::$STATUS, '=', eFotStatus::NONE); $r = Fot::select($q = [ \Query::LEFT_JOINS => [ [Emp::$table_name, Emp::$ID, Fot::$EMP], ], \Query::WHERE => new \Where(\Where::_and($and)), \Query::COUNT => 0, ]); $cities = City::getAll(); $res['q'][] = (string)new \Query($q); while ($l = \DB::fetch($r)) { Fot::decrypt($l); $emp_id = $l[Fot::$EMP]; $color = (($l[Fot::$STATUS])?'#1c303b':'#fb4f14'); $isBadFot = ($l[Fot::$STATUS] == eFotStatus::NONE); $data[$emp_id][$year.$month] = [ 'id'=>intval($l[Fot::$ID]), 'emp_id'=>intval($l[Fot::$EMP]), 'name'=>Emp::SurnameIO($l), 'name2'=>$l[Fot::$NAME], 'fzp'=>$l[Fot::$FZP], 'add'=>$l[Fot::$ADD], 'fot'=>$l[Fot::$FOT], 'per_hour'=>$l[Fot::$PER_HOUR], 'archive'=>boolval($l[Emp::$ARCHIVE]), //'mark'=>eFotStatus::getName($l[Fot::$STATUS]), //'color'=>$color, 'location'=>City::getName( City::getByIDCached(intval($l[Emp::$CITY])) ), 'freelance'=>($l[Emp::$IS_FREELANCER])?"Да":"Нет", 'org_type'=>Org::getName(Org::getByIDCached(intval($l[Emp::$ORG]))), 'department'=>implode("\n",Emp::getDepartmentList($l)), 'staffing'=>implode("\n",Emp::getStaffingList($l)), 'isSecond'=>$isSecond, ]; if($isSecond){ $isChanged = $data[$emp_id][$year.$month]['fzp']!=$data[$emp_id][$nowYear.$nowMonth]['fzp']; $color = ((!$isChanged)?'#1c303b':'#fb4f14'); $data[$emp_id][$nowYear.$nowMonth]['mark'] = $isChanged?"Изм":"Ок"; $data[$emp_id][$nowYear.$nowMonth]['color'] = $color; $data[$emp_id][$nowYear.$nowMonth]['name'] = Emp::SurnameIO($l); $data[$emp_id][$nowYear.$nowMonth]['emp_id'] = intval($l[Fot::$EMP]); } else { $data[$emp_id][$prevYear.$prevMonth]['mark'] = $isChanged?"Изм":"Ок"; $data[$emp_id][$prevYear.$prevMonth]['color'] = $color; $data[$emp_id][$prevYear.$prevMonth]['name'] = Emp::SurnameIO($l); $data[$emp_id][$prevYear.$prevMonth]['emp_id'] = intval($l[Fot::$EMP]); } if($isBad and $isSecond){ if(!$isBadFot){ unset($data[$emp_id]); } } } } $res['data'] = $data; Time::generateFilterOptions($res); echo je($res); } public static function getTableData($post = []) { $post['options'][\ModuleTable::ROW_CLICK] = eRowClick::CUSTOM; $post['options'][\Query::LEFT_JOINS] = [ [Emp::$table_name, Emp::$ID, Fot::$EMP], ]; $emp_id = null; $and = []; if(isset($post['data']['params']['id'])){ $post['options'][\Query::COUNT] = 0; $emp_id = $post['data']['params']['id']; $and[] = \Where::_operator(Fot::$EMP, '=', $emp_id); $year = intval($post['options']['filter']['year'])?:date('Y'); $and[] = \Where::_operator(Fot::$YEAR, '=', $year); $post['options'][\ModuleTable::COLUMN_LIST] = [ Fot::$YM, Fot::$FZP, Fot::$ADD, Fot::$FOT, Fot::$PK, Fot::$PER_HOUR, Fot::$STATUS, ]; } else { $year = intval($post['options']['filter']['year']); if($year) $and[] = \Where::_operator(Fot::$YEAR, '=', $year); $month = intval($post['options']['filter']['month']); if($month) $and[] = \Where::_operator(Fot::$MONTH, '=', $month); if (isset($post['data']['full'])) { $post['options'][\ModuleTable::COLUMN_LIST] = [ Fot::$EMP_NAME, Fot::$EMP_ROLES, Fot::$FZP, Fot::$ADD, Fot::$FOT, Fot::$PER_HOUR, Fot::$STATUS, Fot::$EMP_DEPARTMENT, Fot::$EMP_CITY, Fot::$EMP_ORG, Fot::$EMP_ORG_TYPE, Fot::$EMP_IS_FREELANCE, Fot::$EMP_STATUS, ]; } } if($and){ $post['options'][\Query::WHERE] = \Where::_and($and); } $post['getData'] = true; $res = parent::getTableData($post); $res['title'] = [ 'title' => 'ФОТ', 'edit' => true, 'subtitle' => Merakomis::$FOT_TABLE_TITLE_1, 'text' => Merakomis::$FOT_TABLE_SUBTITLE_1, 'subtitle_var' => Merakomis::$_FOT_TABLE_TITLE_1, 'text_var' => Merakomis::$_FOT_TABLE_SUBTITLE_1, ]; if($emp_id){ $res['title'] = [ 'title' => 'ФОТ: '.Emp::getName(Emp::getByID($emp_id)), 'edit' => true, 'subtitle' => Merakomis::$FOT_TABLE_TITLE_2, 'text' => Merakomis::$FOT_TABLE_SUBTITLE_2, 'subtitle_var' => Merakomis::$_FOT_TABLE_TITLE_2, 'text_var' => Merakomis::$_FOT_TABLE_SUBTITLE_2, ]; } echo je($res); } static function cache(){ set_time_limit(0); $p = Project::getAll(); $e = Emp::getAll(); for($y=2025;$y>=2023;$y--) { for ($i = 1; $i <= 12; $i++) { foreach ($p as $project) { $pid = $project[Project::$ID]; foreach ($e as $emp){ $eid = $emp[Emp::$ID]; $time = strtotime("$y-$i-01"); $begin = date('Y-m-01',$time); $end = date('Y-m-t',$time); Time::getEmpsTime($begin, $end, $eid,$pid); } } } } } static function test2(){ $r = Fot::getEmpIdsForBudget(2025,4); echo '
';
        echo var_dump($r);
        echo '
'; } static function test() { set_time_limit(0); for($y=2025;$y<=2025;$y++) { $maxM = $y == 2025 ? 5 : 12; for ($i = 1; $i <= $maxM; $i++) { for ($j = 1; $j <= 200; $j++) { $r = Fot::uadd([ Fot::$EMP => $j, Fot::$YEAR => $y, Fot::$MONTH => $i, Fot::$FZP => rand(50000, 250000), Fot::$ADD => rand(1000, 50000), ]); } } } } }