mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2026-01-12 13:19:33 +00:00
Projekt BOM-Konfiguration um Assemblies bereinigen.
Assembly BOM-Konfiguration um Projektauswahl erweitern (APS-3, APS-4)
This commit is contained in:
parent
f79dc3a102
commit
df2ce45e4c
53 changed files with 738 additions and 1541 deletions
70
assets/controllers/elements/project_select_controller.js
Normal file
70
assets/controllers/elements/project_select_controller.js
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import {Controller} from "@hotwired/stimulus";
|
||||
|
||||
import "tom-select/dist/css/tom-select.bootstrap5.css";
|
||||
import '../../css/components/tom-select_extensions.css';
|
||||
import TomSelect from "tom-select";
|
||||
import {marked} from "marked";
|
||||
|
||||
export default class extends Controller {
|
||||
_tomSelect;
|
||||
|
||||
connect() {
|
||||
|
||||
let settings = {
|
||||
allowEmptyOption: true,
|
||||
plugins: ['dropdown_input', 'clear_button'],
|
||||
searchField: ["name", "description", "category", "footprint"],
|
||||
valueField: "id",
|
||||
labelField: "name",
|
||||
preload: "focus",
|
||||
render: {
|
||||
item: (data, escape) => {
|
||||
return '<span>' + (data.image ? "<img style='height: 1.5rem; margin-right: 5px;' ' src='" + data.image + "'/>" : "") + escape(data.name) + '</span>';
|
||||
},
|
||||
option: (data, escape) => {
|
||||
if(data.text) {
|
||||
return '<span>' + escape(data.text) + '</span>';
|
||||
}
|
||||
|
||||
let tmp = '<div class="row m-0">' +
|
||||
"<div class='col-2 p-0 d-flex align-items-center' style='max-width: 80px;'>" +
|
||||
(data.image ? "<img class='typeahead-image' src='" + data.image + "'/>" : "") +
|
||||
"</div>" +
|
||||
"<div class='col-10'>" +
|
||||
'<h6 class="m-0">' + escape(data.name) + '</h6>' +
|
||||
(data.description ? '<p class="m-0">' + marked.parseInline(data.description) + '</p>' : "") +
|
||||
(data.category ? '<p class="m-0"><span class="fa-solid fa-tags fa-fw"></span> ' + escape(data.category) : "");
|
||||
|
||||
return tmp + '</p>' +
|
||||
'</div></div>';
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
if (this.element.dataset.autocomplete) {
|
||||
const base_url = this.element.dataset.autocomplete;
|
||||
settings.valueField = "id";
|
||||
settings.load = (query, callback) => {
|
||||
const url = base_url.replace('__QUERY__', encodeURIComponent(query));
|
||||
|
||||
fetch(url)
|
||||
.then(response => response.json())
|
||||
.then(json => {callback(json);})
|
||||
.catch(() => {
|
||||
callback()
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
this._tomSelect = new TomSelect(this.element, settings);
|
||||
//this._tomSelect.clearOptions();
|
||||
}
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
super.disconnect();
|
||||
//Destroy the TomSelect instance
|
||||
this._tomSelect.destroy();
|
||||
}
|
||||
}
|
||||
|
|
@ -6,7 +6,6 @@ namespace DoctrineMigrations;
|
|||
|
||||
use App\Migration\AbstractMultiPlatformMigration;
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
final class Version20250304081039 extends AbstractMultiPlatformMigration
|
||||
{
|
||||
|
|
@ -17,12 +16,13 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
|
||||
public function mySQLUp(Schema $schema): void
|
||||
{
|
||||
$this->addSql('CREATE TABLE assemblies (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, comment LONGTEXT NOT NULL, not_selectable TINYINT(1) NOT NULL, alternative_names LONGTEXT DEFAULT NULL, order_quantity INT NOT NULL, status VARCHAR(64) DEFAULT NULL, order_only_missing_parts TINYINT(1) NOT NULL, description LONGTEXT NOT NULL, parent_id INT DEFAULT NULL, id_preview_attachment INT DEFAULT NULL, INDEX IDX_5F3832C0727ACA70 (parent_id), INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`');
|
||||
$this->addSql('CREATE TABLE assembly_bom_entries (id INT AUTO_INCREMENT NOT NULL, quantity DOUBLE PRECISION NOT NULL, mountnames LONGTEXT NOT NULL, name VARCHAR(255) DEFAULT NULL, comment LONGTEXT NOT NULL, price NUMERIC(11, 5) DEFAULT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, id_assembly INT DEFAULT NULL, id_part INT DEFAULT NULL, price_currency_id INT DEFAULT NULL, INDEX IDX_8C74887E2F180363 (id_assembly), INDEX IDX_8C74887EC22F6CC4 (id_part), INDEX IDX_8C74887E3FFDCD60 (price_currency_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`');
|
||||
$this->addSql('CREATE TABLE assemblies (id INT AUTO_INCREMENT NOT NULL, parent_id INT DEFAULT NULL, id_preview_attachment INT DEFAULT NULL, name VARCHAR(255) NOT NULL, comment LONGTEXT NOT NULL, not_selectable TINYINT(1) NOT NULL, alternative_names LONGTEXT DEFAULT NULL, order_quantity INT NOT NULL, status VARCHAR(64) DEFAULT NULL, order_only_missing_parts TINYINT(1) NOT NULL, description LONGTEXT NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, INDEX IDX_5F3832C0727ACA70 (parent_id), INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`');
|
||||
$this->addSql('CREATE TABLE assembly_bom_entries (id INT AUTO_INCREMENT NOT NULL, id_assembly INT DEFAULT NULL, id_part INT DEFAULT NULL, id_project INT DEFAULT NULL, quantity DOUBLE PRECISION NOT NULL, mountnames LONGTEXT NOT NULL, name VARCHAR(255) DEFAULT NULL, comment LONGTEXT NOT NULL, price NUMERIC(11, 5) DEFAULT NULL, price_currency_id INT DEFAULT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, INDEX IDX_8C74887E2F180363 (id_assembly), INDEX IDX_8C74887EC22F6CC4 (id_part), INDEX IDX_8C74887EF12E799E (id_project), INDEX IDX_8C74887E3FFDCD60 (price_currency_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`');
|
||||
$this->addSql('ALTER TABLE assemblies ADD CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id)');
|
||||
$this->addSql('ALTER TABLE assemblies ADD CONSTRAINT FK_5F3832C0EA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES `attachments` (id) ON DELETE SET NULL');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E2F180363 FOREIGN KEY (id_assembly) REFERENCES assemblies (id)');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES `parts` (id)');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES `projects` (id)');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id)');
|
||||
}
|
||||
|
||||
|
|
@ -32,6 +32,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
$this->addSql('ALTER TABLE assemblies DROP FOREIGN KEY FK_5F3832C0EA7100A1');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY FK_8C74887E2F180363');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY FK_8C74887EC22F6CC4');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY FK_8C74887EF12E799E');
|
||||
$this->addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY FK_8C74887E3FFDCD60');
|
||||
$this->addSql('DROP TABLE assemblies');
|
||||
$this->addSql('DROP TABLE assembly_bom_entries');
|
||||
|
|
@ -70,6 +71,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
id_assembly INTEGER DEFAULT NULL,
|
||||
id_part INTEGER DEFAULT NULL,
|
||||
id_project INTEGER DEFAULT NULL,
|
||||
price_currency_id INTEGER DEFAULT NULL,
|
||||
quantity DOUBLE PRECISION NOT NULL,
|
||||
mountnames CLOB NOT NULL,
|
||||
|
|
@ -80,6 +82,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
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_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
)
|
||||
SQL);
|
||||
|
|
@ -89,6 +92,9 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887E3FFDCD60 ON assembly_bom_entries (price_currency_id)
|
||||
SQL);
|
||||
|
|
@ -106,11 +112,104 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
|
|||
|
||||
public function postgreSQLUp(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TABLE assemblies (
|
||||
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
|
||||
name VARCHAR(255) 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,
|
||||
comment TEXT NOT NULL,
|
||||
not_selectable BOOLEAN NOT NULL,
|
||||
alternative_names TEXT DEFAULT NULL,
|
||||
order_quantity INT NOT NULL,
|
||||
status VARCHAR(64) DEFAULT NULL,
|
||||
order_only_missing_parts BOOLEAN NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
parent_id INT DEFAULT NULL,
|
||||
id_preview_attachment INT DEFAULT NULL,
|
||||
PRIMARY KEY(id)
|
||||
)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_5F3832C0727ACA70 ON assemblies (parent_id)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_5F3832C0EA7100A1 ON assemblies (id_preview_attachment)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TABLE assembly_bom_entries (
|
||||
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
|
||||
id_assembly INT DEFAULT NULL,
|
||||
id_part INT DEFAULT NULL,
|
||||
id_project INT DEFAULT NULL,
|
||||
quantity DOUBLE PRECISION NOT NULL,
|
||||
mountnames TEXT NOT NULL,
|
||||
name VARCHAR(255) DEFAULT NULL,
|
||||
comment TEXT NOT NULL,
|
||||
price NUMERIC(11, 5) DEFAULT NULL,
|
||||
price_currency_id INT DEFAULT 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,
|
||||
PRIMARY KEY(id)
|
||||
)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887E4AD2039E ON assembly_bom_entries (id_assembly)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_8C74887E3FFDCD60 ON assembly_bom_entries (price_currency_id)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assemblies ADD CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assemblies ADD CONSTRAINT FK_5F3832C0EA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES "attachments" (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E4AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES "projects" (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function postgreSQLDown(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assemblies DROP CONSTRAINT FK_5F3832C0727ACA70
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assemblies DROP CONSTRAINT FK_5F3832C0EA7100A1
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries DROP CONSTRAINT FK_8C74887E4AD2039E
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries DROP CONSTRAINT FK_8C74887EC22F6CC4
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries DROP CONSTRAINT FK_8C74887EF12E799E
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE assembly_bom_entries DROP CONSTRAINT FK_8C74887E3FFDCD60
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
DROP TABLE assemblies
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
DROP TABLE assembly_bom_entries
|
||||
SQL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -386,11 +386,27 @@ final class Version20250304154507 extends AbstractMultiPlatformMigration
|
|||
|
||||
public function postgreSQLUp(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE parts ADD built_assembly_id INT DEFAULT NULL
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE parts ADD CONSTRAINT FK_6940A7FECC660B3C FOREIGN KEY (built_assembly_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE UNIQUE INDEX UNIQ_6940A7FECC660B3C ON parts (built_assembly_id)
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function postgreSQLDown(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE "parts" DROP CONSTRAINT FK_6940A7FECC660B3C
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
DROP INDEX UNIQ_6940A7FECC660B3C
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE "parts" DROP built_assembly_id
|
||||
SQL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,188 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace DoctrineMigrations;
|
||||
|
||||
use App\Migration\AbstractMultiPlatformMigration;
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
final class Version20250310160354 extends AbstractMultiPlatformMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Add assembly_id to project_bom_entries';
|
||||
}
|
||||
|
||||
public function mySQLUp(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 mySQLDown(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');
|
||||
}
|
||||
|
||||
public function sqLiteUp(Schema $schema): void
|
||||
{
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TEMPORARY TABLE __temp__project_bom_entries AS
|
||||
SELECT
|
||||
id,
|
||||
id_device,
|
||||
id_part,
|
||||
price_currency_id,
|
||||
quantity,
|
||||
mountnames,
|
||||
name,
|
||||
comment,
|
||||
price,
|
||||
last_modified,
|
||||
datetime_added
|
||||
FROM project_bom_entries
|
||||
SQL);
|
||||
|
||||
$this->addSql('DROP TABLE project_bom_entries');
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TABLE project_bom_entries
|
||||
(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
id_device INTEGER DEFAULT NULL,
|
||||
id_assembly INTEGER DEFAULT NULL,
|
||||
id_part INTEGER DEFAULT NULL,
|
||||
price_currency_id INTEGER DEFAULT NULL,
|
||||
quantity DOUBLE PRECISION NOT NULL,
|
||||
mountnames CLOB NOT NULL,
|
||||
name VARCHAR(255) DEFAULT NULL,
|
||||
comment CLOB NOT NULL,
|
||||
price NUMERIC(11, 5) DEFAULT NULL,
|
||||
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
CONSTRAINT FK_1AA2DD312F180363 FOREIGN KEY (id_device) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
|
||||
CONSTRAINT FK_1AA2DD314AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
|
||||
CONSTRAINT FK_1AA2DD31C22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
|
||||
CONSTRAINT FK_1AA2DD313FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
)
|
||||
SQL);
|
||||
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
INSERT INTO project_bom_entries (
|
||||
id,
|
||||
id_device,
|
||||
id_part,
|
||||
price_currency_id,
|
||||
quantity,
|
||||
mountnames,
|
||||
name,
|
||||
comment,
|
||||
price,
|
||||
last_modified,
|
||||
datetime_added
|
||||
) SELECT * FROM __temp__project_bom_entries
|
||||
SQL);
|
||||
$this->addSql('DROP TABLE __temp__project_bom_entries');
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD312F180363 ON project_bom_entries (id_device)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD31C22F6CC4 ON project_bom_entries (id_part)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD314AD2039E ON project_bom_entries (id_assembly)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD313FFDCD60 ON project_bom_entries (price_currency_id)
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function sqLiteDown(Schema $schema): void
|
||||
{
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TEMPORARY TABLE __temp__project_bom_entries AS
|
||||
SELECT
|
||||
id,
|
||||
id_device,
|
||||
id_part,
|
||||
price_currency_id,
|
||||
quantity,
|
||||
mountnames,
|
||||
name,
|
||||
comment,
|
||||
price,
|
||||
last_modified,
|
||||
datetime_added
|
||||
FROM project_bom_entries
|
||||
SQL);
|
||||
|
||||
$this->addSql('DROP TABLE project_bom_entries');
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TABLE project_bom_entries
|
||||
(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
id_device INTEGER DEFAULT NULL,
|
||||
id_part INTEGER DEFAULT NULL,
|
||||
price_currency_id INTEGER DEFAULT NULL,
|
||||
quantity DOUBLE PRECISION NOT NULL,
|
||||
mountnames CLOB NOT NULL,
|
||||
name VARCHAR(255) DEFAULT NULL,
|
||||
comment CLOB NOT NULL,
|
||||
price NUMERIC(11, 5) DEFAULT NULL,
|
||||
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
CONSTRAINT FK_1AA2DD312F180363 FOREIGN KEY (id_device) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
|
||||
CONSTRAINT FK_1AA2DD31C22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
|
||||
CONSTRAINT FK_1AA2DD313FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
|
||||
)
|
||||
SQL);
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
INSERT INTO project_bom_entries (
|
||||
id,
|
||||
id_device,
|
||||
id_part,
|
||||
price_currency_id,
|
||||
quantity,
|
||||
mountnames,
|
||||
name,
|
||||
comment,
|
||||
price,
|
||||
last_modified,
|
||||
datetime_added
|
||||
) SELECT * FROM __temp__project_bom_entries
|
||||
SQL);
|
||||
|
||||
$this->addSql('DROP TABLE __temp__project_bom_entries');
|
||||
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD312F180363 ON project_bom_entries (id_device)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD31C22F6CC4 ON project_bom_entries (id_part)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE INDEX IDX_1AA2DD313FFDCD60 ON project_bom_entries (price_currency_id)
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function postgreSQLUp(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
}
|
||||
|
||||
public function postgreSQLDown(Schema $schema): void
|
||||
{
|
||||
//Not needed
|
||||
}
|
||||
}
|
||||
|
|
@ -22,9 +22,9 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\Parameters\AbstractParameter;
|
||||
use App\Services\Attachments\AssemblyPreviewGenerator;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Services\Attachments\ProjectPreviewGenerator;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parts\Category;
|
||||
|
|
@ -151,29 +151,29 @@ class TypeaheadController extends AbstractController
|
|||
'footprint' => $part->getFootprint() instanceof Footprint ? $part->getFootprint()->getName() : '',
|
||||
'description' => mb_strimwidth($part->getDescription(), 0, 127, '...'),
|
||||
'image' => $preview_url,
|
||||
];
|
||||
];
|
||||
}
|
||||
|
||||
return new JsonResponse($data);
|
||||
}
|
||||
|
||||
#[Route(path: '/assemblies/search/{query}', name: 'typeahead_assemblies')]
|
||||
public function assemblies(
|
||||
EntityManagerInterface $entityManager,
|
||||
AssemblyPreviewGenerator $assemblyPreviewGenerator,
|
||||
AttachmentURLGenerator $attachmentURLGenerator,
|
||||
string $query = ""
|
||||
#[Route(path: '/projects/search/{query}', name: 'typeahead_projects')]
|
||||
public function projects(
|
||||
EntityManagerInterface $entityManager,
|
||||
ProjectPreviewGenerator $projectPreviewGenerator,
|
||||
AttachmentURLGenerator $attachmentURLGenerator,
|
||||
string $query = ""
|
||||
): JsonResponse {
|
||||
$this->denyAccessUnlessGranted('@assemblies.read');
|
||||
$this->denyAccessUnlessGranted('@projects.read');
|
||||
|
||||
$result = [];
|
||||
|
||||
$assemblyRepository = $entityManager->getRepository(Assembly::class);
|
||||
$projectRepository = $entityManager->getRepository(Project::class);
|
||||
|
||||
$assemblies = $assemblyRepository->autocompleteSearch($query, 100);
|
||||
$projects = $projectRepository->autocompleteSearch($query, 100);
|
||||
|
||||
foreach ($assemblies as $assembly) {
|
||||
$preview_attachment = $assemblyPreviewGenerator->getTablePreviewAttachment($assembly);
|
||||
foreach ($projects as $project) {
|
||||
$preview_attachment = $projectPreviewGenerator->getTablePreviewAttachment($project);
|
||||
|
||||
if($preview_attachment instanceof Attachment) {
|
||||
$preview_url = $attachmentURLGenerator->getThumbnailURL($preview_attachment, 'thumbnail_sm');
|
||||
|
|
@ -181,13 +181,13 @@ class TypeaheadController extends AbstractController
|
|||
$preview_url = '';
|
||||
}
|
||||
|
||||
/** @var Assembly $assembly */
|
||||
/** @var Project $project */
|
||||
$result[] = [
|
||||
'id' => $assembly->getID(),
|
||||
'name' => $this->translator->trans('typeahead.parts.assembly.name', ['%name%' => $assembly->getName()]),
|
||||
'id' => $project->getID(),
|
||||
'name' => $project->getName(),
|
||||
'category' => '',
|
||||
'footprint' => '',
|
||||
'description' => mb_strimwidth($assembly->getDescription(), 0, 127, '...'),
|
||||
'description' => mb_strimwidth($project->getDescription(), 0, 127, '...'),
|
||||
'image' => $preview_url,
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,11 +25,13 @@ namespace App\DataTables;
|
|||
use App\DataTables\Column\EntityColumn;
|
||||
use App\DataTables\Column\LocaleDateTimeColumn;
|
||||
use App\DataTables\Column\MarkdownColumn;
|
||||
use App\DataTables\Helpers\ProjectDataTableHelper;
|
||||
use App\DataTables\Helpers\ColumnSortHelper;
|
||||
use App\DataTables\Helpers\PartDataTableHelper;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\AssemblySystem\AssemblyBOMEntry;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Services\EntityURLGenerator;
|
||||
use App\Services\Formatters\AmountFormatter;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
|
@ -43,12 +45,13 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||
class AssemblyBomEntriesDataTable implements DataTableTypeInterface
|
||||
{
|
||||
public function __construct(
|
||||
protected TranslatorInterface $translator,
|
||||
protected PartDataTableHelper $partDataTableHelper,
|
||||
protected EntityURLGenerator $entityURLGenerator,
|
||||
protected AmountFormatter $amountFormatter,
|
||||
private string $visible_columns,
|
||||
private ColumnSortHelper $csh
|
||||
protected TranslatorInterface $translator,
|
||||
protected PartDataTableHelper $partDataTableHelper,
|
||||
protected ProjectDataTableHelper $projectDataTableHelper,
|
||||
protected EntityURLGenerator $entityURLGenerator,
|
||||
protected AmountFormatter $amountFormatter,
|
||||
private string $visible_columns,
|
||||
private ColumnSortHelper $csh
|
||||
){
|
||||
}
|
||||
|
||||
|
|
@ -86,18 +89,29 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface
|
|||
'label' => $this->translator->trans('part.table.name'),
|
||||
'orderField' => 'NATSORT(part.name)',
|
||||
'render' => function ($value, AssemblyBOMEntry $context) {
|
||||
if(!$context->getPart() instanceof Part) {
|
||||
if(!$context->getPart() instanceof Part && !$context->getProject() instanceof Project) {
|
||||
return htmlspecialchars((string) $context->getName());
|
||||
}
|
||||
|
||||
//Part exists if we reach this point
|
||||
if ($context->getPart() !== null) {
|
||||
$tmp = $this->partDataTableHelper->renderName($context->getPart());
|
||||
$tmp = $this->translator->trans('part.table.name.value.for_part', ['%value%' => $tmp]);
|
||||
|
||||
$tmp = $this->partDataTableHelper->renderName($context->getPart());
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
} elseif ($context->getProject() !== null) {
|
||||
$tmp = $this->projectDataTableHelper->renderName($context->getProject());
|
||||
$tmp = $this->translator->trans('part.table.name.value.for_project', ['%value%' => $tmp]);
|
||||
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
}
|
||||
|
||||
return $tmp;
|
||||
},
|
||||
|
||||
])
|
||||
->add('ipn', TextColumn::class, [
|
||||
'label' => $this->translator->trans('part.table.ipn'),
|
||||
|
|
|
|||
|
|
@ -23,18 +23,18 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\DataTables\Helpers;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Services\EntityURLGenerator;
|
||||
|
||||
/**
|
||||
* A helper service which contains common code to render columns for assembly related tables
|
||||
*/
|
||||
class AssemblyDataTableHelper
|
||||
class ProjectDataTableHelper
|
||||
{
|
||||
public function __construct(private readonly EntityURLGenerator $entityURLGenerator) {
|
||||
}
|
||||
|
||||
public function renderName(Assembly $context): string
|
||||
public function renderName(Project $context): string
|
||||
{
|
||||
$icon = '';
|
||||
|
||||
|
|
@ -25,9 +25,7 @@ namespace App\DataTables;
|
|||
use App\DataTables\Column\EntityColumn;
|
||||
use App\DataTables\Column\LocaleDateTimeColumn;
|
||||
use App\DataTables\Column\MarkdownColumn;
|
||||
use App\DataTables\Helpers\AssemblyDataTableHelper;
|
||||
use App\DataTables\Helpers\PartDataTableHelper;
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||
|
|
@ -46,7 +44,6 @@ class ProjectBomEntriesDataTable implements DataTableTypeInterface
|
|||
public function __construct(
|
||||
protected TranslatorInterface $translator,
|
||||
protected PartDataTableHelper $partDataTableHelper,
|
||||
protected AssemblyDataTableHelper $assemblyDataTableHelper,
|
||||
protected EntityURLGenerator $entityURLGenerator,
|
||||
protected AmountFormatter $amountFormatter
|
||||
) {
|
||||
|
|
@ -90,26 +87,16 @@ class ProjectBomEntriesDataTable implements DataTableTypeInterface
|
|||
'label' => $this->translator->trans('part.table.name'),
|
||||
'orderField' => 'NATSORT(part.name)',
|
||||
'render' => function ($value, ProjectBOMEntry $context) {
|
||||
if(!$context->getPart() instanceof Part && !$context->getAssembly() instanceof Assembly) {
|
||||
if(!$context->getPart() instanceof Part) {
|
||||
return htmlspecialchars((string) $context->getName());
|
||||
}
|
||||
|
||||
if ($context->getPart() !== null) {
|
||||
$tmp = $this->partDataTableHelper->renderName($context->getPart());
|
||||
$tmp = $this->translator->trans('part.table.name.value.for_part', ['%value%' => $tmp]);
|
||||
//Part exists if we reach this point
|
||||
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
} elseif ($context->getAssembly() !== null) {
|
||||
$tmp = $this->assemblyDataTableHelper->renderName($context->getAssembly());
|
||||
$tmp = $this->translator->trans('part.table.name.value.for_assembly', ['%value%' => $tmp]);
|
||||
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
$tmp = $this->partDataTableHelper->renderName($context->getPart());
|
||||
if($context->getName() !== null && $context->getName() !== '') {
|
||||
$tmp .= '<br><b>'.htmlspecialchars($context->getName()).'</b>';
|
||||
}
|
||||
|
||||
return $tmp;
|
||||
},
|
||||
])
|
||||
|
|
@ -121,6 +108,8 @@ class ProjectBomEntriesDataTable implements DataTableTypeInterface
|
|||
if($context->getPart() instanceof Part) {
|
||||
return $context->getPart()->getIpn();
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
])
|
||||
->add('description', MarkdownColumn::class, [
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Entity\AssemblySystem;
|
||||
|
||||
use App\Repository\AssemblyRepository;
|
||||
use Doctrine\Common\Collections\Criteria;
|
||||
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
|
||||
use ApiPlatform\Metadata\ApiFilter;
|
||||
|
|
@ -57,7 +56,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
|||
*
|
||||
* @extends AbstractStructuralDBElement<AssemblyAttachment, AssemblyParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: AssemblyRepository::class)]
|
||||
#[ORM\Entity]
|
||||
#[ORM\Table(name: 'assemblies')]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
|
|
@ -108,6 +107,7 @@ class Assembly extends AbstractStructuralDBElement
|
|||
#[Groups(['extended', 'full', 'import'])]
|
||||
#[ORM\OneToMany(mappedBy: 'assembly', targetEntity: AssemblyBOMEntry::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[UniqueObjectCollection(message: 'assembly.bom_entry.part_already_in_bom', fields: ['part'])]
|
||||
#[UniqueObjectCollection(message: 'assembly.bom_entry.project_already_in_bom', fields: ['project'])]
|
||||
#[UniqueObjectCollection(message: 'assembly.bom_entry.name_already_in_bom', fields: ['name'])]
|
||||
protected Collection $bom_entries;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ use ApiPlatform\OpenApi\Model\Operation;
|
|||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Repository\DBElementRepository;
|
||||
use App\Validator\UniqueValidatableInterface;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
|
|
@ -133,6 +133,18 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt
|
|||
#[Groups(['bom_entry:read', 'bom_entry:write', 'full'])]
|
||||
protected ?Part $part = null;
|
||||
|
||||
/**
|
||||
* @var Project|null The associated project
|
||||
*/
|
||||
#[Assert\Expression(
|
||||
'(this.getPart() === null or this.getProject() === 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: Project::class)]
|
||||
#[ORM\JoinColumn(name: 'id_project', nullable: true)]
|
||||
#[Groups(['bom_entry:read', 'bom_entry:write', ])]
|
||||
protected ?Project $project = null;
|
||||
|
||||
/**
|
||||
* @var BigDecimal|null The price of this non-part BOM entry
|
||||
*/
|
||||
|
|
@ -225,6 +237,17 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function getProject(): ?Project
|
||||
{
|
||||
return $this->project;
|
||||
}
|
||||
|
||||
public function setProject(?Project $project): AssemblyBOMEntry
|
||||
{
|
||||
$this->project = $project;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the price of this BOM entry, if existing.
|
||||
* Prices are only valid on non-Part BOM entries.
|
||||
|
|
@ -297,6 +320,7 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt
|
|||
return [
|
||||
'name' => $this->getName(),
|
||||
'part' => $this->getPart()?->getID(),
|
||||
'project' => $this->getProject()?->getID(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -108,7 +108,6 @@ class Project extends AbstractStructuralDBElement
|
|||
#[Groups(['extended', 'full', 'import'])]
|
||||
#[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.assembly_already_in_bom', fields: ['assembly'])]
|
||||
#[UniqueObjectCollection(message: 'project.bom_entry.name_already_in_bom', fields: ['name'])]
|
||||
protected Collection $bom_entries;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ use ApiPlatform\Metadata\Post;
|
|||
use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Validator\UniqueValidatableInterface;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
|
|
@ -104,10 +103,7 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
|
|||
/**
|
||||
* @var string|null An optional name describing this BOM entry (useful for non-part entries)
|
||||
*/
|
||||
#[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'
|
||||
)]
|
||||
#[Assert\Expression('this.getPart() !== null or this.getName() !== null', message: 'validator.project.bom_entry.name_or_part_needed')]
|
||||
#[ORM\Column(type: Types::STRING, nullable: true)]
|
||||
#[Groups(['bom_entry:read', 'bom_entry:write', 'import', 'simple', 'extended', 'full'])]
|
||||
protected ?string $name = null;
|
||||
|
|
@ -135,18 +131,6 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
|
|||
#[Groups(['bom_entry:read', 'bom_entry:write', 'full'])]
|
||||
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
|
||||
*/
|
||||
|
|
@ -239,16 +223,6 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
|
|||
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.
|
||||
* Prices are only valid on non-Part BOM entries.
|
||||
|
|
@ -286,15 +260,6 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
|
|||
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]
|
||||
public function validate(ExecutionContextInterface $context, $payload): void
|
||||
{
|
||||
|
|
@ -356,7 +321,6 @@ class ProjectBOMEntry extends AbstractDBElement implements UniqueValidatableInte
|
|||
return [
|
||||
'name' => $this->getName(),
|
||||
'part' => $this->getPart()?->getID(),
|
||||
'assembly' => $this->getAssembly()?->getID(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Entity\AssemblySystem\AssemblyBOMEntry;
|
|||
use App\Form\Type\BigDecimalNumberType;
|
||||
use App\Form\Type\CurrencyEntityType;
|
||||
use App\Form\Type\PartSelectType;
|
||||
use App\Form\Type\ProjectSelectType;
|
||||
use App\Form\Type\RichTextEditorType;
|
||||
use App\Form\Type\SIUnitType;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
|
|
@ -34,11 +35,13 @@ class AssemblyBOMEntryType extends AbstractType
|
|||
});
|
||||
|
||||
$builder
|
||||
|
||||
->add('part', PartSelectType::class, [
|
||||
'required' => false,
|
||||
])
|
||||
|
||||
->add('project', ProjectSelectType::class, [
|
||||
'label' => 'assembly.bom.project',
|
||||
'required' => false,
|
||||
])
|
||||
->add('name', TextType::class, [
|
||||
'label' => 'assembly.bom.name',
|
||||
'required' => false,
|
||||
|
|
@ -75,10 +78,8 @@ class AssemblyBOMEntryType extends AbstractType
|
|||
'required' => false,
|
||||
'label' => false,
|
||||
'short' => true,
|
||||
])
|
||||
|
||||
;
|
||||
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
|
|
|
|||
|
|
@ -78,35 +78,34 @@ class AssemblyBuildType extends AbstractType implements DataMapperInterface
|
|||
'required' => false,
|
||||
]);
|
||||
|
||||
|
||||
//The form is initially empty, we have to define the fields after we know the data
|
||||
//The form is initially empty, define the fields after we know the data
|
||||
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (PreSetDataEvent $event) {
|
||||
$form = $event->getForm();
|
||||
/** @var AssemblyBuildRequest $build_request */
|
||||
$build_request = $event->getData();
|
||||
/** @var AssemblyBuildRequest $assemblyBuildRequest */
|
||||
$assemblyBuildRequest = $event->getData();
|
||||
|
||||
$form->add('addBuildsToBuildsPart', CheckboxType::class, [
|
||||
'label' => 'assembly.build.add_builds_to_builds_part',
|
||||
'required' => false,
|
||||
'disabled' => !$build_request->getAssembly()->getBuildPart() instanceof Part,
|
||||
'disabled' => !$assemblyBuildRequest->getAssembly()->getBuildPart() instanceof Part,
|
||||
]);
|
||||
|
||||
if ($build_request->getAssembly()->getBuildPart() instanceof Part) {
|
||||
if ($assemblyBuildRequest->getAssembly()->getBuildPart() instanceof Part) {
|
||||
$form->add('buildsPartLot', PartLotSelectType::class, [
|
||||
'label' => 'assembly.build.builds_part_lot',
|
||||
'required' => false,
|
||||
'part' => $build_request->getAssembly()->getBuildPart(),
|
||||
'part' => $assemblyBuildRequest->getAssembly()->getBuildPart(),
|
||||
'placeholder' => 'assembly.build.buildsPartLot.new_lot'
|
||||
]);
|
||||
}
|
||||
|
||||
foreach ($build_request->getPartBomEntries() as $bomEntry) {
|
||||
foreach ($assemblyBuildRequest->getPartBomEntries() as $bomEntry) {
|
||||
//Every part lot has a field to specify the number of parts to take from this lot
|
||||
foreach ($build_request->getPartLotsForBOMEntry($bomEntry) as $lot) {
|
||||
foreach ($assemblyBuildRequest->getPartLotsForBOMEntry($bomEntry) as $lot) {
|
||||
$form->add('lot_' . $lot->getID(), SIUnitType::class, [
|
||||
'label' => false,
|
||||
'measurement_unit' => $bomEntry->getPart()->getPartUnit(),
|
||||
'max' => min($build_request->getNeededAmountForBOMEntry($bomEntry), $lot->getAmount()),
|
||||
'max' => min($assemblyBuildRequest->getNeededAmountForBOMEntry($bomEntry), $lot->getAmount()),
|
||||
'disabled' => !$this->security->isGranted('withdraw', $lot),
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,6 @@ class ProjectAddPartsType extends AbstractType
|
|||
],
|
||||
'constraints' => [
|
||||
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']),
|
||||
]
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ declare(strict_types=1);
|
|||
namespace App\Form\ProjectSystem;
|
||||
|
||||
use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||
use App\Form\Type\AssemblySelectType;
|
||||
use App\Form\Type\BigDecimalNumberType;
|
||||
use App\Form\Type\CurrencyEntityType;
|
||||
use App\Form\Type\PartSelectType;
|
||||
|
|
@ -39,10 +38,6 @@ class ProjectBOMEntryType extends AbstractType
|
|||
'label' => 'project.bom.part',
|
||||
'required' => false,
|
||||
])
|
||||
->add('assembly', AssemblySelectType::class, [
|
||||
'label' => 'project.bom.assembly',
|
||||
'required' => false,
|
||||
])
|
||||
->add('name', TextType::class, [
|
||||
'label' => 'project.bom.name',
|
||||
'required' => false,
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace App\Form\ProjectSystem;
|
||||
|
||||
use App\Helpers\Assemblies\AssemblyBuildRequest;
|
||||
use Symfony\Bundle\SecurityBundle\Security;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\Parts\PartLot;
|
||||
|
|
@ -39,11 +38,10 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||
use Symfony\Component\Form\FormEvents;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
class ProjectBuildType extends AbstractType implements DataMapperInterface
|
||||
{
|
||||
public function __construct(private readonly Security $security, private readonly TranslatorInterface $translator)
|
||||
public function __construct(private readonly Security $security)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -113,25 +111,6 @@ class ProjectBuildType extends AbstractType implements DataMapperInterface
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($projectBuildRequest->getAssemblyBomEntries() as $bomEntry) {
|
||||
$assemblyBuildRequest = new AssemblyBuildRequest($bomEntry->getAssembly(), $projectBuildRequest->getNumberOfBuilds());
|
||||
|
||||
//Add fields for assembly bom entries
|
||||
foreach ($assemblyBuildRequest->getPartBomEntries() as $partBomEntry) {
|
||||
foreach ($assemblyBuildRequest->getPartLotsForBOMEntry($partBomEntry) as $lot) {
|
||||
$form->add('lot_' . $lot->getID(), SIUnitType::class, [
|
||||
'label' => $this->translator->trans('project.build.builds_part_lot_label', [
|
||||
'%name%' => $partBomEntry->getPart()->getName(),
|
||||
'%quantity%' => $partBomEntry->getQuantity() * $projectBuildRequest->getNumberOfBuilds()
|
||||
]),
|
||||
'measurement_unit' => $partBomEntry->getPart()->getPartUnit(),
|
||||
'max' => min($assemblyBuildRequest->getNeededAmountForBOMEntry($partBomEntry), $lot->getAmount()),
|
||||
'disabled' => !$this->security->isGranted('withdraw', $lot),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Form\Type;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Services\Attachments\AssemblyPreviewGenerator;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Services\Attachments\ProjectPreviewGenerator;
|
||||
use App\Services\Attachments\AttachmentURLGenerator;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||
|
|
@ -20,9 +20,9 @@ use Symfony\Component\Form\FormEvents;
|
|||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
|
||||
class AssemblySelectType extends AbstractType implements DataMapperInterface
|
||||
class ProjectSelectType extends AbstractType implements DataMapperInterface
|
||||
{
|
||||
public function __construct(private readonly UrlGeneratorInterface $urlGenerator, private readonly EntityManagerInterface $em, private readonly AssemblyPreviewGenerator $previewGenerator, private readonly AttachmentURLGenerator $attachmentURLGenerator)
|
||||
public function __construct(private readonly UrlGeneratorInterface $urlGenerator, private readonly EntityManagerInterface $em, private readonly ProjectPreviewGenerator $previewGenerator, private readonly AttachmentURLGenerator $attachmentURLGenerator)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -69,28 +69,28 @@ class AssemblySelectType extends AbstractType implements DataMapperInterface
|
|||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'class' => Assembly::class,
|
||||
'class' => Project::class,
|
||||
'choice_label' => 'name',
|
||||
'compound' => true,
|
||||
'error_bubbling' => false,
|
||||
]);
|
||||
|
||||
error_log($this->urlGenerator->generate('typeahead_assemblies', ['query' => '__QUERY__']));
|
||||
error_log($this->urlGenerator->generate('typeahead_projects', ['query' => '__QUERY__']));
|
||||
|
||||
$resolver->setDefaults([
|
||||
'attr' => [
|
||||
'data-controller' => 'elements--assembly-select',
|
||||
'data-autocomplete' => $this->urlGenerator->generate('typeahead_assemblies', ['query' => '__QUERY__']),
|
||||
'data-controller' => 'elements--project-select',
|
||||
'data-autocomplete' => $this->urlGenerator->generate('typeahead_projects', ['query' => '__QUERY__']),
|
||||
'autocomplete' => 'off',
|
||||
],
|
||||
]);
|
||||
|
||||
$resolver->setDefaults([
|
||||
//Prefill the selected choice with the needed data, so the user can see it without an additional Ajax request
|
||||
'choice_attr' => ChoiceList::attr($this, function (?Assembly $assembly) {
|
||||
if($assembly instanceof Assembly) {
|
||||
'choice_attr' => ChoiceList::attr($this, function (?Project $project) {
|
||||
if($project instanceof Project) {
|
||||
//Determine the picture to show:
|
||||
$preview_attachment = $this->previewGenerator->getTablePreviewAttachment($assembly);
|
||||
$preview_attachment = $this->previewGenerator->getTablePreviewAttachment($project);
|
||||
if ($preview_attachment instanceof Attachment) {
|
||||
$preview_url = $this->attachmentURLGenerator->getThumbnailURL($preview_attachment,
|
||||
'thumbnail_sm');
|
||||
|
|
@ -99,8 +99,8 @@ class AssemblySelectType extends AbstractType implements DataMapperInterface
|
|||
}
|
||||
}
|
||||
|
||||
return $assembly instanceof Assembly ? [
|
||||
'data-description' => $assembly->getDescription() ? mb_strimwidth($assembly->getDescription(), 0, 127, '...') : '',
|
||||
return $project instanceof Project ? [
|
||||
'data-description' => $project->getDescription() ? mb_strimwidth($project->getDescription(), 0, 127, '...') : '',
|
||||
'data-category' => '',
|
||||
'data-footprint' => '',
|
||||
'data-image' => $preview_url,
|
||||
|
|
@ -22,13 +22,10 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace App\Helpers\Projects;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\AssemblySystem\AssemblyBOMEntry;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\Parts\PartLot;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||
use App\Helpers\Assemblies\AssemblyBuildRequest;
|
||||
use App\Validator\Constraints\ProjectSystem\ValidProjectBuildRequest;
|
||||
|
||||
/**
|
||||
|
|
@ -82,7 +79,7 @@ final class ProjectBuildRequest
|
|||
//Completely reset the array
|
||||
$this->withdraw_amounts = [];
|
||||
|
||||
//Now create an array for each part BOM entry
|
||||
//Now create an array for each BOM entry
|
||||
foreach ($this->getPartBomEntries() as $bom_entry) {
|
||||
$remaining_amount = $this->getNeededAmountForBOMEntry($bom_entry);
|
||||
foreach($this->getPartLotsForBOMEntry($bom_entry) as $lot) {
|
||||
|
|
@ -91,21 +88,6 @@ final class ProjectBuildRequest
|
|||
$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()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -248,77 +230,12 @@ final class ProjectBuildRequest
|
|||
{
|
||||
$this->ensureBOMEntryValid($projectBOMEntry);
|
||||
|
||||
if (!$projectBOMEntry->getPart() instanceof Part && !$projectBOMEntry->getAssembly() instanceof Assembly) {
|
||||
if (!$projectBOMEntry->getPart() instanceof Part) {
|
||||
return null;
|
||||
}
|
||||
|
||||
//Filter out all lots which have unknown instock
|
||||
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;
|
||||
return $projectBOMEntry->getPart()->getPartLots()->filter(fn (PartLot $lot) => !$lot->isInstockUnknown())->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -349,15 +266,6 @@ final class ProjectBuildRequest
|
|||
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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,69 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
|
||||
/**
|
||||
* @template TEntityClass of Assembly
|
||||
* @extends DBElementRepository<TEntityClass>
|
||||
*/
|
||||
class AssemblyRepository extends StructuralDBElementRepository
|
||||
{
|
||||
/**
|
||||
* @return Assembly[]
|
||||
*/
|
||||
public function autocompleteSearch(string $query, int $max_limits = 50): array
|
||||
{
|
||||
$qb = $this->createQueryBuilder('assembly');
|
||||
$qb->select('assembly')
|
||||
->where('ILIKE(assembly.name, :query) = TRUE')
|
||||
->orWhere('ILIKE(assembly.description, :query) = TRUE');
|
||||
|
||||
$qb->setParameter('query', '%'.$query.'%');
|
||||
|
||||
$qb->setMaxResults($max_limits);
|
||||
$qb->orderBy('NATSORT(assembly.name)', 'ASC');
|
||||
|
||||
return $qb->getQuery()->getResult();
|
||||
}
|
||||
}
|
||||
|
|
@ -51,4 +51,22 @@ class DeviceRepository extends StructuralDBElementRepository
|
|||
//Prevent user from deleting devices, to not accidentally remove filled devices from old versions
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Project[]
|
||||
*/
|
||||
public function autocompleteSearch(string $query, int $max_limits = 50): array
|
||||
{
|
||||
$qb = $this->createQueryBuilder('project');
|
||||
$qb->select('project')
|
||||
->where('ILIKE(project.name, :query) = TRUE')
|
||||
->orWhere('ILIKE(project.description, :query) = TRUE');
|
||||
|
||||
$qb->setParameter('query', '%'.$query.'%');
|
||||
|
||||
$qb->setMaxResults($max_limits);
|
||||
$qb->orderBy('NATSORT(project.name)', 'ASC');
|
||||
|
||||
return $qb->getQuery()->getResult();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,14 +27,17 @@ use App\Entity\AssemblySystem\AssemblyBOMEntry;
|
|||
use App\Entity\Parts\Part;
|
||||
use App\Helpers\Assemblies\AssemblyBuildRequest;
|
||||
use App\Services\Parts\PartLotWithdrawAddHelper;
|
||||
use App\Services\ProjectSystem\ProjectBuildHelper;
|
||||
|
||||
/**
|
||||
* @see \App\Tests\Services\AssemblySystem\AssemblyBuildHelperTest
|
||||
*/
|
||||
class AssemblyBuildHelper
|
||||
{
|
||||
public function __construct(private readonly PartLotWithdrawAddHelper $withdraw_add_helper)
|
||||
{
|
||||
public function __construct(
|
||||
private readonly PartLotWithdrawAddHelper $withdraw_add_helper,
|
||||
private readonly ProjectBuildHelper $projectBuildHelper
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -66,12 +69,16 @@ class AssemblyBuildHelper
|
|||
$maximum_buildable_count = PHP_INT_MAX;
|
||||
foreach ($assembly->getBomEntries() as $bom_entry) {
|
||||
//Skip BOM entries without a part (as we can not determine that)
|
||||
if (!$bom_entry->isPartBomEntry()) {
|
||||
if (!$bom_entry->isPartBomEntry() && $bom_entry->getProject() === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//The maximum buildable count for the whole assembly is the minimum of all BOM entries
|
||||
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry));
|
||||
//The maximum buildable count for the whole project is the minimum of all BOM entries
|
||||
if ($bom_entry->getPart() !== null) {
|
||||
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry));
|
||||
} elseif ($bom_entry->getProject() !== null) {
|
||||
$maximum_buildable_count = min($maximum_buildable_count, $this->projectBuildHelper->getMaximumBuildableCount($bom_entry->getProject()));
|
||||
}
|
||||
}
|
||||
|
||||
return $maximum_buildable_count;
|
||||
|
|
@ -97,7 +104,7 @@ class AssemblyBuildHelper
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the assembly BOM entries for which parts are missing in the stock for the given number of builds
|
||||
* Returns the project BOM entries for which parts are missing in the stock for the given number of builds
|
||||
* @param Assembly $assembly The assembly for which the BOM entries should be checked
|
||||
* @param int $number_of_builds How often should the assembly be build?
|
||||
* @return AssemblyBOMEntry[]
|
||||
|
|
@ -108,24 +115,29 @@ class AssemblyBuildHelper
|
|||
throw new \InvalidArgumentException('The number of builds must be greater than 0!');
|
||||
}
|
||||
|
||||
$non_buildable_entries = [];
|
||||
$nonBuildableEntries = [];
|
||||
|
||||
foreach ($assembly->getBomEntries() as $bomEntry) {
|
||||
$part = $bomEntry->getPart();
|
||||
|
||||
//Skip BOM entries without a part (as we can not determine that)
|
||||
if (!$part instanceof Part) {
|
||||
if (!$part instanceof Part && $bomEntry->getAssembly() === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$amount_sum = $part->getAmountSum();
|
||||
if ($bomEntry->getPart() !== null) {
|
||||
$amount_sum = $part->getAmountSum();
|
||||
|
||||
if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) {
|
||||
$non_buildable_entries[] = $bomEntry;
|
||||
if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) {
|
||||
$nonBuildableEntries[] = $bomEntry;
|
||||
}
|
||||
} elseif ($bomEntry->getAssembly() !== null) {
|
||||
$nonBuildableAssemblyEntries = $this->projectBuildHelper->getNonBuildableProjectBomEntries($bomEntry->getProject(), $number_of_builds);
|
||||
$nonBuildableEntries = array_merge($nonBuildableEntries, $nonBuildableAssemblyEntries);
|
||||
}
|
||||
}
|
||||
|
||||
return $non_buildable_entries;
|
||||
return $nonBuildableEntries;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -22,38 +22,38 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Services\Attachments;
|
||||
|
||||
use App\Entity\AssemblySystem\Assembly;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
|
||||
class AssemblyPreviewGenerator
|
||||
class ProjectPreviewGenerator
|
||||
{
|
||||
public function __construct(protected AttachmentManager $attachmentHelper)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of attachments that can be used for previewing the assembly ordered by priority.
|
||||
* Returns a list of attachments that can be used for previewing the project ordered by priority.
|
||||
*
|
||||
* @param Assembly $assembly the assembly for which the attachments should be determined
|
||||
* @param Project $project the project for which the attachments should be determined
|
||||
*
|
||||
* @return (Attachment|null)[]
|
||||
*
|
||||
* @psalm-return list<Attachment|null>
|
||||
*/
|
||||
public function getPreviewAttachments(Assembly $assembly): array
|
||||
public function getPreviewAttachments(Project $project): array
|
||||
{
|
||||
$list = [];
|
||||
|
||||
//Master attachment has top priority
|
||||
$attachment = $assembly->getMasterPictureAttachment();
|
||||
$attachment = $project->getMasterPictureAttachment();
|
||||
if ($this->isAttachmentValidPicture($attachment)) {
|
||||
$list[] = $attachment;
|
||||
}
|
||||
|
||||
//Then comes the other images of the assembly
|
||||
foreach ($assembly->getAttachments() as $attachment) {
|
||||
//Then comes the other images of the project
|
||||
foreach ($project->getAttachments() as $attachment) {
|
||||
//Dont show the master attachment twice
|
||||
if ($this->isAttachmentValidPicture($attachment) && $attachment !== $assembly->getMasterPictureAttachment()) {
|
||||
if ($this->isAttachmentValidPicture($attachment) && $attachment !== $project->getMasterPictureAttachment()) {
|
||||
$list[] = $attachment;
|
||||
}
|
||||
}
|
||||
|
|
@ -62,14 +62,14 @@ class AssemblyPreviewGenerator
|
|||
}
|
||||
|
||||
/**
|
||||
* Determines what attachment should be used for previewing a assembly (especially in assembly table).
|
||||
* Determines what attachment should be used for previewing a project (especially in project table).
|
||||
* The returned attachment is guaranteed to be existing and be a picture.
|
||||
*
|
||||
* @param Assembly $assembly The assembly for which the attachment should be determined
|
||||
* @param Project $project The project for which the attachment should be determined
|
||||
*/
|
||||
public function getTablePreviewAttachment(Assembly $assembly): ?Attachment
|
||||
public function getTablePreviewAttachment(Project $project): ?Attachment
|
||||
{
|
||||
$attachment = $assembly->getMasterPictureAttachment();
|
||||
$attachment = $project->getMasterPictureAttachment();
|
||||
if ($this->isAttachmentValidPicture($attachment)) {
|
||||
return $attachment;
|
||||
}
|
||||
|
|
@ -22,13 +22,10 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace App\Services\ProjectSystem;
|
||||
|
||||
use App\Entity\AssemblySystem\AssemblyBOMEntry;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\ProjectSystem\Project;
|
||||
use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||
use App\Helpers\Assemblies\AssemblyBuildRequest;
|
||||
use App\Helpers\Projects\ProjectBuildRequest;
|
||||
use App\Services\AssemblySystem\AssemblyBuildHelper;
|
||||
use App\Services\Parts\PartLotWithdrawAddHelper;
|
||||
|
||||
/**
|
||||
|
|
@ -36,10 +33,8 @@ use App\Services\Parts\PartLotWithdrawAddHelper;
|
|||
*/
|
||||
class ProjectBuildHelper
|
||||
{
|
||||
public function __construct(
|
||||
private readonly PartLotWithdrawAddHelper $withdrawAddHelper,
|
||||
private readonly AssemblyBuildHelper $assemblyBuildHelper
|
||||
) {
|
||||
public function __construct(private readonly PartLotWithdrawAddHelper $withdraw_add_helper)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -71,16 +66,12 @@ class ProjectBuildHelper
|
|||
$maximum_buildable_count = PHP_INT_MAX;
|
||||
foreach ($project->getBomEntries() as $bom_entry) {
|
||||
//Skip BOM entries without a part (as we can not determine that)
|
||||
if (!$bom_entry->isPartBomEntry() && $bom_entry->getAssembly() === null) {
|
||||
if (!$bom_entry->isPartBomEntry()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//The maximum buildable count for the whole project is the minimum of all BOM entries
|
||||
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()));
|
||||
}
|
||||
$maximum_buildable_count = min($maximum_buildable_count, $this->getMaximumBuildableCountForBOMEntry($bom_entry));
|
||||
}
|
||||
|
||||
return $maximum_buildable_count;
|
||||
|
|
@ -106,10 +97,10 @@ class ProjectBuildHelper
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the project or assembly BOM entries for which parts are missing in the stock for the given number of builds
|
||||
* Returns the project 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 int $number_of_builds How often should the project be build?
|
||||
* @return ProjectBOMEntry[]|AssemblyBOMEntry[]
|
||||
* @return ProjectBOMEntry[]
|
||||
*/
|
||||
public function getNonBuildableProjectBomEntries(Project $project, int $number_of_builds = 1): array
|
||||
{
|
||||
|
|
@ -117,29 +108,24 @@ class ProjectBuildHelper
|
|||
throw new \InvalidArgumentException('The number of builds must be greater than 0!');
|
||||
}
|
||||
|
||||
$nonBuildableEntries = [];
|
||||
$non_buildable_entries = [];
|
||||
|
||||
foreach ($project->getBomEntries() as $bomEntry) {
|
||||
$part = $bomEntry->getPart();
|
||||
|
||||
//Skip BOM entries without a part (as we can not determine that)
|
||||
if (!$part instanceof Part && $bomEntry->getAssembly() === null) {
|
||||
if (!$part instanceof Part) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($bomEntry->getPart() !== null) {
|
||||
$amount_sum = $part->getAmountSum();
|
||||
$amount_sum = $part->getAmountSum();
|
||||
|
||||
if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) {
|
||||
$nonBuildableEntries[] = $bomEntry;
|
||||
}
|
||||
} elseif ($bomEntry->getAssembly() !== null) {
|
||||
$nonBuildableAssemblyEntries = $this->assemblyBuildHelper->getNonBuildableAssemblyBomEntries($bomEntry->getAssembly(), $number_of_builds);
|
||||
$nonBuildableEntries = array_merge($nonBuildableEntries, $nonBuildableAssemblyEntries);
|
||||
if ($amount_sum < $bomEntry->getQuantity() * $number_of_builds) {
|
||||
$non_buildable_entries[] = $bomEntry;
|
||||
}
|
||||
}
|
||||
|
||||
return $nonBuildableEntries;
|
||||
return $non_buildable_entries;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -147,37 +133,22 @@ class ProjectBuildHelper
|
|||
* The ProjectBuildRequest has to be validated before!!
|
||||
* You have to flush changes to DB afterward
|
||||
*/
|
||||
public function doBuild(ProjectBuildRequest $projectBuildRequest): void
|
||||
public function doBuild(ProjectBuildRequest $buildRequest): void
|
||||
{
|
||||
$message = $projectBuildRequest->getComment();
|
||||
$message .= ' (Project build: '.$projectBuildRequest->getProject()->getName().')';
|
||||
$message = $buildRequest->getComment();
|
||||
$message .= ' (Project build: '.$buildRequest->getProject()->getName().')';
|
||||
|
||||
foreach ($projectBuildRequest->getPartBomEntries() as $bomEntry) {
|
||||
foreach ($projectBuildRequest->getPartLotsForBOMEntry($bomEntry) as $partLot) {
|
||||
$amount = $projectBuildRequest->getLotWithdrawAmount($partLot);
|
||||
foreach ($buildRequest->getPartBomEntries() as $bom_entry) {
|
||||
foreach ($buildRequest->getPartLotsForBOMEntry($bom_entry) as $part_lot) {
|
||||
$amount = $buildRequest->getLotWithdrawAmount($part_lot);
|
||||
if ($amount > 0) {
|
||||
$this->withdrawAddHelper->withdraw($partLot, $amount, $message);
|
||||
$this->withdraw_add_helper->withdraw($part_lot, $amount, $message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($projectBuildRequest->getAssemblyBomEntries() as $bomEntry) {
|
||||
$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);
|
||||
if ($buildRequest->getAddBuildsToBuildsPart()) {
|
||||
$this->withdraw_add_helper->add($buildRequest->getBuildsPartLot(), $buildRequest->getNumberOfBuilds(), $message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,14 +10,14 @@ class AssemblyTwigExtension extends AbstractExtension
|
|||
public function getFunctions(): array
|
||||
{
|
||||
return [
|
||||
new TwigFunction('has_assembly', [$this, 'hasAssembly']),
|
||||
new TwigFunction('has_project', [$this, 'hasProject']),
|
||||
];
|
||||
}
|
||||
|
||||
public function hasAssembly(array $bomEntries): bool
|
||||
public function hasProject(array $bomEntries): bool
|
||||
{
|
||||
foreach ($bomEntries as $entry) {
|
||||
if ($entry->getAssembly() !== null) {
|
||||
if ($entry->getProject() !== null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<tr>
|
||||
<th></th> {# expand button #}
|
||||
<th>{% trans %}project.bom.quantity{% endtrans %}</th>
|
||||
<th>{% trans %}project.bom.partOrAssembly{% endtrans %}</th>
|
||||
<th>{% trans %}project.bom.part{% endtrans %}</th>
|
||||
<th>{% trans %}project.bom.name{% endtrans %}</th>
|
||||
<th></th> {# Remove button #}
|
||||
</tr>
|
||||
|
|
@ -41,21 +41,9 @@
|
|||
{{ form_widget(form.quantity) }}
|
||||
{{ form_errors(form.quantity) }}
|
||||
</td>
|
||||
<td style="min-width: 300px;">
|
||||
{{ form_row(form.part) }}
|
||||
<td style="min-width: 250px;">
|
||||
{{ form_widget(form.part) }}
|
||||
{{ form_errors(form.part) }}
|
||||
|
||||
{% if form.vars.value is not null and form.vars.value.project is not null %}
|
||||
{% set hasAssembly = false %}
|
||||
{% if is_granted("@assemblies.read") or has_assembly(form.vars.value.project.bomEntries.toArray) %}
|
||||
<div class="text-center mb-2" style="line-height: 1">∨</div>
|
||||
{{ form_widget(form.assembly) }}
|
||||
{{ form_errors(form.assembly) }}
|
||||
{% endif %}
|
||||
{% elseif is_granted("@assemblies.read") %}
|
||||
{{ form_widget(form.assembly) }}
|
||||
{{ form_errors(form.assembly) }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ form_widget(form.name) }}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<tr>
|
||||
<th></th> {# expand button #}
|
||||
<th>{% trans %}assembly.bom.quantity{% endtrans %}</th>
|
||||
<th>{% trans %}assembly.bom.part{% endtrans %}</th>
|
||||
<th>{% trans %}assembly.bom.partOrProject{% endtrans %}</th>
|
||||
<th>{% trans %}assembly.bom.name{% endtrans %}</th>
|
||||
<th></th> {# Remove button #}
|
||||
</tr>
|
||||
|
|
@ -41,9 +41,21 @@
|
|||
{{ form_widget(form.quantity) }}
|
||||
{{ form_errors(form.quantity) }}
|
||||
</td>
|
||||
<td style="min-width: 250px;">
|
||||
{{ form_widget(form.part) }}
|
||||
<td style="min-width: 300px;">
|
||||
{{ form_row(form.part) }}
|
||||
{{ form_errors(form.part) }}
|
||||
|
||||
{% if form.vars.value is not null and form.vars.value.assembly is not null %}
|
||||
{% if is_granted("@projects.read") or has_project(form.vars.value.assembly.bomEntries.toArray) %}
|
||||
<div class="text-center mb-2" style="line-height: 1">∨</div>
|
||||
{{ form_widget(form.project) }}
|
||||
{{ form_errors(form.project) }}
|
||||
{% endif %}
|
||||
{% elseif is_granted("@projects.read") %}
|
||||
<div class="text-center mb-2" style="line-height: 1">∨</div>
|
||||
{{ form_widget(form.project) }}
|
||||
{{ form_errors(form.project) }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ form_widget(form.name) }}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,7 @@
|
|||
</td>
|
||||
<td >
|
||||
{% if bom_entry.part %}
|
||||
<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 %}
|
||||
<b><a target="_blank" href="{{ entity_url(bom_entry.part) }}">{{ bom_entry.part.name }}</a></b> {% if bom_entry.name %}({{ bom_entry.name }}){% endif %}
|
||||
{% else %}
|
||||
<b>{{ bom_entry.name }}</b>
|
||||
{% endif %}
|
||||
|
|
@ -47,29 +45,9 @@
|
|||
<tr>
|
||||
<td colspan="4">
|
||||
{% 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 %}
|
||||
{% set previousLabel = null %}
|
||||
|
||||
{% for lot in lots %}
|
||||
{# @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">
|
||||
<label class="col-form-label col-sm-4" for="category_admin_form_parent">
|
||||
{% if lot.storageLocation %}
|
||||
|
|
@ -83,41 +61,12 @@
|
|||
{{ form_errors(form["lot_"~lot.id]) }}
|
||||
{{ form_widget(form["lot_"~lot.id]) }}
|
||||
</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 %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% 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>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
@ -126,7 +75,7 @@
|
|||
|
||||
{{ form_row(form.comment) }}
|
||||
<div {{ stimulus_controller('pages/dont_check_quantity_checkbox') }}>
|
||||
{{ form_row(form.dontCheckQuantity) }}
|
||||
{{ form_row(form.dontCheckQuantity) }}
|
||||
</div>
|
||||
|
||||
{{ form_row(form.addBuildsToBuildsPart) }}
|
||||
|
|
|
|||
|
|
@ -4741,19 +4741,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
|
|||
<target>Název</target>
|
||||
</segment>
|
||||
</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>
|
||||
<note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note>
|
||||
<note priority="1">Part-DB1\src\DataTables\PartsDataTable.php:126</note>
|
||||
|
|
@ -9798,18 +9786,6 @@ Element 3</target>
|
|||
<target>Díl</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10200,12 +10176,6 @@ Element 3</target>
|
|||
<target>k dispozici</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10278,12 +10248,6 @@ Element 3</target>
|
|||
<target>Cílový inventář</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% požadováno)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -13557,10 +13521,10 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
|
|||
<target>%value% (Součást)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Sestava)</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Projekt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="G2sXzh7" name="assembly.label">
|
||||
|
|
@ -13791,12 +13755,24 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
|
|||
<target>potřebné</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Opravdu chcete tuto položku smazat?</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Projekt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -13833,9 +13809,9 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
|
|||
<target>Importovat součásti do sestavy</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Součást</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -14282,41 +14258,5 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
|
|||
</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>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4748,18 +4748,6 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt
|
|||
<target>Navn</target>
|
||||
</segment>
|
||||
</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">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\DataTables\PartsDataTable.php:178</note>
|
||||
|
|
@ -9824,18 +9812,6 @@ Element 3</target>
|
|||
<target>Komponent</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10226,12 +10202,6 @@ Element 3</target>
|
|||
<target>På lager</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10304,12 +10274,6 @@ Element 3</target>
|
|||
<target>Mål mængde</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% påkrævet)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="pyv0k6b" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12274,10 +12238,10 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
|
|||
<target>%value% (Del)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Samlingsenhed)</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Projekt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="G2sXzh7" name="assembly.label">
|
||||
|
|
@ -12508,12 +12472,24 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
|
|||
<target>nødvendig</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Vil du virkelig slette denne post?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Tilføj dele til samlingen</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Projekt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12550,9 +12526,9 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
|
|||
<target>Importer dele til samling</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Del</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -12999,41 +12975,5 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (del)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (samling)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Del "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Samling "%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% nødvendig)</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>ikke på lager</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4746,10 +4746,10 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
|
|||
<target>%value% (Bauteil)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Baugruppe)</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Projekt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
|
|
@ -9872,18 +9872,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>Bauteil</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10274,12 +10262,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>vorhanden</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10352,12 +10334,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>Ziel-Bestand</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% benötigt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -13229,12 +13205,24 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
|||
<target>benötigt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Wollen sie diesen Eintrag wirklich löschen?</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Projekt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -13271,10 +13259,10 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
|||
<target>Importiere Parts für Baugruppe</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<target>Bauteil</target>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Bauteil oder Projekt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="jHKh8Zp" name="assembly.bom.add_entry">
|
||||
|
|
@ -13720,42 +13708,6 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
|||
</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="X9HUFrv" name="part.table.actions.error">
|
||||
<segment state="translated">
|
||||
<source>part.table.actions.error</source>
|
||||
|
|
|
|||
|
|
@ -1541,22 +1541,10 @@
|
|||
<target>%value% (Μέρος)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<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>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Έργο)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hIIFtI1" name="assembly.edit.status">
|
||||
|
|
@ -1595,18 +1583,6 @@
|
|||
<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>
|
||||
|
|
@ -1835,12 +1811,24 @@
|
|||
<target>απαιτούμενο</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>έργο</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -1877,9 +1865,9 @@
|
|||
<target>Εισαγωγή εξαρτημάτων συναρμολόγησης</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Εξάρτημα</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -2326,41 +2314,5 @@
|
|||
</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>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4747,10 +4747,10 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
|
|||
<target>%value% (Part)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Assembly)</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Project)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
|
|
@ -9873,18 +9873,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>Part</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10275,12 +10263,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>stocked</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10353,12 +10335,6 @@ Element 1 -> Element 1.2</target>
|
|||
<target>Target lot</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% needed)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -13230,12 +13206,24 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
|||
<target>needed</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Do you really want to delete this entry?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Add parts to assembly</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Project</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -13272,9 +13260,9 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
|||
<target>Import part list for assembly</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Part</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -13721,42 +13709,6 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (Part)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (Assembly)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Part "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Assembly "%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% needed)</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>not in stock</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="X9HUFrv" name="part.table.actions.error">
|
||||
<segment state="translated">
|
||||
<source>part.table.actions.error</source>
|
||||
|
|
|
|||
|
|
@ -4746,10 +4746,10 @@ Subelementos serán desplazados hacia arriba.</target>
|
|||
<target>%value% (Componente)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Ensamblaje)</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Proyecto)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
|
|
@ -9816,18 +9816,6 @@ Elemento 3</target>
|
|||
<target>Componente</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10218,12 +10206,6 @@ Elemento 3</target>
|
|||
<target>Almacenado</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10296,12 +10278,6 @@ Elemento 3</target>
|
|||
<target>Lote objetivo</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% (se requiere %quantity%)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12668,12 +12644,24 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
|
|||
<target>necesario</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>¿Realmente desea eliminar esta entrada?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Añadir piezas al ensamblaje</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Proyecto</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12710,9 +12698,9 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
|
|||
<target>Importar piezas para ensamblaje</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Pieza</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -13159,41 +13147,5 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (Componente)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (Ensamblaje)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Componente "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Ensamblaje "%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% necesario)</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>sin stock</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4709,11 +4709,11 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia
|
|||
<target>%value% (Componente)</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% (Assemblaggio)</target>
|
||||
</segment>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Projet)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="eshqdG." name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -9109,18 +9109,6 @@ exemple de ville</target>
|
|||
<target>Si vous avez des questions à propos de Part-DB , rendez vous sur <a href="%href%" class="link-external" target="_blank">Github</a></target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="KJuXVR5" name="project.bom.assembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.assembly</source>
|
||||
<target>Assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.partOrAssembly</source>
|
||||
<target>Sélection</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hIIFtI1" name="assembly.edit.status">
|
||||
<segment state="translated">
|
||||
<source>assembly.edit.status</source>
|
||||
|
|
@ -9157,18 +9145,6 @@ exemple de ville</target>
|
|||
<target>Archivé</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gHU1vgc" name="project.builds.no_stock">
|
||||
<segment state="translated">
|
||||
<source>project.builds.no_stock</source>
|
||||
<target>aucun stock indiqué</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% requis)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="G2sXzh7" name="assembly.label">
|
||||
<segment>
|
||||
<source>assembly.label</source>
|
||||
|
|
@ -9397,12 +9373,24 @@ exemple de ville</target>
|
|||
<target>nécessaire</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Voulez-vous vraiment supprimer cette entrée ?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Ajouter des pièces à l'assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Projet</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -9439,9 +9427,9 @@ exemple de ville</target>
|
|||
<target>Importer des pièces pour l'assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Pièce</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -9888,41 +9876,5 @@ exemple de ville</target>
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (pièce)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (assemblage)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Pièce "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Assemblage "%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% nécessaires)</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>Non disponible en stock</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4748,11 +4748,11 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi
|
|||
<target>%value% (Componente)</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% (Assemblaggio)</target>
|
||||
</segment>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Progetto)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -9818,18 +9818,6 @@ Element 3</target>
|
|||
<target>Componente</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10220,12 +10208,6 @@ Element 3</target>
|
|||
<target>a magazzino</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10298,12 +10280,6 @@ Element 3</target>
|
|||
<target>Lotto 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% richiesti)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12646,12 +12622,24 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
|
|||
<target>necessari</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Vuoi davvero eliminare questa voce?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Aggiungi componenti al gruppo</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Progetto</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12688,9 +12676,9 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
|
|||
<target>Importa componenti per il gruppo</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Componente</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -13137,42 +13125,6 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (componente)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (gruppo)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Componente "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Gruppo "%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% necessari)</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>Non disponibile in magazzino</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="X9HUFrv" name="part.table.actions.error">
|
||||
<segment state="translated">
|
||||
<source>part.table.actions.error</source>
|
||||
|
|
|
|||
|
|
@ -4709,11 +4709,11 @@
|
|||
<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 id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value%(プロジェクト)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="eshqdG." name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -8846,18 +8846,6 @@ Exampletown</target>
|
|||
<target>Part-DBについての質問は、<a href="%href%" class="link-external" target="_blank">GitHub</a> にスレッドがあります。</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>
|
||||
|
|
@ -8894,18 +8882,6 @@ Exampletown</target>
|
|||
<target>アーカイブ済み</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment>
|
||||
<source>assembly.label</source>
|
||||
|
|
@ -9134,12 +9110,48 @@ Exampletown</target>
|
|||
<target>必要数量</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</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="rs_qty" name="assembly.build.required_qty">
|
||||
<segment>
|
||||
<source>assembly.build.required_qty</source>
|
||||
|
|
@ -9589,41 +9601,5 @@ Exampletown</target>
|
|||
</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>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -730,22 +730,10 @@
|
|||
<target>%value% (Onderdeel)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_assembly">
|
||||
<unit id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_assembly</source>
|
||||
<target>%value% (Samenstelling)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="KJuXVR5" name="project.bom.assembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.assembly</source>
|
||||
<target>Assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.partOrAssembly</source>
|
||||
<target>Selectie</target>
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Project)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hIIFtI1" name="assembly.edit.status">
|
||||
|
|
@ -784,18 +772,6 @@
|
|||
<target>Αρχειοθετήθηκε</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gHU1vgc" name="project.builds.no_stock">
|
||||
<segment state="translated">
|
||||
<source>project.builds.no_stock</source>
|
||||
<target>geen voorraad opgegeven</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% vereist)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="G2sXzh7" name="assembly.label">
|
||||
<segment>
|
||||
<source>assembly.label</source>
|
||||
|
|
@ -1024,12 +1000,24 @@
|
|||
<target>Nodig</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Weet u zeker dat u dit item wilt verwijderen?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Onderdelen toevoegen aan assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Project</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -1066,9 +1054,9 @@
|
|||
<target>Importeer onderdelen voor assemblage</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Onderdeel</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -1551,41 +1539,5 @@
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (Onderdeel)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (Assemblage)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Onderdelen "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Assemblage "%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% benodigd)</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>niet op voorraad</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4751,11 +4751,11 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo
|
|||
<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 id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Projekt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -9821,18 +9821,6 @@ Element 3</target>
|
|||
<target>Komponent</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="KJuXVR5" name="project.bom.assembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.assembly</source>
|
||||
<target>Zespół</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="LKvYWS6" name="project.bom.partOrAssembly">
|
||||
<segment state="translated">
|
||||
<source>project.bom.partOrAssembly</source>
|
||||
<target>Wybór</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="kGqIirz" name="project.bom.add_entry">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10223,12 +10211,6 @@ Element 3</target>
|
|||
<target>dostępny</target>
|
||||
</segment>
|
||||
</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">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10301,12 +10283,6 @@ Element 3</target>
|
|||
<target>Partia docelowa</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% wymagane)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12523,12 +12499,24 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
|
|||
<target>potrzebne</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</source>
|
||||
<target>Czy na pewno chcesz usunąć ten element?</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="tgs_7u9" name="assembly.add_parts_to_assembly">
|
||||
<segment>
|
||||
<source>assembly.add_parts_to_assembly</source>
|
||||
<target>Dodaj części do zespołu</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Projekt</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12565,9 +12553,9 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
|
|||
<target>Importuj części dla zespołu</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Część</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -13014,41 +13002,5 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
|
|||
</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="QiZM3zY" name="typeahead.parts.part.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.part.name</source>
|
||||
<target>%name% (część)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WhYL2yX" name="typeahead.parts.assembly.name">
|
||||
<segment>
|
||||
<source>typeahead.parts.assembly.name</source>
|
||||
<target>%name% (zespół)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="4cgba2c" name="projects.build.form.part">
|
||||
<segment>
|
||||
<source>projects.build.form.part</source>
|
||||
<target>Część "%name%"</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="1bCA1zb" name="projects.build.form.assembly">
|
||||
<segment>
|
||||
<source>projects.build.form.assembly</source>
|
||||
<target>Zespół "%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% (wymagana ilość: %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>brak na magazynie</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4757,11 +4757,11 @@
|
|||
<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 id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value% (Проект)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="rW_SFJE" name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -9825,18 +9825,6 @@
|
|||
<target>Компонент</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="kGqIirz" name="project.bom.add_entry">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10227,12 +10215,6 @@
|
|||
<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="s5DQlqF" name="project.builds.needed">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10305,12 +10287,6 @@
|
|||
<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="5DTAvWG" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12623,12 +12599,24 @@
|
|||
<target>Необходимо</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>Проект</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12665,9 +12653,9 @@
|
|||
<target>Импортировать детали для сборки</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>Компонент</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -13114,41 +13102,5 @@
|
|||
</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>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -4755,11 +4755,11 @@
|
|||
<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 id="GW8ZOX7" name="part.table.name.value.for_project">
|
||||
<segment state="translated">
|
||||
<source>part.table.name.value.for_project</source>
|
||||
<target>%value%(项目)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="eshqdG." name="part.table.id">
|
||||
<notes>
|
||||
|
|
@ -9824,18 +9824,6 @@ Element 3</target>
|
|||
<target>部件</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="apnWXEq" name="project.bom.add_entry">
|
||||
<segment state="translated">
|
||||
<source>project.bom.add_entry</source>
|
||||
|
|
@ -10226,12 +10214,6 @@ Element 3</target>
|
|||
<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="mwL3d70" name="project.builds.needed">
|
||||
<segment state="translated">
|
||||
<source>project.builds.needed</source>
|
||||
|
|
@ -10304,12 +10286,6 @@ Element 3</target>
|
|||
<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="pyv0k6b" name="project.builds.number_of_builds">
|
||||
<segment state="translated">
|
||||
<source>project.builds.number_of_builds</source>
|
||||
|
|
@ -12508,12 +12484,24 @@ Element 3</target>
|
|||
<target>需要</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="hO7vWmc" name="assembly.bom.delete.confirm">
|
||||
<segment state="translated">
|
||||
<source>assembly.bom.delete.confirm</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="1zsGacg3" name="assembly.bom.project">
|
||||
<segment>
|
||||
<source>assembly.bom.project</source>
|
||||
<target>项目</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="PPsM0Dg" name="assembly.bom.name">
|
||||
<segment>
|
||||
<source>assembly.bom.name</source>
|
||||
|
|
@ -12550,9 +12538,9 @@ Element 3</target>
|
|||
<target>导入组件的零件</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="WTasGao" name="assembly.bom.part">
|
||||
<unit id="WTasGao" name="assembly.bom.partOrProject">
|
||||
<segment>
|
||||
<source>assembly.bom.part</source>
|
||||
<source>assembly.bom.partOrProject</source>
|
||||
<target>零件</target>
|
||||
</segment>
|
||||
</unit>
|
||||
|
|
@ -12999,41 +12987,5 @@ Element 3</target>
|
|||
</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>
|
||||
</xliff>
|
||||
|
|
|
|||
|
|
@ -389,6 +389,12 @@
|
|||
<target>Tato součást již existuje ve skupině!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Tento projekt již v této skupině existuje!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -365,6 +365,12 @@
|
|||
<target>Denne del eksisterer allerede i gruppen!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Dette projekt eksisterer allerede i gruppen!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -389,6 +389,12 @@
|
|||
<target>Dieses Bauteil existiert bereits in der Gruppe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Dieses Projekt existiert bereits in der Gruppe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@
|
|||
<target>Αυτό το εξάρτημα υπάρχει ήδη στην ομάδα!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Αυτό το έργο υπάρχει ήδη στην ομάδα!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -386,19 +386,25 @@
|
|||
<unit id="qyoCAaP" name="assembly.bom_entry.part_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.part_already_in_bom</source>
|
||||
<target>__assembly.bom_entry.part_already_in_bom</target>
|
||||
<target>This part already exists in the list!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>This project already exists in the list!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
<target>__assembly.bom_entry.name_already_in_bom</target>
|
||||
<target>There is already a part with this name!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="KWc.wZ4" name="validator.assembly.bom_entry.name_or_part_needed">
|
||||
<segment>
|
||||
<source>validator.assembly.bom_entry.name_or_part_needed</source>
|
||||
<target>__validator.assembly.bom_entry.name_or_part_needed</target>
|
||||
<target>You must select a part or set a name for the entry!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="a1dKro7" name="validator.bom_importer.json_csv.quantity.required">
|
||||
|
|
|
|||
|
|
@ -227,6 +227,12 @@
|
|||
<target>Cette pièce existe déjà dans le groupe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ce projet existe déjà dans le groupe!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -383,6 +383,12 @@
|
|||
<target>Ovaj dio već postoji u grupi!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ovaj projekt već postoji u grupi!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -383,6 +383,12 @@
|
|||
<target>Questa parte è già presente nel gruppo!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Questo progetto esiste già nel gruppo!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -227,6 +227,12 @@
|
|||
<target>この部品はすでにグループに存在します!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>このプロジェクトは既にグループに存在しています!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -383,6 +383,12 @@
|
|||
<target>Ten element już istnieje w grupie!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Ten projekt już znajduje się w grupie!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -383,6 +383,12 @@
|
|||
<target>Эта деталь уже существует в группе!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>Этот проект уже находится в группе!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
|
|
@ -371,6 +371,12 @@
|
|||
<target>此零件已存在于组中!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="6bkQ3bo" name="assembly.bom_entry.project_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.project_already_in_bom</source>
|
||||
<target>该项目已在组中!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Pi60dJ9" name="assembly.bom_entry.name_already_in_bom">
|
||||
<segment>
|
||||
<source>assembly.bom_entry.name_already_in_bom</source>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue