diff --git a/src/Configuration/SystemConfiguration.php b/src/Configuration/SystemConfiguration.php index a4597515..7a4459b0 100644 --- a/src/Configuration/SystemConfiguration.php +++ b/src/Configuration/SystemConfiguration.php @@ -232,6 +232,11 @@ class SystemConfiguration implements SystemBundleConfiguration return (string) $this->find('timesheet.default_begin'); } + public function getTimesheetDefaultBillable(): bool + { + return (bool) $this->find('defaults.timesheet.billable'); + } + public function isTimesheetAllowFutureTimes(): bool { return (bool) $this->find('timesheet.rules.allow_future_times'); diff --git a/src/Controller/SystemConfigurationController.php b/src/Controller/SystemConfigurationController.php index 270ac554..22c283f9 100644 --- a/src/Controller/SystemConfigurationController.php +++ b/src/Controller/SystemConfigurationController.php @@ -382,6 +382,10 @@ final class SystemConfigurationController extends AbstractController ->setConstraints([ new GreaterThanOrEqual(['value' => 0]) ]), + (new Configuration()) + ->setName('defaults.timesheet.billable') + ->setType(YesNoType::class) + ->setOptions(['help' => 'default_value_new', 'label' => 'label.billable']), ]), (new SystemConfigurationModel()) ->setSection(SystemConfigurationModel::SECTION_LOCKDOWN) diff --git a/src/Controller/TimesheetAbstractController.php b/src/Controller/TimesheetAbstractController.php index 55a5b01a..a536a1f2 100644 --- a/src/Controller/TimesheetAbstractController.php +++ b/src/Controller/TimesheetAbstractController.php @@ -364,6 +364,10 @@ abstract class TimesheetAbstractController extends AbstractController $timesheet->setExported($dto->isExported()); $execute = true; } + if (null !== $dto->isBillable()) { + $timesheet->setBillable($dto->isBillable()); + $execute = true; + } if ($dto->isRecalculateRates()) { $timesheet->setFixedRate(null); diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index ebadf0b0..81d3ad3f 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -635,6 +635,12 @@ class Configuration implements ConfigurationInterface ->scalarNode('currency')->defaultValue(Customer::DEFAULT_CURRENCY)->end() ->end() ->end() + ->arrayNode('timesheet') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('billable')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('user') ->addDefaultsIfNotSet() ->children() diff --git a/src/Form/MultiUpdate/TimesheetMultiUpdate.php b/src/Form/MultiUpdate/TimesheetMultiUpdate.php index 6297294e..45c89cd0 100644 --- a/src/Form/MultiUpdate/TimesheetMultiUpdate.php +++ b/src/Form/MultiUpdate/TimesheetMultiUpdate.php @@ -207,6 +207,17 @@ class TimesheetMultiUpdate extends AbstractType ]); } + if ($options['include_billable']) { + $builder->add('billable', ChoiceType::class, [ + 'label' => 'label.billable', + 'choices' => [ + '' => null, + 'yes' => true, + 'no' => false, + ], + ]); + } + if ($options['include_rate']) { $builder ->add('recalculateRates', YesNoType::class, [ @@ -279,6 +290,7 @@ class TimesheetMultiUpdate extends AbstractType 'include_user' => false, 'include_rate' => false, 'include_exported' => false, + 'include_billable' => true, ]); } } diff --git a/src/Form/MultiUpdate/TimesheetMultiUpdateDTO.php b/src/Form/MultiUpdate/TimesheetMultiUpdateDTO.php index 7b7fb083..a6f5f2f8 100644 --- a/src/Form/MultiUpdate/TimesheetMultiUpdateDTO.php +++ b/src/Form/MultiUpdate/TimesheetMultiUpdateDTO.php @@ -22,6 +22,7 @@ use Doctrine\Common\Collections\Collection; /** * @App\Validator\Constraints\TimesheetMultiUpdate + * @internal */ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithMetaFields { @@ -57,6 +58,10 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM * @var bool|null */ private $exported = null; + /** + * @var bool|null + */ + private $billable = null; /** * @var float|null */ @@ -84,11 +89,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->customer; } - public function setCustomer(Customer $customer): TimesheetMultiUpdateDTO + public function setCustomer(Customer $customer): void { $this->customer = $customer; - - return $this; } public function getProject(): ?Project @@ -96,11 +99,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->project; } - public function setProject(Project $project): TimesheetMultiUpdateDTO + public function setProject(Project $project): void { $this->project = $project; - - return $this; } public function getActivity(): ?Activity @@ -108,11 +109,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->activity; } - public function setActivity(Activity $activity): TimesheetMultiUpdateDTO + public function setActivity(Activity $activity): void { $this->activity = $activity; - - return $this; } /** @@ -123,11 +122,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->tags; } - public function setTags(iterable $tags): TimesheetMultiUpdateDTO + public function setTags(iterable $tags): void { $this->tags = $tags; - - return $this; } public function getUser(): ?User @@ -135,11 +132,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->user; } - public function setUser(User $user): TimesheetMultiUpdateDTO + public function setUser(User $user): void { $this->user = $user; - - return $this; } public function isExported(): ?bool @@ -147,11 +142,19 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->exported; } - public function setExported(bool $exported): TimesheetMultiUpdateDTO + public function setExported(?bool $exported): void { $this->exported = $exported; + } - return $this; + public function isBillable(): ?bool + { + return $this->billable; + } + + public function setBillable(?bool $billable): void + { + $this->billable = $billable; } public function isRecalculateRates(): bool @@ -159,11 +162,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->recalculateRates; } - public function setRecalculateRates(bool $recalculateRates): TimesheetMultiUpdateDTO + public function setRecalculateRates(bool $recalculateRates): void { $this->recalculateRates = $recalculateRates; - - return $this; } public function isReplaceTags(): bool @@ -171,11 +172,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->replaceTags; } - public function setReplaceTags(bool $replaceTags): TimesheetMultiUpdateDTO + public function setReplaceTags(bool $replaceTags): void { $this->replaceTags = $replaceTags; - - return $this; } public function getFixedRate(): ?float @@ -183,11 +182,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->fixedRate; } - public function setFixedRate(?float $fixedRate): TimesheetMultiUpdateDTO + public function setFixedRate(?float $fixedRate): void { $this->fixedRate = $fixedRate; - - return $this; } public function getHourlyRate(): ?float @@ -195,11 +192,9 @@ class TimesheetMultiUpdateDTO extends MultiUpdateTableDTO implements EntityWithM return $this->hourlyRate; } - public function setHourlyRate(?float $hourlyRate): TimesheetMultiUpdateDTO + public function setHourlyRate(?float $hourlyRate): void { $this->hourlyRate = $hourlyRate; - - return $this; } /** diff --git a/src/Timesheet/TimesheetService.php b/src/Timesheet/TimesheetService.php index ecacdb7a..44e80eff 100644 --- a/src/Timesheet/TimesheetService.php +++ b/src/Timesheet/TimesheetService.php @@ -110,6 +110,8 @@ final class TimesheetService $mode = $this->trackingModeService->getActiveMode(); $mode->create($timesheet, $request); + $timesheet->setBillable($this->configuration->getTimesheetDefaultBillable()); + return $timesheet; } diff --git a/templates/timesheet/layout-multi-update.html.twig b/templates/timesheet/layout-multi-update.html.twig index da6c2c29..797ade92 100644 --- a/templates/timesheet/layout-multi-update.html.twig +++ b/templates/timesheet/layout-multi-update.html.twig @@ -36,6 +36,11 @@ {{ form_row(form.exported) }} {% endif %} + {% if form.billable is defined %} +
+ {% endif %} {% if form.recalculateRates is defined %}