Assemblies einführen

This commit is contained in:
Marcel Diegelmann 2025-03-19 08:13:45 +01:00
parent c79fc47c1e
commit 55828d830d
45 changed files with 2754 additions and 127 deletions

View file

@ -18,42 +18,42 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{ {
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TABLE assemblies ( CREATE TABLE assemblies (
id INT AUTO_INCREMENT NOT NULL, id INT AUTO_INCREMENT NOT NULL,
parent_id INT DEFAULT NULL, parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL, id_preview_attachment INT DEFAULT NULL,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,
comment LONGTEXT NOT NULL, comment LONGTEXT NOT NULL,
not_selectable TINYINT(1) NOT NULL, not_selectable TINYINT(1) NOT NULL,
alternative_names LONGTEXT DEFAULT NULL, alternative_names LONGTEXT DEFAULT NULL,
order_quantity INT NOT NULL, order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL, status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts TINYINT(1) NOT NULL, order_only_missing_parts TINYINT(1) NOT NULL,
description LONGTEXT NOT NULL, description LONGTEXT NOT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_5F3832C0727ACA70 (parent_id), INDEX IDX_5F3832C0727ACA70 (parent_id),
INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment), INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment),
PRIMARY KEY(id) PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`
SQL); SQL);
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TABLE assembly_bom_entries ( CREATE TABLE assembly_bom_entries (
id INT AUTO_INCREMENT NOT NULL, id INT AUTO_INCREMENT NOT NULL,
id_assembly INT DEFAULT NULL, id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL, id_part INT DEFAULT NULL,
id_project INT DEFAULT NULL, id_project INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL, quantity DOUBLE PRECISION NOT NULL,
mountnames LONGTEXT NOT NULL, mountnames LONGTEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL, name VARCHAR(255) DEFAULT NULL,
comment LONGTEXT NOT NULL, comment LONGTEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL, price NUMERIC(11, 5) DEFAULT NULL,
price_currency_id INT DEFAULT NULL, price_currency_id INT DEFAULT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_8C74887E2F180363 (id_assembly), INDEX IDX_8C74887E2F180363 (id_assembly),
INDEX IDX_8C74887EC22F6CC4 (id_part), INDEX IDX_8C74887EC22F6CC4 (id_part),
INDEX IDX_8C74887EF12E799E (id_project), INDEX IDX_8C74887EF12E799E (id_project),
INDEX IDX_8C74887E3FFDCD60 (price_currency_id), INDEX IDX_8C74887E3FFDCD60 (price_currency_id),
PRIMARY KEY(id) PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`
SQL); SQL);
@ -109,7 +109,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{ {
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TABLE assemblies ( CREATE TABLE assemblies (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
parent_id INTEGER DEFAULT NULL, parent_id INTEGER DEFAULT NULL,
id_preview_attachment INTEGER DEFAULT NULL, id_preview_attachment INTEGER DEFAULT NULL,
order_quantity INTEGER NOT NULL, order_quantity INTEGER NOT NULL,
@ -120,7 +120,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
status VARCHAR(64) DEFAULT NULL, status VARCHAR(64) DEFAULT NULL,
ipn VARCHAR(100) DEFAULT NULL, ipn VARCHAR(100) DEFAULT NULL,
description CLOB NOT NULL, description CLOB NOT NULL,
alternative_names CLOB DEFAULT NULL, alternative_names CLOB DEFAULT NULL,
CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
@ -145,7 +145,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
id_assembly INTEGER DEFAULT NULL, id_assembly INTEGER DEFAULT NULL,
id_part INTEGER DEFAULT NULL, id_part INTEGER DEFAULT NULL,
id_project INTEGER DEFAULT NULL, id_project INTEGER DEFAULT NULL,
id_referenced_assembly INTEGER DEFAULT NULL, id_referenced_assembly INTEGER DEFAULT NULL,
price_currency_id INTEGER DEFAULT NULL, price_currency_id INTEGER DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL, quantity DOUBLE PRECISION NOT NULL,
@ -158,8 +158,8 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
CONSTRAINT FK_8C74887E4AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_8C74887E4AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
) )
SQL); SQL);
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
@ -193,19 +193,19 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{ {
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TABLE assemblies ( CREATE TABLE assemblies (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
comment TEXT NOT NULL, comment TEXT NOT NULL,
not_selectable BOOLEAN NOT NULL, not_selectable BOOLEAN NOT NULL,
alternative_names TEXT DEFAULT NULL, alternative_names TEXT DEFAULT NULL,
order_quantity INT NOT NULL, order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL, status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts BOOLEAN NOT NULL, order_only_missing_parts BOOLEAN NOT NULL,
description TEXT NOT NULL, description TEXT NOT NULL,
parent_id INT DEFAULT NULL, parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL, id_preview_attachment INT DEFAULT NULL,
PRIMARY KEY(id) PRIMARY KEY(id)
) )
SQL); SQL);
@ -217,18 +217,18 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
SQL); SQL);
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TABLE assembly_bom_entries ( CREATE TABLE assembly_bom_entries (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
id_assembly INT DEFAULT NULL, id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL, id_part INT DEFAULT NULL,
id_project INT DEFAULT NULL, id_project INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL, quantity DOUBLE PRECISION NOT NULL,
mountnames TEXT NOT NULL, mountnames TEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL, name VARCHAR(255) DEFAULT NULL,
comment TEXT NOT NULL, comment TEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL, price NUMERIC(11, 5) DEFAULT NULL,
price_currency_id INT DEFAULT NULL, price_currency_id INT DEFAULT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY(id) PRIMARY KEY(id)
) )
SQL); SQL);

View file

@ -44,8 +44,8 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
public function sqLiteUp(Schema $schema): void public function sqLiteUp(Schema $schema): void
{ {
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TEMPORARY TABLE __temp__parts AS CREATE TEMPORARY TABLE __temp__parts AS
SELECT SELECT
id, id,
id_preview_attachment, id_preview_attachment,
id_category, id_category,
@ -82,7 +82,7 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
eda_info_exclude_from_board, eda_info_exclude_from_board,
eda_info_exclude_from_sim, eda_info_exclude_from_sim,
eda_info_kicad_symbol, eda_info_kicad_symbol,
eda_info_kicad_footprint eda_info_kicad_footprint
FROM parts FROM parts
SQL); SQL);
$this->addSql('DROP TABLE parts'); $this->addSql('DROP TABLE parts');
@ -148,8 +148,8 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
id_part_unit, id_part_unit,
id_manufacturer, id_manufacturer,
order_orderdetails_id, order_orderdetails_id,
built_project_id, built_project_id,
datetime_added, datetime_added,
name, name,
last_modified, last_modified,
needs_review, needs_review,
@ -164,12 +164,12 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
manufacturer_product_number, manufacturer_product_number,
manufacturing_status, manufacturing_status,
order_quantity, order_quantity,
manual_order, manual_order,
ipn, ipn,
provider_reference_provider_key, provider_reference_provider_key,
provider_reference_provider_id, provider_reference_provider_id,
provider_reference_provider_url, provider_reference_provider_url,
provider_reference_last_updated, provider_reference_last_updated,
eda_info_reference_prefix, eda_info_reference_prefix,
eda_info_value, eda_info_value,
eda_info_invisible, eda_info_invisible,
@ -223,8 +223,8 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
public function sqLiteDown(Schema $schema): void public function sqLiteDown(Schema $schema): void
{ {
$this->addSql(<<<'SQL' $this->addSql(<<<'SQL'
CREATE TEMPORARY TABLE __temp__parts AS CREATE TEMPORARY TABLE __temp__parts AS
SELECT SELECT
id, id,
id_preview_attachment, id_preview_attachment,
id_category, id_category,
@ -326,8 +326,8 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
id_part_unit, id_part_unit,
id_manufacturer, id_manufacturer,
order_orderdetails_id, order_orderdetails_id,
built_project_id, built_project_id,
datetime_added, datetime_added,
name, name,
last_modified, last_modified,
needs_review, needs_review,
@ -342,12 +342,12 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
manufacturer_product_number, manufacturer_product_number,
manufacturing_status, manufacturing_status,
order_quantity, order_quantity,
manual_order, manual_order,
ipn, ipn,
provider_reference_provider_key, provider_reference_provider_key,
provider_reference_provider_id, provider_reference_provider_id,
provider_reference_provider_url, provider_reference_provider_url,
provider_reference_last_updated, provider_reference_last_updated,
eda_info_reference_prefix, eda_info_reference_prefix,
eda_info_value, eda_info_value,
eda_info_invisible, eda_info_invisible,

View file

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20250310160354 extends AbstractMigration
{
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE assembly_bom_entries RENAME INDEX idx_8c74887e2f180363 TO IDX_8C74887E4AD2039E');
$this->addSql('ALTER TABLE project_bom_entries ADD id_assembly INT DEFAULT NULL AFTER id_part');
$this->addSql('ALTER TABLE project_bom_entries ADD CONSTRAINT FK_1AA2DD314AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id)');
$this->addSql('CREATE INDEX IDX_1AA2DD314AD2039E ON project_bom_entries (id_assembly)');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE assembly_bom_entries RENAME INDEX idx_8c74887e4ad2039e TO IDX_8C74887E2F180363');
$this->addSql('ALTER TABLE project_bom_entries DROP FOREIGN KEY FK_1AA2DD314AD2039E');
$this->addSql('DROP INDEX IDX_1AA2DD314AD2039E ON project_bom_entries');
$this->addSql('ALTER TABLE project_bom_entries DROP id_assembly');
}
}

View file

@ -207,7 +207,7 @@ final class PartController extends AbstractController
#[Route(path: '/new', name: 'part_new')] #[Route(path: '/new', name: 'part_new')]
#[Route(path: '/{id}/clone', name: 'part_clone')] #[Route(path: '/{id}/clone', name: 'part_clone')]
#[Route(path: '/new_build_part/{project_id}', name: 'part_new_build_part')] #[Route(path: '/new_build_part_project/{project_id}', name: 'part_new_build_part_project')]
#[Route(path: '/new_build_part_assembly/{assembly_id}', name: 'part_new_build_part_assembly')] #[Route(path: '/new_build_part_assembly/{assembly_id}', name: 'part_new_build_part_assembly')]
public function new( public function new(
Request $request, Request $request,

View file

@ -206,7 +206,7 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface
//Apply the user configured order and visibility and add the columns to the table //Apply the user configured order and visibility and add the columns to the table
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns,"TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS"); $this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns,"TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS");
$dataTable->addOrderBy('name'); $dataTable->addOrderBy('name', DataTable::SORT_ASCENDING);
$dataTable->createAdapter(ORMAdapter::class, [ $dataTable->createAdapter(ORMAdapter::class, [
'entity' => Attachment::class, 'entity' => Attachment::class,

View file

@ -37,6 +37,7 @@ use ApiPlatform\Serializer\Filter\PropertyFilter;
use App\ApiPlatform\Filter\LikeFilter; use App\ApiPlatform\Filter\LikeFilter;
use App\Entity\Contracts\TimeStampableInterface; use App\Entity\Contracts\TimeStampableInterface;
use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\Project;
use App\Entity\AssemblySystem\Assembly;
use App\Repository\DBElementRepository; use App\Repository\DBElementRepository;
use App\Validator\Constraints\AssemblySystem\AssemblyCycle; use App\Validator\Constraints\AssemblySystem\AssemblyCycle;
use App\Validator\Constraints\AssemblySystem\AssemblyInvalidBomEntry; use App\Validator\Constraints\AssemblySystem\AssemblyInvalidBomEntry;

View file

@ -22,9 +22,6 @@ declare(strict_types=1);
namespace App\Entity\Base; namespace App\Entity\Base;
use App\Entity\AssemblySystem\Assembly;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\Attachments\AssemblyAttachment;
use App\Entity\Attachments\AttachmentType; use App\Entity\Attachments\AttachmentType;
use App\Entity\Attachments\Attachment; use App\Entity\Attachments\Attachment;
use App\Entity\Attachments\AttachmentTypeAttachment; use App\Entity\Attachments\AttachmentTypeAttachment;
@ -38,6 +35,7 @@ use App\Entity\Attachments\MeasurementUnitAttachment;
use App\Entity\Attachments\PartAttachment; use App\Entity\Attachments\PartAttachment;
use App\Entity\Attachments\PartCustomStateAttachment; use App\Entity\Attachments\PartCustomStateAttachment;
use App\Entity\Attachments\ProjectAttachment; use App\Entity\Attachments\ProjectAttachment;
use App\Entity\Attachments\AssemblyAttachment;
use App\Entity\Attachments\StorageLocationAttachment; use App\Entity\Attachments\StorageLocationAttachment;
use App\Entity\Attachments\SupplierAttachment; use App\Entity\Attachments\SupplierAttachment;
use App\Entity\Attachments\UserAttachment; use App\Entity\Attachments\UserAttachment;
@ -47,6 +45,8 @@ use App\Entity\PriceInformations\Pricedetail;
use App\Entity\Parts\PartCustomState; use App\Entity\Parts\PartCustomState;
use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\Project;
use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\ProjectSystem\ProjectBOMEntry;
use App\Entity\AssemblySystem\Assembly;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\Parts\Footprint; use App\Entity\Parts\Footprint;
use App\Entity\UserSystem\Group; use App\Entity\UserSystem\Group;
use App\Entity\Parts\Manufacturer; use App\Entity\Parts\Manufacturer;
@ -87,12 +87,15 @@ use Symfony\Component\Serializer\Annotation\Groups;
'part_attachment' => PartAttachment::class, 'part_attachment' => PartAttachment::class,
'part_custom_state_attachment' => PartCustomStateAttachment::class, 'part_custom_state_attachment' => PartCustomStateAttachment::class,
'project_attachment' => ProjectAttachment::class, 'project_attachment' => ProjectAttachment::class,
'assembly_attachment' => AssemblyAttachment::class,
'storelocation_attachment' => StorageLocationAttachment::class, 'storelocation_attachment' => StorageLocationAttachment::class,
'supplier_attachment' => SupplierAttachment::class, 'supplier_attachment' => SupplierAttachment::class,
'user_attachment' => UserAttachment::class, 'user_attachment' => UserAttachment::class,
'category' => Category::class, 'category' => Category::class,
'project' => Project::class, 'project' => Project::class,
'project_bom_entry' => ProjectBOMEntry::class, 'project_bom_entry' => ProjectBOMEntry::class,
'assembly' => Assembly::class,
'assembly_bom_entry' => AssemblyBOMEntry::class,
'footprint' => Footprint::class, 'footprint' => Footprint::class,
'group' => Group::class, 'group' => Group::class,
'manufacturer' => Manufacturer::class, 'manufacturer' => Manufacturer::class,

View file

@ -108,6 +108,7 @@ class Project extends AbstractStructuralDBElement
#[Groups(['extended', 'full', 'import'])] #[Groups(['extended', 'full', 'import'])]
#[ORM\OneToMany(mappedBy: 'project', targetEntity: ProjectBOMEntry::class, cascade: ['persist', 'remove'], orphanRemoval: true)] #[ORM\OneToMany(mappedBy: 'project', targetEntity: ProjectBOMEntry::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
#[UniqueObjectCollection(message: 'project.bom_entry.part_already_in_bom', fields: ['part'])] #[UniqueObjectCollection(message: 'project.bom_entry.part_already_in_bom', fields: ['part'])]
#[UniqueObjectCollection(message: 'project.bom_entry.assembly_already_in_bom', fields: ['assembly'])]
#[UniqueObjectCollection(message: 'project.bom_entry.name_already_in_bom', fields: ['name'])] #[UniqueObjectCollection(message: 'project.bom_entry.name_already_in_bom', fields: ['name'])]
protected Collection $bom_entries; protected Collection $bom_entries;

View file

@ -35,6 +35,7 @@ use ApiPlatform\Metadata\Post;
use ApiPlatform\OpenApi\Model\Operation; use ApiPlatform\OpenApi\Model\Operation;
use ApiPlatform\Serializer\Filter\PropertyFilter; use ApiPlatform\Serializer\Filter\PropertyFilter;
use App\ApiPlatform\Filter\LikeFilter; use App\ApiPlatform\Filter\LikeFilter;
use App\Entity\AssemblySystem\Assembly;
use App\Entity\Contracts\TimeStampableInterface; use App\Entity\Contracts\TimeStampableInterface;
use App\Repository\DBElementRepository; use App\Repository\DBElementRepository;
use App\Validator\UniqueValidatableInterface; use App\Validator\UniqueValidatableInterface;
@ -104,7 +105,10 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
/** /**
* @var string|null An optional name describing this BOM entry (useful for non-part entries) * @var string|null An optional name describing this BOM entry (useful for non-part entries)
*/ */
#[Assert\Expression('this.getPart() !== null or this.getName() !== null', message: 'validator.project.bom_entry.name_or_part_needed')] #[Assert\Expression(
'this.getPart() !== null or this.getAssembly() !== null or (this.getName() !== null and this.getName() != "")',
message: 'validator.project.bom_entry.part_or_assembly_needed'
)]
#[ORM\Column(type: Types::STRING, nullable: true)] #[ORM\Column(type: Types::STRING, nullable: true)]
#[Groups(['bom_entry:read', 'bom_entry:write', 'import', 'simple', 'extended', 'full'])] #[Groups(['bom_entry:read', 'bom_entry:write', 'import', 'simple', 'extended', 'full'])]
protected ?string $name = null; protected ?string $name = null;
@ -132,6 +136,18 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
#[Groups(['bom_entry:read', 'bom_entry:write', 'full'])] #[Groups(['bom_entry:read', 'bom_entry:write', 'full'])]
protected ?Part $part = null; protected ?Part $part = null;
/**
* @var Assembly|null The associated assembly
*/
#[Assert\Expression(
'(this.getPart() === null or this.getAssembly() === null) and (this.getName() === null or (this.getName() != null and this.getName() != ""))',
message: 'validator.project.bom_entry.only_part_or_assembly_allowed'
)]
#[ORM\ManyToOne(targetEntity: Assembly::class, inversedBy: 'assembly_bom_entries')]
#[ORM\JoinColumn(name: 'id_assembly')]
#[Groups(['bom_entry:read', 'bom_entry:write', ])]
protected ?Assembly $assembly = null;
/** /**
* @var BigDecimal|null The price of this non-part BOM entry * @var BigDecimal|null The price of this non-part BOM entry
*/ */
@ -224,6 +240,16 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
return $this; return $this;
} }
public function getAssembly(): ?Assembly
{
return $this->assembly;
}
public function setAssembly(?Assembly $assembly): void
{
$this->assembly = $assembly;
}
/** /**
* Returns the price of this BOM entry, if existing. * Returns the price of this BOM entry, if existing.
* Prices are only valid on non-Part BOM entries. * Prices are only valid on non-Part BOM entries.
@ -261,6 +287,15 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
return $this->part instanceof Part; 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->assembly instanceof Assembly;
}
#[Assert\Callback] #[Assert\Callback]
public function validate(ExecutionContextInterface $context, $payload): void public function validate(ExecutionContextInterface $context, $payload): void
{ {
@ -322,6 +357,7 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
return [ return [
'name' => $this->getName(), 'name' => $this->getName(),
'part' => $this->getPart()?->getID(), 'part' => $this->getPart()?->getID(),
'assembly' => $this->getAssembly()?->getID(),
]; ];
} }
} }

View file

@ -59,6 +59,7 @@ class ProjectAddPartsType extends AbstractType
], ],
'constraints' => [ 'constraints' => [
new UniqueObjectCollection(message: 'project.bom_entry.part_already_in_bom', fields: ['part']), new UniqueObjectCollection(message: 'project.bom_entry.part_already_in_bom', fields: ['part']),
new UniqueObjectCollection(message: 'project.bom_entry.assembly_already_in_bom', fields: ['assembly']),
new UniqueObjectCollection(message: 'project.bom_entry.name_already_in_bom', fields: ['name']), new UniqueObjectCollection(message: 'project.bom_entry.name_already_in_bom', fields: ['name']),
] ]
]); ]);

View file

@ -22,10 +22,13 @@ declare(strict_types=1);
*/ */
namespace App\Helpers\Projects; namespace App\Helpers\Projects;
use App\Entity\AssemblySystem\Assembly;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\Parts\Part; use App\Entity\Parts\Part;
use App\Entity\Parts\PartLot; use App\Entity\Parts\PartLot;
use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\Project;
use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\ProjectSystem\ProjectBOMEntry;
use App\Helpers\Assemblies\AssemblyBuildRequest;
use App\Validator\Constraints\ProjectSystem\ValidProjectBuildRequest; use App\Validator\Constraints\ProjectSystem\ValidProjectBuildRequest;
/** /**
@ -79,7 +82,7 @@ final class ProjectBuildRequest
//Completely reset the array //Completely reset the array
$this->withdraw_amounts = []; $this->withdraw_amounts = [];
//Now create an array for each BOM entry //Now create an array for each part BOM entry
foreach ($this->getPartBomEntries() as $bom_entry) { foreach ($this->getPartBomEntries() as $bom_entry) {
$remaining_amount = $this->getNeededAmountForBOMEntry($bom_entry); $remaining_amount = $this->getNeededAmountForBOMEntry($bom_entry);
foreach($this->getPartLotsForBOMEntry($bom_entry) as $lot) { foreach($this->getPartLotsForBOMEntry($bom_entry) as $lot) {
@ -88,6 +91,21 @@ final class ProjectBuildRequest
$remaining_amount -= max(0, $this->withdraw_amounts[$lot->getID()]); $remaining_amount -= max(0, $this->withdraw_amounts[$lot->getID()]);
} }
} }
//Now create an array for each assembly BOM entry
foreach ($this->getAssemblyBomEntries() as $assemblyBomEntry) {
$assemblyBuildRequest = new AssemblyBuildRequest($assemblyBomEntry->getAssembly(), $this->number_of_builds);
//Add fields for assembly bom entries
foreach ($assemblyBuildRequest->getPartBomEntries() as $partBomEntry) {
$remaining_amount = $assemblyBuildRequest->getNeededAmountForBOMEntry($partBomEntry) * $assemblyBomEntry->getQuantity();
foreach ($assemblyBuildRequest->getPartLotsForBOMEntry($partBomEntry) as $lot) {
$this->withdraw_amounts[$lot->getID()] = min($remaining_amount, $lot->getAmount());
$remaining_amount -= max(0, $this->withdraw_amounts[$lot->getID()]);
}
}
}
} }
/** /**
@ -230,12 +248,77 @@ final class ProjectBuildRequest
{ {
$this->ensureBOMEntryValid($projectBOMEntry); $this->ensureBOMEntryValid($projectBOMEntry);
if (!$projectBOMEntry->getPart() instanceof Part) { if (!$projectBOMEntry->getPart() instanceof Part && !$projectBOMEntry->getAssembly() instanceof Assembly) {
return null; return null;
} }
//Filter out all lots which have unknown instock //Filter out all lots which have unknown instock
return $projectBOMEntry->getPart()->getPartLots()->filter(fn (PartLot $lot) => !$lot->isInstockUnknown())->toArray(); if ($projectBOMEntry->getPart() instanceof Part) {
return $projectBOMEntry->getPart()->getPartLots()->filter(fn (PartLot $lot) => !$lot->isInstockUnknown())->toArray();
} elseif ($projectBOMEntry->getAssembly() instanceof Assembly) {
$assemblyBuildRequest = new AssemblyBuildRequest($projectBOMEntry->getAssembly(), $this->number_of_builds);
//Add fields for assembly bom entries
$result = [];
foreach ($assemblyBuildRequest->getPartBomEntries() as $assemblyBOMEntry) {
$tmp = $assemblyBOMEntry->getPart()->getPartLots()->filter(fn (PartLot $lot) => !$lot->isInstockUnknown())->toArray();
$result = array_merge($result, $tmp);
}
return $result;
}
return null;
}
/**
* Returns all available assembly BOM-entries with no part assigned.
* @return AssemblyBOMEntry[]|null Returns null if no entries found
*/
public function getAssemblyBomEntriesWithoutPart(ProjectBOMEntry $projectBOMEntry): ?array
{
$this->ensureBOMEntryValid($projectBOMEntry);
if (!$projectBOMEntry->getAssembly() instanceof Assembly) {
return null;
}
$assemblyBuildRequest = new AssemblyBuildRequest($projectBOMEntry->getAssembly(), $this->number_of_builds);
$result = [];
foreach ($assemblyBuildRequest->getBomEntries() as $assemblyBOMEntry) {
if ($assemblyBOMEntry->getPart() === null) {
$result[] = $assemblyBOMEntry;
}
}
return count($result) > 0 ? $result : null;
}
/**
* Returns all available assembly BOM-entries with no part assigned.
* @return AssemblyBOMEntry[]|null Returns null if no entries found
*/
public function getAssemblyBomEntriesWithPartNoStock(ProjectBOMEntry $projectBOMEntry): ?array
{
$this->ensureBOMEntryValid($projectBOMEntry);
if (!$projectBOMEntry->getAssembly() instanceof Assembly) {
return null;
}
$assemblyBuildRequest = new AssemblyBuildRequest($projectBOMEntry->getAssembly(), $this->number_of_builds);
$result = [];
foreach ($assemblyBuildRequest->getBomEntries() as $assemblyBOMEntry) {
if ($assemblyBOMEntry->getPart() instanceof Part && $assemblyBOMEntry->getPart()->getPartLots()->filter(fn (PartLot $lot) => !$lot->isInstockUnknown())->count() === 0) {
$result[] = $assemblyBOMEntry;
}
}
return count($result) > 0 ? $result : null;
} }
/** /**
@ -266,6 +349,15 @@ final class ProjectBuildRequest
return $this->project->getBomEntries()->filter(fn(ProjectBOMEntry $entry) => $entry->isPartBomEntry())->toArray(); return $this->project->getBomEntries()->filter(fn(ProjectBOMEntry $entry) => $entry->isPartBomEntry())->toArray();
} }
/**
* Returns the all assembly bom entries that have to be built.
* @return ProjectBOMEntry[]
*/
public function getAssemblyBomEntries(): array
{
return $this->project->getBomEntries()->filter(fn(ProjectBOMEntry $entry) => $entry->isAssemblyBomEntry())->toArray();
}
/** /**
* Returns which project should be build * Returns which project should be build
*/ */

View file

@ -74,11 +74,11 @@ class AssemblyBuildHelper
continue; continue;
} }
//The maximum buildable count for the whole project is the minimum of all BOM entries //The maximum buildable count for the whole assembly is the minimum of all BOM entries
if ($bom_entry->getPart() !== null) { if ($bom_entry->getPart() !== null) {
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry)); $maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry));
} elseif ($bom_entry->getReferencedAssembly() !== null) { } elseif ($bom_entry->getReferencedAssembly() !== null) {
$maximum_buildable_count = min($maximum_buildable_count, $this->projectBuildHelper->getMaximumBuildableCount($bom_entry->getReferencedAssembly())); $maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCount($bom_entry->getReferencedAssembly()));
} }
} }
@ -105,7 +105,7 @@ class AssemblyBuildHelper
} }
/** /**
* Returns the project BOM entries for which parts are missing in the stock for the given number of builds * Returns the 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 Assembly $assembly The assembly for which the BOM entries should be checked
* @param int $number_of_builds How often should the assembly be build? * @param int $number_of_builds How often should the assembly be build?
* @return AssemblyBOMEntry[] * @return AssemblyBOMEntry[]

View file

@ -76,8 +76,6 @@ class BOMImporter
private DBElementRepository $assemblyBOMEntryRepository; private DBElementRepository $assemblyBOMEntryRepository;
private TranslatorInterface $translator;
public function __construct( public function __construct(
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private readonly TranslatorInterface $translator, private readonly TranslatorInterface $translator,
@ -89,7 +87,6 @@ class BOMImporter
$this->categoryRepository = $entityManager->getRepository(Category::class); $this->categoryRepository = $entityManager->getRepository(Category::class);
$this->projectBOMEntryRepository = $entityManager->getRepository(ProjectBOMEntry::class); $this->projectBOMEntryRepository = $entityManager->getRepository(ProjectBOMEntry::class);
$this->assemblyBOMEntryRepository = $entityManager->getRepository(AssemblyBOMEntry::class); $this->assemblyBOMEntryRepository = $entityManager->getRepository(AssemblyBOMEntry::class);
$this->translator = $translator;
} }
protected function configureOptions(OptionsResolver $resolver): OptionsResolver protected function configureOptions(OptionsResolver $resolver): OptionsResolver
@ -257,7 +254,8 @@ class BOMImporter
$options = $resolver->resolve($options); $options = $resolver->resolve($options);
return match ($options['type']) { return match ($options['type']) {
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $objectType)->getBomEntries(), self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject)->getBomEntries(),
self::IMPORT_TYPE_KICAD_SCHEMATIC => $this->parseKiCADPCB($data, $importObject)->getBomEntries(),
default => throw new InvalidArgumentException($this->translator->trans('validator.bom_importer.invalid_import_type', [], 'validators')), default => throw new InvalidArgumentException($this->translator->trans('validator.bom_importer.invalid_import_type', [], 'validators')),
}; };
} }
@ -285,8 +283,8 @@ class BOMImporter
return match ($options['type']) { return match ($options['type']) {
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject), self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject),
self::IMPORT_TYPE_JSON => $this->parseJson($data, $importObject), self::IMPORT_TYPE_JSON => $this->parseJson($importObject, $data),
self::IMPORT_TYPE_CSV => $this->parseCsv($data, $importObject), self::IMPORT_TYPE_CSV => $this->parseCsv($importObject, $data),
default => $defaultImporterResult, default => $defaultImporterResult,
}; };
} }

View file

@ -22,10 +22,13 @@ declare(strict_types=1);
*/ */
namespace App\Services\ProjectSystem; namespace App\Services\ProjectSystem;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\Parts\Part; use App\Entity\Parts\Part;
use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\Project;
use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\ProjectSystem\ProjectBOMEntry;
use App\Helpers\Assemblies\AssemblyBuildRequest;
use App\Helpers\Projects\ProjectBuildRequest; use App\Helpers\Projects\ProjectBuildRequest;
use App\Services\AssemblySystem\AssemblyBuildHelper;
use App\Services\Parts\PartLotWithdrawAddHelper; use App\Services\Parts\PartLotWithdrawAddHelper;
/** /**
@ -33,8 +36,10 @@ use App\Services\Parts\PartLotWithdrawAddHelper;
*/ */
class ProjectBuildHelper class ProjectBuildHelper
{ {
public function __construct(private readonly PartLotWithdrawAddHelper $withdraw_add_helper) public function __construct(
{ private readonly PartLotWithdrawAddHelper $withdrawAddHelper,
private readonly AssemblyBuildHelper $assemblyBuildHelper
) {
} }
/** /**
@ -66,12 +71,16 @@ class ProjectBuildHelper
$maximum_buildable_count = PHP_INT_MAX; $maximum_buildable_count = PHP_INT_MAX;
foreach ($project->getBomEntries() as $bom_entry) { foreach ($project->getBomEntries() as $bom_entry) {
//Skip BOM entries without a part (as we can not determine that) //Skip BOM entries without a part (as we can not determine that)
if (!$bom_entry->isPartBomEntry()) { if (!$bom_entry->isPartBomEntry() && $bom_entry->getAssembly() === null) {
continue; continue;
} }
//The maximum buildable count for the whole project is the minimum of all BOM entries //The maximum buildable count for the whole project is the minimum of all BOM entries
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry)); if ($bom_entry->getPart() !== null) {
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry));
} elseif ($bom_entry->getAssembly() !== null) {
$maximum_buildable_count = min($maximum_buildable_count, $this->assemblyBuildHelper->getMaximumBuildableCount($bom_entry->getAssembly()));
}
} }
return $maximum_buildable_count; return $maximum_buildable_count;
@ -97,10 +106,10 @@ class ProjectBuildHelper
} }
/** /**
* Returns the project BOM entries for which parts are missing in the stock for the given number of builds * Returns the project or assembly BOM entries for which parts are missing in the stock for the given number of builds
* @param Project $project The project for which the BOM entries should be checked * @param Project $project The project for which the BOM entries should be checked
* @param int $number_of_builds How often should the project be build? * @param int $number_of_builds How often should the project be build?
* @return ProjectBOMEntry[] * @return ProjectBOMEntry[]|AssemblyBOMEntry[]
*/ */
public function getNonBuildableProjectBomEntries(Project $project, int $number_of_builds = 1): array public function getNonBuildableProjectBomEntries(Project $project, int $number_of_builds = 1): array
{ {
@ -108,24 +117,29 @@ class ProjectBuildHelper
throw new \InvalidArgumentException('The number of builds must be greater than 0!'); throw new \InvalidArgumentException('The number of builds must be greater than 0!');
} }
$non_buildable_entries = []; $nonBuildableEntries = [];
foreach ($project->getBomEntries() as $bomEntry) { foreach ($project->getBomEntries() as $bomEntry) {
$part = $bomEntry->getPart(); $part = $bomEntry->getPart();
//Skip BOM entries without a part (as we can not determine that) //Skip BOM entries without a part (as we can not determine that)
if (!$part instanceof Part) { if (!$part instanceof Part && $bomEntry->getAssembly() === null) {
continue; continue;
} }
$amount_sum = $part->getAmountSum(); if ($bomEntry->getPart() !== null) {
$amount_sum = $part->getAmountSum();
if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) { if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) {
$non_buildable_entries[] = $bomEntry; $nonBuildableEntries[] = $bomEntry;
}
} elseif ($bomEntry->getAssembly() !== null) {
$nonBuildableAssemblyEntries = $this->assemblyBuildHelper->getNonBuildableAssemblyBomEntries($bomEntry->getAssembly(), $number_of_builds);
$nonBuildableEntries = array_merge($nonBuildableEntries, $nonBuildableAssemblyEntries);
} }
} }
return $non_buildable_entries; return $nonBuildableEntries;
} }
/** /**
@ -133,22 +147,37 @@ class ProjectBuildHelper
* The ProjectBuildRequest has to be validated before!! * The ProjectBuildRequest has to be validated before!!
* You have to flush changes to DB afterward * You have to flush changes to DB afterward
*/ */
public function doBuild(ProjectBuildRequest $buildRequest): void public function doBuild(ProjectBuildRequest $projectBuildRequest): void
{ {
$message = $buildRequest->getComment(); $message = $projectBuildRequest->getComment();
$message .= ' (Project build: '.$buildRequest->getProject()->getName().')'; $message .= ' (Project build: '.$projectBuildRequest->getProject()->getName().')';
foreach ($buildRequest->getPartBomEntries() as $bom_entry) { foreach ($projectBuildRequest->getPartBomEntries() as $bomEntry) {
foreach ($buildRequest->getPartLotsForBOMEntry($bom_entry) as $part_lot) { foreach ($projectBuildRequest->getPartLotsForBOMEntry($bomEntry) as $partLot) {
$amount = $buildRequest->getLotWithdrawAmount($part_lot); $amount = $projectBuildRequest->getLotWithdrawAmount($partLot);
if ($amount > 0) { if ($amount > 0) {
$this->withdraw_add_helper->withdraw($part_lot, $amount, $message); $this->withdrawAddHelper->withdraw($partLot, $amount, $message);
} }
} }
} }
if ($buildRequest->getAddBuildsToBuildsPart()) { foreach ($projectBuildRequest->getAssemblyBomEntries() as $bomEntry) {
$this->withdraw_add_helper->add($buildRequest->getBuildsPartLot(), $buildRequest->getNumberOfBuilds(), $message); $assemblyBuildRequest = new AssemblyBuildRequest($bomEntry->getAssembly(), $projectBuildRequest->getNumberOfBuilds());
//Add fields for assembly bom entries
foreach ($assemblyBuildRequest->getPartBomEntries() as $partBomEntry) {
foreach ($assemblyBuildRequest->getPartLotsForBOMEntry($partBomEntry) as $partLot) {
//Read amount from build configuration of the projectBuildRequest
$amount = $projectBuildRequest->getLotWithdrawAmount($partLot);
if ($amount > 0) {
$this->withdrawAddHelper->withdraw($partLot, $amount, $message);
}
}
}
}
if ($projectBuildRequest->getAddBuildsToBuildsPart()) {
$this->withdrawAddHelper->add($projectBuildRequest->getBuildsPartLot(), $projectBuildRequest->getNumberOfBuilds(), $message);
} }
} }
} }

View file

@ -147,7 +147,7 @@ class ToolsTreeBuilder
$this->translator->trans('info_providers.search.title'), $this->translator->trans('info_providers.search.title'),
$this->urlGenerator->generate('info_providers_search') $this->urlGenerator->generate('info_providers_search')
))->setIcon('fa-treeview fa-fw fa-solid fa-cloud-arrow-down'); ))->setIcon('fa-treeview fa-fw fa-solid fa-cloud-arrow-down');
$nodes[] = (new TreeViewNode( $nodes[] = (new TreeViewNode(
$this->translator->trans('info_providers.bulk_import.manage_jobs'), $this->translator->trans('info_providers.bulk_import.manage_jobs'),
$this->urlGenerator->generate('bulk_info_provider_manage') $this->urlGenerator->generate('bulk_info_provider_manage')

View file

@ -62,4 +62,4 @@
</a> </a>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -87,4 +87,4 @@
{{ form_row(form.submit) }} {{ form_row(form.submit) }}
{{ form_end(form) }} {{ form_end(form) }}

View file

@ -105,6 +105,8 @@
{{ 'assembly.bom_import.template.kicad_pcbnew.exptected_columns.note'|trans|raw }} {{ 'assembly.bom_import.template.kicad_pcbnew.exptected_columns.note'|trans|raw }}
{{ 'assembly.bom_import.template.kicad_pcbnew.table'|trans|raw }} {{ 'assembly.bom_import.template.kicad_pcbnew.table'|trans|raw }}
{{ 'assembly.bom_import.template.json.table'|trans|raw }}
</div> </div>
</div> </div>
</div> </div>

View file

@ -0,0 +1,22 @@
{% import "components/datatables.macro.html.twig" as datatables %}
<div class="btn-group mb-2 mt-2">
<a class="btn btn-success" {% if not is_granted('@assemblies.edit') %}disabled{% endif %}
href="{{ path('assembly_add_parts', {"id": assembly.id, "_redirect": uri_without_host(app.request)}) }}">
<i class="fa-solid fa-square-plus fa-fw"></i>
{% trans %}assembly.info.bom_add_parts{% endtrans %}
</a>
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="{{ path('assembly_import_bom', {'id': assembly.id}) }}" {% if not is_granted('edit', assembly) %}disabled="disabled"{% endif %}>
<i class="fa-solid fa-file-import fa-fw"></i>
{% trans %}assembly.edit.bom.import_bom{% endtrans %}
</a>
</li>
</ul>
</div>
{{ datatables.datatable(datatable, 'elements/datatables/datatables', 'assemblies') }}

View file

@ -37,6 +37,12 @@
{% trans %}entity.info.attachments.tab{% endtrans %} {% trans %}entity.info.attachments.tab{% endtrans %}
</a> </a>
{% endif %} {% endif %}
{% if assembly.parameters is not empty %}
<a class="nav-link" id="v-pills-parameters-tab" data-bs-toggle="pill" href="#v-pills-parameters" role="tab" aria-controls="v-pills-parameters" aria-selected="false">
<i class="fas fa-atlas fa-fw"></i>
{% trans %}entity.info.parameters.tab{% endtrans %}
</a>
{% endif %}
{% if assembly.comment is not empty %} {% if assembly.comment is not empty %}
<a class="nav-link" id="v-pills-comment-tab" data-bs-toggle="pill" href="#v-pills-comment" role="tab"> <a class="nav-link" id="v-pills-comment-tab" data-bs-toggle="pill" href="#v-pills-comment" role="tab">
<i class="fas fa-comment-alt fa-fw"></i> <i class="fas fa-comment-alt fa-fw"></i>
@ -102,6 +108,15 @@
</div> </div>
{% endif %} {% endif %}
{% if assembly.parameters is not empty %}
<div class="tab-pane fade" id="v-pills-parameters" role="tabpanel" aria-labelledby="v-pills-parameters-tab">
{% for name, parameters in assembly.groupedParameters %}
{% if name is not empty %}<h5 class="mt-1">{{ name }}</h5>{% endif %}
{{ helper.parameters_table(assembly) }}
{% endfor %}
</div>
{% endif %}
{% if assembly.comment is not empty %} {% if assembly.comment is not empty %}
<div class="tab-pane fade" id="v-pills-comment" role="tabpanel" aria-labelledby="home-tab"> <div class="tab-pane fade" id="v-pills-comment" role="tabpanel" aria-labelledby="home-tab">
<div class="container-fluid mt-2 latex" data-controller="common--latex"> <div class="container-fluid mt-2 latex" data-controller="common--latex">
@ -115,4 +130,4 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -0,0 +1,28 @@
<table class="table table-striped table-hover">
<thead>
<tr>
<th>{% trans %}name.label{% endtrans %}</th>
<th>{% trans %}description.label{% endtrans %}</th>
<th># {% trans %}assembly.info.bom_entries_count{% endtrans %}</th>
<th># {% trans %}assembly.info.sub_assemblies_count{% endtrans %}</th>
</tr>
</thead>
<tbody>
{% for subassembly in assembly.children %}
<tr>
<td> {# Name #}
<a href="{{ entity_url(subassembly, 'info') }}">{{ subassembly.name }}</a>
</td>
<td> {# Description #}
{{ subassembly.description | format_markdown }}
</td>
<td>
{{ subassembly.bomEntries | length }}
</td>
<td>
{{ subassembly.children | length }}
</td>
</tr>
{% endfor %}
</tbody>
</table>

View file

@ -70,8 +70,18 @@
{% trans %}assembly.info.info.label{% endtrans %} {% trans %}assembly.info.info.label{% endtrans %}
</button> </button>
</li> </li>
{% if assembly.children is not empty %}
<li class="nav-item" role="presentation">
<button class="nav-link" id="subassemblies-tab" data-bs-toggle="tab" data-bs-target="#subassemblies-tab-pane"
type="button" role="tab" aria-controls="subassemblies-tab-pane" aria-selected="false">
<i class="fa-solid fa-folder-tree fa-fw"></i>
{% trans %}assembly.info.sub_assemblies.label{% endtrans %}
<span class="badge bg-secondary">{{ assembly.children | length }}</span>
</button>
</li>
{% endif %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link" id="part-tab" data-bs-toggle="tab" data-bs-target="#part-tab-pane" <button class="nav-link" id="bom-tab" data-bs-toggle="tab" data-bs-target="#part-tab-pane"
type="button" role="tab" aria-controls="part-tab-pane" aria-selected="false"> type="button" role="tab" aria-controls="part-tab-pane" aria-selected="false">
<i class="fa-solid fa-list-check fa-fw"></i> <i class="fa-solid fa-list-check fa-fw"></i>
{% trans %}assembly_bom_entry.label{% endtrans %} {% trans %}assembly_bom_entry.label{% endtrans %}
@ -95,6 +105,16 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if assembly.parameters is not empty %}
<li class="nav-item">
<a class="nav-link" id="parameters-tab" data-bs-toggle="tab"
data-bs-target="#parameters-tab-pane" role="tab">
<i class="fas fa-atlas fa-fw"></i>
{% trans %}entity.info.parameters.tab{% endtrans %}
<span class="badge bg-secondary">{{ assembly.parameters | length }}</span>
</a>
</li>
{% endif %}
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
@ -103,13 +123,26 @@
</div> </div>
<div class="tab-pane fade" id="part-tab-pane" role="tabpanel" aria-labelledby="part-tab" tabindex="0"> <div class="tab-pane fade" id="part-tab-pane" role="tabpanel" aria-labelledby="part-tab" tabindex="0">
{% include "assemblies/info/_part.html.twig" %} {% include "assemblies/info/_part.html.twig" %}
{% if assembly.children is not empty %}
<div class="tab-pane fade" id="subassemblies-tab-pane" role="tabpanel" aria-labelledby="bom-tab" tabindex="0">
{% include "assemblies/info/_subassemblies.html.twig" %}
</div>
{% endif %}
<div class="tab-pane fade" id="bom-tab-pane" role="tabpanel" aria-labelledby="bom-tab" tabindex="0">
{% include "assemblies/info/_bom.html.twig" %}
</div> </div>
<div class="tab-pane fade" id="builds-tab-pane" role="tabpanel" aria-labelledby="builds-tab" tabindex="0"> <div class="tab-pane fade" id="builds-tab-pane" role="tabpanel" aria-labelledby="builds-tab" tabindex="0">
{% include "assemblies/info/_builds.html.twig" %} {% include "assemblies/info/_builds.html.twig" %}
</div> </div>
<div class="tab-pane fade" id="attachments-tab-pane" role="tabpanel" aria-labelledby="attachments-tab" tabindex="0"> <div class="tab-pane fade" id="attachments-tab-pane" role="tabpanel" aria-labelledby="attachments-tab" tabindex="0">
{% include "assemblies/info/_attachments_info.html.twig" with {"assembly": assembly} %} {% include "assemblies/info/_attachments_info.html.twig" with {"part": assembly} %}
</div>
<div class="tab-pane fade" id="parameters-tab-pane" role="tabpanel" aria-labelledby="parameters-tab">
{% for name, parameters in assembly.groupedParameters %}
{% if name is not empty %}<h5 class="mt-1">{{ name }}</h5>{% endif %}
{{ helper.parameters_table(assembly.parameters) }}
{% endfor %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -6,7 +6,7 @@
<tr> <tr>
<th></th> {# expand button #} <th></th> {# expand button #}
<th>{% trans %}project.bom.quantity{% endtrans %}</th> <th>{% trans %}project.bom.quantity{% endtrans %}</th>
<th>{% trans %}project.bom.part{% endtrans %}</th> <th>{% trans %}project.bom.partOrAssembly{% endtrans %}</th>
<th>{% trans %}project.bom.name{% endtrans %}</th> <th>{% trans %}project.bom.name{% endtrans %}</th>
<th></th> {# Remove button #} <th></th> {# Remove button #}
</tr> </tr>
@ -41,9 +41,11 @@
{{ form_widget(form.quantity) }} {{ form_widget(form.quantity) }}
{{ form_errors(form.quantity) }} {{ form_errors(form.quantity) }}
</td> </td>
<td style="min-width: 250px;"> <td style="min-width: 300px;">
{{ form_widget(form.part) }} {{ form_row(form.part) }}
{{ form_errors(form.part) }} {{ form_errors(form.part) }}
{{ form_widget(form.assembly) }}
{{ form_errors(form.assembly) }}
</td> </td>
<td> <td>
{{ form_widget(form.name) }} {{ form_widget(form.name) }}

View file

@ -80,4 +80,4 @@
</div> </div>
</td> </td>
</tr> </tr>
{% endblock %} {% endblock %}

View file

@ -27,7 +27,9 @@
</td> </td>
<td > <td >
{% if bom_entry.part %} {% if bom_entry.part %}
<b><a target="_blank" href="{{ entity_url(bom_entry.part) }}">{{ bom_entry.part.name }}</a></b> {% if bom_entry.name %}({{ bom_entry.name }}){% endif %} <b><a target="_blank" href="{{ entity_url(bom_entry.part) }}">{{ 'projects.build.form.part'|trans({'%name%': bom_entry.part.name}) }}</a></b> {% if bom_entry.name %}({{ bom_entry.name }}){% endif %}
{% elseif bom_entry.assembly %}
<b><a target="_blank" href="{{ entity_url(bom_entry.assembly) }}">{{ 'projects.build.form.assembly'|trans({'%name%': bom_entry.assembly.name}) }}</a></b> {% if bom_entry.name %}({{ bom_entry.name }}){% endif %}
{% else %} {% else %}
<b>{{ bom_entry.name }}</b> <b>{{ bom_entry.name }}</b>
{% endif %} {% endif %}
@ -45,9 +47,29 @@
<tr> <tr>
<td colspan="4"> <td colspan="4">
{% set lots = build_request.partLotsForBOMEntry(bom_entry) %} {% set lots = build_request.partLotsForBOMEntry(bom_entry) %}
{% set assemblyBomEntriesWithoutPart = build_request.assemblyBomEntriesWithoutPart(bom_entry) %}
{% set assemblyBomEntriesWithPartNoStock = build_request.assemblyBomEntriesWithPartNoStock(bom_entry) %}
{% if lots is not null %} {% if lots is not null %}
{% set previousLabel = null %}
{% for lot in lots %} {% for lot in lots %}
{# @var lot \App\Entity\Parts\PartLot #} {# @var lot \App\Entity\Parts\PartLot #}
{% set label = '' %}
{% if form["lot_"~lot.id].vars.label is defined and form["lot_"~lot.id].vars.label is not empty %}
{% set label = form["lot_"~lot.id].vars.label %}
{% endif %}
{% if label != '' and (previousLabel is null or label != previousLabel) %}
<div class="mb-2 row">
<label class="col-form-label col-lg-4">
<small>{{ label|raw }}</small>
</label>
</div>
{% endif %}
{% set previousLabel = label %}
<div class="mb-2 row"> <div class="mb-2 row">
<label class="col-form-label col-sm-4" for="category_admin_form_parent"> <label class="col-form-label col-sm-4" for="category_admin_form_parent">
{% if lot.storageLocation %} {% if lot.storageLocation %}
@ -61,12 +83,41 @@
{{ form_errors(form["lot_"~lot.id]) }} {{ form_errors(form["lot_"~lot.id]) }}
{{ form_widget(form["lot_"~lot.id]) }} {{ form_widget(form["lot_"~lot.id]) }}
</div> </div>
<div class="col-sm-2 mt-1 text-end"> <div class="col-sm-2 mt-1 text-end">
/ <b>{{ lot.amount | format_amount(lot.part.partUnit) }}</b> {% trans %}project.builds.stocked{% endtrans %} / <b>{{ lot.amount | format_amount(lot.part.partUnit) }}</b> {% trans %}project.builds.stocked{% endtrans %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if assemblyBomEntriesWithoutPart is not null %}
{% for bomEntryWithoutPart in assemblyBomEntriesWithoutPart %}
<div class="mb-2 row">
<label class="col-form-label col-sm-4" for="category_admin_form_parent">
<small>{{ 'projects.build.form.assembly.bom.entry'|trans({'%name%': bomEntryWithoutPart.name, '%quantity%': bomEntryWithoutPart.quantity * number_of_builds}) }}</small>
</label>
<div class="col-sm-6"></div>
<div class="col-sm-2 mt-1 text-end">
/ {% trans %}project.builds.no_stock{% endtrans %}
</div>
</div>
{% endfor %}
{% endif %}
{% if assemblyBomEntriesWithPartNoStock is not null %}
{% for bomEntryWithPartNoStock in assemblyBomEntriesWithPartNoStock %}
<div class="alert alert-danger">
<div class="mb-2 row">
<label class="col-form-label col-sm-4" for="category_admin_form_parent">
{% trans %}projects.build.form.assembly.bom.entry.no.stock{% endtrans %}<br/>
<small>{{ 'projects.build.form.assembly.bom.entry'|trans({'%name%': bomEntryWithPartNoStock.name ? bomEntryWithPartNoStock.name : bomEntryWithPartNoStock.part.name, '%quantity%': bomEntryWithPartNoStock.quantity * number_of_builds}) }}</small>
</label>
<div class="col-sm-6"></div>
<div class="col-sm-2 mt-1 text-end">
/ {% trans %}project.builds.no_stock{% endtrans %}
</div>
</div>
</div>
{% endfor %}
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View file

@ -4813,6 +4813,18 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
<target>Název</target> <target>Název</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Sestava</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Výběr</target>
</segment>
</unit>
<unit id="rW_SFJE." name="part.table.id"> <unit id="rW_SFJE." name="part.table.id">
<notes> <notes>
<note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note> <note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note>
@ -9894,6 +9906,18 @@ Element 3</target>
<target>Díl</target> <target>Díl</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Auswahl</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10290,6 +10314,12 @@ Element 3</target>
<target>k dispozici</target> <target>k dispozici</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>není uveden žádný sklad</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10362,6 +10392,12 @@ Element 3</target>
<target>Cílový inventář</target> <target>Cílový inventář</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% požadováno)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>
@ -13540,6 +13576,634 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Z bezpečnostních důvodů redigováno</target> <target>Z bezpečnostních důvodů redigováno</target>
</segment> </segment>
</unit> </unit>
<unit id="FV7YOW6" name="part.table.name.value.for_part">
<segment state="translated">
<source>part.table.name.value.for_part</source>
<target>%value% (Součást)</target>
</segment>
</unit>
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
<segment state="translated">
<source>part.table.name.value.for_assembly</source>
<target>%value% (Sestava)</target>
</segment>
</unit>
<unit id="G2sXzh7" name="assembly.label">
<segment>
<source>assembly.label</source>
<target>Sestava</target>
</segment>
</unit>
<unit id="dL51AVa" name="assembly.caption">
<segment>
<source>assembly.caption</source>
<target>Sestava</target>
</segment>
</unit>
<unit id="G_rlE3w" name="perm.assemblies">
<segment>
<source>perm.assemblies</source>
<target>Sestavy</target>
</segment>
</unit>
<unit id="dipIGt4" name="assembly_bom_entry.label">
<segment>
<source>assembly_bom_entry.label</source>
<target>Součásti</target>
</segment>
</unit>
<unit id="TvHlYfl" name="assembly.labelp">
<segment>
<source>assembly.labelp</source>
<target>Sestavy</target>
</segment>
</unit>
<unit id="gyRGdfv" name="assembly.edit">
<segment>
<source>assembly.edit</source>
<target>Upravit sestavu</target>
</segment>
</unit>
<unit id="4Tdtoj_" name="assembly.new">
<segment>
<source>assembly.new</source>
<target>Nová sestava</target>
</segment>
</unit>
<unit id="M51YUE." name="assembly.edit.associated_build_part">
<segment>
<source>assembly.edit.associated_build_part</source>
<target>Přidružená součást</target>
</segment>
</unit>
<unit id="nH9R9f." name="assembly.edit.associated_build_part.add">
<segment>
<source>assembly.edit.associated_build_part.add</source>
<target>Přidat součást</target>
</segment>
</unit>
<unit id="oVfOk.i" name="assembly.edit.associated_build.hint">
<segment>
<source>assembly.edit.associated_build.hint</source>
<target>Tato součást představuje vyrobené instance sestavy. Zadejte, pokud jsou vyrobené instance potřeba. Pokud ne, počet součástí bude použit až při sestavení daného projektu.</target>
</segment>
</unit>
<unit id="_wZ_JZY" name="assembly.edit.bom.import_bom">
<segment>
<source>assembly.edit.bom.import_bom</source>
<target>Importovat součásti</target>
</segment>
</unit>
<unit id="vsmgKMw" name="log.database_updated.failed">
<segment>
<source>log.database_updated.failed</source>
<target>__log.database_updated.failed</target>
</segment>
</unit>
<unit id="GcQrTTE" name="log.database_updated.old_version">
<segment>
<source>log.database_updated.old_version</source>
<target>__log.database_updated.old_version</target>
</segment>
</unit>
<unit id="JJF47vK" name="log.database_updated.new_version">
<segment>
<source>log.database_updated.new_version</source>
<target>__log.database_updated.new_version</target>
</segment>
</unit>
<unit id="iVHS_sh" name="tree.tools.edit.assemblies">
<segment>
<source>tree.tools.edit.assemblies</source>
<target>Sestavy</target>
</segment>
</unit>
<unit id="naAMjcH" name="assembly.bom_import.flash.success">
<segment>
<source>assembly.bom_import.flash.success</source>
<target>%count% součástí úspěšně importováno do sestavy.</target>
</segment>
</unit>
<unit id="ScQhV.o" name="assembly.bom_import.flash.invalid_entries">
<segment>
<source>assembly.bom_import.flash.invalid_entries</source>
<target>Chyba ověření! Zkontrolujte svůj importovaný soubor!</target>
</segment>
</unit>
<unit id="luj_uCZ" name="assembly.bom_import.flash.invalid_file">
<segment>
<source>assembly.bom_import.flash.invalid_file</source>
<target>Soubor nelze importovat. Zkontrolujte, zda jste vybrali správný typ souboru. Chybová zpráva: %message%</target>
</segment>
</unit>
<unit id="u7SYWcB" name="assembly.bom.quantity">
<segment>
<source>assembly.bom.quantity</source>
<target>Množství</target>
</segment>
</unit>
<unit id="D7dPvPL" name="assembly.bom.mountnames">
<segment>
<source>assembly.bom.mountnames</source>
<target>Názvy osazení</target>
</segment>
</unit>
<unit id="rswC4eS" name="assembly.bom.instockAmount">
<segment state="translated">
<source>assembly.bom.instockAmount</source>
<target>Stav na skladě</target>
</segment>
</unit>
<unit id="oNutri3" name="assembly.info.title">
<segment>
<source>assembly.info.title</source>
<target>Info o sestavě</target>
</segment>
</unit>
<unit id="aO1rzVQ" name="assembly.info.info.label">
<segment>
<source>assembly.info.info.label</source>
<target>Informace</target>
</segment>
</unit>
<unit id="9dOByT_" name="assembly.info.sub_assemblies.label">
<segment>
<source>assembly.info.sub_assemblies.label</source>
<target>Podskupina</target>
</segment>
</unit>
<unit id="Hmf0EwN" name="assembly.info.builds.label">
<segment>
<source>assembly.info.builds.label</source>
<target>Sestavení</target>
</segment>
</unit>
<unit id="z3F4Rcu" name="assembly.info.bom_add_parts">
<segment>
<source>assembly.info.bom_add_parts</source>
<target>Přidat součásti</target>
</segment>
</unit>
<unit id="ZbDTUTS" name="assembly.builds.check_assembly_status">
<segment>
<source>assembly.builds.check_assembly_status</source>
<target><![CDATA[Aktuální stav sestavy je <b>"%assembly_status%"</b>. Měli byste zkontrolovat, zda opravdu chcete sestavu postavit s tímto stavem!]]></target>
</segment>
</unit>
<unit id="xq1Soad" name="assembly.builds.build_not_possible">
<segment>
<source>assembly.builds.build_not_possible</source>
<target>Sestavení není možné: Nedostatek součástí</target>
</segment>
</unit>
<unit id="njRyDHQ" name="assembly.builds.following_bom_entries_miss_instock">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock</source>
<target>Není dostatek součástí na skladě pro postavení tohoto projektu %number_of_builds% krát. Následující součásti nejsou skladem v dostatečném množství.</target>
</segment>
</unit>
<unit id="sp7Z0MS" name="assembly.builds.build_possible">
<segment>
<source>assembly.builds.build_possible</source>
<target>Sestavení je možné</target>
</segment>
</unit>
<unit id="1uZzdEl" name="assembly.builds.number_of_builds_possible">
<segment>
<source>assembly.builds.number_of_builds_possible</source>
<target><![CDATA[Máte dostatek součástí na skladě k vytvoření <b>%max_builds%</b> kusů této sestavy.]]></target>
</segment>
</unit>
<unit id="pW6QLXf" name="assembly.builds.number_of_builds">
<segment>
<source>assembly.builds.number_of_builds</source>
<target>Počet sestavení</target>
</segment>
</unit>
<unit id="mtJqT_a" name="assembly.build.btn_build">
<segment>
<source>assembly.build.btn_build</source>
<target>Sestavit</target>
</segment>
</unit>
<unit id="LFSVVcP" name="assembly.builds.no_stocked_builds">
<segment>
<source>assembly.builds.no_stocked_builds</source>
<target>Počet skladovaných vyrobených instancí</target>
</segment>
</unit>
<unit id="dGFHutJ" name="assembly.info.bom_entries_count">
<segment>
<source>assembly.info.bom_entries_count</source>
<target>Součásti</target>
</segment>
</unit>
<unit id="xJ7oBM4" name="assembly.info.sub_assemblies_count">
<segment>
<source>assembly.info.sub_assemblies_count</source>
<target>Podskupiny</target>
</segment>
</unit>
<unit id="HZYhTlb" name="assembly.builds.stocked">
<segment>
<source>assembly.builds.stocked</source>
<target>skladem</target>
</segment>
</unit>
<unit id="9EG0PLW" name="assembly.builds.needed">
<segment>
<source>assembly.builds.needed</source>
<target>potřebné</target>
</segment>
</unit>
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
<segment>
<source>assembly.add_parts_to_assembly</source>
<target>Přidat součásti do sestavy</target>
</segment>
</unit>
<unit id="PPsM0Dg" name="assembly.bom.name">
<segment>
<source>assembly.bom.name</source>
<target>Název</target>
</segment>
</unit>
<unit id="nUEs.ld" name="assembly.bom.comment">
<segment>
<source>assembly.bom.comment</source>
<target>Poznámky</target>
</segment>
</unit>
<unit id="87YpQ_u" name="assembly.builds.following_bom_entries_miss_instock_n">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock_n</source>
<target>Není dostatek součástí na skladě pro sestavení této sestavy %number_of_builds% krát. Následující součásti nejsou skladem:</target>
</segment>
</unit>
<unit id="JlQhDdS" name="assembly.build.help">
<segment>
<source>assembly.build.help</source>
<target>Vyberte, ze kterých zásob se mají brát potřebné součásti pro sestavení (a v jakém množství). Zaškrtněte políčko u každého dílu, pokud jste jej odebrali, nebo použijte horní políčko k výběru všech naráz.</target>
</segment>
</unit>
<unit id="iP5_QVj" name="assembly.build.required_qty">
<segment>
<source>assembly.build.required_qty</source>
<target>Požadované množství</target>
</segment>
</unit>
<unit id="UJpD7n6" name="assembly.import_bom">
<segment>
<source>assembly.import_bom</source>
<target>Importovat součásti do sestavy</target>
</segment>
</unit>
<unit id="WTasGao" name="assembly.bom.part">
<segment>
<source>assembly.bom.part</source>
<target>Součást</target>
</segment>
</unit>
<unit id="jHKh8Zp" name="assembly.bom.add_entry">
<segment>
<source>assembly.bom.add_entry</source>
<target>Přidat položku</target>
</segment>
</unit>
<unit id="RsZ77df" name="assembly.bom.price">
<segment>
<source>assembly.bom.price</source>
<target>Cena</target>
</segment>
</unit>
<unit id="63adIrC" name="assembly.build.dont_check_quantity">
<segment state="translated">
<source>assembly.build.dont_check_quantity</source>
<target>Neověřovat množství</target>
</segment>
</unit>
<unit id="O0DP6tK" name="assembly.build.dont_check_quantity.help">
<segment state="translated">
<source>assembly.build.dont_check_quantity.help</source>
<target>Pokud je tato volba vybrána, budou vybraná množství odstraněna ze skladu bez ohledu na to, zda je méně nebo více součástí, než je skutečně potřeba pro sestavení sestavy.</target>
</segment>
</unit>
<unit id="9bc0nzK" name="assembly.build.add_builds_to_builds_part">
<segment state="translated">
<source>assembly.build.add_builds_to_builds_part</source>
<target>Přidat vyrobené instance do součásti sestavy</target>
</segment>
</unit>
<unit id="nl.jtSx" name="assembly.bom_import.type">
<segment state="translated">
<source>assembly.bom_import.type</source>
<target>Typ</target>
</segment>
</unit>
<unit id="LtbSLHx" name="assembly.bom_import.type.json">
<segment state="translated">
<source>assembly.bom_import.type.json</source>
<target>JSON pro sestavu</target>
</segment>
</unit>
<unit id="clXFAdN" name="assembly.bom_import.type.kicad_pcbnew">
<segment state="translated">
<source>assembly.bom_import.type.kicad_pcbnew</source>
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
<target>Smazat existující položky před importem</target>
</segment>
</unit>
<unit id="S4QY6pA" name="assembly.bom_import.clear_existing_bom.help">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom.help</source>
<target>Pokud je tato možnost vybrána, budou všechny již existující součásti sestavy smazány a nahrazeny importovanými daty součástí.</target>
</segment>
</unit>
<unit id="RVNWPsh" name="assembly.import_bom.template.header.json">
<segment>
<source>assembly.import_bom.template.header.json</source>
<target>Šablona importu JSON pro sestavu</target>
</segment>
</unit>
<unit id="eU4FfCr" name="assembly.import_bom.template.header.kicad_pcbnew">
<segment>
<source>assembly.import_bom.template.header.kicad_pcbnew</source>
<target>Šablona importu CSV (KiCAD Pcbnew BOM) pro sestavu</target>
</segment>
</unit>
<unit id="aLomVVS" name="assembly.bom_import.template.entry.name">
<segment>
<source>assembly.bom_import.template.entry.name</source>
<target>Název součásti v sestavě</target>
</segment>
</unit>
<unit id="o4ZcLfV" name="assembly.bom_import.template.entry.part.mpnr">
<segment>
<source>assembly.bom_import.template.entry.part.mpnr</source>
<target>Unikátní číslo produktu u výrobce</target>
</segment>
</unit>
<unit id="n3YbKeU" name="assembly.bom_import.template.entry.part.ipn">
<segment>
<source>assembly.bom_import.template.entry.part.ipn</source>
<target>Unikátní IPN součásti</target>
</segment>
</unit>
<unit id="l2SYJP5" name="assembly.bom_import.template.entry.part.name">
<segment>
<source>assembly.bom_import.template.entry.part.name</source>
<target>Unikátní název součásti</target>
</segment>
</unit>
<unit id="VgXQ1xW" name="assembly.bom_import.template.entry.part.manufacturer.name">
<segment>
<source>assembly.bom_import.template.entry.part.manufacturer.name</source>
<target>Unikátní jméno výrobce</target>
</segment>
</unit>
<unit id="MpB.o_L" name="assembly.bom_import.template.entry.part.category.name">
<segment>
<source>assembly.bom_import.template.entry.part.category.name</source>
<target>Unikátní název kategorie</target>
</segment>
</unit>
<unit id="NIcfgj84" name="assembly.bom_import.template.json.table">
<segment>
<source>assembly.bom_import.template.json.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Pole</th>
<th>Podmínka</th>
<th>Datový typ</th>
<th>Popis</th>
</tr>
</thead>
<tbody>
<tr>
<td>quantity</td>
<td>Povinné</td>
<td>Číslo s plovoucí desetinnou čárkou (Float)</td>
<td>Musí být uvedeno a obsahovat hodnotu s plovoucí desetinnou čárkou (Float) větší než 0,0.</td>
</tr>
<tr>
<td>name</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Pokud je přítomen, musí být neprázdný řetězec.</td>
</tr>
<tr>
<td>part</td>
<td>Volitelné</td>
<td>Objekt/Array</td>
<td>
Pokud je uvedeno, musí to být objekt/array a minimálně jedno pole musí být vyplněno:
<ul>
<li>part.id</li>
<li>part.name</li>
</ul>
</td>
</tr>
<tr>
<td>part.id</td>
<td>Volitelné</td>
<td>Celé číslo (Integer)</td>
<td>Celé číslo (Integer) &gt; 0. Odpovídá internímu číselnému ID součástky v Part-DB.</td>
</tr>
<tr>
<td>part.name</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Neprázdný řetězec, pokud není zadáno part.mpnr nebo part.ipn.</td>
</tr>
<tr>
<td>part.mpnr</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Neprázdný řetězec, pokud není zadáno part.name nebo part.ipn.</td>
</tr>
<tr>
<td>part.ipn</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Neprázdný řetězec, pokud není zadáno part.name nebo part.mpnr.</td>
</tr>
<tr>
<td>part.description</td>
<td>Volitelné</td>
<td>Řetězec nebo null</td>
<td>Pokud je přítomen, musí být neprázdný řetězec nebo null.</td>
</tr>
<tr>
<td>part.manufacturer</td>
<td>Volitelné</td>
<td>Objekt/Array</td>
<td>
Pokud je přítomen, musí to být objekt/array a minimálně jedno pole musí být vyplněno:
<ul>
<li>manufacturer.id</li>
<li>manufacturer.name</li>
</ul>
</td>
</tr>
<tr>
<td>manufacturer.id</td>
<td>Volitelné</td>
<td>Celé číslo (Integer)</td>
<td>Celé číslo (Integer) &gt; 0. Odpovídá internímu číselnému ID výrobce.</td>
</tr>
<tr>
<td>manufacturer.name</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Neprázdný řetězec, pokud není uvedeno manufacturer.id.</td>
</tr>
<tr>
<td>part.category</td>
<td>Volitelné</td>
<td>Objekt/Array</td>
<td>
Pokud je přítomen, musí to být objekt/array a minimálně jedno pole musí být vyplněno:
<ul>
<li>category.id</li>
<li>category.name</li>
</ul>
</td>
</tr>
<tr>
<td>category.id</td>
<td>Volitelné</td>
<td>Celé číslo (Integer)</td>
<td>Celé číslo (Integer) &gt; 0. Odpovídá internímu číselnému ID kategorie součástky.</td>
</tr>
<tr>
<td>category.name</td>
<td>Volitelné</td>
<td>Řetězec (String)</td>
<td>Neprázdný řetězec, pokud není uvedeno category.id.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="cU1bfDa" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns</source>
<target>Očekávané sloupce:</target>
</segment>
</unit>
<unit id="gvaB1sb" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns.note">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns.note</source>
<target>
<![CDATA[
<p><strong>Poznámka:</strong> Neprobíhá přiřazení ke konkrétním součástem ze správy kategorií.</p>
]]>
</target>
</segment>
</unit>
<unit id="translationUnit1" name="assembly.bom_import.template.kicad_pcbnew.table">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Pole</th>
<th>Podmínka</th>
<th>Datový typ</th>
<th>Popis</th>
</tr>
</thead>
<tbody>
<tr>
<td>Id</td>
<td>Volitelný</td>
<td>Celé číslo (Integer)</td>
<td>Volný údaj. Jedinečné identifikační číslo pro každou součástku.</td>
</tr>
<tr>
<td>Designator</td>
<td>Volitelný</td>
<td>Řetězec (String)</td>
<td>Volný údaj. Jedinečný referenční označovač součástky na desce plošných spojů, např. „R1“ pro rezistor 1. Používá se pro název osazení součástky v rámci skupiny součástek.</td>
</tr>
<tr>
<td>Package</td>
<td>Volitelný</td>
<td>Řetězec (String)</td>
<td>Volný údaj. Pouzdro nebo tvar součástky, např. „0805“ pro SMD rezistory.</td>
</tr>
<tr>
<td>Množství</td>
<td>Povinný</td>
<td>Celé číslo (Integer)</td>
<td>Počet identických součástek, které jsou potřeba k vytvoření jedné instance sestavy.</td>
</tr>
<tr>
<td>Určení</td>
<td>Povinný</td>
<td>Řetězec (String)</td>
<td>Popis nebo funkce součástky, např. hodnota rezistoru „10kΩ“ nebo hodnota kondenzátoru „100nF“. Používá se pro název položky v BOM.</td>
</tr>
<tr>
<td>Dodavatel a ref</td>
<td>Volitelný</td>
<td>Řetězec (String)</td>
<td>Volný údaj. Může obsahovat např. specifické údaje distributora.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="QiZM3zY" name="typeahead.parts.part.name">
<segment>
<source>typeahead.parts.part.name</source>
<target>%name% (součást)</target>
</segment>
</unit>
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
<segment>
<source>typeahead.parts.assembly.name</source>
<target>%name% (sestava)</target>
</segment>
</unit>
<unit id="4cgba2c" name="projects.build.form.part">
<segment>
<source>projects.build.form.part</source>
<target>Součást "%name%"</target>
</segment>
</unit>
<unit id="1bCA1zb" name="projects.build.form.assembly">
<segment>
<source>projects.build.form.assembly</source>
<target>Sestava "%name%"</target>
</segment>
</unit>
<unit id="2cDB2ac" name="projects.build.form.assembly.bom.entry">
<segment>
<source>projects.build.form.assembly.bom.entry</source>
<target>%name% (potřebné množství: %quantity%)</target>
</segment>
</unit>
<unit id="3dEC3bd" name="projects.build.form.assembly.bom.entry.no.stock">
<segment>
<source>projects.build.form.assembly.bom.entry.no.stock</source>
<target>není skladem</target>
</segment>
</unit>
<unit id="J716Oh4" name="project.bom_import.map_fields"> <unit id="J716Oh4" name="project.bom_import.map_fields">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.map_fields</source> <source>project.bom_import.map_fields</source>

View file

@ -4820,6 +4820,18 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt
<target>Navn</target> <target>Navn</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Montering</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Valg</target>
</segment>
</unit>
<unit id="eshqdG." name="part.table.id"> <unit id="eshqdG." name="part.table.id">
<notes> <notes>
<note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note> <note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note>
@ -9920,6 +9932,18 @@ Element 3</target>
<target>Komponent</target> <target>Komponent</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Auswahl</target>
</segment>
</unit>
<unit id="apnWXEq" name="project.bom.add_entry"> <unit id="apnWXEq" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10316,6 +10340,12 @@ Element 3</target>
<target>På lager</target> <target>På lager</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>intet lager angivet</target>
</segment>
</unit>
<unit id="mwL3d70" name="project.builds.needed"> <unit id="mwL3d70" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10388,6 +10418,12 @@ Element 3</target>
<target>Mål mængde</target> <target>Mål mængde</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% påkrævet)</target>
</segment>
</unit>
<unit id="pyv0k6b" name="project.builds.number_of_builds"> <unit id="pyv0k6b" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -9986,6 +9986,18 @@ Element 1 -&gt; Element 1.2</target>
<target>Bauteil</target> <target>Bauteil</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Auswahl</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10106,6 +10118,42 @@ Element 1 -&gt; Element 1.2</target>
<target>Archiviert</target> <target>Archiviert</target>
</segment> </segment>
</unit> </unit>
<unit id="hIIFtI1" name="assembly.edit.status">
<segment state="translated">
<source>assembly.edit.status</source>
<target>Status</target>
</segment>
</unit>
<unit id="zRd.psv" name="assembly.status.draft">
<segment state="translated">
<source>assembly.status.draft</source>
<target>Entwurf</target>
</segment>
</unit>
<unit id="_U8bb1t" name="assembly.status.planning">
<segment state="translated">
<source>assembly.status.planning</source>
<target>In Planung</target>
</segment>
</unit>
<unit id="GgUh7RT" name="assembly.status.in_production">
<segment state="translated">
<source>assembly.status.in_production</source>
<target>In Produktion</target>
</segment>
</unit>
<unit id="IluD8iU" name="assembly.status.finished">
<segment state="translated">
<source>assembly.status.finished</source>
<target>Abgeschlossen</target>
</segment>
</unit>
<unit id="Mybkd1s" name="assembly.status.archived">
<segment state="translated">
<source>assembly.status.archived</source>
<target>Archiviert</target>
</segment>
</unit>
<unit id="9GtmqC1" name="part.new_build_part.error.build_part_already_exists"> <unit id="9GtmqC1" name="part.new_build_part.error.build_part_already_exists">
<segment state="translated"> <segment state="translated">
<source>part.new_build_part.error.build_part_already_exists</source> <source>part.new_build_part.error.build_part_already_exists</source>
@ -10382,6 +10430,12 @@ Element 1 -&gt; Element 1.2</target>
<target>vorhanden</target> <target>vorhanden</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>kein Lager angegeben</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10454,6 +10508,12 @@ Element 1 -&gt; Element 1.2</target>
<target>Ziel-Bestand</target> <target>Ziel-Bestand</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% benötigt)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>
@ -13482,6 +13542,622 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Baugruppen</target> <target>Baugruppen</target>
</segment> </segment>
</unit> </unit>
<unit id="gyRGdfv" name="assembly.edit">
<segment>
<source>assembly.edit</source>
<target>Bearbeite Baugruppe</target>
</segment>
</unit>
<unit id="4Tdtoj_" name="assembly.new">
<segment>
<source>assembly.new</source>
<target>Neue Baugruppe</target>
</segment>
</unit>
<unit id="M51YUE." name="assembly.edit.associated_build_part">
<segment>
<source>assembly.edit.associated_build_part</source>
<target>Verknüpftes Bauteil</target>
</segment>
</unit>
<unit id="nH9R9f." name="assembly.edit.associated_build_part.add">
<segment>
<source>assembly.edit.associated_build_part.add</source>
<target>Bauteil hinzufügen</target>
</segment>
</unit>
<unit id="oVfOk.i" name="assembly.edit.associated_build.hint">
<segment>
<source>assembly.edit.associated_build.hint</source>
<target>Dieses Bauteil repräsentiert die gebauten Instanzen der Baugruppe. Anzugeben, sofern gebaute Instanzen benötigt werden. Wenn nein, werden die Stückzahlen bzgl. der Baugruppe erst beim Build des jeweiligen Projektes herangezogen.</target>
</segment>
</unit>
<unit id="_wZ_JZY" name="assembly.edit.bom.import_bom">
<segment>
<source>assembly.edit.bom.import_bom</source>
<target>Bauteile importieren</target>
</segment>
</unit>
<unit id="vsmgKMw" name="log.database_updated.failed">
<segment>
<source>log.database_updated.failed</source>
<target>__log.database_updated.failed</target>
</segment>
</unit>
<unit id="GcQrTTE" name="log.database_updated.old_version">
<segment>
<source>log.database_updated.old_version</source>
<target>__log.database_updated.old_version</target>
</segment>
</unit>
<unit id="JJF47vK" name="log.database_updated.new_version">
<segment>
<source>log.database_updated.new_version</source>
<target>__log.database_updated.new_version</target>
</segment>
</unit>
<unit id="iVHS_sh" name="tree.tools.edit.assemblies">
<segment>
<source>tree.tools.edit.assemblies</source>
<target>Baugruppen</target>
</segment>
</unit>
<unit id="naAMjcH" name="assembly.bom_import.flash.success">
<segment>
<source>assembly.bom_import.flash.success</source>
<target>%count% Part Einträge erfolgreich in Baugruppe importiert.</target>
</segment>
</unit>
<unit id="ScQhV.o" name="assembly.bom_import.flash.invalid_entries">
<segment>
<source>assembly.bom_import.flash.invalid_entries</source>
<target>Validierungsfehler! Bitte überprüfen Sie die importierte Datei!</target>
</segment>
</unit>
<unit id="luj_uCZ" name="assembly.bom_import.flash.invalid_file">
<segment>
<source>assembly.bom_import.flash.invalid_file</source>
<target>Datei konnte nicht importiert werden. Überprüfen Sie, dass Sie den richtigen Dateityp gewählt haben. Fehlermeldung: %message%</target>
</segment>
</unit>
<unit id="u7SYWcB" name="assembly.bom.quantity">
<segment>
<source>assembly.bom.quantity</source>
<target>Menge</target>
</segment>
</unit>
<unit id="D7dPvPL" name="assembly.bom.mountnames">
<segment>
<source>assembly.bom.mountnames</source>
<target>Bestückungsnamen</target>
</segment>
</unit>
<unit id="rswC4eS" name="assembly.bom.instockAmount">
<segment state="translated">
<source>assembly.bom.instockAmount</source>
<target>Bestand im Lager</target>
</segment>
</unit>
<unit id="oNutri3" name="assembly.info.title">
<segment>
<source>assembly.info.title</source>
<target>Baugruppen-Info</target>
</segment>
</unit>
<unit id="aO1rzVQ" name="assembly.info.info.label">
<segment>
<source>assembly.info.info.label</source>
<target>Info</target>
</segment>
</unit>
<unit id="9dOByT_" name="assembly.info.sub_assemblies.label">
<segment>
<source>assembly.info.sub_assemblies.label</source>
<target>Untergruppe</target>
</segment>
</unit>
<unit id="Hmf0EwN" name="assembly.info.builds.label">
<segment>
<source>assembly.info.builds.label</source>
<target>Bau</target>
</segment>
</unit>
<unit id="z3F4Rcu" name="assembly.info.bom_add_parts">
<segment>
<source>assembly.info.bom_add_parts</source>
<target>Bauteile hinzufügen</target>
</segment>
</unit>
<unit id="ZbDTUTS" name="assembly.builds.check_assembly_status">
<segment>
<source>assembly.builds.check_assembly_status</source>
<target><![CDATA[Der aktuelle Baugruppen-Status ist <b>"%assembly_status%"</b>. Sie sollten überprüfen, ob sie die Baugruppe mit diesem Status wirklich bauen wollen!]]></target>
</segment>
</unit>
<unit id="xq1Soad" name="assembly.builds.build_not_possible">
<segment>
<source>assembly.builds.build_not_possible</source>
<target>Bau nicht möglich: Nicht genügend Bauteile vorhanden</target>
</segment>
</unit>
<unit id="njRyDHQ" name="assembly.builds.following_bom_entries_miss_instock">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock</source>
<target>Es sind nicht genügend Bauteile auf Lager, um dieses Projekt %number_of_builds% mal zu bauen. Von folgenden Bauteilen ist nicht genügend auf Lager.</target>
</segment>
</unit>
<unit id="sp7Z0MS" name="assembly.builds.build_possible">
<segment>
<source>assembly.builds.build_possible</source>
<target>Bau möglich</target>
</segment>
</unit>
<unit id="1uZzdEl" name="assembly.builds.number_of_builds_possible">
<segment>
<source>assembly.builds.number_of_builds_possible</source>
<target><![CDATA[Sie haben genug Bauteile auf Lager, um <b>%max_builds%</b> Exemplare dieser Baugruppe zu bauen.]]></target>
</segment>
</unit>
<unit id="pW6QLXf" name="assembly.builds.number_of_builds">
<segment>
<source>assembly.builds.number_of_builds</source>
<target>Zu bauende Anzahl</target>
</segment>
</unit>
<unit id="mtJqT_a" name="assembly.build.btn_build">
<segment>
<source>assembly.build.btn_build</source>
<target>Bauen</target>
</segment>
</unit>
<unit id="LFSVVcP" name="assembly.builds.no_stocked_builds">
<segment>
<source>assembly.builds.no_stocked_builds</source>
<target>Anzahl gelagerter gebauter Instanzen</target>
</segment>
</unit>
<unit id="dGFHutJ" name="assembly.info.bom_entries_count">
<segment>
<source>assembly.info.bom_entries_count</source>
<target>Bauteile</target>
</segment>
</unit>
<unit id="xJ7oBM4" name="assembly.info.sub_assemblies_count">
<segment>
<source>assembly.info.sub_assemblies_count</source>
<target>Untergruppen</target>
</segment>
</unit>
<unit id="HZYhTlb" name="assembly.builds.stocked">
<segment>
<source>assembly.builds.stocked</source>
<target>vorhanden</target>
</segment>
</unit>
<unit id="9EG0PLW" name="assembly.builds.needed">
<segment>
<source>assembly.builds.needed</source>
<target>benötigt</target>
</segment>
</unit>
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
<segment>
<source>assembly.add_parts_to_assembly</source>
<target>Bauteile zur Baugruppe hinzufügen</target>
</segment>
</unit>
<unit id="PPsM0Dg" name="assembly.bom.name">
<segment>
<source>assembly.bom.name</source>
<target>Name</target>
</segment>
</unit>
<unit id="nUEs.ld" name="assembly.bom.comment">
<segment>
<source>assembly.bom.comment</source>
<target>Notizen</target>
</segment>
</unit>
<unit id="87YpQ_u" name="assembly.builds.following_bom_entries_miss_instock_n">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock_n</source>
<target>Es sind nicht genügend Bauteile auf Lager, um diese Baugruppe %number_of_builds% mal zu bauen. Von folgenden Bauteilen ist nicht genügend auf Lager:</target>
</segment>
</unit>
<unit id="JlQhDdS" name="assembly.build.help">
<segment>
<source>assembly.build.help</source>
<target>Wählen Sie aus, aus welchen Beständen die zum Bau notwendigen Bauteile genommen werden sollen (und in welcher Anzahl). Setzen Sie den Haken für jeden Part Eintrag, wenn sie die Bauteile entnommen haben, oder nutzen Sie die oberste Checkbox, um alle Haken auf einmal zu setzen.</target>
</segment>
</unit>
<unit id="iP5_QVj" name="assembly.build.required_qty">
<segment>
<source>assembly.build.required_qty</source>
<target>Benötigte Anzahl</target>
</segment>
</unit>
<unit id="UJpD7n6" name="assembly.import_bom">
<segment>
<source>assembly.import_bom</source>
<target>Importiere Parts für Baugruppe</target>
</segment>
</unit>
<unit id="WTasGao" name="assembly.bom.part">
<segment>
<source>assembly.bom.part</source>
<target>Bauteil</target>
</segment>
</unit>
<unit id="jHKh8Zp" name="assembly.bom.add_entry">
<segment>
<source>assembly.bom.add_entry</source>
<target>Eintrag hinzufügen</target>
</segment>
</unit>
<unit id="RsZ77df" name="assembly.bom.price">
<segment>
<source>assembly.bom.price</source>
<target>Preis</target>
</segment>
</unit>
<unit id="63adIrC" name="assembly.build.dont_check_quantity">
<segment state="translated">
<source>assembly.build.dont_check_quantity</source>
<target>Mengen nicht überprüfen</target>
</segment>
</unit>
<unit id="O0DP6tK" name="assembly.build.dont_check_quantity.help">
<segment state="translated">
<source>assembly.build.dont_check_quantity.help</source>
<target>Wenn diese Option gewählt wird, werden die gewählten Mengen aus dem Lager entfernt, egal ob mehr oder weniger Bauteile sind, als für den Bau der Baugruppe eigentlich benötigt werden.</target>
</segment>
</unit>
<unit id="9bc0nzK" name="assembly.build.add_builds_to_builds_part">
<segment state="translated">
<source>assembly.build.add_builds_to_builds_part</source>
<target>Gebaute Instanzen zum Bauteil der Baugruppe hinzufügen</target>
</segment>
</unit>
<unit id="nl.jtSx" name="assembly.bom_import.type">
<segment state="translated">
<source>assembly.bom_import.type</source>
<target>Typ</target>
</segment>
</unit>
<unit id="LtbSLHx" name="assembly.bom_import.type.json">
<segment state="translated">
<source>assembly.bom_import.type.json</source>
<target>JSON für eine Baugruppe</target>
</segment>
</unit>
<unit id="clXFAdN" name="assembly.bom_import.type.kicad_pcbnew">
<segment state="translated">
<source>assembly.bom_import.type.kicad_pcbnew</source>
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
<target>Lösche existierende Bauteil-Einträge vor dem Import</target>
</segment>
</unit>
<unit id="S4QY6pA" name="assembly.bom_import.clear_existing_bom.help">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom.help</source>
<target>Wenn diese Option ausgewählt ist, werden alle bereits in der Baugruppe existierenden Bauteile gelöscht und mit den importierten Bauteildaten überschrieben.</target>
</segment>
</unit>
<unit id="RVNWPsh" name="assembly.import_bom.template.header.json">
<segment>
<source>assembly.import_bom.template.header.json</source>
<target>Import-Vorlage JSON für eine Baugruppe</target>
</segment>
</unit>
<unit id="eU4FfCr" name="assembly.import_bom.template.header.kicad_pcbnew">
<segment>
<source>assembly.import_bom.template.header.kicad_pcbnew</source>
<target>Import-Vorlage CSV (KiCAD Pcbnew BOM) für eine Baugruppe</target>
</segment>
</unit>
<unit id="aLomVVS" name="assembly.bom_import.template.entry.name">
<segment>
<source>assembly.bom_import.template.entry.name</source>
<target>Name des Bauteils in der Baugruppe</target>
</segment>
</unit>
<unit id="o4ZcLfV" name="assembly.bom_import.template.entry.part.mpnr">
<segment>
<source>assembly.bom_import.template.entry.part.mpnr</source>
<target>Eindeutige Produktnummer innerhalb des Herstellers</target>
</segment>
</unit>
<unit id="n3YbKeU" name="assembly.bom_import.template.entry.part.ipn">
<segment>
<source>assembly.bom_import.template.entry.part.ipn</source>
<target>Eideutige IPN des Bauteils</target>
</segment>
</unit>
<unit id="l2SYJP5" name="assembly.bom_import.template.entry.part.name">
<segment>
<source>assembly.bom_import.template.entry.part.name</source>
<target>Eindeutiger Name des Bauteils</target>
</segment>
</unit>
<unit id="VgXQ1xW" name="assembly.bom_import.template.entry.part.manufacturer.name">
<segment>
<source>assembly.bom_import.template.entry.part.manufacturer.name</source>
<target>Eindeutiger Name des Herstellers</target>
</segment>
</unit>
<unit id="MpB.o_L" name="assembly.bom_import.template.entry.part.category.name">
<segment>
<source>assembly.bom_import.template.entry.part.category.name</source>
<target>Eindeutiger Name der Kategorie</target>
</segment>
</unit>
<unit id="NIcfgj84" name="assembly.bom_import.template.json.table">
<segment>
<source>assembly.bom_import.template.json.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Feld</th>
<th>Bedingung</th>
<th>Datentyp</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td>quantity</td>
<td>Pflichtfeld</td>
<td>Gleitkommazahl (Float)</td>
<td>Muss gegeben sein und enthält einen Gleitkommawert (Float), der größer als 0.0 ist.</td>
</tr>
<tr>
<td>name</td>
<td>Optional</td>
<td>String</td>
<td>Falls vorhanden, muss es ein nicht-leerer String sein.</td>
</tr>
<tr>
<td>part</td>
<td>Optional</td>
<td>Objekt/Array</td>
<td>
Falls angegeben, muss es ein Objekt/Array sein und mindestens eines der Felder ausgefüllt sein:
<ul>
<li>part.id</li>
<li>part.name</li>
</ul>
</td>
</tr>
<tr>
<td>part.id</td>
<td>Optional</td>
<td>Ganzzahl (Integer)</td>
<td>Ganzzahl (Integer) > 0. Entspricht der Part-DB internen numerischen ID des Bauteils.</td>
</tr>
<tr>
<td>part.name</td>
<td>Optional</td>
<td>String</td>
<td>Nicht-leerer String, falls keine part.mpnr- bzw. part.ipn-Angabe gegeben ist.</td>
</tr>
<tr>
<td>part.mpnr</td>
<td>Optional</td>
<td>String</td>
<td>Nicht-leerer String, falls keine part.name- bzw. part-ipn-Angabe gegeben ist.</td>
</tr>
<tr>
<td>part.ipn</td>
<td>Optional</td>
<td>String</td>
<td>Nicht-leerer String, falls keine part.name- bzw. part.mpnr-Angabe gegeben ist.</td>
</tr>
<tr>
<td>part.description</td>
<td>Optional</td>
<td>String oder null</td>
<td>Falls vorhanden, muss es ein nicht-leerer String sein oder null.</td>
</tr>
<tr>
<td>part.manufacturer</td>
<td>Optional</td>
<td>Objekt/Array</td>
<td>
Falls vorhanden, muss es ein Objekt/Array sein und mindestens eines der Felder ausgefüllt sein:
<ul>
<li>manufacturer.id</li>
<li>manufacturer.name</li>
</ul>
</td>
</tr>
<tr>
<td>manufacturer.id</td>
<td>Optional</td>
<td>Ganzzahl (Integer)</td>
<td>Ganzzahl (Integer) > 0. Entspricht der internen numerischen ID des Herstellers.</td>
</tr>
<tr>
<td>manufacturer.name</td>
<td>Optional</td>
<td>String</td>
<td>Nicht-leerer String, falls keine manufacturer.id-Angabe gegeben ist.</td>
</tr>
<tr>
<td>part.category</td>
<td>Optional</td>
<td>Objekt/Array</td>
<td>
Falls vorhanden, muss es ein Objekt/Array sein und mindestens eines der Felder ausgefüllt sein:
<ul>
<li>category.id</li>
<li>category.name</li>
</ul>
</td>
</tr>
<tr>
<td>category.id</td>
<td>Optional</td>
<td>Ganzzahl (Integer)</td>
<td>Ganzzahl (Integer) > 0. Entspricht der internen numerischen ID der Kategorie des Bauteils.</td>
</tr>
<tr>
<td>category.name</td>
<td>Optional</td>
<td>String</td>
<td>Nicht-leerer String, falls keine category.id-Angabe gegeben ist.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="cU1bfDa" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns</source>
<target>Erwartete Spalten:</target>
</segment>
</unit>
<unit id="gvaB1sb" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns.note">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns.note</source>
<target>
<![CDATA[
<p><strong>Hinweis:</strong> Es findet keine Zuordnung zu konkreten Bauteilen aus der Kategorie-Verwaltung statt.</p>
]]>
</target>
</segment>
</unit>
<unit id="translationUnit3" name="assembly.bom_import.template.kicad_pcbnew.table">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Feld</th>
<th>Bedingung</th>
<th>Datentyp</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td>Id</td>
<td>Optional</td>
<td>Ganzzahl (Integer)</td>
<td>Offene Angabe. Eine eindeutige Identifikationsnummer für jedes Bauteil.</td>
</tr>
<tr>
<td>Designator</td>
<td>Optional</td>
<td>String</td>
<td>Offene Angabe. Ein eindeutiger Referenzbezeichner des Bauteils auf der Leiterplatte, z.B. „R1“ für Widerstand 1. Wird für den Bestückungsnamen des Bauteil-Eintrags innerhalb der Bauteilgruppe verwendet.</td>
</tr>
<tr>
<td>Package</td>
<td>Optional</td>
<td>String</td>
<td>Offene Angabe. Das Gehäuse oder die Bauform des Bauteils, z.B. „0805“ für SMD-Widerstände.</td>
</tr>
<tr>
<td>Quantity</td>
<td>Pflichtfeld</td>
<td>Ganzzahl (Integer)</td>
<td>Anzahl der identischen Bauteile, die benötigt werden, um eine Instanz der Baugruppe zu erstellen.</td>
</tr>
<tr>
<td>Designation</td>
<td>Pflichtfeld</td>
<td>String</td>
<td>Beschreibung oder Funktion des Bauteils, z.B. Widerstandswert „10kΩ“ oder Kondensatorwert „100nF“. Wird für den Namen des BOM-Eintrags verwendet.</td>
</tr>
<tr>
<td>Supplier and ref</td>
<td>Optional</td>
<td>String</td>
<td>Offene Angabe. Kann z.B. Distributor spezifischen Wert enthalten.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="QiZM3zY" name="typeahead.parts.part.name">
<segment>
<source>typeahead.parts.part.name</source>
<target>%name% (Bauteil)</target>
</segment>
</unit>
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
<segment>
<source>typeahead.parts.assembly.name</source>
<target>%name% (Baugruppe)</target>
</segment>
</unit>
<unit id="4cgba2c" name="projects.build.form.part">
<segment>
<source>projects.build.form.part</source>
<target>Bauteil "%name%"</target>
</segment>
</unit>
<unit id="1bCA1zb" name="projects.build.form.assembly">
<segment>
<source>projects.build.form.assembly</source>
<target>Baugruppe "%name%"</target>
</segment>
</unit>
<unit id="2cDB2ac" name="projects.build.form.assembly.bom.entry">
<segment>
<source>projects.build.form.assembly.bom.entry</source>
<target>%name% (%quantity% benötigt)</target>
</segment>
</unit>
<unit id="3dEC3bd" name="projects.build.form.assembly.bom.entry.no.stock">
<segment>
<source>projects.build.form.assembly.bom.entry.no.stock</source>
<target>nicht auf Lager</target>
</segment>
</unit>
<unit id="G2sXzh7" name="assembly.label">
<segment>
<source>assembly.label</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="dL51AVa" name="assembly.caption">
<segment>
<source>assembly.caption</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="G_rlE3w" name="perm.assemblies">
<segment>
<source>perm.assemblies</source>
<target>Baugruppen</target>
</segment>
</unit>
<unit id="dipIGt4" name="assembly_bom_entry.label">
<segment>
<source>assembly_bom_entry.label</source>
<target>Bauteile</target>
</segment>
</unit>
<unit id="TvHlYfl" name="assembly.labelp">
<segment>
<source>assembly.labelp</source>
<target>Baugruppen</target>
</segment>
</unit>
<unit id="Tab5Ou1" name="assembly.referencedAssembly.labelp"> <unit id="Tab5Ou1" name="assembly.referencedAssembly.labelp">
<segment> <segment>
<source>assembly.referencedAssembly.labelp</source> <source>assembly.referencedAssembly.labelp</source>

View file

@ -2614,5 +2614,693 @@
<target>Δημιουργήστε πρώτα ένα εξάρτημα και αντιστοιχίστε το σε μια κατηγορία: με τις υπάρχουσες κατηγορίες και τα δικά τους προθέματα IPN, η ονομασία IPN για το εξάρτημα μπορεί να προταθεί αυτόματα</target> <target>Δημιουργήστε πρώτα ένα εξάρτημα και αντιστοιχίστε το σε μια κατηγορία: με τις υπάρχουσες κατηγορίες και τα δικά τους προθέματα IPN, η ονομασία IPN για το εξάρτημα μπορεί να προταθεί αυτόματα</target>
</segment> </segment>
</unit> </unit>
<unit id="FV7YOW6" name="part.table.name.value.for_part">
<segment state="translated">
<source>part.table.name.value.for_part</source>
<target>%value% (Μέρος)</target>
</segment>
</unit>
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
<segment state="translated">
<source>part.table.name.value.for_assembly</source>
<target>%value% (Συναρμολόγηση)</target>
</segment>
</unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Συναρμολόγηση</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Επιλογή</target>
</segment>
</unit>
<unit id="hIIFtI1" name="assembly.edit.status">
<segment state="translated">
<source>assembly.edit.status</source>
<target>Κατάσταση</target>
</segment>
</unit>
<unit id="zRd.psv" name="assembly.status.draft">
<segment state="translated">
<source>assembly.status.draft</source>
<target>Προσχέδιο</target>
</segment>
</unit>
<unit id="_U8bb1t" name="assembly.status.planning">
<segment state="translated">
<source>assembly.status.planning</source>
<target>Υπό σχεδιασμό</target>
</segment>
</unit>
<unit id="GgUh7RT" name="assembly.status.in_production">
<segment state="translated">
<source>assembly.status.in_production</source>
<target>Σε παραγωγή</target>
</segment>
</unit>
<unit id="IluD8iU" name="assembly.status.finished">
<segment state="translated">
<source>assembly.status.finished</source>
<target>Ολοκληρώθηκε</target>
</segment>
</unit>
<unit id="Mybkd1s" name="assembly.status.archived">
<segment state="translated">
<source>assembly.status.archived</source>
<target>Αρχειοθετήθηκε</target>
</segment>
</unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>δεν έχει καθοριστεί απόθεμα</target>
</segment>
</unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% απαιτείται)</target>
</segment>
</unit>
<unit id="G2sXzh7" name="assembly.label">
<segment>
<source>assembly.label</source>
<target>Σύνολο</target>
</segment>
</unit>
<unit id="dL51AVa" name="assembly.caption">
<segment>
<source>assembly.caption</source>
<target>Σύνολο</target>
</segment>
</unit>
<unit id="G_rlE3w" name="perm.assemblies">
<segment>
<source>perm.assemblies</source>
<target>Συναρμολογήσεις</target>
</segment>
</unit>
<unit id="dipIGt4" name="assembly_bom_entry.label">
<segment>
<source>assembly_bom_entry.label</source>
<target>Μέρη</target>
</segment>
</unit>
<unit id="TvHlYfl" name="assembly.labelp">
<segment>
<source>assembly.labelp</source>
<target>Συναρμολογήσεις</target>
</segment>
</unit>
<unit id="gyRGdfv" name="assembly.edit">
<segment>
<source>assembly.edit</source>
<target>Επεξεργασία συνόλου</target>
</segment>
</unit>
<unit id="4Tdtoj_" name="assembly.new">
<segment>
<source>assembly.new</source>
<target>Νέο σύνολο</target>
</segment>
</unit>
<unit id="M51YUE." name="assembly.edit.associated_build_part">
<segment>
<source>assembly.edit.associated_build_part</source>
<target>Σχετικό μέρος</target>
</segment>
</unit>
<unit id="nH9R9f." name="assembly.edit.associated_build_part.add">
<segment>
<source>assembly.edit.associated_build_part.add</source>
<target>Προσθήκη μέρους</target>
</segment>
</unit>
<unit id="oVfOk.i" name="assembly.edit.associated_build.hint">
<segment>
<source>assembly.edit.associated_build.hint</source>
<target>Αυτό το μέρος αντιπροσωπεύει τις κατασκευασμένες εκδόσεις του συνόλου. Καταχωρίστε το εάν απαιτούνται κατασκευασμένες εκδόσεις. Εάν όχι, οι ποσότητες θα χρησιμοποιηθούν μόνο κατά την κατασκευή του εκάστοτε έργου.</target>
</segment>
</unit>
<unit id="_wZ_JZY" name="assembly.edit.bom.import_bom">
<segment>
<source>assembly.edit.bom.import_bom</source>
<target>Εισαγωγή μερών</target>
</segment>
</unit>
<unit id="vsmgKMw" name="log.database_updated.failed">
<segment>
<source>log.database_updated.failed</source>
<target>__log.database_updated.failed</target>
</segment>
</unit>
<unit id="GcQrTTE" name="log.database_updated.old_version">
<segment>
<source>log.database_updated.old_version</source>
<target>__log.database_updated.old_version</target>
</segment>
</unit>
<unit id="JJF47vK" name="log.database_updated.new_version">
<segment>
<source>log.database_updated.new_version</source>
<target>__log.database_updated.new_version</target>
</segment>
</unit>
<unit id="iVHS_sh" name="tree.tools.edit.assemblies">
<segment>
<source>tree.tools.edit.assemblies</source>
<target>Συναρμολογήσεις</target>
</segment>
</unit>
<unit id="naAMjcH" name="assembly.bom_import.flash.success">
<segment>
<source>assembly.bom_import.flash.success</source>
<target>%count% εγγραφές εξαρτημάτων εισήχθησαν με επιτυχία στο σύνολο.</target>
</segment>
</unit>
<unit id="ScQhV.o" name="assembly.bom_import.flash.invalid_entries">
<segment>
<source>assembly.bom_import.flash.invalid_entries</source>
<target>Σφάλμα επικύρωσης! Ελέγξτε το εισαγόμενο αρχείο!</target>
</segment>
</unit>
<unit id="luj_uCZ" name="assembly.bom_import.flash.invalid_file">
<segment>
<source>assembly.bom_import.flash.invalid_file</source>
<target>Το αρχείο δεν μπόρεσε να εισαχθεί. Ελέγξτε ότι έχετε επιλέξει τον σωστό τύπο αρχείου. Μήνυμα σφάλματος: %message%</target>
</segment>
</unit>
<unit id="u7SYWcB" name="assembly.bom.quantity">
<segment>
<source>assembly.bom.quantity</source>
<target>Ποσότητα</target>
</segment>
</unit>
<unit id="D7dPvPL" name="assembly.bom.mountnames">
<segment>
<source>assembly.bom.mountnames</source>
<target>Ονόματα συναρμολόγησης</target>
</segment>
</unit>
<unit id="rswC4eS" name="assembly.bom.instockAmount">
<segment state="translated">
<source>assembly.bom.instockAmount</source>
<target>Ποσότητα σε απόθεμα</target>
</segment>
</unit>
<unit id="oNutri3" name="assembly.info.title">
<segment>
<source>assembly.info.title</source>
<target>Πληροφορίες συναρμολόγησης</target>
</segment>
</unit>
<unit id="aO1rzVQ" name="assembly.info.info.label">
<segment>
<source>assembly.info.info.label</source>
<target>Πληροφορίες</target>
</segment>
</unit>
<unit id="9dOByT_" name="assembly.info.sub_assemblies.label">
<segment>
<source>assembly.info.sub_assemblies.label</source>
<target>Υποομάδες</target>
</segment>
</unit>
<unit id="Hmf0EwN" name="assembly.info.builds.label">
<segment>
<source>assembly.info.builds.label</source>
<target>Κατασκευές</target>
</segment>
</unit>
<unit id="z3F4Rcu" name="assembly.info.bom_add_parts">
<segment>
<source>assembly.info.bom_add_parts</source>
<target>Προσθήκη εξαρτημάτων</target>
</segment>
</unit>
<unit id="ZbDTUTS" name="assembly.builds.check_assembly_status">
<segment>
<source>assembly.builds.check_assembly_status</source>
<target><![CDATA[Η τρέχουσα κατάσταση συναρμολόγησης είναι <b>«%assembly_status%»</b>. Ελέγξτε εάν θέλετε πραγματικά να κατασκευάσετε τη συναρμολόγηση με αυτήν την κατάσταση!]]></target>
</segment>
</unit>
<unit id="xq1Soad" name="assembly.builds.build_not_possible">
<segment>
<source>assembly.builds.build_not_possible</source>
<target>Η κατασκευή δεν είναι δυνατή: Δεν υπάρχουν αρκετά διαθέσιμα εξαρτήματα</target>
</segment>
</unit>
<unit id="njRyDHQ" name="assembly.builds.following_bom_entries_miss_instock">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock</source>
<target>Δεν υπάρχουν αρκετά εξαρτήματα σε απόθεμα για να κατασκευαστεί αυτό το έργο %number_of_builds% φορές. Λείπουν τα ακόλουθα εξαρτήματα:</target>
</segment>
</unit>
<unit id="sp7Z0MS" name="assembly.builds.build_possible">
<segment>
<source>assembly.builds.build_possible</source>
<target>Κατασκευή δυνατή</target>
</segment>
</unit>
<unit id="1uZzdEl" name="assembly.builds.number_of_builds_possible">
<segment>
<source>assembly.builds.number_of_builds_possible</source>
<target><![CDATA[Διαθέτετε αρκετά εξαρτήματα σε απόθεμα για να κατασκευάσετε <b>%max_builds%</b> μονάδες αυτής της συναρμολόγησης.]]></target>
</segment>
</unit>
<unit id="pW6QLXf" name="assembly.builds.number_of_builds">
<segment>
<source>assembly.builds.number_of_builds</source>
<target>Αριθμός κατασκευών</target>
</segment>
</unit>
<unit id="mtJqT_a" name="assembly.build.btn_build">
<segment>
<source>assembly.build.btn_build</source>
<target>Κατασκευή</target>
</segment>
</unit>
<unit id="LFSVVcP" name="assembly.builds.no_stocked_builds">
<segment>
<source>assembly.builds.no_stocked_builds</source>
<target>Αποθηκευμένα κατασκευασμένα κομμάτια</target>
</segment>
</unit>
<unit id="dGFHutJ" name="assembly.info.bom_entries_count">
<segment>
<source>assembly.info.bom_entries_count</source>
<target>Εξαρτήματα</target>
</segment>
</unit>
<unit id="xJ7oBM4" name="assembly.info.sub_assemblies_count">
<segment>
<source>assembly.info.sub_assemblies_count</source>
<target>Υποομάδες</target>
</segment>
</unit>
<unit id="HZYhTlb" name="assembly.builds.stocked">
<segment>
<source>assembly.builds.stocked</source>
<target>σε απόθεμα</target>
</segment>
</unit>
<unit id="9EG0PLW" name="assembly.builds.needed">
<segment>
<source>assembly.builds.needed</source>
<target>απαιτούμενο</target>
</segment>
</unit>
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
<segment>
<source>assembly.add_parts_to_assembly</source>
<target>Προσθήκη εξαρτημάτων στη συναρμολόγηση</target>
</segment>
</unit>
<unit id="PPsM0Dg" name="assembly.bom.name">
<segment>
<source>assembly.bom.name</source>
<target>Όνομα</target>
</segment>
</unit>
<unit id="nUEs.ld" name="assembly.bom.comment">
<segment>
<source>assembly.bom.comment</source>
<target>Σχόλια</target>
</segment>
</unit>
<unit id="87YpQ_u" name="assembly.builds.following_bom_entries_miss_instock_n">
<segment>
<source>assembly.builds.following_bom_entries_miss_instock_n</source>
<target>Δεν υπάρχουν αρκετά εξαρτήματα σε απόθεμα για να κατασκευαστεί αυτή η συναρμολόγηση %number_of_builds% φορές. Λείπουν τα ακόλουθα εξαρτήματα:</target>
</segment>
</unit>
<unit id="JlQhDdS" name="assembly.build.help">
<segment>
<source>assembly.build.help</source>
<target>Επιλέξτε από ποια αποθέματα θα αφαιρεθούν τα αναγκαία για την κατασκευή εξαρτήματα (και σε ποια ποσότητα). Σημειώστε το πλαίσιο επιλογής για κάθε εξάρτημα όταν αφαιρέσετε τα εξαρτήματα ή χρησιμοποιήστε το ανώτερο πλαίσιο επιλογής για να τα ελέγξετε όλα ταυτόχρονα.</target>
</segment>
</unit>
<unit id="iP5_QVj" name="assembly.build.required_qty">
<segment>
<source>assembly.build.required_qty</source>
<target>Απαιτούμενη ποσότητα</target>
</segment>
</unit>
<unit id="UJpD7n6" name="assembly.import_bom">
<segment>
<source>assembly.import_bom</source>
<target>Εισαγωγή εξαρτημάτων συναρμολόγησης</target>
</segment>
</unit>
<unit id="WTasGao" name="assembly.bom.part">
<segment>
<source>assembly.bom.part</source>
<target>Εξάρτημα</target>
</segment>
</unit>
<unit id="jHKh8Zp" name="assembly.bom.add_entry">
<segment>
<source>assembly.bom.add_entry</source>
<target>Προσθήκη καταχώρησης</target>
</segment>
</unit>
<unit id="RsZ77df" name="assembly.bom.price">
<segment>
<source>assembly.bom.price</source>
<target>Τιμή</target>
</segment>
</unit>
<unit id="63adIrC" name="assembly.build.dont_check_quantity">
<segment state="translated">
<source>assembly.build.dont_check_quantity</source>
<target>Μην ελέγχετε την ποσότητα</target>
</segment>
</unit>
<unit id="O0DP6tK" name="assembly.build.dont_check_quantity.help">
<segment state="translated">
<source>assembly.build.dont_check_quantity.help</source>
<target>Εάν επιλεγεί αυτή η επιλογή, οι επιλεγμένες ποσότητες θα αφαιρεθούν από το απόθεμα ανεξάρτητα από το αν είναι περισσότερο ή λιγότερο από το απαιτούμενο για την κατασκευή της συναρμολόγησης.</target>
</segment>
</unit>
<unit id="9bc0nzK" name="assembly.build.add_builds_to_builds_part">
<segment state="translated">
<source>assembly.build.add_builds_to_builds_part</source>
<target>Προσθήκη κατασκευασμένων κομματιών στο τμήμα συναρμολόγησης</target>
</segment>
</unit>
<unit id="nl.jtSx" name="assembly.bom_import.type">
<segment state="translated">
<source>assembly.bom_import.type</source>
<target>Τύπος</target>
</segment>
</unit>
<unit id="LtbSLHx" name="assembly.bom_import.type.json">
<segment state="translated">
<source>assembly.bom_import.type.json</source>
<target>JSON για συναρμολόγηση</target>
</segment>
</unit>
<unit id="clXFAdN" name="assembly.bom_import.type.kicad_pcbnew">
<segment state="translated">
<source>assembly.bom_import.type.kicad_pcbnew</source>
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
<target>Διαγραφή υπαρχόντων εξαρτημάτων πριν από την εισαγωγή</target>
</segment>
</unit>
<unit id="S4QY6pA" name="assembly.bom_import.clear_existing_bom.help">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom.help</source>
<target>Εάν επιλεγεί αυτή η επιλογή, όλα τα ήδη υπάρχοντα εξαρτήματα στη συναρμολόγηση θα διαγραφούν και θα αντικατασταθούν με τα δεδομένα εξαρτημάτων που εισάγονται.</target>
</segment>
</unit>
<unit id="RVNWPsh" name="assembly.import_bom.template.header.json">
<segment>
<source>assembly.import_bom.template.header.json</source>
<target>Πρότυπο εισαγωγής JSON για συναρμολόγηση</target>
</segment>
</unit>
<unit id="eU4FfCr" name="assembly.import_bom.template.header.kicad_pcbnew">
<segment>
<source>assembly.import_bom.template.header.kicad_pcbnew</source>
<target>Πρότυπο εισαγωγής CSV (KiCAD Pcbnew BOM) για συναρμολόγηση</target>
</segment>
</unit>
<unit id="aLomVVS" name="assembly.bom_import.template.entry.name">
<segment>
<source>assembly.bom_import.template.entry.name</source>
<target>Όνομα του εξαρτήματος στη συναρμολόγηση</target>
</segment>
</unit>
<unit id="o4ZcLfV" name="assembly.bom_import.template.entry.part.mpnr">
<segment>
<source>assembly.bom_import.template.entry.part.mpnr</source>
<target>Μοναδικός αριθμός προϊόντος από τον κατασκευαστή</target>
</segment>
</unit>
<unit id="n3YbKeU" name="assembly.bom_import.template.entry.part.ipn">
<segment>
<source>assembly.bom_import.template.entry.part.ipn</source>
<target>Μοναδικός IPN του εξαρτήματος</target>
</segment>
</unit>
<unit id="l2SYJP5" name="assembly.bom_import.template.entry.part.name">
<segment>
<source>assembly.bom_import.template.entry.part.name</source>
<target>Μοναδικό όνομα εξαρτήματος</target>
</segment>
</unit>
<unit id="VgXQ1xW" name="assembly.bom_import.template.entry.part.manufacturer.name">
<segment>
<source>assembly.bom_import.template.entry.part.manufacturer.name</source>
<target>Μοναδικό όνομα κατασκευαστή</target>
</segment>
</unit>
<unit id="MpB.o_L" name="assembly.bom_import.template.entry.part.category.name">
<segment>
<source>assembly.bom_import.template.entry.part.category.name</source>
<target>Μοναδικό όνομα κατηγορίας</target>
</segment>
</unit>
<unit id="NIcfgj84" name="assembly.bom_import.template.json.table">
<segment>
<source>assembly.bom_import.template.json.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Πεδίο</th>
<th>Προϋπόθεση</th>
<th>Τύπος Δεδομένων</th>
<th>Περιγραφή</th>
</tr>
</thead>
<tbody>
<tr>
<td>quantity</td>
<td>Υποχρεωτικό πεδίο</td>
<td>Αριθμός κινητής υποδιαστολής (Float)</td>
<td>Πρέπει να παρέχεται και να περιέχει τιμή κινητής υποδιαστολής (Float) μεγαλύτερη από 0.0.</td>
</tr>
<tr>
<td>name</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Εάν υπάρχει, πρέπει να είναι μη κενό κείμενο.</td>
</tr>
<tr>
<td>part</td>
<td>Προαιρετικό</td>
<td>Αντικείμενο/Πίνακας</td>
<td>
Εάν παρέχεται, πρέπει να είναι αντικείμενο/πίνακας και τουλάχιστον ένα από τα πεδία του να είναι συμπληρωμένο:
<ul>
<li>part.id</li>
<li>part.name</li>
</ul>
</td>
</tr>
<tr>
<td>part.id</td>
<td>Προαιρετικό</td>
<td>Ακέραιος αριθμός (Integer)</td>
<td>Ακέραιος (Integer) > 0. Αντιστοιχεί στην εσωτερική αριθμητική ταυτότητα (ID) του εξαρτήματος στη βάση δεδομένων.</td>
</tr>
<tr>
<td>part.name</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Μη κενό κείμενο, εάν δεν παρέχονται οι ενδείξεις part.mpnr ή part.ipn.</td>
</tr>
<tr>
<td>part.mpnr</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Μη κενό κείμενο, εάν δεν παρέχονται οι ενδείξεις part.name ή part.ipn.</td>
</tr>
<tr>
<td>part.ipn</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Μη κενό κείμενο, εάν δεν παρέχονται οι ενδείξεις part.name ή part.mpnr.</td>
</tr>
<tr>
<td>part.description</td>
<td>Προαιρετικό</td>
<td>Κείμενο ή null</td>
<td>Εάν υπάρχει, πρέπει να είναι μη κενό κείμενο, ή null.</td>
</tr>
<tr>
<td>part.manufacturer</td>
<td>Προαιρετικό</td>
<td>Αντικείμενο/Πίνακας</td>
<td>
Εάν υπάρχει, πρέπει να είναι αντικείμενο/πίνακας και τουλάχιστον ένα από τα πεδία του να είναι συμπληρωμένο:
<ul>
<li>manufacturer.id</li>
<li>manufacturer.name</li>
</ul>
</td>
</tr>
<tr>
<td>manufacturer.id</td>
<td>Προαιρετικό</td>
<td>Ακέραιος αριθμός (Integer)</td>
<td>Ακέραιος (Integer) > 0. Αντιστοιχεί στην εσωτερική αριθμητική ταυτότητα (ID) του κατασκευαστή.</td>
</tr>
<tr>
<td>manufacturer.name</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Μη κενό κείμενο, εάν δεν παρέχεται η ένδειξη manufacturer.id.</td>
</tr>
<tr>
<td>part.category</td>
<td>Προαιρετικό</td>
<td>Αντικείμενο/Πίνακας</td>
<td>
Εάν υπάρχει, πρέπει να είναι αντικείμενο/πίνακας και τουλάχιστον ένα από τα πεδία του να είναι συμπληρωμένο:
<ul>
<li>category.id</li>
<li>category.name</li>
</ul>
</td>
</tr>
<tr>
<td>category.id</td>
<td>Προαιρετικό</td>
<td>Ακέραιος αριθμός (Integer)</td>
<td>Ακέραιος (Integer) > 0. Αντιστοιχεί στην εσωτερική αριθμητική ταυτότητα (ID) της κατηγορίας του εξαρτήματος.</td>
</tr>
<tr>
<td>category.name</td>
<td>Προαιρετικό</td>
<td>Κείμενο (String)</td>
<td>Μη κενό κείμενο, εάν δεν παρέχεται η ένδειξη category.id.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="cU1bfDa" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns</source>
<target>Αναμενόμενες στήλες:</target>
</segment>
</unit>
<unit id="gvaB1sb" name="assembly.bom_import.template.kicad_pcbnew.exptected_columns.note">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.exptected_columns.note</source>
<target>
<![CDATA[
<p><strong>Σημείωση:</strong> Δεν πραγματοποιείται αντιστοίχιση με συγκεκριμένα εξαρτήματα από τη διαχείριση κατηγοριών.</p>
]]>
</target>
</segment>
</unit>
<unit id="translationUnit4" name="assembly.bom_import.template.kicad_pcbnew.table">
<segment>
<source>assembly.bom_import.template.kicad_pcbnew.table</source>
<target>
<![CDATA[
<table class="table table-bordered table-striped">
<thead class="thead-dark">
<tr>
<th>Πεδίο</th>
<th>Εκπλήρωση</th>
<th>Τύπος δεδομένων</th>
<th>Περιγραφή</th>
</tr>
</thead>
<tbody>
<tr>
<td>Id</td>
<td>Προαιρετικό</td>
<td>Ακέραιος αριθμός (Integer)</td>
<td>Ελεύθερη καταχώρηση. Μοναδικός αριθμός ταυτοποίησης για κάθε εξάρτημα.</td>
</tr>
<tr>
<td>Σχεδιαστής</td>
<td>Προαιρετικό</td>
<td>Συμβολοσειρά (String)</td>
<td>Ελεύθερη καταχώρηση. Μοναδικός αναγνωριστικός δείκτης του εξαρτήματος στην πλακέτα κυκλώματος, π.χ. "R1" για την αντίσταση 1. Χρησιμοποιείται για το όνομα του εξαρτήματος στο πλαίσιο της ομάδας εξαρτημάτων.</td>
</tr>
<tr>
<td>Συσκευασία</td>
<td>Προαιρετικό</td>
<td>Συμβολοσειρά (String)</td>
<td>Ελεύθερη καταχώρηση. Ο τύπος ή η μορφή του εξαρτήματος, π.χ. "0805" για αντιστάσεις SMD.</td>
</tr>
<tr>
<td>Ποσότητα</td>
<td>Υποχρεωτικό</td>
<td>Ακέραιος αριθμός (Integer)</td>
<td>Ο αριθμός των πανομοιότυπων εξαρτημάτων που απαιτούνται για τη δημιουργία μίας μονάδας του συνόλου.</td>
</tr>
<tr>
<td>Ορισμός</td>
<td>Υποχρεωτικό</td>
<td>Συμβολοσειρά (String)</td>
<td>Περιγραφή ή λειτουργία του εξαρτήματος, π.χ. αντίσταση "10kΩ" ή χωρητικότητα "100nF". Χρησιμοποιείται για το όνομα της εγγραφής στο BOM.</td>
</tr>
<tr>
<td>Προμηθευτής και παραπομπή</td>
<td>Προαιρετικό</td>
<td>Συμβολοσειρά (String)</td>
<td>Ελεύθερη καταχώρηση. Μπορεί να περιλαμβάνει, π.χ., ειδική τιμή από διανομέα.</td>
</tr>
</tbody>
</table>
]]>
</target>
</segment>
</unit>
<unit id="QiZM3zY" name="typeahead.parts.part.name">
<segment>
<source>typeahead.parts.part.name</source>
<target>%name% (Εξάρτημα)</target>
</segment>
</unit>
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
<segment>
<source>typeahead.parts.assembly.name</source>
<target>%name% (Συναρμολόγηση)</target>
</segment>
</unit>
<unit id="4cgba2c" name="projects.build.form.part">
<segment>
<source>projects.build.form.part</source>
<target>Εξάρτημα "%name%"</target>
</segment>
</unit>
<unit id="1bCA1zb" name="projects.build.form.assembly">
<segment>
<source>projects.build.form.assembly</source>
<target>Συναρμολόγηση "%name%"</target>
</segment>
</unit>
<unit id="2cDB2ac" name="projects.build.form.assembly.bom.entry">
<segment>
<source>projects.build.form.assembly.bom.entry</source>
<target>%name% (%quantity% απαιτείται)</target>
</segment>
</unit>
<unit id="3dEC3bd" name="projects.build.form.assembly.bom.entry.no.stock">
<segment>
<source>projects.build.form.assembly.bom.entry.no.stock</source>
<target>δεν υπάρχει στο απόθεμα</target>
</segment>
</unit>
</file> </file>
</xliff> </xliff>

View file

@ -4831,6 +4831,18 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
<target>%value% (Project)</target> <target>%value% (Project)</target>
</segment> </segment>
</unit> </unit>
<unit id="FV7YOW6" name="part.table.name.value.for_part">
<segment state="translated">
<source>part.table.name.value.for_part</source>
<target>%value% (Part)</target>
</segment>
</unit>
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
<segment state="translated">
<source>part.table.name.value.for_assembly</source>
<target>%value% (Assembly)</target>
</segment>
</unit>
<unit id="rW_SFJE" name="part.table.id"> <unit id="rW_SFJE" name="part.table.id">
<notes> <notes>
<note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note> <note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note>
@ -9987,6 +9999,18 @@ Element 1 -&gt; Element 1.2</target>
<target>Part</target> <target>Part</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Assembly</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Selection</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10383,6 +10407,12 @@ Element 1 -&gt; Element 1.2</target>
<target>stocked</target> <target>stocked</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>no stock specified</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10455,6 +10485,12 @@ Element 1 -&gt; Element 1.2</target>
<target>Target lot</target> <target>Target lot</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% needed)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -9930,6 +9930,18 @@ Elemento 3</target>
<target>Componente</target> <target>Componente</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Baugruppe</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Auswahl</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10326,6 +10338,12 @@ Elemento 3</target>
<target>Almacenado</target> <target>Almacenado</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>no se ha especificado stock</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10398,6 +10416,12 @@ Elemento 3</target>
<target>Lote objetivo</target> <target>Lote objetivo</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (se requiere %quantity%)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -9932,6 +9932,18 @@ Element 3</target>
<target>Componente</target> <target>Componente</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Assemblaggio</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Selezione</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10328,6 +10340,12 @@ Element 3</target>
<target>a magazzino</target> <target>a magazzino</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>nessuna scorta specificata</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10400,6 +10418,12 @@ Element 3</target>
<target>Lotto target</target> <target>Lotto target</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% richiesti)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -8960,6 +8960,18 @@ Exampletown</target>
<target>Part-DBについての質問は、&lt;a href="%href%" class="link-external" target="_blank"&gt;GitHub&lt;/a&gt; にスレッドがあります。</target> <target>Part-DBについての質問は、&lt;a href="%href%" class="link-external" target="_blank"&gt;GitHub&lt;/a&gt; にスレッドがあります。</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>アセンブリ</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>選択</target>
</segment>
</unit>
<unit id="hIIFtI1" name="assembly.edit.status"> <unit id="hIIFtI1" name="assembly.edit.status">
<segment state="translated"> <segment state="translated">
<source>assembly.edit.status</source> <source>assembly.edit.status</source>
@ -8996,6 +9008,18 @@ Exampletown</target>
<target>アーカイブ済み</target> <target>アーカイブ済み</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>nessuna scorta specificata</target>
</segment>
</unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (必要数: %quantity%)</target>
</segment>
</unit>
<unit id="G2sXzh7" name="assembly.label"> <unit id="G2sXzh7" name="assembly.label">
<segment> <segment>
<source>assembly.label</source> <source>assembly.label</source>

View file

@ -10331,6 +10331,12 @@ Element 3</target>
<target>dostępny</target> <target>dostępny</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>brak podanego stanu magazynowego</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10403,6 +10409,12 @@ Element 3</target>
<target>Partia docelowa</target> <target>Partia docelowa</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (%quantity% wymagane)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -743,7 +743,7 @@
</notes> </notes>
<segment state="translated"> <segment state="translated">
<source>user.edit.tfa.disable_tfa_message</source> <source>user.edit.tfa.disable_tfa_message</source>
<target>Это выключит &lt;b&gt;все активные двухфакторной способы аутентификации пользователя&lt;/b&gt;и удалит &lt;b&gt;резервные коды&lt;/b&gt;! <target>Это выключит &lt;b&gt;все активные двухфакторной способы аутентификации пользователя&lt;/b&gt;и удалит &lt;b&gt;резервные коды&lt;/b&gt;!
&lt;br&gt; &lt;br&gt;
Пользователь должен будет снова настроить все методы двухфакторной аутентификации и распечатать новые резервные коды! &lt;br&gt;&lt;br&gt; Пользователь должен будет снова настроить все методы двухфакторной аутентификации и распечатать новые резервные коды! &lt;br&gt;&lt;br&gt;
&lt;b&gt;Делайте это только в том случае, если вы абсолютно уверены в личности пользователя (обращающегося за помощью), в противном случае учетная запись может быть взломана злоумышленником!&lt;/b&gt;</target> &lt;b&gt;Делайте это только в том случае, если вы абсолютно уверены в личности пользователя (обращающегося за помощью), в противном случае учетная запись может быть взломана злоумышленником!&lt;/b&gt;</target>
@ -3812,7 +3812,7 @@
</notes> </notes>
<segment state="translated"> <segment state="translated">
<source>tfa_backup.reset_codes.confirm_message</source> <source>tfa_backup.reset_codes.confirm_message</source>
<target>Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено. <target>Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено.
Не забудьте распечатать новы кода и хранить их в безопасном месте!</target> Не забудьте распечатать новы кода и хранить их в безопасном месте!</target>
</segment> </segment>
</unit> </unit>
@ -9939,6 +9939,18 @@
<target>Компонент</target> <target>Компонент</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>Сборка</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>Выбор</target>
</segment>
</unit>
<unit id="kGqIirz" name="project.bom.add_entry"> <unit id="kGqIirz" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10335,6 +10347,12 @@
<target>запасено</target> <target>запасено</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>склад не указан</target>
</segment>
</unit>
<unit id="s5DQlqF" name="project.builds.needed"> <unit id="s5DQlqF" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10407,6 +10425,12 @@
<target>Целевой лот</target> <target>Целевой лот</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (требуется: %quantity%)</target>
</segment>
</unit>
<unit id="5DTAvWG" name="project.builds.number_of_builds"> <unit id="5DTAvWG" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -9938,6 +9938,18 @@ Element 3</target>
<target>部件</target> <target>部件</target>
</segment> </segment>
</unit> </unit>
<unit id="KJuXVR5" name="project.bom.assembly">
<segment state="translated">
<source>project.bom.assembly</source>
<target>装配</target>
</segment>
</unit>
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
<segment state="translated">
<source>project.bom.partOrAssembly</source>
<target>选择</target>
</segment>
</unit>
<unit id="apnWXEq" name="project.bom.add_entry"> <unit id="apnWXEq" name="project.bom.add_entry">
<segment state="translated"> <segment state="translated">
<source>project.bom.add_entry</source> <source>project.bom.add_entry</source>
@ -10334,6 +10346,12 @@ Element 3</target>
<target>在库</target> <target>在库</target>
</segment> </segment>
</unit> </unit>
<unit id="gHU1vgc" name="project.builds.no_stock">
<segment state="translated">
<source>project.builds.no_stock</source>
<target>未指定库存</target>
</segment>
</unit>
<unit id="mwL3d70" name="project.builds.needed"> <unit id="mwL3d70" name="project.builds.needed">
<segment state="translated"> <segment state="translated">
<source>project.builds.needed</source> <source>project.builds.needed</source>
@ -10406,6 +10424,12 @@ Element 3</target>
<target>目标批次</target> <target>目标批次</target>
</segment> </segment>
</unit> </unit>
<unit id="OsmK1Iv" name="project.build.builds_part_lot_label">
<segment state="translated">
<source>project.build.builds_part_lot_label</source>
<target>%name% (需求数量: %quantity%)</target>
</segment>
</unit>
<unit id="pyv0k6b" name="project.builds.number_of_builds"> <unit id="pyv0k6b" name="project.builds.number_of_builds">
<segment state="translated"> <segment state="translated">
<source>project.builds.number_of_builds</source> <source>project.builds.number_of_builds</source>

View file

@ -251,6 +251,12 @@
<target>Musíte vybrat díl pro položku BOM dílu nebo nastavit název pro položku BOM bez dílu.</target> <target>Musíte vybrat díl pro položku BOM dílu nebo nastavit název pro položku BOM bez dílu.</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Je povoleno vybrat pouze jednu součástku nebo sestavu. Upravit prosím svůj výběr!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>Du skal vælge en komponent eller angive et navn til en ikke-komponent styklistepost!</target> <target>Du skal vælge en komponent eller angive et navn til en ikke-komponent styklistepost!</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Det er kun tilladt at vælge én del eller en samling. Venligst tilpas dit valg!</target>
</segment>
</unit>
<unit id="WF_v4ih" name="project.bom_entry.name_already_in_bom"> <unit id="WF_v4ih" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>Sie müssen ein Bauteil bzw. eine Baugruppe auswählen, oder einen Namen für ein nicht-Bauteil BOM-Eintrag setzen!</target> <target>Sie müssen ein Bauteil bzw. eine Baugruppe auswählen, oder einen Namen für ein nicht-Bauteil BOM-Eintrag setzen!</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Es darf nur ein Bauteil oder eine Baugruppe ausgewählt werden. Bitte passen Sie Ihre Auswahl an!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>You have to select a part or assembly, or set a name for a non-component Bom entry!</target> <target>You have to select a part or assembly, or set a name for a non-component Bom entry!</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Only one part or assembly may be selected. Please modify your selection!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>Morate odabrati dio za unos u BOM ili postaviti naziv za unos koji nije dio.</target> <target>Morate odabrati dio za unos u BOM ili postaviti naziv za unos koji nije dio.</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Dozvoljeno je odabrati samo jednu komponentu ili sklop. Molimo prilagodite svoj odabir!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>È necessario selezionare un componente o assegnare un nome ad una voce BOM che non indica un componente!</target> <target>È necessario selezionare un componente o assegnare un nome ad una voce BOM che non indica un componente!</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>È consentito selezionare solo una parte o un assieme. Si prega di modificare la selezione!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>Należy wybrać część dla wpisu BOM części lub ustawić nazwę dla wpisu BOM niebędącego częścią.</target> <target>Należy wybrać część dla wpisu BOM części lub ustawić nazwę dla wpisu BOM niebędącego częścią.</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Można wybrać tylko jedną część lub zespół. Proszę dostosować swój wybór!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>Вам необходимо выбрать компонент или задать имя для BOM, не относящейся к компоненту!</target> <target>Вам необходимо выбрать компонент или задать имя для BOM, не относящейся к компоненту!</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Можно выбрать только деталь или сборку. Пожалуйста, измените ваш выбор!</target>
</segment>
</unit>
<unit id="5CEup_N" name="project.bom_entry.name_already_in_bom"> <unit id="5CEup_N" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>

View file

@ -251,6 +251,12 @@
<target>您必须为 BOM 条目选择部件,或为非部件 BOM 条目设置名称。</target> <target>您必须为 BOM 条目选择部件,或为非部件 BOM 条目设置名称。</target>
</segment> </segment>
</unit> </unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>只能选择一个零件或组件。请修改您的选择!</target>
</segment>
</unit>
<unit id="WF_v4ih" name="project.bom_entry.name_already_in_bom"> <unit id="WF_v4ih" name="project.bom_entry.name_already_in_bom">
<segment state="translated"> <segment state="translated">
<source>project.bom_entry.name_already_in_bom</source> <source>project.bom_entry.name_already_in_bom</source>