added project detail report (#2651)

- avatars via css only
- random colors for entities
- improves print view
- added colors for teams
- added color to tag
This commit is contained in:
Kevin Papst
2021-07-06 22:01:20 +02:00
committed by GitHub
parent cc6031bfde
commit 9ddb87a6fd
122 changed files with 2736 additions and 1549 deletions

View File

@@ -9,6 +9,58 @@
namespace App\Model;
class ActivityStatistic extends TimesheetCountedStatistic
use App\Entity\Activity;
class ActivityStatistic extends TimesheetCountedStatistic implements \JsonSerializable
{
/**
* @var Activity
*/
private $activity;
public function getActivity(): ?Activity
{
return $this->activity;
}
public function setActivity(Activity $activity): void
{
$this->activity = $activity;
}
/**
* Added for simpler re-use in frontend (charts).
*
* @return string|null
*/
public function getColor(): ?string
{
if ($this->activity === null) {
return null;
}
return $this->activity->getColor();
}
/**
* Added for simpler re-use in frontend (charts).
*
* @return string|null
*/
public function getName(): ?string
{
if ($this->activity === null) {
return null;
}
return $this->activity->getName();
}
public function jsonSerialize()
{
return array_merge(parent::jsonSerialize(), [
'name' => $this->getName(),
'color' => $this->getColor(),
]);
}
}

View File

@@ -11,20 +11,12 @@ namespace App\Model\Statistic;
use DateTime;
class Day
class Day extends Timesheet
{
/**
* @var int
*/
protected $totalDuration = 0;
/**
* @var int|null
*/
private $totalDurationBillable = 0;
/**
* @var float
*/
protected $totalRate = 0.00;
/**
* @var DateTime
*/
@@ -37,8 +29,8 @@ class Day
public function __construct(DateTime $day, int $duration, float $rate)
{
$this->day = $day;
$this->totalDuration = $duration;
$this->totalRate = $rate;
$this->setTotalDuration($duration);
$this->setTotalRate($rate);
}
public function getDay(): DateTime
@@ -46,18 +38,6 @@ class Day
return $this->day;
}
public function getTotalDuration(): int
{
return $this->totalDuration;
}
public function setTotalDuration(int $seconds): Day
{
$this->totalDuration = $seconds;
return $this;
}
public function getTotalDurationBillable(): int
{
return $this->totalDurationBillable;
@@ -68,18 +48,6 @@ class Day
$this->totalDurationBillable = $seconds;
}
public function getTotalRate(): float
{
return $this->totalRate;
}
public function setTotalRate(float $totalRate): Day
{
$this->totalRate = $totalRate;
return $this;
}
public function setDetails(array $details): Day
{
$this->details = $details;

View File

@@ -11,11 +11,9 @@ namespace App\Model\Statistic;
use InvalidArgumentException;
final class Month
final class Month extends Timesheet
{
private $month;
private $totalDuration = 0;
private $totalRate = 0.00;
private $billableDuration = 0;
private $billableRate = 0.00;
@@ -40,30 +38,6 @@ final class Month
return (int) $this->month;
}
public function getTotalDuration(): int
{
return $this->totalDuration;
}
public function setTotalDuration(int $seconds): Month
{
$this->totalDuration = $seconds;
return $this;
}
public function getTotalRate(): float
{
return $this->totalRate;
}
public function setTotalRate(float $totalRate): Month
{
$this->totalRate = $totalRate;
return $this;
}
public function getBillableDuration(): int
{
return $this->billableDuration;

View File

@@ -0,0 +1,87 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Model\Statistic;
class Timesheet
{
private $totalDuration = 0;
private $totalRate = 0.00;
private $totalInternalRate = 0.00;
/**
* For unified access, used in frontend.
*
* @return int
*/
public function getValue(): int
{
return $this->totalDuration;
}
/**
* For unified access, used in frontend.
*
* @return int
*/
public function getDuration(): int
{
return $this->totalDuration;
}
public function getTotalDuration(): int
{
return $this->totalDuration;
}
public function setTotalDuration(int $totalDuration): void
{
$this->totalDuration = $totalDuration;
}
/**
* For unified access, used in frontend.
*
* @return float
*/
public function getRate(): float
{
return $this->totalRate;
}
public function getTotalRate(): float
{
return $this->totalRate;
}
public function setTotalRate(float $totalRate): void
{
$this->totalRate = $totalRate;
}
/**
* For unified access, used in frontend.
*
* @return float
*/
public function getInternalRate(): float
{
return $this->totalInternalRate;
}
public function getTotalInternalRate(): float
{
return $this->totalInternalRate;
}
public function setTotalInternalRate(float $totalInternalRate): void
{
$this->totalInternalRate = $totalInternalRate;
}
}

View File

@@ -0,0 +1,60 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Model\Statistic;
use App\Entity\User;
final class UserYear
{
/**
* @var Year
*/
private $year;
/**
* @var User
*/
private $user;
public function __construct(User $user, Year $year)
{
$this->user = $user;
$this->year = $year;
}
public function getYear(): Year
{
return $this->year;
}
public function getUser(): User
{
return $this->user;
}
public function getDuration(): int
{
$duration = 0;
foreach ($this->year->getMonths() as $month) {
$duration += $month->getDuration();
}
return $duration;
}
public function getRate(): float
{
$rate = 0;
foreach ($this->year->getMonths() as $month) {
$rate += $month->getRate();
}
return $rate;
}
}

View File

@@ -9,19 +9,13 @@
namespace App\Model\Statistic;
/**
* Yearly statistics
*/
class Year
final class Year extends Timesheet
{
/**
* @var string
*/
protected $year;
private $year;
/**
* @var Month[]
*/
protected $months = [];
private $months = [];
public function __construct(string $year)
{

View File

@@ -9,7 +9,7 @@
namespace App\Model;
class TimesheetCountedStatistic
class TimesheetCountedStatistic implements \JsonSerializable
{
private $recordAmount = 0;
private $recordDuration = 0;
@@ -40,6 +40,26 @@ class TimesheetCountedStatistic
return $this;
}
/**
* For unified access, used in frontend.
*
* @return int
*/
public function getValue(): int
{
return $this->recordDuration;
}
/**
* For unified access, used in frontend.
*
* @return int
*/
public function getDuration(): int
{
return $this->recordDuration;
}
/**
* Returns the total duration of all included timesheet records.
*
@@ -61,6 +81,16 @@ class TimesheetCountedStatistic
return $this;
}
/**
* For unified access, used in frontend.
*
* @return float
*/
public function getRate(): float
{
return $this->recordRate;
}
/**
* Returns the total rate of all included timesheet records.
*
@@ -132,4 +162,17 @@ class TimesheetCountedStatistic
{
$this->recordRateBillable = $recordRate;
}
public function jsonSerialize()
{
return [
'duration' => $this->recordDuration,
'duration_billable' => $this->recordDurationBillable,
'rate' => $this->recordRate,
'rate_billable' => $this->recordRateBillable,
'rate_internal' => $this->recordInternalRate,
'amount' => $this->recordAmount,
'amount_billable' => $this->recordAmountBillable,
];
}
}

View File

@@ -0,0 +1,40 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Model;
use App\Entity\User;
use App\Model\Statistic\Month;
class UserStatistic extends TimesheetCountedStatistic
{
/**
* @var User
*/
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function getUser(): User
{
return $this->user;
}
public function addValuesFromMonth(Month $month): void
{
$this->setRecordDuration($this->getRecordDuration() + $month->getTotalDuration());
$this->setDurationBillable($this->getDurationBillable() + $month->getBillableDuration());
$this->setRecordRate($this->getRate() + $month->getTotalRate());
$this->setRateBillable($this->getRateBillable() + $month->getBillableRate());
$this->setRecordInternalRate($this->getRecordInternalRate() + $month->getTotalInternalRate());
}
}