mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2026-01-11 04:39:33 +00:00
Entferne Projektbezogene Logik bzw. Verweise auf Baugruppen, da nicht benötigt. Überarbeitung Exporter: Aufnahme von Parts aus Subassemblies.
This commit is contained in:
parent
dc3279c449
commit
5e3a9ec90c
21 changed files with 193 additions and 136 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
} 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 .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,4 +70,4 @@ class PartUniqueIpnSubscriber implements EventSubscriber
|
|||
$part->setIpn($originalIpn . "_$increment");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
83
src/Helpers/Assemblies/AssemblyPartAggregator.php
Normal file
83
src/Helpers/Assemblies/AssemblyPartAggregator.php
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2023 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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,
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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[]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -413,12 +413,6 @@
|
|||
<target>Sestava nesmí ve svém seznamu materiálů (BOM) odkazovat na podskupinu, která je součástí její vlastní hierarchie.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Tento projekt již v této skupině existuje!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -383,12 +383,6 @@
|
|||
<target>En samling må ikke referere til en undergruppe fra sin egen hierarki i BOM-listerne.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Dette projekt eksisterer allerede i gruppen!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -407,12 +407,6 @@
|
|||
<target>Eine Baugruppe darf keine Unterbaugruppe aus seiner eigenen Hierarchie in den BOM-Einträgen referenzieren.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Dieses Projekt existiert bereits in der Gruppe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -49,12 +49,6 @@
|
|||
<target>Μία συναρμολόγηση δεν πρέπει να αναφέρεται σε μία υποσυναρμολόγηση από την ίδια την ιεραρχία της στη λίστα BOM.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Αυτό το έργο υπάρχει ήδη στην ομάδα!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -407,12 +407,6 @@
|
|||
<target>An assembly must not reference a subassembly from its own hierarchy in the BOM entries.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>This project already exists in the list!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -239,12 +239,6 @@
|
|||
<target>Un assemblage ne doit pas référencer un sous-assemblage de sa propre hiérarchie dans les entrées de la nomenclature (BOM).</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ce projet existe déjà dans le groupe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -401,12 +401,6 @@
|
|||
<target>Sklop ne smije referencirati podsklop iz vlastite hijerarhije u unosima BOM-a.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ovaj projekt već postoji u grupi!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -401,12 +401,6 @@
|
|||
<target>Un assemblaggio non deve fare riferimento a un sottoassemblaggio nella propria gerarchia nelle voci della distinta base (BOM).</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Questo progetto esiste già nel gruppo!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -239,12 +239,6 @@
|
|||
<target>アセンブリは、BOMエントリで自身の階層内のサブアセンブリを参照してはいけません。</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>このプロジェクトは既にグループに存在しています!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -401,12 +401,6 @@
|
|||
<target>Zespół nie może odwoływać się do podzespołu w swojej własnej hierarchii w wpisach BOM.</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ten projekt już znajduje się w grupie!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -401,12 +401,6 @@
|
|||
<target>Сборка не должна ссылаться на подсборку внутри своей собственной иерархии в записях спецификации (BOM).</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Этот проект уже находится в группе!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -389,12 +389,6 @@
|
|||
<target>Сборка не должна ссылаться на подсборку внутри своей собственной иерархии в записях спецификации (BOM).</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>该项目已在组中!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue