392 lines
12 KiB
PHP
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
|
|
|
|
|