. */ namespace App\Services\ImportExportSystem\PartKeeprImporter; use App\Entity\Parts\Part; use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\UserSystem\Group; use App\Entity\UserSystem\User; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; /** * This service is used to other non mandatory data from a PartKeepr export. * You have to import the datastructures and parts first to use project import! */ class PKOptionalImporter { use PKImportHelperTrait; public function __construct(EntityManagerInterface $em, PropertyAccessorInterface $propertyAccessor) { $this->em = $em; $this->propertyAccessor = $propertyAccessor; } /** * Import the projects from the given data. * @param array $data * @return int The number of imported projects */ public function importProjects(array $data): int { if (!isset($data['project'])) { throw new \RuntimeException('$data must contain a "project" key!'); } if (!isset($data['projectpart'])) { throw new \RuntimeException('$data must contain a "projectpart" key!'); } $projects_data = $data['project']; $projectparts_data = $data['projectpart']; //First import the projects foreach ($projects_data as $project_data) { $project = new Project(); $project->setName($project_data['name']); $project->setDescription($project_data['description'] ?? ''); $this->setIDOfEntity($project, $project_data['id']); $this->em->persist($project); } $this->em->flush(); //Then the project BOM entries foreach ($projectparts_data as $projectpart_data) { /** @var Project $project */ $project = $this->em->find(Project::class, (int) $projectpart_data['project_id']); if (!$project) { throw new \RuntimeException('Could not find project with ID '.$projectpart_data['project_id']); } $bom_entry = new ProjectBOMEntry(); $bom_entry->setQuantity((float) $projectpart_data['quantity']); $bom_entry->setName($projectpart_data['remarks']); $this->setAssociationField($bom_entry, 'part', Part::class, $projectpart_data['part_id']); $comments = []; if (!empty($projectpart_data['lotNumber'])) { $comments[] = 'Lot number: '.$projectpart_data['lotNumber']; } if (!empty($projectpart_data['overage'])) { $comments[] = 'Overage: '.$projectpart_data['overage'].($projectpart_data['overageType'] ? ' %' : ' pcs'); } $bom_entry->setComment(implode(',', $comments)); $project->addBomEntry($bom_entry); } $this->em->flush(); return count($projects_data); } /** * Import the users from the given data. * @param array $data * @return int The number of imported users */ public function importUsers(array $data): int { if (!isset($data['fosuser'])) { throw new \RuntimeException('$data must contain a "fosuser" key!'); } //All imported users get assigned to the "PartKeepr Users" group $group_users = $this->em->find(Group::class, 3); $group = $this->em->getRepository(Group::class)->findOneBy(['name' => 'PartKeepr Users', 'parent' => $group_users]); if (!$group) { $group = new Group(); $group->setName('PartKeepr Users'); $group->setParent($group_users); $this->em->persist($group); } $users_data = $data['fosuser']; foreach ($users_data as $user_data) { if (in_array($user_data['username'], ['admin', 'anonymous'], true)) { continue; } $user = new User(); $user->setName($user_data['username']); $user->setEmail($user_data['email']); $user->setGroup($group); //User is disabled by default $user->setDisabled(true); //We let doctrine generate a new ID for the user $this->em->persist($user); } $this->em->flush(); return count($users_data); } }