meraproject/themes/merakomis/day/model.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

392 lines
12 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 ModuleBZ\Form\Input\DatePicker;
use ModuleBZ\Form\Input\Select;
use ModuleBZ\Layout\Column;
use ms\ms\structure\msModuleTable;
use common\Image;
use ModuleBZ\Form\Input\ImagePicker;
use ModuleBZ\Form\Input\Switcher;
use ModuleBZ\Form\Input\Text;
use ModuleBZ\Form\Input\Textarea;
use ModuleBZ\Layout\Row;
use themes\Merakomis;
use themes\merakomis\Day\structure\EDayType;
use themes\merakomis\day\structure\lang as Vars;
use themes\merakomis\input\Save as InputSave;
use themes\merakomis\structure\merakomisModuleTable;
use themes\merakomis\time\Cache;
class Day extends merakomisModuleTable {
static $self;
static $cache = [];
static $table_name = 'tMerakomisDay';
static $controller = 'themes.merakomis.day';
static $ID = 'id';
static $DATE = 'date';
static $TYPE = 'type';
static $TEXT = 'text';
static $HOURS = 'hours';
static $PORTAL = 'portal';
static $PROFILE = 'profile';
static $ACCOUNT = 'account';
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
static function getSystemLangValues():array{ return Vars::getArray(); }
public function _insert(array $values, array $options = array())
{
$res = parent::_insert($values, $options);
$date = $values[self::$DATE];
Cache::removeRows($date);
return $res;
}
public function _updateById(int $id, array $values)
{
$C = self::getByID($id);
$res = parent::_updateById($id, $values);
if($values[self::$DATE]) {
Cache::removeRows($C[self::$DATE]);
Cache::removeRows($values[self::$DATE]);
}
return $res;
}
public function _deleteById(int $id)
{
$C = self::getByID($id);
$res = parent::_deleteById($id);
Cache::removeRows($C[self::$DATE]);
return $res;
}
public static function installUniques() {
parent::installUniques();
\DB::addUnique(self::$table_name,self::$table_name.'_unique',[self::$DATE]);
}
static function getStat($year){
$year = intval($year);
$begin = date($year.'-01-01');
$end = date($year.'-12-31');
$r = self::select([
\Query::SELECT => ['COUNT(*) as cc',Day::$TYPE],
\Query::WHERE => \Where::_operator(self::$DATE,'LIKE',$year.'%'),
\Query::GROUP_BY=>[
Day::$TYPE,
],
]);
$days = [];
while($l = \DB::fetch($r)){
$days[$l[Day::$TYPE]] = intval($l['cc']);
}
$earlier = new \DateTime($begin);
$later = new \DateTime($end);
$all_days = $earlier->diff($later)->days+1;
$work_days = self::getWorkDays($begin,$end);
$short_days = $days[EDayType::SHORT];
$no_work = $all_days - $work_days - $short_days;
$res = [
'total_days' => intval($all_days),
'work_days' => intval($work_days),
'short_days' => intval($short_days),
'no_work_days' => intval($no_work),
'hours' => self::getWorkHours($begin,$end),
];
return $res;
}
static function getByDateFormatted($date){
$res = [];
$a = self::getByDate($date);
foreach ($a as $v){
$res[] = self::format($v);
}
return $res;
}
static function getPerHour(){
return 8;
}
static function getWorkHoursByDate($date){
$a = self::getByDate($date);
$day = array_pop($a);
if($day){
$res = self::getWorkHoursInDay($day);
} else {
$res = self::getWorkHoursInDate($date);
}
return $res;
}
static function getWorkHoursInDay($day = null){
if($day) {
return $day[self::$HOURS];
}
return self::getWorkHoursInDate($day[self::$DATE]);
}
static $all_days = null;
static function getAllDays(){
if(self::$all_days) return self::$all_days;
$a = self::getAll();
$res = [];
foreach ($a as $v){
$res[$v[Day::$DATE]] = $v;
}
return self::$all_days = $res;
}
static function isNoWorkDay($date){
$w = date('w',strtotime($date));
$res = false;
$days = self::getAllDays();
if($day = $days[$date]){
if($day[Day::$TYPE]==EDayType::NO_WORK){
$res = true;
}
}
if(!$res){
$res = ($w==0 || $w==6);
}
return $res;
}
static function getWorkHoursInDate($date){
$w = date('w',strtotime($date));
if(in_array($w,[1,2,3,4,5])){
return self::getPerHour();
} else {
return 0;
}
}
static function getWorkDays($begin_date,$end_date){
$key = $begin_date.':'.$end_date.'_days';
if(isset(static::$cache[$key])) return static::$cache[$key];
$begin = strtotime($begin_date);
$end = strtotime($end_date);
$day = 60*60*24;
$res = 0;
$dates = [];
$r = self::select([
\Query::WHERE => new \Where(\Where::_and([
\Where::_between( self::$DATE,$begin_date,$end_date )
]))
]);
while ($l = \DB::fetch($r)){
$dates[$l[self::$DATE]] = $l;
}
for($i=$begin; $i<=$end; $i+=$day){
$date = date('Y-m-d',$i);
if($d = $dates[$date]){
$res += (self::getWorkHoursInDay($d)>0?1:0);
} else {
$res += (self::getWorkHoursInDate($date)?1:0);
}
}
return static::$cache[$key] = $res;
}
static function getWorkHours($begin_date,$end_date){
$key = $begin_date.':'.$end_date;
if(isset(static::$cache[$key])) return static::$cache[$key];
$begin = strtotime($begin_date);
$end = strtotime($end_date);
$day = 60*60*24;
$res = 0;
$perHour = self::getPerHour();
$dates = [];
$r = self::select([
\Query::WHERE => new \Where(\Where::_and([
\Where::_between( self::$DATE,$begin_date,$end_date )
]))
]);
while ($l = \DB::fetch($r)){
$dates[$l[self::$DATE]] = $l;
}
for($i=$begin; $i<=$end; $i+=$day){
$date = date('Y-m-d',$i);
//$res+=self::getWorkHoursInDay();
if($d = $dates[$date]){
$res += self::getWorkHoursInDay($d);
} else {
$res += self::getWorkHoursInDate($date);
}
}
return static::$cache[$key] = $res;
}
public static function afterUadd($values, $id, $result) {
$res = parent::afterUadd($values, $id, $result);
self::updateById($id,[
self::$TYPE=>$values['type'],
self::$HOURS=>$values['hours'],
]);
return $res;
}
static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) {
$form->addRow((new Row())
->addColumn((new Column())->setClassAll('c-40 ')->addRow((new Row())))
->addColumn(
(new Column())->setClassAll('c-20 ')->addRow((new Row())
->addColumn(((new Text())
->setName(self::$TEXT)
->setValue($C[self::$TEXT])
->setClassAll('c-100')
->setLabel($c = V::get(Vars::$TEXT))
->setPlaceholder($c)
))
->addColumn(((new DatePicker())
->setName(self::$DATE)
->setValue($C[self::$DATE])
->setClassAll('c-100')
->setLabel($c = V::get(Vars::$DATE))
->setPlaceholder($c)
))
->addColumn(((new Select())
->setName('type')
->setValue(intval($C[self::$TYPE]) ?: EDayType::WORK )
->setClassAll('c-100')
->setLabel($c = V::get(Vars::$TYPE))
->setPlaceholder($c)
->setOptions(EDayType::getNameList())
))
->addColumn(((new Text())
->setName('hours')
->setValue($C ? $C[self::$HOURS] : 8)
->setClassAll('c-100')
->setLabel($c = V::get(Vars::$HOURS))
->setPlaceholder($c)
->setDisabled(
(isset($C[self::$TYPE]) and in_array($C[self::$TYPE],[EDayType::NO_WORK,EDayType::WORK]))
or !$C
)
))
)->addRow((new Row())
->addColumn(((new InputSave())->setClassAll('c-100')->setName('save')))
)
))
;
}
static function getByDate($date){
return self::select([
\Query::WHERE => \Where::_operator(self::$DATE,'=',$date)
],true);
}
static function getByRangeFormatted($begin,$end){
$res = [];
$r = self::select([
\Query::WHERE => \Where::_between(self::$DATE,$begin,$end)
]);
while($l = \DB::fetch($r)){
$res[$l[self::$DATE]] = self::format($l);
}
return $res;
}
static function format($v){
return [
'date'=>$v[self::$DATE],
'type'=>intval($v[self::$TYPE]),
'text'=>trim($v[self::$TEXT]),
];
}
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),
]),
new C([
C::VAR_NAME => &self::$DATE,
C::TYPE => eColumnType::DATE,
C::TH =>V::get(Vars::$DATE),
C::FILTER_TYPE => eFilterType::DATE,
C::FUNC_VALUE_DATA => function($v){
return Merakomis::fdate($v[self::$DATE]);
}
]),
new C([
C::VAR_NAME => &self::$TYPE,
C::TYPE => eColumnType::INT,
C::TH =>V::get(Vars::$TYPE),
C::FUNC_VALUE_DATA => function($v){
return EDayType::getName($v[self::$TYPE]);
}
]),
new C([
C::VAR_NAME => &self::$TEXT,
C::TYPE => eColumnType::TEXT,
C::TH =>V::get(Vars::$TEXT),
]),
new C([
C::VAR_NAME => &self::$HOURS,
C::TYPE => eColumnType::DOUBLE,
C::TH =>V::get(Vars::$HOURS),
C::LENGTH => '10,1'
]),
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::$PROFILE,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(PID),
//C::TH => V::get(Vars::$PROFILE),
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 Day();
/// controller.php