diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php new file mode 100644 index 0000000..c19dd67 --- /dev/null +++ b/Admin/Routes/Web/Api.php @@ -0,0 +1,32 @@ + [ + [ + 'dest' => '\Modules\ProjectManagement\Controller\ApiController:apiProjectCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::PROJECT, + ], + ], + ], +]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f7f190e..74a97c4 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -14,6 +14,16 @@ declare(strict_types=1); namespace Modules\ProjectManagement\Controller; +use Modules\Admin\Models\NullAccount; +use Modules\Media\Models\NullMedia; +use Modules\ProjectManagement\Models\ProgressType; +use Modules\ProjectManagement\Models\Project; +use Modules\ProjectManagement\Models\ProjectMapper; +use phpOMS\Message\Http\RequestStatusCode; +use phpOMS\Message\RequestAbstract; +use phpOMS\Message\ResponseAbstract; +use phpOMS\Utils\Parser\Markdown\Markdown; + /** * ProjectManagement api controller class. * @@ -24,4 +34,99 @@ namespace Modules\ProjectManagement\Controller; */ final class ApiController extends Controller { + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiProjectCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + if (!empty($val = $this->validateProjectCreate($request))) { + $response->header->status = RequestStatusCode::R_400; + $this->createInvalidCreateResponse($request, $response, $val); + + return; + } + + $project = $this->createProjectFromRequest($request); + $this->createModel($request->header->account, $project, ProjectMapper::class, 'card', $request->getOrigin()); + + $this->createStandardCreateResponse($request, $response, $project); + } + + /** + * Method to create card from request. + * + * @param RequestAbstract $request Request + * + * @return Project + * + * @since 1.0.0 + */ + public function createProjectFromRequest(RequestAbstract $request) : Project + { + $project = new Project(); + $project->name = $request->getDataString('name') ?? ''; + $project->descriptionRaw = $request->getDataString('plain') ?? ''; + $project->description = Markdown::parse($request->getDataString('plain') ?? ''); + $project->start = $request->getDataDateTime('start') ?? $project->start; + $project->end = $request->getDataDateTime('end') ?? $project->end; + $project->createdBy = new NullAccount($request->header->account); + $project->progressType = ProgressType::tryFromValue($request->getDataInt('progresstype')) ?? ProgressType::MANUAL; + $project->progress = $request->getDataInt('progress') ?? 0; + $project->budgetCosts->value = $request->getDataInt('budgetcosts') ?? 0; + $project->actualCosts->value = $request->getDataInt('actualcosts') ?? 0; + + // @todo implement unit + //$project->unit = $this->app->unitId; + + if (!empty($uploadedFiles = $request->files)) { + $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( + [], + [], + $uploadedFiles, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files/Modules/ProjectManagement', + '/Modules/ProjectManagement', + ); + + foreach ($uploaded as $media) { + $project->files[] = $media; + } + } + + $mediaFiles = $request->getDataJson('media'); + foreach ($mediaFiles as $media) { + $project->files[] = new NullMedia($media); + } + + return $project; + } + + /** + * Validate card create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateProjectCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = !$request->hasData('name'))) { + return $val; + } + + return []; + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 07a42dc..1c565c9 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\ProjectManagement\Controller; +use Modules\ProjectManagement\Models\NullProject; use Modules\ProjectManagement\Models\ProjectMapper; use phpOMS\Asset\AssetType; use phpOMS\Contract\RenderableInterface; @@ -51,7 +52,7 @@ 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); + $projects = ProjectMapper::getAll()->sort('id', OrderType::DESC)->limit(25)->executeGetArray(); $view->data['projects'] = $projects; return $view; @@ -72,9 +73,11 @@ final class BackendController extends Controller public function viewProjectManagementCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); - $view->setTemplate('/Modules/ProjectManagement/Theme/Backend/projectmanagement-create'); + $view->setTemplate('/Modules/ProjectManagement/Theme/Backend/projectmanagement-view'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001701001, $request, $response); + $view->data['project'] = new NullProject(); + return $view; } diff --git a/Models/Project.php b/Models/Project.php index edc35d3..be764d2 100755 --- a/Models/Project.php +++ b/Models/Project.php @@ -173,7 +173,7 @@ class Project * * @since 1.0.0 */ - public function __construct(string $name = '') + public function __construct() { $this->start = new \DateTime('now'); $this->end = new \DateTime('now'); @@ -189,61 +189,6 @@ class Project $this->actualEarnings = new FloatInt(); $this->budgetCosts = new FloatInt(); $this->budgetEarnings = new FloatInt(); - - $this->setName($name); - } - - /** - * Get progress type - * - * @return int - * - * @since 1.0.0 - */ - public function getProgressType() : int - { - return $this->progressType; - } - - /** - * Set progress type - * - * @param int $type Progress type - * - * @return void - * - * @since 1.0.0 - */ - public function setProgressType(int $type) : void - { - $this->progressType = $type; - } - - /** - * Get name - * - * @return string - * - * @since 1.0.0 - */ - public function getName() : string - { - return $this->name; - } - - /** - * Set name - * - * @param string $name Project name - * - * @return void - * - * @since 1.0.0 - */ - public function setName(string $name) : void - { - $this->name = $name; - $this->calendar->name = $name; } /** @@ -280,4 +225,5 @@ class Project use \Modules\Media\Models\MediaListTrait; use \Modules\Attribute\Models\AttributeHolderTrait; + // @todo implement tags } diff --git a/Theme/Backend/projectmanagement-create.tpl.php b/Theme/Backend/projectmanagement-create.tpl.php deleted file mode 100755 index e3e9859..0000000 --- a/Theme/Backend/projectmanagement-create.tpl.php +++ /dev/null @@ -1,54 +0,0 @@ -data['nav']->render(); ?> - -
-
-
-

getHtml('Project'); ?>

-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/Theme/Backend/projectmanagement-list.tpl.php b/Theme/Backend/projectmanagement-list.tpl.php index ec62e6e..f386782 100755 --- a/Theme/Backend/projectmanagement-list.tpl.php +++ b/Theme/Backend/projectmanagement-list.tpl.php @@ -37,12 +37,12 @@ echo $this->data['nav']->render(); ?> $url = \phpOMS\Uri\UriFactory::build('projectmanagement/view?{?}&id=' . $value->id); ?> printHtml($value->name); ?> - printHtml($value->getStart()->format('Y-m-d')); ?> - printHtml($value->getEnd()->format('Y-m-d')); ?> + printHtml($value->start?->format('Y-m-d')); ?> + printHtml($value->end?->format('Y-m-d')); ?> getHtml('Empty', '0', '0'); ?> - + diff --git a/Theme/Backend/projectmanagement-view.tpl.php b/Theme/Backend/projectmanagement-view.tpl.php index 63944da..92bfc6c 100644 --- a/Theme/Backend/projectmanagement-view.tpl.php +++ b/Theme/Backend/projectmanagement-view.tpl.php @@ -12,51 +12,107 @@ */ declare(strict_types=1); +use Modules\EventManagement\Models\ProgressType; + +/** \Modules\ProjectManagement\Models\Project $project */ $project = $this->data['project']; +$isNew = $project->id === 0; + echo $this->data['nav']->render(); ?>
-
-

printHtml($project->getName()); ?>

-
-
- - -
-
-
- -
- -
-
-
-
- getProgressType() !== \Modules\ProjectManagement\Models\ProgressType::MANUAL ? ' disabled' : ''; ?>> -
-
-
-
-
+
+
+
getHtml('Project'); ?>
+
+
+ + +
+ +
+ + +
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+ + +
+ +
+ +
+
+ +
+
+ progressType !== ProgressType::MANUAL ? ' disabled' : ''; ?>> +
+
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + + + + +
+
+
getData('tasklist')->render($project->tasks); ?>
+
+
getData('calendar')->render($project->getCalendar()); ?> @@ -66,11 +122,4 @@ echo $this->data['nav']->render(); ?> getData('medialist')->render($project->files); ?>
- -
-
-
-

Finances

-
-
-
\ No newline at end of file + diff --git a/tests/Models/ProjectMapperTest.php b/tests/Models/ProjectMapperTest.php index 9549a9a..0846f8e 100755 --- a/tests/Models/ProjectMapperTest.php +++ b/tests/Models/ProjectMapperTest.php @@ -34,7 +34,7 @@ final class ProjectMapperTest extends \PHPUnit\Framework\TestCase { $project = new Project(); - $project->setName('Projectname'); + $project->name = 'Projectname'; $project->description = 'Description'; $project->createdBy = new NullAccount(1); $project->start = new \DateTime('2000-05-05'); @@ -60,7 +60,7 @@ final class ProjectMapperTest extends \PHPUnit\Framework\TestCase $project->tasks[] = $task2; $project->progress = 10; - $project->setProgressType(ProgressType::TASKS); + $project->progressType = ProgressType::TASKS; $media = new Media(); $media->createdBy = new NullAccount(1); @@ -77,7 +77,7 @@ final class ProjectMapperTest extends \PHPUnit\Framework\TestCase $projectR = ProjectMapper::get()->with('files')->where('id', $project->id)->execute(); - self::assertEquals($project->getName(), $projectR->getName()); + self::assertEquals($project->name, $projectR->name); self::assertEquals($project->description, $projectR->description); self::assertEquals($project->budgetEarnings->getAmount(), $projectR->budgetEarnings->getAmount()); self::assertEquals($project->budgetCosts->getAmount(), $projectR->budgetCosts->getAmount()); @@ -87,7 +87,7 @@ final class ProjectMapperTest extends \PHPUnit\Framework\TestCase self::assertEquals($project->start->format('Y-m-d'), $projectR->start->format('Y-m-d')); self::assertEquals($project->end->format('Y-m-d'), $projectR->end->format('Y-m-d')); self::assertEquals($project->progress, $projectR->progress); - self::assertEquals($project->getProgressType(), $projectR->getProgressType()); + self::assertEquals($project->progressType, $projectR->progressType); $expected = $project->files; $actual = $projectR->files; diff --git a/tests/Models/ProjectTest.php b/tests/Models/ProjectTest.php index a505561..321e275 100755 --- a/tests/Models/ProjectTest.php +++ b/tests/Models/ProjectTest.php @@ -44,7 +44,7 @@ final class ProjectTest extends \PHPUnit\Framework\TestCase self::assertEquals((new \DateTime('now'))->format('Y-m-d'), $this->project->start->format('Y-m-d')); self::assertEquals((new \DateTime('now'))->modify('+1 month')->format('Y-m-d'), $this->project->end->format('Y-m-d')); self::assertEquals(0, $this->project->createdBy->id); - self::assertEquals('', $this->project->getName()); + self::assertEquals('', $this->project->name); self::assertEquals('', $this->project->description); self::assertEquals(0, $this->project->budgetCosts->getInt()); self::assertEquals(0, $this->project->budgetEarnings->getInt()); @@ -52,7 +52,7 @@ final class ProjectTest extends \PHPUnit\Framework\TestCase self::assertEquals(0, $this->project->actualEarnings->getInt()); self::assertEquals(0, $this->project->progress); self::assertEquals([], $this->project->files); - self::assertEquals(ProgressType::MANUAL, $this->project->getProgressType()); + self::assertEquals(ProgressType::MANUAL, $this->project->progressType); self::assertEmpty($this->project->tasks); } @@ -63,13 +63,6 @@ final class ProjectTest extends \PHPUnit\Framework\TestCase self::assertEquals(1, $this->project->createdBy->id); } - #[\PHPUnit\Framework\Attributes\Group('module')] - public function testNameInputOutput() : void - { - $this->project->setName('Name'); - self::assertEquals('Name', $this->project->getName()); - } - #[\PHPUnit\Framework\Attributes\Group('module')] public function testDescriptionInputOutput() : void { @@ -84,22 +77,15 @@ final class ProjectTest extends \PHPUnit\Framework\TestCase self::assertEquals(10, $this->project->progress); } - #[\PHPUnit\Framework\Attributes\Group('module')] - public function testProgressTypeInputOutput() : void - { - $this->project->setProgressType(ProgressType::TASKS); - self::assertEquals(ProgressType::TASKS, $this->project->getProgressType()); - } - #[\PHPUnit\Framework\Attributes\Group('module')] public function testSerialize() : void { - $this->project->setName('Name'); + $this->project->name = 'Name'; $this->project->description = 'Description'; $this->project->start = new \DateTime(); $this->project->end = new \DateTime(); $this->project->progress = 10; - $this->project->setProgressType(ProgressType::TASKS); + $this->project->progressType = ProgressType::TASKS; $serialized = $this->project->jsonSerialize(); unset($serialized['calendar']);