diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 1c565c9..3abc18b 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -15,10 +15,13 @@ declare(strict_types=1); namespace Modules\ProjectManagement\Controller; use Modules\ProjectManagement\Models\NullProject; +use Modules\ProjectManagement\Models\ProgressType; use Modules\ProjectManagement\Models\ProjectMapper; use phpOMS\Asset\AssetType; use phpOMS\Contract\RenderableInterface; +use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\DataStorage\Database\Query\OrderType; +use phpOMS\Math\Number\Numbers; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; @@ -43,6 +46,8 @@ final class BackendController extends Controller * * @return RenderableInterface * + * @feature Create Gantt chart for all active projects in one overview + * * @since 1.0.0 * @codeCoverageIgnore */ @@ -52,8 +57,59 @@ final class BackendController extends Controller $view->setTemplate('/Modules/ProjectManagement/Theme/Backend/projectmanagement-list'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001701001, $request, $response); - $projects = ProjectMapper::getAll()->sort('id', OrderType::DESC)->limit(25)->executeGetArray(); - $view->data['projects'] = $projects; + $view->data['projects'] = ProjectMapper::getAll() + ->sort('id', OrderType::DESC) + ->limit(25) + ->executeGetArray(); + + // Evaluate progress + $view->data['progress'] = []; + + $taskProgress = []; + + $now = new \DateTime('now'); + + /** @var \Modules\ProjectManagement\Models\Project $project */ + foreach ($view->data['projects'] as $project) { + if ($project->progressType === ProgressType::TASKS) { + $taskProgress[] = $project->id; + } elseif ($project->progressType === ProgressType::LINEAR) { + $duration = (int) $project->start->diff($project->endEstimated)->format('%a'); + $progress = (int) $project->start->diff($now)->format('%a'); + + $view->data['progress'][$project->id] = (int) \min(100, $duration / $progress * 100); + } elseif ($project->progressType === ProgressType::EXPONENTIAL) { + $duration = (int) $project->start->diff($project->endEstimated)->format('%a'); + $progress = (int) $project->start->diff($now)->format('%a'); + + $view->data['progress'][$project->id] = (int) Numbers::remapRangeExponentially($progress, $duration); + } elseif ($project->progressType === ProgressType::LOG) { + $duration = (int) $project->start->diff($project->endEstimated)->format('%a'); + $progress = (int) $project->start->diff($now)->format('%a'); + + $view->data['progress'][$project->id] = (int) Numbers::remapRangeLog($progress, $duration); + } else { + $view->data['progress'][$project->id] = $project->progress; + } + } + + // Count tasks per project where tasks are used as progress indication + $projectIds = \implode(',', $taskProgress); + + $sql = <<app->dbPool->get()); + $results = $query->raw($sql)->execute()?->fetchAll(\PDO::FETCH_ASSOC) ?? []; + foreach ($results as $result) { + $view->data['progress'][$result['id']] = (int) (($result['total_tasks'] - $result['open_tasks']) / $result['total_tasks']); + } return $view; } @@ -90,6 +146,8 @@ final class BackendController extends Controller * * @return RenderableInterface * + * @feature Create Gantt chart for project based on milestones and tasks and general project settings + * * @since 1.0.0 * @codeCoverageIgnore */ diff --git a/Models/Project.php b/Models/Project.php index 108517d..2fa3969 100755 --- a/Models/Project.php +++ b/Models/Project.php @@ -27,6 +27,9 @@ use phpOMS\Stdlib\Base\FloatInt; * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 + * + * @feature Add milestones + * https://github.com/Karaka-Management/oms-ProjectManagement/issues/4 */ class Project { diff --git a/Theme/Backend/projectmanagement-list.tpl.php b/Theme/Backend/projectmanagement-list.tpl.php index f386782..c646b66 100755 --- a/Theme/Backend/projectmanagement-list.tpl.php +++ b/Theme/Backend/projectmanagement-list.tpl.php @@ -12,11 +12,6 @@ */ declare(strict_types=1); -$footerView = new \phpOMS\Views\PaginationView($this->l11nManager, $this->request, $this->response); -$footerView->setTemplate('/Web/Templates/Lists/Footer/PaginationBig'); -$footerView->setPages(20); -$footerView->setPage(1); - $list = $this->data['projects']; echo $this->data['nav']->render(); ?> @@ -29,19 +24,22 @@ echo $this->data['nav']->render(); ?> + - $value) : ++$count; - $url = \phpOMS\Uri\UriFactory::build('projectmanagement/view?{?}&id=' . $value->id); ?> + $value) : ++$count; + $url = \phpOMS\Uri\UriFactory::build('{/base}/projectmanagement/view?{?}&id=' . $value->id); ?> +
getHtml('Progress'); ?> getHtml('Title'); ?> getHtml('Start'); ?> getHtml('Due'); ?>
data['progress'][$value->id] ?? 0; ?> % printHtml($value->name); ?> printHtml($value->start?->format('Y-m-d')); ?> printHtml($value->end?->format('Y-m-d')); ?> -
getHtml('Empty', '0', '0'); ?> +
getHtml('Empty', '0', '0'); ?>