configuration = $configuration; $this->transitions = $transitions; $this->command = $command; $this->transitionQuery = $transitionQuery; $this->places = $places; $this->pageRepository = $pageRepository; } public function load(int $config_id): array { $configuration = $this->configuration->findById($config_id); $places = []; $transitions = []; foreach ($configuration->getPlaces() as $place) { $places[] = trim($place->getKey()); } foreach ($configuration->getTransitions() as $transition) { $transitions[trim($transition->getKey())] = [ 'from' => trim($transition->getStartPlace()->getKey()), 'to' => trim($transition->getEndPlace()->getKey()), ]; } return [ 'name' => trim($configuration->getName()), 'type' => trim($configuration->getType()), 'audit_trail' => $configuration->getAuditTrail(), 'marking_store' => $configuration->getMarkingStore(), 'places' => $places, 'transitions' => $transitions, ]; } public function display(string $keyPlace): array { $transitions = []; if ($keyPlace) { $config_id = $this->configuration->findIdByPlace($keyPlace); if ($config_id) { $transitionsDB = $this->transitions->findByConfigId($config_id['id']); foreach ($transitionsDB as $transition) { $startPlaceView = new PlaceView( $transition->getStartPlace()->getName(), $transition->getStartPlace()->getDefault(), $transition->getStartPlace()->getKey() ); $endPlaceView = new PlaceView( $transition->getEndPlace()->getName(), $transition->getEndPlace()->getDefault(), $transition->getEndPlace()->getKey() ); $transitions[] = new TransitionView( $transition->getName(), $startPlaceView, $endPlaceView, $transition->getKey(), json_decode(json_encode($transition->getUsers()), true), $transition->getCommands(), ); } } } return $transitions; } public function read(int $id): ConfigurationReadView { $configuration = $this->configuration->findById($id); if (null === $configuration) { return new ConfigurationReadView( '', [], [], [] ); } $places = []; foreach ($configuration->getPlaces() as $place) { if($place->getName() !== "workflowEnd"){ $users = []; $commands = []; $commandIds = []; $transitions = $this->transitions->findByStartPlaceKey($place->getKey()); foreach ($transitions as $transition) { if ($transition->getUsers()) { foreach ($transition->getUsers() as $user) { $userFilter = array_values(array_filter($users, function ($userV) use ($user) { return $userV->id === $user->id; })); if (0 === count($userFilter)) { $userView = new UserView( $user->id, $user->name ); $users[]=$userView; } } } if(!empty($transition->getCommands())){ foreach ($transition->getCommands() as $command) { if (!in_array($command->getId(), $commandIds, true)) { $commandIds[] = $command->getId(); $commands[]=["id" => $command->getId(), "name" => $command->getName()]; } } } } $color = null; if (method_exists($place, 'getColor')) { if ($place->getColor()) { $color = $place->getColor(); } } $blockPictures = false; if (method_exists($place, 'getBlockPictures')) { if ($place->getBlockPictures()) { $blockPictures = $place->getBlockPictures(); } } $blockTexts = false; if (method_exists($place, 'getBlockTexts')) { if ($place->getBlockTexts()) { $blockTexts = $place->getBlockTexts(); } } $dateEnable = false; if ($place->getDateEnable()) { $dateEnable = $place->getDateEnable(); } $sendMail = false; if (method_exists($place, 'getSendMail')) { if ($place->getSendMail()) { $sendMail = $place->getSendMail(); } } $places[] = new ConfigurationPlaceView( $place->getId(), $place->getName(), $place->getDefault(), $place->getKey(), $users, $commands, $color, $dateEnable, $blockPictures, $blockTexts, $sendMail ); } } $transitions = []; foreach ($configuration->getTransitions() as $transition) { if (false === strpos($transition->getName(), '_Reject')) { $transitions[] = $this->transitionQuery->read($transition->getKey()); } } return new ConfigurationReadView( $configuration->getName(), $places, $transitions, [] ); } public function create(ConfigurationCreateView $configView, array $places, array $transitions, string $module): int { $configuration = null; $allKey = []; if ($configView->id) { $configuration = $this->configuration->findById($configView->id); foreach ($configuration->getPlaces() as $place) { $allKey[] = '"' . $place->getKey() . '"'; } } $clear = new ClearService(); if (null === $configuration) { $configuration = new Configuration(); $generatedKey = bin2hex(random_bytes(self::TOKEN_BYTES)); $configuration->setGenericKey($generatedKey); } else { $generatedKey = $configuration->getGenericKey(); } $configuration->setName($configView->nom); $configuration->setModule($module); $configuration->setType($this->configuration::TYPE); $configuration->setAuditTrail($this->configuration::AUDIT_TRAIL); $configuration->setMarkingStore($this->configuration::MARKING_STORE); $this->configuration->create($configuration); $this->createPlaces($configuration, $places, $clear, $generatedKey, $module); $this->createTransitions($configuration, $transitions, $clear, $generatedKey, $module, $places); return $configuration->getId(); } private function createPlaces($configuration, $places, $clear, $generatedKey, $module): void { $places_id = []; $isNewStep = false; foreach ($places as $place) { if ($place->id) { $places_id[] = $place->id; } } if (count($places_id) > 0) { $this->places->remove(implode(',', $places_id), $configuration->getId(), $module); } $index_color = 0; foreach ($places as $place) { if ($place->id) { $entity = $this->places->findById($place->id); } else { $entity = new Places(); $isNewStep = true; } $entity->setKey($clear->cleanString($place->nom)); $entity->setKey($entity->getKey() . '_' . $generatedKey); $entity->setName($place->nom); $entity->setDateEnable($place->dateEnable); $entity->setDefault($place->default); $entity->setConfiguration($configuration); if (method_exists($entity, 'setColor')) { $color = '#000000'; if ($place->color) { $color = $place->color; } $entity->setColor($color); } if (method_exists($entity, 'setBlockPictures')) { $blockPictures = false; if ($place->blockPictures) { $blockPictures = $place->blockPictures; } $entity->setBlockPictures($blockPictures); } if (method_exists($entity, 'setBlockTexts')) { $blockTexts = false; if ($place->blockTexts) { $blockTexts = $place->blockTexts; } $entity->setBlockTexts($blockTexts); } if(method_exists($entity, 'setSendMail')) { $sendMail = false; if($place->sendMail) { $sendMail = $place->sendMail; } $entity->setSendMail($sendMail); } $this->places->create($entity); ++$index_color; if($isNewStep){ $this->pageRepository->setCurrentPlace($entity->getKey()); } } $entity = new Places(); $entity->setKey($clear->cleanString("workflowEnd") . '_' . $generatedKey); $entity->setName("workflowEnd"); $entity->setDateEnable($place->dateEnable); $entity->setDefault(false); $entity->setConfiguration($configuration); if (method_exists($entity, 'setColor')) { $color = '#000000'; if ($place->color) { $color = $place->color; } $entity->setColor($color); } if (method_exists($entity, 'setBlockPictures')) { $blockPictures = false; if ($place->blockPictures) { $blockPictures = true; } $entity->setBlockPictures($blockPictures); } if (method_exists($entity, 'setBlockTexts')) { $blockTexts = false; if ($place->blockTexts) { $blockTexts = true; } $entity->setBlockTexts($blockTexts); } if(method_exists($entity, 'setSendMail')) { $sendMail = false; if($place->sendMail) { $sendMail = $place->sendMail; } $entity->setSendMail($sendMail); } $this->places->create($entity); } private function createTransitions($configuration, $transitions, $clear, $generatedKey, $module, $places): void { $transitionsDB = $this->transitions->findByConfigId($configuration->getId()); foreach ($transitionsDB as $transitionDB) { $this->transitions->remove($transitionDB); } if(count($transitions) > 0){ foreach ($transitions as $i => $iValue) { $transition = $iValue; $entity = new Transitions(); $entity->setName($transition->nom); $entity->setPosition($transition->position); $entity->setKey($clear->cleanString($transition->nom)); $entity->setKey($entity->getKey() . '_' . $generatedKey); $entity->setConfiguration($configuration); $debutKey = $clear->cleanString($transition->startPlace_name); $debutPlace = $this->places->findByKey($debutKey . '_' . $generatedKey); $entity->setStartPlace($debutPlace); $finKey = $clear->cleanString($transition->endPlace_name); $finPlace = $this->places->findByKey($finKey . '_' . $generatedKey); $entity->setEndPlace($finPlace); $valueFilter = array_values(array_filter($places, static function ($place) use ($transition) { return $place->nom === $transition->startPlace_name; })); if (count($valueFilter) > 0) { $users = $valueFilter[0]->users ?: []; $entity->setUsers($users); // if(method_exists($entity ,"setTypeGenerate") && $debutKey != $finKey){ // $entity->setTypeGenerate($valueFilter[0]->typeGeneration); // } } if (count($transition->commands) > 0) { foreach ($transition->commands as $command) { $entityCommand = $this->command->findById($command->id); $entity->addCommand($entityCommand); } } $this->transitions->create($entity); if ($debutKey !== $finKey) { $entityReject = new Transitions(); $entityReject->setName($transition->nom . '_Reject'); $entityReject->setPosition($transition->position); $entityReject->setKey($clear->cleanString($transition->nom)); $entityReject->setKey($entity->getKey() . '_Reject'); $entityReject->setConfiguration($configuration); $entityReject->setEndPlace($debutPlace); $entityReject->setStartPlace($finPlace); $valueFilterReject = array_values(array_filter($places, function ($place) use ($transition) { return $place->nom === $transition->endPlace_name; })); if (count($valueFilterReject) > 0) { $entityReject->setUsers($valueFilterReject[0]->users); } $this->transitions->create($entityReject); } } $transition = end($transitions); if(isset($transition)){ $entity = new Transitions(); $entity->setName("validWorkflow"); $entity->setPosition($transition->position + 1); $entity->setKey($clear->cleanString("validWorkflow")); $entity->setKey($entity->getKey() . '_' . $generatedKey); $entity->setConfiguration($configuration); $debutKey = $clear->cleanString($transition->endPlace_name); $debutPlace = $this->places->findByKey($debutKey . '_' . $generatedKey); $entity->setStartPlace($debutPlace); $finKey = $clear->cleanString("workflowEnd"); $finPlace = $this->places->findByKey($finKey . '_' . $generatedKey); $entity->setEndPlace($finPlace); $valueFilter = array_values(array_filter($places, static function ($place) use ($transition) { return $place->nom === $transition->endPlace_name; })); if (count($valueFilter) > 0) { $users = $valueFilter[0]->users ?: []; $entity->setUsers($users); // if(method_exists($entity ,"setTypeGenerate")){ // $entity->setTypeGenerate($valueFilter[0]->typeGeneration); // } } if (count($transition->commands) > 0) { foreach ($transition->commands as $command) { $entityCommand = $this->command->findById($command->id); $entity->addCommand($entityCommand); } } $this->transitions->create($entity); $entityReject = new Transitions(); $entityReject->setName($entity->getName() . '_Reject'); $entityReject->setPosition($transition->position); $entityReject->setKey($clear->cleanString($entity->getName())); $entityReject->setKey($entity->getKey() . '_Reject'); $entityReject->setConfiguration($configuration); $entityReject->setEndPlace($debutPlace); $entityReject->setStartPlace($finPlace); $valueFilterReject = array_values(array_filter($places, function ($place) use ($transition) { return $place->nom === $transition->endPlace_name; })); if (count($valueFilterReject) > 0) { $entityReject->setUsers($valueFilterReject[0]->users); } $this->transitions->create($entityReject); } } } public function delete(int $config_id): bool { $configuration = $this->configuration->findById($config_id); if(isset($configuration)){ return $this->configuration->removeWorkflow($configuration); } return false; } }