/** * Prepare summary */ protected function prepare() { parent::prepare(); $this->Title = sprintf(__('All training weeks %s'), $this->Year); $this->TimeEnd = $this->Year == date("Y") ? Time::weekend(time()) : Time::weekend(mktime(1, 0, 0, 12, 31, $this->Year)); $this->TimeStart = Time::weekstart(mktime(1, 0, 0, 12, 31, $this->Year - 1)); }
/** * Head for row * @param int $index * @return string */ protected function rowHead($index) { $time = $this->TimeEnd - ($index + 0.5) * 7 * DAY_IN_S; $start = Time::weekstart($time); $end = Time::weekend($time); $week = Icon::$CALENDAR . ' ' . __('Week') . ' ' . date('W', $time); return DataBrowserLinker::link($week, $start, $end, '') . '</span> <span class="small">' . date('d.m', $start) . ' - ' . date('d.m', $end); }
public function testWeekstartAndWeekendForSundayBug() { Configuration::General()->weekStart()->set(WeekStart::SUNDAY); $today = mktime(0, 0, 0, 10, 25, 2015); $end = mktime(23, 59, 50, 10, 31, 2015); $this->assertEquals($today, Time::weekstart($today)); $this->assertEquals($today, Time::weekstart($end)); $this->assertEquals($end, Time::weekend($today)); $this->assertEquals($end, Time::weekend($end)); }
/** * Get the timeset as array for this panel */ private function getTimeset() { $timeset = array(); // km-Spiel Saisonen $kmstart = new DateTime(); $kmstart->setTime(0, 0, 0); $kmend = new DateTime(); $kmend->setTime(0, 0, 0); $now = new DateTime("now"); $kmstart->setISODate(date('Y'), 27, 1); if ($kmstart > $now) { $kmstart->setISODate(date('Y'), 1, 1); $kmend->setISODate(date('Y'), 26, 7); } else { $weeks = date('W', strtotime(date('Y') . '-12-31')); $kmend->setISODate(date('Y'), $weeks == 53 ? 53 : 52, 7); } echo new DateTime(date('o-\\WW')); // Zeitraeume fuer die Prognosen. $Time = new Time(); $timeset['woche'] = array('name' => __('Week'), 'start' => (new DateTime())->setTimestamp(Time::weekstart(time())), 'end' => (new DateTime())->setTimestamp(Time::weekend(time()) . " + 6 days")); $timeset['mon'] = array('name' => __('Month'), 'start' => new DateTime(date("Y-m-01")), 'end' => new Datetime(date('Y-m-t'))); $timeset['hj'] = array('name' => __('Half-Year'), 'start' => new DateTime(date('m') < 7 ? date("Y-01-01") : date("Y-07-01")), 'end' => new Datetime(date('m') < 7 ? date("Y-06-30") : date('Y-12-31'))); $timeset['saison'] = array('name' => __('Saison'), 'start' => $kmstart, 'end' => $kmend, 'note' => __('Note: Saison means the current season in the german "kmspiel"')); $timeset['jahr'] = array('name' => __('Year'), 'start' => new DateTime(date("Y-01-01")), 'end' => new Datetime(date('Y-12-31'))); return $timeset; }
/** * Init private timestamps from request */ protected function initTimestamps() { if (!isset($_GET['start']) || !isset($_GET['end'])) { $Mode = Configuration::DataBrowser()->mode(); if ($Mode->showMonth()) { $this->timestamp_start = mktime(0, 0, 0, date("m"), 1, date("Y")); $this->timestamp_end = mktime(23, 59, 50, date("m") + 1, 0, date("Y")); } else { $this->timestamp_start = Time::weekstart(time()); $this->timestamp_end = Time::weekend(time()); } } else { $this->timestamp_start = $_GET['start']; $this->timestamp_end = $_GET['end']; } $this->day_count = round(($this->timestamp_end - $this->timestamp_start) / 86400); }
/** * Show values */ protected function showValues() { $ModelQuery = new Performance\ModelQuery(); $ModelQuery->execute(DB::getInstance()); $TSBmodel = new Performance\TSB($ModelQuery->data(), Configuration::Trimp()->daysForCTL(), Configuration::Trimp()->daysForATL()); $TSBmodel->calculate(); $MonotonyQuery = new Performance\ModelQuery(); $MonotonyQuery->setRange(time() - (Monotony::DAYS - 1) * DAY_IN_S, time()); $MonotonyQuery->execute(DB::getInstance()); $Monotony = new Monotony($MonotonyQuery->data()); $Monotony->calculate(); $VDOT = Configuration::Data()->vdot(); $ATLmax = Configuration::Data()->maxATL(); $CTLmax = Configuration::Data()->maxCTL(); $ModelATLmax = $TSBmodel->maxFatigue(); $ModelCTLmax = $TSBmodel->maxFitness(); if ($ModelATLmax > $ATLmax) { Configuration::Data()->updateMaxATL($ModelATLmax); $ATLmax = $ModelATLmax; } if ($ModelCTLmax > $CTLmax) { Configuration::Data()->updateMaxCTL($ModelCTLmax); $CTLmax = $ModelCTLmax; } $ATLabsolute = $TSBmodel->fatigueAt(0); $CTLabsolute = $TSBmodel->fitnessAt(0); $TSBabsolute = $TSBmodel->performanceAt(0); $TrimpValues = array('ATL' => round(100 * $ATLabsolute / $ATLmax), 'ATLstring' => Configuration::Trimp()->showInPercent() ? round(100 * $ATLabsolute / $ATLmax) . ' %' : $ATLabsolute, 'CTL' => round(100 * $CTLabsolute / $CTLmax), 'CTLstring' => Configuration::Trimp()->showInPercent() ? round(100 * $CTLabsolute / $CTLmax) . ' %' : $CTLabsolute, 'TSB' => round(100 * $TSBabsolute / max($ATLabsolute, $CTLabsolute, 1)), 'TSBstring' => Configuration::Trimp()->showTSBinPercent() ? sprintf("%+d", round(100 * $TSBabsolute / max($ATLabsolute, $CTLabsolute))) . ' %' : sprintf("%+d", $TSBabsolute)); $TSBisPositive = $TrimpValues['TSB'] > 0; $maxTrimpToBalanced = ceil($TSBmodel->maxTrimpToBalanced($CTLabsolute, $ATLabsolute)); $restDays = ceil($TSBmodel->restDays($CTLabsolute, $ATLabsolute)); $JDQuery = Cache::get(self::CACHE_KEY_JD_POINTS); if (is_null($JDQuery)) { $JDQueryLastWeek = DB::getInstance()->query('SELECT SUM(`jd_intensity`) FROM `' . PREFIX . 'training` WHERE `time`>=' . Time::weekstart(time() - 7 * DAY_IN_S) . ' AND `time`<' . Time::weekend(time() - 7 * DAY_IN_S) . ' AND accountid = ' . SessionAccountHandler::getId()); $JDQueryThisWeek = DB::getInstance()->query('SELECT SUM(`jd_intensity`) FROM `' . PREFIX . 'training` WHERE `time`>=' . Time::weekstart(time()) . ' AND `time`<' . Time::weekend(time()) . ' AND accountid = ' . SessionAccountHandler::getId()); $JDQuery['LastWeek'] = Helper::Unknown($JDQueryLastWeek->fetchColumn(), 0); $JDQuery['ThisWeek'] = Helper::Unknown($JDQueryThisWeek->fetchColumn(), 0); Cache::set(self::CACHE_KEY_JD_POINTS, $JDQuery, '600'); } $JDPointsLastWeek = $JDQuery['LastWeek']; $JDPointsThisWeek = $JDQuery['ThisWeek']; $JDPointsPrognosis = round($JDPointsThisWeek / (7 - (Time::weekend(time()) - time()) / DAY_IN_S) * 7); $Values = array(array('show' => $this->Configuration()->value('show_vdot'), 'bars' => array(new ProgressBarSingle(2 * round($VDOT - 30), ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => '', 'value' => number_format($VDOT, 2), 'title' => __('VDOT'), 'small' => '', 'tooltip' => __('Current average VDOT')), array('show' => $this->Configuration()->value('show_basicendurance'), 'bars' => array(new ProgressBarSingle(BasicEndurance::getConst(), ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => '', 'value' => BasicEndurance::getConst() . ' %', 'title' => __('Basic endurance'), 'small' => '', 'tooltip' => __('<em>Experimental value!</em><br>100 % means: you had enough long runs and kilometers per week to run a good marathon, based on your current VDOT.')), array('show' => $this->Configuration()->value('show_trimpvalues'), 'bars' => array(new ProgressBarSingle($TrimpValues['ATL'], ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => sprintf(__('Current value: %s<br>Maximal value: %s<br>as percentage: %s %'), $ATLabsolute, $ATLmax, $TrimpValues['ATL']), 'value' => $TrimpValues['ATLstring'], 'title' => __('Fatigue'), 'small' => '(ATL)', 'tooltip' => __('Actual Training Load<br><small>Average training impulse of the last weeks in relation to your maximal value.</small>')), array('show' => $this->Configuration()->value('show_trimpvalues'), 'bars' => array(new ProgressBarSingle($TrimpValues['CTL'], ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => sprintf(__('Current value: %s<br>Maximal value: %s<br>as percentage: %s %'), $CTLabsolute, $CTLmax, $TrimpValues['CTL']), 'value' => $TrimpValues['CTLstring'], 'title' => __('Fitness level'), 'small' => '(CTL)', 'tooltip' => __('Chronical Training Load<br><small>Average training impulse of the last months in relation to your maximal value.</small>')), array('show' => $this->Configuration()->value('show_trimpvalues'), 'bars' => array(new ProgressBarSingle(abs($TrimpValues['TSB']) / 2, $TSBisPositive ? ProgressBarSingle::$COLOR_GREEN : ProgressBarSingle::$COLOR_RED, $TSBisPositive ? 'right' : 'left')), 'bar-tooltip' => 'TSB = CTL - ATL<br>' . sprintf(__('absolute: %s<br>as percentage: %s %'), $CTLabsolute . ' - ' . $ATLabsolute . ' = ' . sprintf("%+d", $TSBabsolute), $TrimpValues['TSB']), 'value' => $TrimpValues['TSBstring'], 'title' => __('Stress Balance'), 'small' => '(TSB)', 'tooltip' => __('Training Stress Balance (= CTL - ATL)<br>> 0: You are relaxing.<br>' . '< 0: You are training hard.')), array('show' => $this->Configuration()->value('show_trimpvalues') && !$TSBisPositive, 'bars' => array(new ProgressBarSingle(100 * $restDays / 7, ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => '', 'value' => $restDays, 'title' => __('Rest days'), 'small' => '', 'tooltip' => __('Rest days needed to reach TSB = 0')), array('show' => $this->Configuration()->value('show_trimpvalues') && $TSBisPositive, 'bars' => array(new ProgressBarSingle(100 * $maxTrimpToBalanced / 1000, ProgressBarSingle::$COLOR_BLUE)), 'bar-tooltip' => '', 'value' => $maxTrimpToBalanced, 'title' => __('Easy TRIMP'), 'small' => '', 'tooltip' => __('Max TRIMP that will still keep you at TSB = 0')), array('show' => $this->Configuration()->value('show_trimpvalues_extra'), 'bars' => array(new ProgressBarSingle($Monotony->valueAsPercentage(), $Monotony->value() > Monotony::CRITICAL ? ProgressBarSingle::$COLOR_RED : $Monotony->value() > Monotony::WARNING ? ProgressBarSingle::$COLOR_ORANGE : ProgressBarSingle::$COLOR_GREEN)), 'bar-tooltip' => 'Monotony = avg(Trimp)/stddev(Trimp)', 'value' => number_format($Monotony->value(), 2), 'title' => __('Monotony'), 'small' => '', 'tooltip' => __('Monotony<br><small>Monotony of your last seven days.<br>Values below 1.5 are preferable.</small>')), array('show' => $this->Configuration()->value('show_trimpvalues_extra'), 'bars' => array(new ProgressBarSingle($Monotony->trainingStrainAsPercentage(), $Monotony->trainingStrainAsPercentage() >= 75 ? ProgressBarSingle::$COLOR_RED : ($Monotony->trainingStrainAsPercentage() >= 50 ? ProgressBarSingle::$COLOR_ORANGE : ProgressBarSingle::$COLOR_GREEN))), 'bar-tooltip' => 'Training strain = sum(Trimp)*Monotony', 'value' => round($Monotony->trainingStrain()), 'title' => __('Training strain'), 'small' => '', 'tooltip' => __('Training strain<br><small>of your last seven days</small>')), array('show' => $this->Configuration()->value('show_jd_intensity'), 'bars' => array(new ProgressBarSingle($JDPointsPrognosis / 2, ProgressBarSingle::$COLOR_LIGHT), new ProgressBarSingle($JDPointsThisWeek / 2, ProgressBarSingle::$COLOR_RED)), 'bar-goal' => $JDPointsLastWeek / 2, 'bar-tooltip' => sprintf(__('This week: %s training points<br>Prognosis: ca. %s training points<br>Last week: %s training points'), $JDPointsThisWeek, $JDPointsPrognosis, $JDPointsLastWeek), 'value' => $JDPointsThisWeek, 'title' => __('Training points'), 'small' => '', 'tooltip' => __('Training intensity by Jack Daniels.<br>' . 'Jack Daniels considers the following levels:<br>' . '50 points: Beginner<br>' . '100 points: Advanced Runner<br>' . '200 points: Pro Runner'))); $this->showTableForValues($Values); }
/** * Get a ajax-link to a specified DataBrowser * @param string $name Name to be displayed as link * @param int $time Timestamp of the week * @return string HTML-link */ public static function weekLink($name, $time) { return self::link($name, Time::weekstart($time), Time::weekend($time), '', 'week-link'); }
/** * Display the table with most kilometer for each year/month/week */ private function displayMostKilometer() { echo '<table class="fullwidth zebra-style">'; echo '<thead><tr><th colspan="11" class="l">' . __('Most kilometers') . '</th></tr></thead>'; echo '<tbody>'; if (empty($this->weeks)) { echo '<tr><td colspan="11"><em>' . __('No data available') . '</em></td></tr>'; echo HTML::spaceTR(11); echo '</tbody>'; echo '</table>'; return; } // Years if ($this->year == -1) { echo '<tr class="r"><td class="c b">' . __('per year') . '</td>'; foreach ($this->years as $i => $year) { $link = DataBrowserLinker::link(Distance::format($year['km']), mktime(0, 0, 0, 1, 1, $year['year']), mktime(23, 59, 50, 12, 31, $year['year'])); echo '<td class="small"><span title="' . $year['year'] . '">' . $link . '</span></td>'; } for (; $i < 9; $i++) { echo HTML::emptyTD(); } echo '</tr>'; } // Months echo '<tr class="r"><td class="c b">' . __('per month') . '</td>'; foreach ($this->months as $i => $month) { $link = DataBrowserLinker::link(Distance::format($month['km']), mktime(0, 0, 0, $month['month'], 1, $month['year']), mktime(23, 59, 50, $month['month'] + 1, 0, $month['year'])); echo '<td class="small"><span title="' . Time::month($month['month']) . ' ' . $month['year'] . '">' . $link . '</span></td>'; } for (; $i < 9; $i++) { echo HTML::emptyTD(); } echo '</tr>'; // Weeks echo '<tr class="r"><td class="c b">' . __('per week') . '</td>'; foreach ($this->weeks as $i => $week) { $link = DataBrowserLinker::link(Distance::format($week['km']), Time::weekstart($week['time']), Time::weekend($week['time'])); echo '<td class="small"><span title="' . __('Week') . ' ' . $week['week'] . ' ' . $week['year'] . '">' . $link . '</span></td>'; } for (; $i < 9; $i++) { echo HTML::emptyTD(); } echo '</tr>'; echo '</tbody>'; echo '</table>'; }
/** * Week link * @param string $name [optional] * @return string */ public function weekLink($name = '') { if ($name == '') { $name = date('d.m.Y', $this->Activity->timestamp()); } return DataBrowserLinker::link($name, Time::weekstart($this->Activity->timestamp()), Time::weekend($this->Activity->timestamp())); }