['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