fix billable calculation on timesheet restart (#3225)

This commit is contained in:
Kevin Papst
2022-03-29 23:24:22 +02:00
committed by GitHub
parent 2c2ba2e32c
commit 31743cf962
5 changed files with 204 additions and 32 deletions

View File

@@ -21,6 +21,7 @@ use App\Form\Type\TimesheetBillableType;
use App\Form\Type\UserType;
use App\Form\Type\YesNoType;
use App\Repository\CustomerRepository;
use App\Timesheet\Calculator\BillableCalculator;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\FormBuilderInterface;
@@ -279,36 +280,8 @@ class TimesheetEditForm extends AbstractType
return $record;
},
function (Timesheet $record) {
switch ($record->getBillableMode()) {
case Timesheet::BILLABLE_NO:
$record->setBillable(false);
break;
case Timesheet::BILLABLE_YES:
$record->setBillable(true);
break;
case Timesheet::BILLABLE_AUTOMATIC:
$billable = true;
$activity = $record->getActivity();
if ($activity !== null && !$activity->isBillable()) {
$billable = false;
}
$project = $record->getProject();
if ($billable && $project !== null && !$project->isBillable()) {
$billable = false;
}
if ($billable && $project !== null) {
$customer = $project->getCustomer();
if ($customer !== null && !$customer->isBillable()) {
$billable = false;
}
}
$record->setBillable($billable);
break;
}
$billable = new BillableCalculator();
$billable->calculate($record);
return $record;
}

View File

@@ -0,0 +1,53 @@
<?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\Timesheet\Calculator;
use App\Entity\Timesheet;
use App\Timesheet\CalculatorInterface;
/**
* Implementation to calculate the billable field for a timesheet record.
*/
class BillableCalculator implements CalculatorInterface
{
public function calculate(Timesheet $record)
{
switch ($record->getBillableMode()) {
case Timesheet::BILLABLE_NO:
$record->setBillable(false);
break;
case Timesheet::BILLABLE_YES:
$record->setBillable(true);
break;
case Timesheet::BILLABLE_AUTOMATIC:
$billable = true;
$activity = $record->getActivity();
if ($activity !== null && !$activity->isBillable()) {
$billable = false;
}
$project = $record->getProject();
if ($billable && $project !== null && !$project->isBillable()) {
$billable = false;
}
if ($billable && $project !== null) {
$customer = $project->getCustomer();
if ($customer !== null && !$customer->isBillable()) {
$billable = false;
}
}
$record->setBillable($billable);
break;
}
}
}

View File

@@ -61,7 +61,8 @@ final class TimesheetLongRunningValidator extends ConstraintValidator
}
$duration = $timesheet->getEnd()->getTimestamp() - $timesheet->getBegin()->getTimestamp();
$minutes = (int) $duration / 60;
// float on purpose, because one second more than the configured minutes is already too long
$minutes = $duration / 60;
if ($minutes < $maxMinutes) {
return;