entityManager = $entityManager; $this->projectRepository = $projectRepository; $this->exportRepository = $exportRepository; $this->workflowProjectRepo = $workflowProjectRepo; $this->workflowProjectOptionsRepo = $workflowProjectOptionsRepo; $this->transitionRepo = $transitionRepo; $this->pageQuery = $pageQuery; $this->draftQuery = $draftQuery; $this->story = $story; } /** * @param array $workflowAndUserView * @param int $id * @param bool $lastStep * * @return bool */ public function save(array $workflowAndUserView, int $id, bool $lastStep): bool { // TODO : Delete $project if not necessary $project = $this->projectRepository->findById($id); $storyWorkflow = []; if (!$project) { return false; } $entityManager = $this->entityManager; foreach ($workflowAndUserView as $exportView) { $workflow = $this->workflowProjectRepo->findByExportId($exportView->id); $export = $this->exportRepository->findById($exportView->id); if ($exportView->workflow) { if (!$workflow) { $workflow = new WorkflowProject(); $workflow->setExport($export); } $export->setWorkflowProjects($workflow); $workflow->setPage($exportView->page); if (isset($exportView->workflow) && isset($exportView->workflow)) { if ($workflow->getPage() !== $exportView->page || $workflow->getWorkflow() !== $exportView->workflow) { if (!$workflow->getPage()) { $firstTransition = $this->transitionRepo->findFirstTransition($exportView->workflow, 'projects'); if (isset($firstTransition) && isset($firstTransition['keyInternal'])) { $transition = $this->transitionRepo->findByKey($firstTransition['keyInternal']); if ($transition) { $workflow->setCurrentPlace($transition->getStartPlace()->getKey()); //todo check is we set the current place } } } else { $this->pageQuery->updateWorkflow($exportView->id, $exportView->workflow); } } } $workflow->setWorkflow($exportView->workflow); $entityManager = $this->workflowProjectRepo->createWithoutFlush($entityManager, $workflow); $entityManager = $this->exportRepository->saveWithoutFlush($entityManager, $export); $options = []; $this->workflowProjectOptionsRepo->removeByExport($exportView->id); $storyOptions = []; foreach ($exportView->options as $optionView) { $option = new WorkflowProjectOptions(); $option->setStepId($optionView->step); if ($optionView->date) { $option->setDateFin(new \DateTime($optionView->date)); } $option->setWorkflowProject($workflow); $entityManager = $this->workflowProjectOptionsRepo->createOptionWithoutFlush($entityManager, $option); $storyOptions[] = new WorkflowOptionsStoryView( $optionView->step, $optionView->date ); } $storyWorkflow[] = new WorkflowStoryView( $exportView->workflow, $workflow->getPage(), $storyOptions ); } else { $export->setWorkflowProjects(null); $entityManager = $this->exportRepository->saveWithoutFlush($entityManager, $export); if ($workflow) { $this->exportRepository->setWorkflowProject($exportView->id, 'null'); $this->workflowProjectRepo->delete($workflow->getId()); } $storyWorkflow[] = new WorkflowStoryView( 0, $exportView->page, [] ); } } $entityManager->flush(); if ($project->getCurrentStep() < 3) { $project->setCurrentStep(3); $this->projectRepository->create($project); } if (!empty($storyWorkflow)) { $this->story->execute('Step 4', ['value' => $storyWorkflow], $id, get_class($project), 0); } if (isset($lastStep) && $lastStep) { $this->draftQuery->changeDraft($id); } return true; // TODO : Create / Update association between 1 Export and 1 Workflow (+ User) // TODO : Foreach selected workflow's steps display configuration's options if checked in workflow's side (eg: "due date") => See Front // TODO : DO NOT display actions selector (only workflow's side) => See Front // TODO : Vérifier que le code "display" du workflow est appliqué aux steps et que la step 4 à bien récupérée le code workflow de la step 1 } public function changeCurrentPlaceKey(array $placeKeys) { foreach ($placeKeys as $key) { if ($key["key"] !== $key["newKey"]) { $this->workflowProjectRepo->changeCurrentPlaceKey($key['key'], $key['newKey']); } } } }