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:
@@ -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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
87
src/Model/Statistic/Timesheet.php
Normal file
87
src/Model/Statistic/Timesheet.php
Normal 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;
|
||||
}
|
||||
}
|
||||
60
src/Model/Statistic/UserYear.php
Normal file
60
src/Model/Statistic/UserYear.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
40
src/Model/UserStatistic.php
Normal file
40
src/Model/UserStatistic.php
Normal 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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user