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

304 lines
12 KiB
PHP

<?
namespace controller\themes\merakomis\time;
use ms\ms\structure\msControllerTable;
use themes\Merakomis;
use themes\merakomis\Day;
use themes\merakomis\Emp;
use themes\merakomis\structure\merakomisControllerTable;
use themes\merakomis\Time;
use themes\merakomis\time\Absence;
use themes\merakomis\time\Cache;
class Api extends merakomisControllerTable {
static $class = 'themes\merakomis\Time';
static function test()
{
$begin = '2025-05-19';
$end = '2025-06-30';
$emp_id = 10;
$pid = 86;
$res = Time::getEmpsTimeWithFot($begin,$end,$emp_id,$pid);
/*
echo '<pre>';
echo var_dump(Time::getPeriodWithDays('2020-12-31','2021-01-17'));
echo var_dump(Time::getPeriodWithDays('2021-01-05','2021-01-17'));
echo var_dump(Time::getPeriodWithDays('2021-01-05','2022-05-17'));
echo '</pre>';
*/
}
public static function getSummary() {
$res = [];
if(Emp::$IS_AUTH) {
$res = Time::getMySummary($_POST['emp']);
}
echo je($res);
}
public static function addFromCalendar() {
$res =[];
if(Emp::$IS_AUTH){
$emp_id = intval($_POST['emp']) ?: Emp::$AUTH_ID;
$time = cfloatval($_POST['time']);
$date = $_POST['date'];
$project_id = intval($_POST['project']);
$x = ($time-intval($time))*100;
if($x<=25) $x = 0;
else if ($x>=75) $x=100;
else $x=50;
$time = intval($time)+$x/100;
if($time<0) $time = 0;
if($time>24) $time = 24;
// Считаем сколько чел за этот день вообще от работал, и сколько рабочих часов в этом дне
$total_work = 0;
$total_over = 0;
$r = Time::select([
\Query::SELECT => [
'SUM('.Time::$DURATION.') as cc',
Time::$IS_OVER,
],
\Query::WHERE => \Where::_and([
\Where::_operator(Time::$EMP,'=',$emp_id),
\Where::_operator(Time::$DATE,'=',$_POST['date']),
]),
\Query::GROUP_BY => [Time::$IS_OVER],
]);
while ($l = \DB::fetch($r)){
if(!$l[Time::$IS_OVER]) $total_work += floatval($l['cc']);
if($l[Time::$IS_OVER]) $total_over += floatval($l['cc']);
}
$maxWorkHours = Day::getWorkHoursByDate($date);
$maxOverHours = 24 - $maxWorkHours;
//$info = Time::getEmpTime([\Where::_operator(Time::$DATE,'=',$date)],$emp_id,$project_id);
$info = Time::getEmpTime($date,null,$emp_id,$project_id);
$res['info'] = $info;
$total_work -= $info['hours'];
$total_over -= $info['over'];
$newWorkHours = $total_work+$time;
$newOverHours = $total_over + $time;
$leftWorkHours = $maxWorkHours - $total_work;
$leftOverHours = $maxOverHours - $total_over;
$isOver = intval($_POST['over']);
if($isOver){
if($newOverHours > $maxOverHours){
$time = $leftOverHours;
}
} else {
if($newWorkHours > $maxWorkHours){
$time = $leftWorkHours;
}
}
$d = [
Time::$PROJECT => intval($_POST['project']),
Time::$EMP => $emp_id,
Time::$DATE => $_POST['date'],
Time::$IS_OVER => intval($_POST['over']),
Time::$DURATION => $time,
];
$res['r'] = Time::insert($d);
//$res = $d;
$res['$newWorkHours'] = $newWorkHours;
$res['$leftWorkHours'] = $leftWorkHours;
$res['$maxWorkHours'] = $maxWorkHours;
$res['$newOverHours'] = $newOverHours;
$res['$leftOverHours'] = $leftOverHours;
$res['$maxOverHours'] = $maxOverHours;
}
echo je($res);
}
public static function setAbsence() {
$res =[];
if(Emp::$IS_AUTH){
$project = intval($_POST['project']);
$emp_id = intval($_POST['emp']) ?: Emp::$AUTH_ID;
$type = intval($_POST['type']);
foreach ($_POST['dates'] as $date){
Absence::uadd([
Absence::$DATE => $date,
Absence::$EMP => $emp_id,
Absence::$ABSENCE => $type,
]);
$res[] = Cache::removeRows($date,$emp_id);
}
}
echo je($res);
}
public static function getTimeTable($post) {
$res = [];
//Emp::$AUTH_ID = 1;
//Emp::$IS_AUTH = true;
//$_POST['type']=2;
if(Emp::$IS_AUTH){
$res = Time::getTimeTable(
intval($_POST['project']),
intval($_POST['emp'])?:Emp::$AUTH_ID,
);
}
echo je($res);
}
public static function getStat($post) {
ini_set('memory_limit', '512M');
set_time_limit(0);
$res = [];
//Emp::$AUTH_ID = 3;
//Emp::$IS_AUTH = true;
//$_POST['type']=12;
//$_POST['range'][0]='2025-05-19';
//$_POST['range'][1]='2025-06-30';
if(Emp::$IS_AUTH){
$res = Time::getStat($_POST);
}
$res['text'] = [
Merakomis::$_ANALYSIS_MY_1 => Merakomis::$ANALYSIS_MY_1,
Merakomis::$_ANALYSIS_MY_2 => Merakomis::$ANALYSIS_MY_2,
Merakomis::$_ANALYSIS_YEAR_1 => Merakomis::$ANALYSIS_YEAR_1,
Merakomis::$_ANALYSIS_YEAR_2 => Merakomis::$ANALYSIS_YEAR_2,
Merakomis::$_ANALYSIS_OFFICE_1 => Merakomis::$ANALYSIS_OFFICE_1,
Merakomis::$_ANALYSIS_OFFICE_2 => Merakomis::$ANALYSIS_OFFICE_2,
Merakomis::$_ANALYSIS_OFFICE_3 => Merakomis::$ANALYSIS_OFFICE_3,
Merakomis::$_ANALYSIS_DEPARTMENT_1 => Merakomis::$ANALYSIS_DEPARTMENT_1,
Merakomis::$_ANALYSIS_DEPARTMENT_2 => Merakomis::$ANALYSIS_DEPARTMENT_2,
Merakomis::$_ANALYSIS_DEPARTMENT_3 => Merakomis::$ANALYSIS_DEPARTMENT_3,
Merakomis::$_ANALYSIS_COMPANY_1 => Merakomis::$ANALYSIS_COMPANY_1,
Merakomis::$_ANALYSIS_COMPANY_2 => Merakomis::$ANALYSIS_COMPANY_2,
Merakomis::$_ANALYSIS_COMPANY_3 => Merakomis::$ANALYSIS_COMPANY_3,
Merakomis::$_ANALYSIS_COMPANY_4 => Merakomis::$ANALYSIS_COMPANY_4,
Merakomis::$_ANALYSIS_COMPANY_5 => Merakomis::$ANALYSIS_COMPANY_5,
Merakomis::$_ANALYSIS_COMPANY_6 => Merakomis::$ANALYSIS_COMPANY_6,
Merakomis::$_STAFF_SUBTITLE_1 => Merakomis::$STAFF_SUBTITLE_1,
Merakomis::$_STAFF_SUBTITLE_2 => Merakomis::$STAFF_SUBTITLE_2,
Merakomis::$_STAFF_SUBTITLE_3 => Merakomis::$STAFF_SUBTITLE_3,
Merakomis::$_STAFF_SUBTITLE_4 => Merakomis::$STAFF_SUBTITLE_4,
Merakomis::$_STAFF_SUBTITLE_5 => Merakomis::$STAFF_SUBTITLE_5,
Merakomis::$_STAFF_TEXT_1 => Merakomis::$STAFF_TEXT_1,
Merakomis::$_STAFF_TEXT_2 => Merakomis::$STAFF_TEXT_2,
Merakomis::$_STAFF_TEXT_3 => Merakomis::$STAFF_TEXT_3,
Merakomis::$_STAFF_TEXT_4 => Merakomis::$STAFF_TEXT_4,
Merakomis::$_STAFF_TEXT_5 => Merakomis::$STAFF_TEXT_5,
Merakomis::$_ANALYSIS_TEAM_1 => Merakomis::$ANALYSIS_TEAM_1,
Merakomis::$_ANALYSIS_TEAM_2 => Merakomis::$ANALYSIS_TEAM_2,
Merakomis::$_ANALYSIS_TEAM_3 => Merakomis::$ANALYSIS_TEAM_3,
Merakomis::$_ANALYSIS_TEAM_4 => Merakomis::$ANALYSIS_TEAM_4,
Merakomis::$_ANALYSIS_TEAM_5 => Merakomis::$ANALYSIS_TEAM_5,
Merakomis::$_ANALYSIS_TEAM_6 => Merakomis::$ANALYSIS_TEAM_6,
Merakomis::$_ANALYSIS_TEAM_7 => Merakomis::$ANALYSIS_TEAM_7,
Merakomis::$_ANALYSIS_TEAM_8 => Merakomis::$ANALYSIS_TEAM_8,
Merakomis::$_ANALYSIS_TEAM_9 => Merakomis::$ANALYSIS_TEAM_9,
Merakomis::$_ANALYSIS_TEAM_10 => Merakomis::$ANALYSIS_TEAM_10,
Merakomis::$_ANALYSIS_TEAM_11 => Merakomis::$ANALYSIS_TEAM_11,
Merakomis::$_ANALYSIS_TEAM_12 => Merakomis::$ANALYSIS_TEAM_12,
Merakomis::$_ANALYSIS_TEAM_1_SUBTITLE => Merakomis::$ANALYSIS_TEAM_1_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_2_SUBTITLE => Merakomis::$ANALYSIS_TEAM_2_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_3_SUBTITLE => Merakomis::$ANALYSIS_TEAM_3_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_4_SUBTITLE => Merakomis::$ANALYSIS_TEAM_4_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_5_SUBTITLE => Merakomis::$ANALYSIS_TEAM_5_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_6_SUBTITLE => Merakomis::$ANALYSIS_TEAM_6_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_7_SUBTITLE => Merakomis::$ANALYSIS_TEAM_7_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_8_SUBTITLE => Merakomis::$ANALYSIS_TEAM_8_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_9_SUBTITLE => Merakomis::$ANALYSIS_TEAM_9_SUBTITLE,
Merakomis::$_ANALYSIS_TEAM_10_SUBTITLE => Merakomis::$ANALYSIS_TEAM_10_SUBTITLE,
Merakomis::$_ANALYSIS_YEAR_1_SUBTITLE => Merakomis::$ANALYSIS_YEAR_1_SUBTITLE,
Merakomis::$_ANALYSIS_YEAR_2_SUBTITLE => Merakomis::$ANALYSIS_YEAR_2_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_1_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_1_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_2_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_2_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_3_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_3_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_4_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_4_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_4_SUBTITLE_2 => Merakomis::$ANALYSIS_COMPANY_4_SUBTITLE_2,
Merakomis::$_ANALYSIS_COMPANY_5_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_5_SUBTITLE,
Merakomis::$_ANALYSIS_COMPANY_6_SUBTITLE => Merakomis::$ANALYSIS_COMPANY_6_SUBTITLE,
Merakomis::$_FOT_TITLE => Merakomis::$FOT_TITLE,
Merakomis::$_FOT_TEXT => Merakomis::$FOT_TEXT,
Merakomis::$_FOT_TITLE_2 => Merakomis::$FOT_TITLE_2,
Merakomis::$_FOT_TEXT_2 => Merakomis::$FOT_TEXT_2,
Merakomis::$_ALL_PROJECTS_TITLE => Merakomis::$ALL_PROJECTS_TITLE,
Merakomis::$_ALL_PROJECTS_TEXT => Merakomis::$ALL_PROJECTS_TEXT,
];
echo je($res);
}
public static function getTableData($post = []) {
$and = [];
if($id = intval($post['data']['params']['id'])){
$and[] = \Where::_operator(Time::$PROJECT,'=',$id);
}
if($emp = intval($post['data']['params']['emp'])){
$and[] = \Where::_operator(Time::$EMP,'=',$emp);
} else {
$and[] = \Where::_operator(Time::$EMP,'=',Emp::$AUTH_ID);
}
if($and){
$post['options'][\Query::WHERE] = \Where::_and($and);
}
$post['options'][\Query::SORT] = [Time::$DATE=>'DESC'];
$post['getData'] = true;
$res = parent::getTableData($post);
/*
switch (intval($id)){
case merakomru::$PARTNERS->id_for_theme : $res['title'] = 'Партнёры'; break;
}
*/
echo je($res);
}
static function getStatTest()
{
echo ini_get('memory_limit');
ini_set('memory_limit', '512M');
set_time_limit(0);
$res = [];
Emp::$AUTH_ID = 7;
Emp::$IS_AUTH = true;
$_POST['type']=1;
$_POST['range'][0]='2024-10-01';
$_POST['range'][0]='2024-09-01';
$_POST['range'][1]='2025-09-30';
$res = Time::getStat($_POST);
//echo je($res);
echo "После: " . (memory_get_usage()/1024/1024) . " байт\n";
echo "Пик: " . (memory_get_peak_usage()/1024/1024) . " байт\n";
}
}