From 5e3a9ec90c3d398f228af7171b2002af4fe5f98b Mon Sep 17 00:00:00 2001 From: Marcel Diegelmann Date: Fri, 12 Sep 2025 16:05:42 +0200 Subject: [PATCH] =?UTF-8?q?Entferne=20Projektbezogene=20Logik=20bzw.=20Ver?= =?UTF-8?q?weise=20auf=20Baugruppen,=20da=20nicht=20ben=C3=B6tigt.=20?= =?UTF-8?q?=C3=9Cberarbeitung=20Exporter:=20Aufnahme=20von=20Parts=20aus?= =?UTF-8?q?=20Subassemblies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/AssemblyController.php | 1 - .../AssemblyBomEntriesDataTable.php | 12 +- src/Entity/AssemblySystem/Assembly.php | 3 +- .../AssemblySystem/AssemblyBOMEntry.php | 22 ++-- .../UserSystem/PartUniqueIpnSubscriber.php | 2 +- .../AssemblySystem/AssemblyBOMEntryType.php | 4 - .../Assemblies/AssemblyPartAggregator.php | 83 ++++++++++++ .../AssemblySystem/AssemblyBuildHelper.php | 7 +- .../ImportExportSystem/EntityExporter.php | 123 +++++++++++++----- translations/validators.cs.xlf | 6 - translations/validators.da.xlf | 6 - translations/validators.de.xlf | 6 - translations/validators.el.xlf | 6 - translations/validators.en.xlf | 6 - translations/validators.fr.xlf | 6 - translations/validators.hr.xlf | 6 - translations/validators.it.xlf | 6 - translations/validators.ja.xlf | 6 - translations/validators.pl.xlf | 6 - translations/validators.ru.xlf | 6 - translations/validators.zh.xlf | 6 - 21 files changed, 193 insertions(+), 136 deletions(-) create mode 100644 src/Helpers/Assemblies/AssemblyPartAggregator.php diff --git a/src/Controller/AssemblyController.php b/src/Controller/AssemblyController.php index 520bc52d..5d821121 100644 --- a/src/Controller/AssemblyController.php +++ b/src/Controller/AssemblyController.php @@ -29,7 +29,6 @@ use App\DataTables\Filters\AssemblyFilter; use App\Entity\AssemblySystem\Assembly; use App\Entity\AssemblySystem\AssemblyBOMEntry; use App\Entity\Parts\Part; -use App\Entity\UserSystem\User; use App\Exceptions\InvalidRegexException; use App\Form\AssemblySystem\AssemblyAddPartsType; use App\Form\AssemblySystem\AssemblyBuildType; diff --git a/src/DataTables/AssemblyBomEntriesDataTable.php b/src/DataTables/AssemblyBomEntriesDataTable.php index 2afec65a..93e1566d 100644 --- a/src/DataTables/AssemblyBomEntriesDataTable.php +++ b/src/DataTables/AssemblyBomEntriesDataTable.php @@ -26,14 +26,12 @@ use App\DataTables\Column\EntityColumn; use App\DataTables\Column\LocaleDateTimeColumn; use App\DataTables\Column\MarkdownColumn; use App\DataTables\Helpers\AssemblyDataTableHelper; -use App\DataTables\Helpers\ProjectDataTableHelper; use App\DataTables\Helpers\ColumnSortHelper; use App\DataTables\Helpers\PartDataTableHelper; use App\Entity\AssemblySystem\Assembly; use App\Entity\Attachments\Attachment; use App\Entity\Parts\Part; use App\Entity\AssemblySystem\AssemblyBOMEntry; -use App\Entity\ProjectSystem\Project; use App\Services\Formatters\AmountFormatter; use App\Settings\BehaviorSettings\TableSettings; use Doctrine\ORM\QueryBuilder; @@ -49,7 +47,6 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface public function __construct( private readonly TranslatorInterface $translator, private readonly PartDataTableHelper $partDataTableHelper, - private readonly ProjectDataTableHelper $projectDataTableHelper, private readonly AssemblyDataTableHelper $assemblyDataTableHelper, private readonly AmountFormatter $amountFormatter, private readonly ColumnSortHelper $csh, @@ -90,7 +87,7 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface 'label' => $this->translator->trans('part.table.name'), 'orderField' => 'NATSORT(part.name)', 'render' => function ($value, AssemblyBOMEntry $context) { - if(!$context->getPart() instanceof Part && !$context->getReferencedAssembly() instanceof Assembly && !$context->getProject() instanceof Project) { + if(!$context->getPart() instanceof Part && !$context->getReferencedAssembly() instanceof Assembly) { return htmlspecialchars((string) $context->getName()); } @@ -105,13 +102,6 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface $tmp = $this->assemblyDataTableHelper->renderName($context->getReferencedAssembly()); $tmp = $this->translator->trans('part.table.name.value.for_assembly', ['%value%' => $tmp]); - if($context->getName() !== null && $context->getName() !== '') { - $tmp .= '
'.htmlspecialchars($context->getName()).''; - } - } elseif ($context->getProject() !== null) { - $tmp = $this->projectDataTableHelper->renderName($context->getProject()); - $tmp = $this->translator->trans('part.table.name.value.for_project', ['%value%' => $tmp]); - if($context->getName() !== null && $context->getName() !== '') { $tmp .= '
'.htmlspecialchars($context->getName()).''; } diff --git a/src/Entity/AssemblySystem/Assembly.php b/src/Entity/AssemblySystem/Assembly.php index c65ca71f..fde61cd9 100644 --- a/src/Entity/AssemblySystem/Assembly.php +++ b/src/Entity/AssemblySystem/Assembly.php @@ -118,7 +118,6 @@ class Assembly extends AbstractStructuralDBElement #[Groups(['extended', 'full', 'import'])] #[ORM\OneToMany(targetEntity: AssemblyBOMEntry::class, mappedBy: 'assembly', cascade: ['persist', 'remove'], orphanRemoval: true)] #[UniqueObjectCollection(message: 'assembly.bom_entry.part_already_in_bom', fields: ['part'])] - #[UniqueObjectCollection(message: 'assembly.bom_entry.project_already_in_bom', fields: ['project'])] #[UniqueObjectCollection(message: 'assembly.bom_entry.name_already_in_bom', fields: ['name'])] protected Collection $bom_entries; @@ -137,7 +136,7 @@ class Assembly extends AbstractStructuralDBElement * @var string|null The internal ipn number of the assembly */ #[Assert\Length(max: 100)] - #[Groups(['extended', 'full', 'project:read', 'project:write', 'import'])] + #[Groups(['extended', 'full', 'assembly:read', 'assembly:write', 'import'])] #[ORM\Column(type: Types::STRING, length: 100, unique: true, nullable: true)] #[Length(max: 100)] protected ?string $ipn = null; diff --git a/src/Entity/AssemblySystem/AssemblyBOMEntry.php b/src/Entity/AssemblySystem/AssemblyBOMEntry.php index ebadd2b9..80b7d6bb 100644 --- a/src/Entity/AssemblySystem/AssemblyBOMEntry.php +++ b/src/Entity/AssemblySystem/AssemblyBOMEntry.php @@ -253,17 +253,6 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt return $this; } - public function getProject(): ?Project - { - return $this->project; - } - - public function setProject(?Project $project): AssemblyBOMEntry - { - $this->project = $project; - return $this; - } - /** * Returns the price of this BOM entry, if existing. * Prices are only valid on non-Part BOM entries. @@ -301,6 +290,15 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt return $this->part instanceof Part; } + /** + * Checks whether this BOM entry is a assembly associated BOM entry or not. + * @return bool True if this BOM entry is a assembly associated BOM entry, false otherwise. + */ + public function isAssemblyBomEntry(): bool + { + return $this->referencedAssembly !== null; + } + #[Assert\Callback] public function validate(ExecutionContextInterface $context, $payload): void { @@ -336,7 +334,7 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt return [ 'name' => $this->getName(), 'part' => $this->getPart()?->getID(), - 'project' => $this->getProject()?->getID(), + 'referencedAssembly' => $this->getReferencedAssembly()?->getID(), ]; } } diff --git a/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php b/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php index 9cff3166..c5d22dbe 100644 --- a/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php +++ b/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php @@ -70,4 +70,4 @@ class PartUniqueIpnSubscriber implements EventSubscriber $part->setIpn($originalIpn . "_$increment"); } } -} \ No newline at end of file +} diff --git a/src/Form/AssemblySystem/AssemblyBOMEntryType.php b/src/Form/AssemblySystem/AssemblyBOMEntryType.php index b86b2fd1..851ab815 100644 --- a/src/Form/AssemblySystem/AssemblyBOMEntryType.php +++ b/src/Form/AssemblySystem/AssemblyBOMEntryType.php @@ -39,10 +39,6 @@ class AssemblyBOMEntryType extends AbstractType ->add('part', PartSelectType::class, [ 'required' => false, ]) - ->add('project', ProjectSelectType::class, [ - 'label' => 'assembly.bom.project', - 'required' => false, - ]) ->add('referencedAssembly', AssemblySelectType::class, [ 'label' => 'assembly.bom.referencedAssembly', 'required' => false, diff --git a/src/Helpers/Assemblies/AssemblyPartAggregator.php b/src/Helpers/Assemblies/AssemblyPartAggregator.php new file mode 100644 index 00000000..94c10257 --- /dev/null +++ b/src/Helpers/Assemblies/AssemblyPartAggregator.php @@ -0,0 +1,83 @@ +. + */ +namespace App\Helpers\Assemblies; + +use App\Entity\AssemblySystem\Assembly; +use App\Entity\Parts\Part; + +class AssemblyPartAggregator +{ + /** + * Aggregate the required parts and their total quantities for an assembly. + * + * @param Assembly $assembly The assembly to process. + * @param float $multiplier The quantity multiplier from the parent assembly. + * @return array Array of parts with their aggregated quantities, keyed by Part ID. + */ + public function getAggregatedParts(Assembly $assembly, float $multiplier): array + { + $aggregatedParts = []; + + // Start processing the assembly recursively + $this->processAssembly($assembly, $multiplier, $aggregatedParts); + + // Return the final aggregated list of parts + return $aggregatedParts; + } + + /** + * Recursive helper to process an assembly and all its BOM entries. + * + * @param Assembly $assembly The current assembly to process. + * @param float $multiplier The quantity multiplier from the parent assembly. + * @param array &$aggregatedParts The array to accumulate parts and their quantities. + */ + private function processAssembly(Assembly $assembly, float $multiplier, array &$aggregatedParts): void + { + foreach ($assembly->getBomEntries() as $bomEntry) { + // If the BOM entry refers to a part, add its quantity + if ($bomEntry->getPart() instanceof Part) { + $part = $bomEntry->getPart(); + + if (!isset($aggregatedParts[$part->getId()])) { + $aggregatedParts[$part->getId()] = [ + 'part' => $part, + 'assembly' => $assembly, + 'quantity' => $bomEntry->getQuantity(), + 'multiplier' => $multiplier, + ]; + } + } elseif ($bomEntry->getReferencedAssembly() instanceof Assembly) { + // If the BOM entry refers to another assembly, process it recursively + $this->processAssembly($bomEntry->getReferencedAssembly(), $bomEntry->getQuantity(), $aggregatedParts); + } else { + $aggregatedParts[] = [ + 'part' => null, + 'assembly' => $assembly, + 'quantity' => $bomEntry->getQuantity(), + 'multiplier' => $multiplier, + ]; + } + } + } +} diff --git a/src/Services/AssemblySystem/AssemblyBuildHelper.php b/src/Services/AssemblySystem/AssemblyBuildHelper.php index 430eb5d2..ce52ef0a 100644 --- a/src/Services/AssemblySystem/AssemblyBuildHelper.php +++ b/src/Services/AssemblySystem/AssemblyBuildHelper.php @@ -27,7 +27,6 @@ use App\Entity\AssemblySystem\AssemblyBOMEntry; use App\Entity\Parts\Part; use App\Helpers\Assemblies\AssemblyBuildRequest; use App\Services\Parts\PartLotWithdrawAddHelper; -use App\Services\ProjectSystem\ProjectBuildHelper; /** * @see \App\Tests\Services\AssemblySystem\AssemblyBuildHelperTest @@ -35,8 +34,7 @@ use App\Services\ProjectSystem\ProjectBuildHelper; class AssemblyBuildHelper { public function __construct( - private readonly PartLotWithdrawAddHelper $withdraw_add_helper, - private readonly ProjectBuildHelper $projectBuildHelper + private readonly PartLotWithdrawAddHelper $withdraw_add_helper ) { } @@ -70,7 +68,7 @@ class AssemblyBuildHelper /** @var AssemblyBOMEntry $bom_entry */ foreach ($assembly->getBomEntries() as $bom_entry) { //Skip BOM entries without a part (as we can not determine that) - if (!$bom_entry->isPartBomEntry() && $bom_entry->getProject() === null) { + if (!$bom_entry->isPartBomEntry() && !$bom_entry->isAssemblyBomEntry()) { continue; } @@ -106,6 +104,7 @@ class AssemblyBuildHelper /** * Returns the assembly BOM entries for which parts are missing in the stock for the given number of builds + * Returns the referenced assembly BOM entries for which parts are missing in the stock for the given number of builds * @param Assembly $assembly The assembly for which the BOM entries should be checked * @param int $number_of_builds How often should the assembly be build? * @return AssemblyBOMEntry[] diff --git a/src/Services/ImportExportSystem/EntityExporter.php b/src/Services/ImportExportSystem/EntityExporter.php index 56b5743f..4b5658f1 100644 --- a/src/Services/ImportExportSystem/EntityExporter.php +++ b/src/Services/ImportExportSystem/EntityExporter.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Services\ImportExportSystem; use App\Entity\AssemblySystem\Assembly; +use App\Entity\AssemblySystem\AssemblyBOMEntry; use App\Entity\Attachments\AttachmentType; use App\Entity\Base\AbstractNamedDBElement; use App\Entity\Base\AbstractStructuralDBElement; @@ -35,6 +36,7 @@ use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\PriceInformations\Currency; use App\Entity\ProjectSystem\Project; +use App\Helpers\Assemblies\AssemblyPartAggregator; use App\Helpers\FilenameSanatizer; use App\Serializer\APIPlatform\SkippableItemNormalizer; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -59,8 +61,10 @@ use PhpOffice\PhpSpreadsheet\Writer\Xls; */ class EntityExporter { - public function __construct(protected SerializerInterface $serializer) - { + public function __construct( + protected SerializerInterface $serializer, + protected AssemblyPartAggregator $partAggregator, private readonly AssemblyPartAggregator $assemblyPartAggregator, + ) { } protected function configureOptions(OptionsResolver $resolver): void @@ -356,8 +360,9 @@ class EntityExporter ], Project::class => [ 'header' => [ - 'Id', 'ParentId', 'Type', 'ProjectNameHierarchical', 'ProjectName', 'ProjectFullName', - 'BomQuantity', 'BomPartId', 'BomPartIpn', 'BomPartName', 'BomName', 'BomPartDescription', 'BomMountNames' + 'Id', 'ParentId', 'Type', 'ProjectNameHierarchical', 'ProjectName', 'ProjectFullName', 'BomQuantity', + 'BomPartId', 'BomPartIpn', 'BomPartMpnr', 'BomPartName', 'BomDesignator', 'BomPartDescription', + 'BomMountNames' ], 'processEntity' => fn($entity, $depth) => [ 'ProjectId' => $entity->getId(), @@ -369,12 +374,13 @@ class EntityExporter 'BomQuantity' => '-', 'BomPartId' => '-', 'BomPartIpn' => '-', + 'BomPartMpnr' => '-', 'BomPartName' => '-', - 'BomName' => '-', + 'BomDesignator' => '-', 'BomPartDescription' => '-', 'BomMountNames' => '-', ], - 'processBomEntries' => fn($entity, $depth) => array_map(fn($bomEntry) => [ + 'processBomEntries' => fn($entity, $depth) => array_map(fn(AssemblyBOMEntry $bomEntry) => [ 'Id' => $entity->getId(), 'ParentId' => '', 'Type' => 'project_bom_entry', @@ -384,8 +390,9 @@ class EntityExporter 'BomQuantity' => $bomEntry->getQuantity() ?? '', 'BomPartId' => $bomEntry->getPart()?->getId() ?? '', 'BomPartIpn' => $bomEntry->getPart()?->getIpn() ?? '', + 'BomPartMpnr' => $bomEntry->getPart()?->getManufacturerProductNumber() ?? '', 'BomPartName' => $bomEntry->getPart()?->getName() ?? '', - 'BomName' => $bomEntry->getName() ?? '', + 'BomDesignator' => $bomEntry->getName() ?? '', 'BomPartDescription' => $bomEntry->getPart()?->getDescription() ?? '', 'BomMountNames' => $bomEntry->getMountNames(), ], $entity->getBomEntries()->toArray()), @@ -393,8 +400,9 @@ class EntityExporter Assembly::class => [ 'header' => [ 'Id', 'ParentId', 'Type', 'AssemblyIpn', 'AssemblyNameHierarchical', 'AssemblyName', - 'AssemblyFullName', 'BomQuantity', 'BomPartId', 'BomPartIpn', 'BomPartName', 'BomName', 'BomPartDescription', - 'BomMountNames', 'BomReferencedAssemblyId', 'BomReferencedAssemblyIpn', 'BomReferencedAssemblyFullName' + 'AssemblyFullName', 'BomQuantity', 'BomMultiplier', 'BomPartId', 'BomPartIpn', 'BomPartMpnr', + 'BomPartName', 'BomDesignator', 'BomPartDescription', 'BomMountNames', 'BomReferencedAssemblyId', + 'BomReferencedAssemblyIpn', 'BomReferencedAssemblyFullName' ], 'processEntity' => fn($entity, $depth) => [ 'Id' => $entity->getId(), @@ -405,35 +413,19 @@ class EntityExporter 'AssemblyName' => $entity->getName(), 'AssemblyFullName' => $this->getFullName($entity), 'BomQuantity' => '-', + 'BomMultiplier' => '-', 'BomPartId' => '-', 'BomPartIpn' => '-', + 'BomPartMpnr' => '-', 'BomPartName' => '-', - 'BomName' => '-', + 'BomDesignator' => '-', 'BomPartDescription' => '-', 'BomMountNames' => '-', 'BomReferencedAssemblyId' => '-', 'BomReferencedAssemblyIpn' => '-', 'BomReferencedAssemblyFullName' => '-', ], - 'processBomEntries' => fn($entity, $depth) => array_map(fn($bomEntry) => [ - 'Id' => $entity->getId(), - 'ParentId' => '', - 'Type' => 'assembly_bom_entry', - 'AssemblyIpn' => $entity->getIpn(), - 'AssemblyNameHierarchical' => str_repeat('--', $depth) . '> ' . $entity->getName(), - 'AssemblyName' => $entity->getName(), - 'AssemblyFullName' => $this->getFullName($entity), - 'BomQuantity' => $bomEntry->getQuantity() ?? '', - 'BomPartId' => $bomEntry->getPart()?->getId() ?? '', - 'BomPartIpn' => $bomEntry->getPart()?->getIpn() ?? '', - 'BomPartName' => $bomEntry->getPart()?->getName() ?? '', - 'BomName' => $bomEntry->getName() ?? '', - 'BomPartDescription' => $bomEntry->getPart()?->getDescription() ?? '', - 'BomMountNames' => $bomEntry->getMountNames(), - 'BomReferencedAssemblyId' => $bomEntry->getReferencedAssembly()?->getId() ?? '', - 'BomReferencedAssemblyIpn' => $bomEntry->getReferencedAssembly()?->getIpn() ?? '', - 'BomReferencedAssemblyFullName' => $this->getFullName($bomEntry->getReferencedAssembly() ?? null), - ], $entity->getBomEntries()->toArray()), + 'processBomEntries' => fn($entity, $depth) => $this->processBomEntriesWithAggregatedParts($entity, $depth), ], Supplier::class => [ 'header' => ['Id', 'ParentId', 'NameHierarchical', 'Name', 'FullName'], @@ -533,6 +525,79 @@ class EntityExporter return $output; } + /** + * Process BOM entries and include aggregated parts as "complete_part_list". + * + * @param Assembly $assembly The assembly being processed. + * @param int $depth The current depth in the hierarchy. + * @return array Processed BOM entries and aggregated parts rows. + */ + private function processBomEntriesWithAggregatedParts(Assembly $assembly, int $depth): array + { + $rows = []; + + foreach ($assembly->getBomEntries() as $bomEntry) { + // Add the BOM entry itself + $rows[] = [ + 'Id' => $assembly->getId(), + 'ParentId' => '', + 'Type' => 'assembly_bom_entry', + 'AssemblyIpn' => $assembly->getIpn(), + 'AssemblyNameHierarchical' => str_repeat('--', $depth) . '> ' . $assembly->getName(), + 'AssemblyName' => $assembly->getName(), + 'AssemblyFullName' => $this->getFullName($assembly), + 'BomQuantity' => $bomEntry->getQuantity() ?? '', + 'BomMultiplier' => '', + 'BomPartId' => $bomEntry->getPart()?->getId() ?? '-', + 'BomPartIpn' => $bomEntry->getPart()?->getIpn() ?? '-', + 'BomPartMpnr' => $bomEntry->getPart()?->getManufacturerProductNumber() ?? '-', + 'BomPartName' => $bomEntry->getPart()?->getName() ?? '-', + 'BomDesignator' => $bomEntry->getName() ?? '-', + 'BomPartDescription' => $bomEntry->getPart()?->getDescription() ?? '-', + 'BomMountNames' => $bomEntry->getMountNames(), + 'BomReferencedAssemblyId' => $bomEntry->getReferencedAssembly()?->getId() ?? '-', + 'BomReferencedAssemblyIpn' => $bomEntry->getReferencedAssembly()?->getIpn() ?? '-', + 'BomReferencedAssemblyFullName' => $this->getFullName($bomEntry->getReferencedAssembly() ?? null), + ]; + + // If a referenced assembly exists, add aggregated parts + if ($bomEntry->getReferencedAssembly() instanceof Assembly) { + $referencedAssembly = $bomEntry->getReferencedAssembly(); + + // Get aggregated parts for the referenced assembly + $aggregatedParts = $this->assemblyPartAggregator->getAggregatedParts($referencedAssembly, $bomEntry->getQuantity());; + + foreach ($aggregatedParts as $partData) { + $partAssembly = $partData['assembly'] ?? null; + + $rows[] = [ + 'Id' => $assembly->getId(), + 'ParentId' => '', + 'Type' => 'subassembly_part_list', + 'AssemblyIpn' => $partAssembly ? $partAssembly->getIpn() : '', + 'AssemblyNameHierarchical' => '', + 'AssemblyName' => $partAssembly ? $partAssembly->getName() : '', + 'AssemblyFullName' => $this->getFullName($partAssembly), + 'BomQuantity' => $partData['quantity'], + 'BomMultiplier' => $partData['multiplier'], + 'BomPartId' => $partData['part']?->getId(), + 'BomPartIpn' => $partData['part']?->getIpn(), + 'BomPartMpnr' => $partData['part']?->getManufacturerProductNumber(), + 'BomPartName' => $partData['part']?->getName(), + 'BomDesignator' => $partData['part']?->getName(), + 'BomPartDescription' => $partData['part']?->getDescription(), + 'BomMountNames' => '-', + 'BomReferencedAssemblyId' => '-', + 'BomReferencedAssemblyIpn' => '-', + 'BomReferencedAssemblyFullName' => '-', + ]; + } + } + } + + return $rows; + } + /** * Constructs the full hierarchical name of an object by traversing * through its parent objects and concatenating their names using diff --git a/translations/validators.cs.xlf b/translations/validators.cs.xlf index 5b899d98..40c02a4b 100644 --- a/translations/validators.cs.xlf +++ b/translations/validators.cs.xlf @@ -413,12 +413,6 @@ Sestava nesmí ve svém seznamu materiálů (BOM) odkazovat na podskupinu, která je součástí její vlastní hierarchie. - - - assembly.bom_entry.project_already_in_bom - Tento projekt již v této skupině existuje! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.da.xlf b/translations/validators.da.xlf index f30dd211..98d10775 100644 --- a/translations/validators.da.xlf +++ b/translations/validators.da.xlf @@ -383,12 +383,6 @@ En samling må ikke referere til en undergruppe fra sin egen hierarki i BOM-listerne. - - - assembly.bom_entry.project_already_in_bom - Dette projekt eksisterer allerede i gruppen! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.de.xlf b/translations/validators.de.xlf index 8e6d7f02..06764efd 100644 --- a/translations/validators.de.xlf +++ b/translations/validators.de.xlf @@ -407,12 +407,6 @@ Eine Baugruppe darf keine Unterbaugruppe aus seiner eigenen Hierarchie in den BOM-Einträgen referenzieren. - - - assembly.bom_entry.project_already_in_bom - Dieses Projekt existiert bereits in der Gruppe! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.el.xlf b/translations/validators.el.xlf index 9464f288..320155ff 100644 --- a/translations/validators.el.xlf +++ b/translations/validators.el.xlf @@ -49,12 +49,6 @@ Μία συναρμολόγηση δεν πρέπει να αναφέρεται σε μία υποσυναρμολόγηση από την ίδια την ιεραρχία της στη λίστα BOM. - - - assembly.bom_entry.project_already_in_bom - Αυτό το έργο υπάρχει ήδη στην ομάδα! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.en.xlf b/translations/validators.en.xlf index 8bc34a33..375d6ff3 100644 --- a/translations/validators.en.xlf +++ b/translations/validators.en.xlf @@ -407,12 +407,6 @@ An assembly must not reference a subassembly from its own hierarchy in the BOM entries. - - - assembly.bom_entry.project_already_in_bom - This project already exists in the list! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.fr.xlf b/translations/validators.fr.xlf index 44046829..d8e824af 100644 --- a/translations/validators.fr.xlf +++ b/translations/validators.fr.xlf @@ -239,12 +239,6 @@ Un assemblage ne doit pas référencer un sous-assemblage de sa propre hiérarchie dans les entrées de la nomenclature (BOM). - - - assembly.bom_entry.project_already_in_bom - Ce projet existe déjà dans le groupe! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.hr.xlf b/translations/validators.hr.xlf index 485cb0e2..23ea0e84 100644 --- a/translations/validators.hr.xlf +++ b/translations/validators.hr.xlf @@ -401,12 +401,6 @@ Sklop ne smije referencirati podsklop iz vlastite hijerarhije u unosima BOM-a. - - - assembly.bom_entry.project_already_in_bom - Ovaj projekt već postoji u grupi! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.it.xlf b/translations/validators.it.xlf index 74d3969f..4851ab6e 100644 --- a/translations/validators.it.xlf +++ b/translations/validators.it.xlf @@ -401,12 +401,6 @@ Un assemblaggio non deve fare riferimento a un sottoassemblaggio nella propria gerarchia nelle voci della distinta base (BOM). - - - assembly.bom_entry.project_already_in_bom - Questo progetto esiste già nel gruppo! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.ja.xlf b/translations/validators.ja.xlf index f9f8a54f..aed026ea 100644 --- a/translations/validators.ja.xlf +++ b/translations/validators.ja.xlf @@ -239,12 +239,6 @@ アセンブリは、BOMエントリで自身の階層内のサブアセンブリを参照してはいけません。 - - - assembly.bom_entry.project_already_in_bom - このプロジェクトは既にグループに存在しています! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.pl.xlf b/translations/validators.pl.xlf index 9916178c..68d65a4a 100644 --- a/translations/validators.pl.xlf +++ b/translations/validators.pl.xlf @@ -401,12 +401,6 @@ Zespół nie może odwoływać się do podzespołu w swojej własnej hierarchii w wpisach BOM. - - - assembly.bom_entry.project_already_in_bom - Ten projekt już znajduje się w grupie! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.ru.xlf b/translations/validators.ru.xlf index b8029e47..f80d91d7 100644 --- a/translations/validators.ru.xlf +++ b/translations/validators.ru.xlf @@ -401,12 +401,6 @@ Сборка не должна ссылаться на подсборку внутри своей собственной иерархии в записях спецификации (BOM). - - - assembly.bom_entry.project_already_in_bom - Этот проект уже находится в группе! - - assembly.bom_entry.name_already_in_bom diff --git a/translations/validators.zh.xlf b/translations/validators.zh.xlf index 6e4fc056..c7425081 100644 --- a/translations/validators.zh.xlf +++ b/translations/validators.zh.xlf @@ -389,12 +389,6 @@ Сборка не должна ссылаться на подсборку внутри своей собственной иерархии в записях спецификации (BOM). - - - assembly.bom_entry.project_already_in_bom - 该项目已在组中! - - assembly.bom_entry.name_already_in_bom