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 您尚未安装插件。