diff --git a/.gitignore b/.gitignore
index 5c8d479e..ec71ad97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
# ========== KIMAI ==========
# some hosters require a htaccess to change the PHP version
.htaccess
-
+.env-*
.idea/
.DS_Store
diff --git a/README.md b/README.md
index 4049845a..357e7830 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,9 @@
Kimai - time-tracker
Kimai is a free, open source and online time-tracking software designed for small businesses and freelancers.
-It is built with modern technologies such as Symfony, Bootstrap, RESTful API, Doctrine, AdminLTE, Webpack, ES6 etc.
+It is built with modern technologies such as [Symfony](https://github.com/symfony/symfony), [Bootstrap](https://github.com/twbs/bootstrap),
+[RESTful API](https://github.com/FriendsOfSymfony/FOSRestBundle), [Doctrine](https://github.com/doctrine/),
+[AdminLTE](https://github.com/kevinpapst/AdminLTEBundle/), [Webpack](https://github.com/webpack/webpack), ES6 and [many](composer.json) [more](package.json).
## Introduction
@@ -25,10 +27,10 @@ It is built with modern technologies such as Symfony, Bootstrap, RESTful API, Do
### Requirements
-- PHP 7.2.9 or higher ([PHP 8 support in master](https://github.com/kevinpapst/kimai2/pull/2158))
+- PHP 7.3 or higher (PHP 8 supported)
- MariaDB or MySQL
-- Webserver (nginx, Apache)
-- Some PHP extensions, see [composer.json](composer.json) or [here](https://www.kimai.org/download/)
+- A webserver and subdomain
+- PHP extensions: `gd`, `intl`, `json`, `mbstring`, `pdo`, `xsl`, `zip`
### About
@@ -37,10 +39,7 @@ with many advanced features, including but not limited to:
JSON API, invoicing, data exports, multi-timer and punch-in punch-out mode, tagging, multi-user and multi-timezones,
authentication via SAML/LDAP/Database, customizable role and team permissions, responsive and ready for your mobile device,
-user specific rates, advanced search & filtering, money and time budgets, multiple reports, support for plugins and many more.
-
-Kimai 2 is based on modern frameworks like [Symfony](https://github.com/symfony/symfony), [Doctrine](https://github.com/doctrine/),
-[AdminLTE](https://github.com/kevinpapst/AdminLTEBundle/) and [many](composer.json) [more](package.json).
+user specific rates, advanced search & filtering, money and time budgets, reporting, support for plugins and many more.
## Installation
diff --git a/src/Project/ProjectStatisticService.php b/src/Project/ProjectStatisticService.php
index 32ac55ae..41cc77f4 100644
--- a/src/Project/ProjectStatisticService.php
+++ b/src/Project/ProjectStatisticService.php
@@ -111,9 +111,9 @@ class ProjectStatisticService
$years = [];
$qb = $this->timesheetRepository->createQueryBuilder('t');
$qb
- ->select('SUM(t.duration) as duration')
- ->addSelect('SUM(t.rate) as rate')
- ->addSelect('SUM(t.internalRate) as internalRate')
+ ->select('COALESCE(SUM(t.duration), 0) as duration')
+ ->addSelect('COALESCE(SUM(t.rate), 0) as rate')
+ ->addSelect('COALESCE(SUM(t.internalRate), 0) as internalRate')
->addSelect('COUNT(t.id) as count')
->andWhere('t.project = :project')
->setParameter('project', $query->getProject())
diff --git a/src/Repository/CustomerRepository.php b/src/Repository/CustomerRepository.php
index 68f0829d..103624eb 100644
--- a/src/Repository/CustomerRepository.php
+++ b/src/Repository/CustomerRepository.php
@@ -22,7 +22,6 @@ use App\Repository\Paginator\LoaderPaginator;
use App\Repository\Paginator\PaginatorInterface;
use App\Repository\Query\CustomerFormTypeQuery;
use App\Repository\Query\CustomerQuery;
-use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\Query;
@@ -81,48 +80,44 @@ class CustomerRepository extends EntityRepository
public function getCustomerStatistics(Customer $customer): CustomerStatistic
{
+ $stats = new CustomerStatistic();
+
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->from(Timesheet::class, 't')
->join(Project::class, 'p', Query\Expr\Join::WITH, 't.project = p.id')
->addSelect('COUNT(t.id) as amount')
+ ->addSelect('t.billable as billable')
->addSelect('COALESCE(SUM(t.duration), 0) as duration')
->addSelect('COALESCE(SUM(t.rate), 0) as rate')
->addSelect('COALESCE(SUM(t.internalRate), 0) as internal_rate')
->andWhere('p.customer = :customer')
->setParameter('customer', $customer)
+ ->groupBy('billable')
;
- $timesheetResult = $qb->getQuery()->getOneOrNullResult();
-
- $stats = new CustomerStatistic();
+ $timesheetResult = $qb->getQuery()->getResult();
if (null !== $timesheetResult) {
- $stats->setRecordAmount($timesheetResult['amount']);
- $stats->setRecordDuration($timesheetResult['duration']);
- $stats->setRecordRate($timesheetResult['rate']);
- $stats->setRecordInternalRate($timesheetResult['internal_rate']);
- }
-
- $qb = $this->getEntityManager()->createQueryBuilder();
- $qb
- ->from(Timesheet::class, 't')
- ->join(Project::class, 'p', Query\Expr\Join::WITH, 't.project = p.id')
- ->addSelect('COUNT(t.id) as amount')
- ->addSelect('COALESCE(SUM(t.duration), 0) as duration')
- ->addSelect('COALESCE(SUM(t.rate), 0) as rate')
- ->andWhere('p.customer = :customer')
- ->andWhere('t.billable = :billable')
- ->setParameter('customer', $customer)
- ->setParameter('billable', true, Types::BOOLEAN)
- ;
-
- $timesheetResult = $qb->getQuery()->getOneOrNullResult();
-
- if (null !== $timesheetResult) {
- $stats->setDurationBillable($timesheetResult['duration']);
- $stats->setRateBillable($timesheetResult['rate']);
- $stats->setRecordAmountBillable($timesheetResult['amount']);
+ $amount = 0;
+ $duration = 0;
+ $rate = 0.00;
+ $rateInternal = 0.00;
+ foreach ($timesheetResult as $resultRow) {
+ $amount += $resultRow['amount'];
+ $duration += $resultRow['duration'];
+ $rate += $resultRow['rate'];
+ $rateInternal += $resultRow['internal_rate'];
+ if ($resultRow['billable']) {
+ $stats->setDurationBillable($resultRow['duration']);
+ $stats->setRateBillable($resultRow['rate']);
+ $stats->setRecordAmountBillable($resultRow['amount']);
+ }
+ }
+ $stats->setRecordAmount($amount);
+ $stats->setRecordDuration($duration);
+ $stats->setRecordRate($rate);
+ $stats->setRecordInternalRate($rateInternal);
}
$qb = $this->getEntityManager()->createQueryBuilder();
diff --git a/templates/plugin/index.html.twig b/templates/plugin/index.html.twig
index 5afdbd6a..3a0ac41d 100644
--- a/templates/plugin/index.html.twig
+++ b/templates/plugin/index.html.twig
@@ -2,8 +2,7 @@
{% import "macros/widgets.html.twig" as widgets %}
{% import "macros/datatables.html.twig" as tables %}
-{% block page_title %}{{ 'plugins.title'|trans({}, 'plugins') }}{% endblock %}
-{% block page_subtitle %}{{ 'plugins.subtitle'|trans({}, 'plugins') }}{% endblock %}
+{% block page_title %}{{ 'menu.plugin'|trans }}{% endblock %}
{% block page_actions %}
{% set event = actions(app.user, 'plugins', 'index') %}
{{ widgets.page_actions(event.actions) }}
diff --git a/translations/about.cs.xlf b/translations/about.cs.xlf
index e36de16e..834eaa60 100644
--- a/translations/about.cs.xlf
+++ b/translations/about.cs.xlf
@@ -6,10 +6,6 @@
about.title
O Kimai
-
- about.subtitle
- Systémové informace
-
support
Podpora
diff --git a/translations/messages.cs.xlf b/translations/messages.cs.xlf
index 1488d851..c04e26ea 100644
--- a/translations/messages.cs.xlf
+++ b/translations/messages.cs.xlf
@@ -332,10 +332,6 @@
timesheet.title
Moje časy
-
- timesheet.subtitle
- Upravit moje časové záznami
-
timesheet.edit
Upravit záznam
@@ -375,10 +371,6 @@
profile.title
Profil uživatele
-
- profile.subtitle
- Upravit mé nastavení
-
profile.about_me
O mně
@@ -447,10 +439,6 @@
calendar.title
Kalendář
-
- calendar.subtitle
- Zobrazení a správa pracovního výkazu v kalendáři
-
@@ -458,10 +446,6 @@
admin_timesheet.title
Pracovní výkaz
-
- admin_timesheet.subtitle
- Záznamy všech uživatelů
-
@@ -469,10 +453,6 @@
admin_project.title
Projekt
-
- admin_project.subtitle
- Projekt kombinuje aktivity pro zákazníka do skupiny
-
admin_project.short_stats
@@ -487,10 +467,6 @@
admin_activity.title
Aktivity
-
- admin_activity.subtitle
- Úlohy, které lze vybrat pro časové záznamy
-
admin_activity.short_stats
@@ -505,10 +481,6 @@
admin_customer.title
Zákazník
-
- admin_customer.subtitle
- Vaši zákazníci jsou základem pro vytváření projektů a aktivit
-
label.number
Účet
@@ -571,10 +543,6 @@
admin_user.title
Uživatel
-
- admin_user.subtitle
- Všichni registrovaní uživatelé vaší instalace Kimai
-
label.alias
Jméno
@@ -725,10 +693,6 @@
admin_invoice_template.title
Šablona faktury
-
- admin_invoice_template.subtitle
- Spravujte své šablony faktur, které lze použít k exportu dat.
-
invoice.title
Faktura
diff --git a/translations/plugins.ar.xlf b/translations/plugins.ar.xlf
index 067da445..a8662f88 100644
--- a/translations/plugins.ar.xlf
+++ b/translations/plugins.ar.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- الإضافات
-
-
- plugins.subtitle
- يمكنك تحسين وظائف Kimai باستخدام المكونات الإضافية
-
plugin.none_installed
ليس لديك أي إضافات مثبتة حتى الآن.
diff --git a/translations/plugins.cs.xlf b/translations/plugins.cs.xlf
index 2ace2d82..f42f3eb7 100644
--- a/translations/plugins.cs.xlf
+++ b/translations/plugins.cs.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Doplňky
-
-
- plugins.subtitle
- Funkce Kimai můžete vylepšit pomoci doplňků
-
plugin.none_installed
Zatím nemáte nainstalované žádné doplňky.
diff --git a/translations/plugins.da.xlf b/translations/plugins.da.xlf
index 3bb9688e..c4fc5ca4 100644
--- a/translations/plugins.da.xlf
+++ b/translations/plugins.da.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Du kan forbedre Kimai's funktionalitet med plugins
-
plugin.none_installed
Du har ikke installeret nogen plugins endnu.
diff --git a/translations/plugins.de.xlf b/translations/plugins.de.xlf
index b22c0e19..e81e24e6 100644
--- a/translations/plugins.de.xlf
+++ b/translations/plugins.de.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Mit Plugins können Sie den Funktionsumfang von Kimai erweitern
-
plugin.none_installed
Sie haben noch kein Plugin installiert.
diff --git a/translations/plugins.el.xlf b/translations/plugins.el.xlf
index 5ca46860..36c61f99 100644
--- a/translations/plugins.el.xlf
+++ b/translations/plugins.el.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Πρόσθετα
-
-
- plugins.subtitle
- Μπορείτε να ενισχύσετε τη λειτουργικότητα του Kimai με πρόσθετα
-
plugin.none_installed
Δεν έχετε εγκαταστήσει πρόσθετα, ακόμη.
diff --git a/translations/plugins.en.xlf b/translations/plugins.en.xlf
index 2b257e74..4f37732b 100644
--- a/translations/plugins.en.xlf
+++ b/translations/plugins.en.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- You can enhance the functionality of Kimai with plugins
-
plugin.none_installed
You have no plugins installed yet.
diff --git a/translations/plugins.eo.xlf b/translations/plugins.eo.xlf
index 0b8df40d..5fedd558 100644
--- a/translations/plugins.eo.xlf
+++ b/translations/plugins.eo.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Kromprogramoj
-
-
- plugins.subtitle
- Vi povas plibonigi la funkciadon de Kimai per kromprogramoj
-
plugin.none_installed
Vi ankoraŭ ne havas instalitajn kromprogramojn.
diff --git a/translations/plugins.es.xlf b/translations/plugins.es.xlf
index 5b3bf595..3d94dabf 100644
--- a/translations/plugins.es.xlf
+++ b/translations/plugins.es.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Complementos
-
-
- plugins.subtitle
- Puede mejorar la funcionalidad de Kimai con complementos
-
plugin.none_installed
Aún no tiene ningún complemento instalado.
diff --git a/translations/plugins.eu.xlf b/translations/plugins.eu.xlf
index ab576aa1..ca2ba315 100644
--- a/translations/plugins.eu.xlf
+++ b/translations/plugins.eu.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Pluginak
-
-
- plugins.subtitle
- Pluginen bitartez Kimai hobe dezakezu
-
plugin.none_installed
Oraindik ez daukazu pluginik instalatuta.
diff --git a/translations/plugins.fi.xlf b/translations/plugins.fi.xlf
index eda09092..4bf8d1c5 100644
--- a/translations/plugins.fi.xlf
+++ b/translations/plugins.fi.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Liitännäiset
-
-
- plugins.subtitle
- Voit parantaa Kimain toimintoja liitännäisillä
-
plugin.none_installed
Sinulla ei ole asennettuja liitännäisiä.
diff --git a/translations/plugins.fr.xlf b/translations/plugins.fr.xlf
index 762bee71..ff543fee 100644
--- a/translations/plugins.fr.xlf
+++ b/translations/plugins.fr.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Extensions
-
-
- plugins.subtitle
- Les extensions permettent d'étendre les fonctionnalités de Kimai
-
plugin.none_installed
Aucune extension d'installée pour le moment.
diff --git a/translations/plugins.he.xlf b/translations/plugins.he.xlf
index 907d069e..f514fa31 100644
--- a/translations/plugins.he.xlf
+++ b/translations/plugins.he.xlf
@@ -1,18 +1,7 @@
-
-
- plugins.title
- תוספים
-
-
- plugins.subtitle
- ניתן להרחיב את יכולות קימאי באמצעות תוספים
-
plugin.none_installed
לא הותקנו תוספים עדין.
diff --git a/translations/plugins.hu.xlf b/translations/plugins.hu.xlf
index e44a5fb6..7f902a46 100644
--- a/translations/plugins.hu.xlf
+++ b/translations/plugins.hu.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Bővítmények
-
-
- plugins.subtitle
- Bővítményekkel új funkciókat adhatsz Kimaihoz
-
plugin.none_installed
Egy bővítmény sincs telepítve még.
diff --git a/translations/plugins.it.xlf b/translations/plugins.it.xlf
index 0d66f149..eeb7156a 100644
--- a/translations/plugins.it.xlf
+++ b/translations/plugins.it.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Puoi estendere le funzionalità di Kimai con i plugins
-
plugin.none_installed
Non hai plugin installati per ora.
diff --git a/translations/plugins.ja.xlf b/translations/plugins.ja.xlf
index 279dcfa1..8091d776 100644
--- a/translations/plugins.ja.xlf
+++ b/translations/plugins.ja.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- プラグイン
-
-
- plugins.subtitle
- プラグインによって Kimai の機能性を高めることができます。
-
plugin.none_installed
インストールされたプラグインは存在しません。
diff --git a/translations/plugins.ko.xlf b/translations/plugins.ko.xlf
index 751ea9df..5aa0efc7 100755
--- a/translations/plugins.ko.xlf
+++ b/translations/plugins.ko.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- 플러그인
-
-
- plugins.subtitle
- 플러그인으로 키마이의 기능을 향상시킬 수 있습니다
-
plugin.none_installed
아직 플러그인을 설치하지 않았습니다.
diff --git a/translations/plugins.nl.xlf b/translations/plugins.nl.xlf
index c4718abd..020d8f56 100644
--- a/translations/plugins.nl.xlf
+++ b/translations/plugins.nl.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plug-ins
-
-
- plugins.subtitle
- Met plug-ins kunt u de functionaliteit van Kimai uitbreiden
-
plugin.none_installed
U heeft nog geen plug-ins geïnstalleerd.
diff --git a/translations/plugins.pl.xlf b/translations/plugins.pl.xlf
index 7fd4e168..2fdf9111 100644
--- a/translations/plugins.pl.xlf
+++ b/translations/plugins.pl.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Wtyczki
-
-
- plugins.subtitle
- Możesz rozszerzyć funkcjonalność Kimai przy pomocy wtyczek
-
plugin.none_installed
Nie masz jeszcze żadnych zainstalowanych wtyczek.
diff --git a/translations/plugins.pt.xlf b/translations/plugins.pt.xlf
index 204ea340..3460c13e 100644
--- a/translations/plugins.pt.xlf
+++ b/translations/plugins.pt.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Pode melhorar a funcionalidade do Kimai com plugins
-
plugin.none_installed
Não tem plugins instalados ainda.
diff --git a/translations/plugins.pt_BR.xlf b/translations/plugins.pt_BR.xlf
index 29f9fb37..4efeddfd 100644
--- a/translations/plugins.pt_BR.xlf
+++ b/translations/plugins.pt_BR.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Você pode melhorar a funcionalidade do Kimai com plugins
-
plugin.none_installed
Você não tem plugins instalados ainda.
diff --git a/translations/plugins.ro.xlf b/translations/plugins.ro.xlf
index 9c2ea198..b8af8487 100755
--- a/translations/plugins.ro.xlf
+++ b/translations/plugins.ro.xlf
@@ -1,18 +1,7 @@
-
-
- plugins.title
- Plugin-uri
-
-
- plugins.subtitle
- Poți îmbunătăți funcționalitatea Kimai folosind plugin-uri
-
plugin.none_installed
Nu există nici un plugin instalat.
diff --git a/translations/plugins.ru.xlf b/translations/plugins.ru.xlf
index 84183d02..e4d7b937 100644
--- a/translations/plugins.ru.xlf
+++ b/translations/plugins.ru.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Дополнения
-
-
- plugins.subtitle
- Вы можете увеличить функциональность Kimai с помощью дополнений
-
plugin.none_installed
Нет установленных дополнений.
diff --git a/translations/plugins.sk.xlf b/translations/plugins.sk.xlf
index f2420396..2fd34423 100644
--- a/translations/plugins.sk.xlf
+++ b/translations/plugins.sk.xlf
@@ -2,22 +2,6 @@
-
- plugins.title
- Rozšírenia
-
-
- plugins.subtitle
- Funkciu Kimai môžete vylepšiť pomocou zásuvných modulov
-
-
- label.version
- Verzia
-
-
- label.required_version
- Kompatibilné s
-
plugin.none_installed
Ešte nemáte nainštalovaný plugin.
diff --git a/translations/plugins.sv.xlf b/translations/plugins.sv.xlf
index 13f0ec85..7b1627f0 100644
--- a/translations/plugins.sv.xlf
+++ b/translations/plugins.sv.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Plugins
-
-
- plugins.subtitle
- Du kan förbättra funktionaliteten hos Kimai med plugins
-
plugin.none_installed
Du har inga plugin installerade än.
diff --git a/translations/plugins.tr.xlf b/translations/plugins.tr.xlf
index 154eb49b..5cacb448 100644
--- a/translations/plugins.tr.xlf
+++ b/translations/plugins.tr.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Eklentiler
-
-
- plugins.subtitle
- Kimai'ye eklentilerle yeni özellikler ekleyebilirsiniz
-
plugin.none_installed
Henüz kurulu eklentiniz bulunmamaktadır.
diff --git a/translations/plugins.vi.xlf b/translations/plugins.vi.xlf
index e920bc20..636004c2 100644
--- a/translations/plugins.vi.xlf
+++ b/translations/plugins.vi.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- Tiện ích mở rộng
-
-
- plugins.subtitle
- Bạn có thể tăng cường chức năng của Kimai bằng các tiện ích mở rộng
-
plugin.none_installed
Bạn chưa cài đặt phần mở rộng nào.
diff --git a/translations/plugins.zh_CN.xlf b/translations/plugins.zh_CN.xlf
index 183b3db0..8a05c7cb 100644
--- a/translations/plugins.zh_CN.xlf
+++ b/translations/plugins.zh_CN.xlf
@@ -2,14 +2,6 @@
-
- plugins.title
- 插件
-
-
- plugins.subtitle
- 您可以通过安装插件以提升Kimai的性能。
-
plugin.none_installed
您尚未安装插件。