$repo */
+ $repo = $this->em->getRepository($element::class);
+ return $repo->getPartsCountRecursive($element);
+ }
+}
diff --git a/src/Twig/TwigCoreExtension.php b/src/Twig/TwigCoreExtension.php
index 7b2b58f8..ceb4ce82 100644
--- a/src/Twig/TwigCoreExtension.php
+++ b/src/Twig/TwigCoreExtension.php
@@ -22,7 +22,11 @@ declare(strict_types=1);
*/
namespace App\Twig;
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+use Twig\Attribute\AsTwigFilter;
+use Twig\Attribute\AsTwigFunction;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
+use Twig\Attribute\AsTwigTest;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
@@ -32,58 +36,54 @@ use Twig\TwigTest;
* The functionalities here extend the Twig with some core functions, which are independently of Part-DB.
* @see \App\Tests\Twig\TwigCoreExtensionTest
*/
-final class TwigCoreExtension extends AbstractExtension
+final readonly class TwigCoreExtension
{
- private readonly ObjectNormalizer $objectNormalizer;
+ private NormalizerInterface $objectNormalizer;
public function __construct()
{
$this->objectNormalizer = new ObjectNormalizer();
}
- public function getFunctions(): array
+ /**
+ * Checks if the given variable is an instance of the given class/interface/enum. E.g. `x is instanceof('App\Entity\Parts\Part')`
+ * @param mixed $var
+ * @param string $instance
+ * @return bool
+ */
+ #[AsTwigTest("instanceof")]
+ public function testInstanceOf(mixed $var, string $instance): bool
{
- return [
- /* Returns the enum cases as values */
- new TwigFunction('enum_cases', $this->getEnumCases(...)),
- ];
- }
+ if (!class_exists($instance) && !interface_exists($instance) && !enum_exists($instance)) {
+ throw new \InvalidArgumentException(sprintf('The given class/interface/enum "%s" does not exist!', $instance));
+ }
- public function getTests(): array
- {
- return [
- /*
- * Checks if a given variable is an instance of a given class. E.g. ` x is instanceof('App\Entity\Parts\Part')`
- */
- new TwigTest('instanceof', static fn($var, $instance) => $var instanceof $instance),
- /* Checks if a given variable is an object. E.g. `x is object` */
- new TwigTest('object', static fn($var): bool => is_object($var)),
- new TwigTest('enum', fn($var) => $var instanceof \UnitEnum),
- ];
+ return $var instanceof $instance;
}
/**
- * @param string $enum_class
- * @phpstan-param class-string $enum_class
+ * Checks if the given variable is an object. This can be used to check if a variable is an object, without knowing the exact class of the object. E.g. `x is object`
+ * @param mixed $var
+ * @return bool
*/
- public function getEnumCases(string $enum_class): array
+ #[AsTwigTest("object")]
+ public function testObject(mixed $var): bool
{
- if (!enum_exists($enum_class)) {
- throw new \InvalidArgumentException(sprintf('The given class "%s" is not an enum!', $enum_class));
- }
-
- /** @noinspection PhpUndefinedMethodInspection */
- return ($enum_class)::cases();
+ return is_object($var);
}
- public function getFilters(): array
+ /**
+ * Checks if the given variable is an enum (instance of UnitEnum). This can be used to check if a variable is an enum, without knowing the exact class of the enum. E.g. `x is enum`
+ * @param mixed $var
+ * @return bool
+ */
+ #[AsTwigTest("enum")]
+ public function testEnum(mixed $var): bool
{
- return [
- /* Converts the given object to an array representation of the public/accessible properties */
- new TwigFilter('to_array', fn($object) => $this->toArray($object)),
- ];
+ return $var instanceof \UnitEnum;
}
+ #[AsTwigFilter('to_array')]
public function toArray(object|array $object): array
{
//If it is already an array, we can just return it
diff --git a/src/Twig/UpdateExtension.php b/src/Twig/UpdateExtension.php
new file mode 100644
index 00000000..7ec7897b
--- /dev/null
+++ b/src/Twig/UpdateExtension.php
@@ -0,0 +1,74 @@
+.
+ */
+
+declare(strict_types=1);
+
+
+namespace App\Twig;
+
+use Twig\Attribute\AsTwigFunction;
+use App\Services\System\UpdateAvailableFacade;
+use Symfony\Bundle\SecurityBundle\Security;
+use Twig\Extension\AbstractExtension;
+use Twig\TwigFunction;
+
+/**
+ * Twig extension for update-related functions.
+ */
+final readonly class UpdateExtension
+{
+ public function __construct(private UpdateAvailableFacade $updateAvailableManager,
+ private Security $security)
+ {
+
+ }
+
+ /**
+ * Check if an update is available and the user has permission to see it.
+ */
+ #[AsTwigFunction(name: 'is_update_available')]
+ public function isUpdateAvailable(): bool
+ {
+ // Only show to users with the show_updates permission
+ if (!$this->security->isGranted('@system.show_updates')) {
+ return false;
+ }
+
+ return $this->updateAvailableManager->isUpdateAvailable();
+ }
+
+ /**
+ * Get the latest available version string.
+ */
+ #[AsTwigFunction(name: 'get_latest_version')]
+ public function getLatestVersion(): string
+ {
+ return $this->updateAvailableManager->getLatestVersionString();
+ }
+
+ /**
+ * Get the URL to the latest version release page.
+ */
+ #[AsTwigFunction(name: 'get_latest_version_url')]
+ public function getLatestVersionUrl(): string
+ {
+ return $this->updateAvailableManager->getLatestVersionUrl();
+ }
+}
diff --git a/src/Twig/UserExtension.php b/src/Twig/UserExtension.php
index 5045257a..81ff0857 100644
--- a/src/Twig/UserExtension.php
+++ b/src/Twig/UserExtension.php
@@ -41,51 +41,24 @@ declare(strict_types=1);
namespace App\Twig;
-use App\Entity\Base\AbstractDBElement;
+use Twig\Attribute\AsTwigFilter;
+use Twig\Attribute\AsTwigFunction;
use App\Entity\UserSystem\User;
-use App\Entity\LogSystem\AbstractLogEntry;
-use App\Repository\LogEntryRepository;
-use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
-use Twig\Extension\AbstractExtension;
-use Twig\TwigFilter;
-use Twig\TwigFunction;
/**
* @see \App\Tests\Twig\UserExtensionTest
*/
-final class UserExtension extends AbstractExtension
+final readonly class UserExtension
{
- private readonly LogEntryRepository $repo;
- public function __construct(EntityManagerInterface $em,
- private readonly Security $security,
- private readonly UrlGeneratorInterface $urlGenerator)
+ public function __construct(
+ private Security $security,
+ private UrlGeneratorInterface $urlGenerator)
{
- $this->repo = $em->getRepository(AbstractLogEntry::class);
- }
-
- public function getFilters(): array
- {
- return [
- new TwigFilter('remove_locale_from_path', fn(string $path): string => $this->removeLocaleFromPath($path)),
- ];
- }
-
- public function getFunctions(): array
- {
- return [
- /* Returns the user which has edited the given entity the last time. */
- new TwigFunction('last_editing_user', fn(AbstractDBElement $element): ?User => $this->repo->getLastEditingUser($element)),
- /* Returns the user which has created the given entity. */
- new TwigFunction('creating_user', fn(AbstractDBElement $element): ?User => $this->repo->getCreatingUser($element)),
- new TwigFunction('impersonator_user', $this->getImpersonatorUser(...)),
- new TwigFunction('impersonation_active', $this->isImpersonationActive(...)),
- new TwigFunction('impersonation_path', $this->getImpersonationPath(...)),
- ];
}
/**
@@ -93,6 +66,7 @@ final class UserExtension extends AbstractExtension
* If the current user is not impersonated, null is returned.
* @return User|null
*/
+ #[AsTwigFunction(name: 'impersonator_user')]
public function getImpersonatorUser(): ?User
{
$token = $this->security->getToken();
@@ -107,11 +81,13 @@ final class UserExtension extends AbstractExtension
return null;
}
+ #[AsTwigFunction(name: 'impersonation_active')]
public function isImpersonationActive(): bool
{
return $this->security->isGranted('IS_IMPERSONATOR');
}
+ #[AsTwigFunction(name: 'impersonation_path')]
public function getImpersonationPath(User $user, string $route_name = 'homepage'): string
{
if (! $this->security->isGranted('CAN_SWITCH_USER', $user)) {
@@ -124,6 +100,7 @@ final class UserExtension extends AbstractExtension
/**
* This function/filter generates a path.
*/
+ #[AsTwigFilter(name: 'remove_locale_from_path')]
public function removeLocaleFromPath(string $path): string
{
//Ensure the path has the correct format
diff --git a/src/Twig/UserRepoExtension.php b/src/Twig/UserRepoExtension.php
new file mode 100644
index 00000000..1dcc6706
--- /dev/null
+++ b/src/Twig/UserRepoExtension.php
@@ -0,0 +1,57 @@
+.
+ */
+
+declare(strict_types=1);
+
+
+namespace App\Twig;
+
+use App\Entity\Base\AbstractDBElement;
+use App\Entity\LogSystem\AbstractLogEntry;
+use App\Entity\UserSystem\User;
+use App\Repository\LogEntryRepository;
+use Doctrine\ORM\EntityManagerInterface;
+use Twig\Attribute\AsTwigFunction;
+
+final readonly class UserRepoExtension
+{
+
+ public function __construct(private EntityManagerInterface $entityManager)
+ {
+ }
+
+ /**
+ * Returns the user which has edited the given entity the last time.
+ */
+ #[AsTwigFunction('creating_user')]
+ public function creatingUser(AbstractDBElement $element): ?User
+ {
+ return $this->entityManager->getRepository(AbstractLogEntry::class)->getCreatingUser($element);
+ }
+
+ /**
+ * Returns the user which has edited the given entity the last time.
+ */
+ #[AsTwigFunction('last_editing_user')]
+ public function lastEditingUser(AbstractDBElement $element): ?User
+ {
+ return $this->entityManager->getRepository(AbstractLogEntry::class)->getLastEditingUser($element);
+ }
+}
diff --git a/src/Validator/Constraints/UniquePartIpnConstraint.php b/src/Validator/Constraints/UniquePartIpnConstraint.php
index ca32f9ef..652f2bcd 100644
--- a/src/Validator/Constraints/UniquePartIpnConstraint.php
+++ b/src/Validator/Constraints/UniquePartIpnConstraint.php
@@ -1,5 +1,7 @@
.
*/
-import { Controller } from '@hotwired/stimulus';
+declare(strict_types=1);
-export default class extends Controller {
- connect() {
- //If we encounter an element with global reload controller, then reload the whole page
- window.location.reload();
- }
-}
\ No newline at end of file
+
+namespace App\Validator\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A constraint to ensure that a GTIN is valid.
+ */
+#[\Attribute(\Attribute::TARGET_PROPERTY)]
+class ValidGTIN extends Constraint
+{
+
+}
diff --git a/src/Validator/Constraints/ValidGTINValidator.php b/src/Validator/Constraints/ValidGTINValidator.php
new file mode 100644
index 00000000..57eb23e6
--- /dev/null
+++ b/src/Validator/Constraints/ValidGTINValidator.php
@@ -0,0 +1,54 @@
+.
+ */
+
+declare(strict_types=1);
+
+
+namespace App\Validator\Constraints;
+
+use GtinValidation\GtinValidator;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+class ValidGTINValidator extends ConstraintValidator
+{
+
+ public function validate(mixed $value, Constraint $constraint): void
+ {
+ if (!$constraint instanceof ValidGTIN) {
+ throw new UnexpectedTypeException($constraint, ValidGTIN::class);
+ }
+
+ if (null === $value || '' === $value) {
+ return;
+ }
+
+ if (!is_string($value)) {
+ throw new UnexpectedTypeException($value, 'string');
+ }
+
+ $gtinValidator = new GtinValidator($value);
+ if (!$gtinValidator->isValid()) {
+ $this->context->buildViolation('validator.invalid_gtin')
+ ->addViolation();
+ }
+ }
+}
diff --git a/templates/_navbar.html.twig b/templates/_navbar.html.twig
index 446ccdab..57331370 100644
--- a/templates/_navbar.html.twig
+++ b/templates/_navbar.html.twig
@@ -10,9 +10,9 @@
- {% if is_granted("@tools.label_scanner") %}
+ {% if is_granted("@tools.label_scanner") %}
-
+
{% endif %}
@@ -52,6 +52,23 @@
{% trans %}info_providers.search.title{% endtrans %}
+ {% if settings_instance('generic_web_provider').enabled %}
+
+
+
+ {% trans %}info_providers.from_url.title{% endtrans %}
+
+
+ {% endif %}
+
+ {% if is_granted("@tools.label_scanner") %}
+
+
+
+ {% trans %}parts.create_from_scan.title{% endtrans %}
+
+
+ {% endif %}
{% endif %}
{% if is_granted('@parts.import') %}
@@ -69,11 +86,24 @@
{% if is_granted('@parts.read') %}
{{ search.search_form("navbar") }}
- {# {% include "_navbar_search.html.twig" %} #}
+ {# {% include "_navbar_search.html.twig" %} #}
{% endif %}
+ {# Update notification badge #}
+ {% if is_update_available() %}
+
+
+
+
+ {% trans %}update_manager.new{% endtrans %}
+
+
+
+ {% endif %}
+
@@ -138,11 +168,11 @@
-
\ No newline at end of file
+
diff --git a/templates/_turbo_control.html.twig b/templates/_turbo_control.html.twig
index 90ae8d9a..281b21f2 100644
--- a/templates/_turbo_control.html.twig
+++ b/templates/_turbo_control.html.twig
@@ -1,35 +1,39 @@
-{# Insert flashes #}
-
- {% for label, messages in app.flashes() %}
- {% for message in messages %}
- {{ include('_toast.html.twig', {
- 'label': label,
- 'message': message
- }) }}
- {% endfor %}
- {% endfor %}
-
+{% block flashes %}
+ {# Insert flashes #}
+
+
+
+ {% for label, messages in app.flashes() %}
+ {% for message in messages %}
+ {{ include('_toast.html.twig', {
+ 'label': label,
+ 'message': message
+ }) }}
+ {% endfor %}
+ {% endfor %}
+
+
+
+{% endblock %}
+
-{# Allow pages to request a fully reload of everything #}
-{% if global_reload_needed is defined and global_reload_needed %}
-
-{% endif %}
{# Insert info about when the sidebar trees were updated last time, so the sidebar_tree_controller can decide if it needs to reload the tree #}
-{# The title block is already escaped, therefore we dont require any additional escaping here #}
-
+
+
+ {% set locales = settings_instance('localization').languageMenuEntries %}
+ {% if locales is empty %}
+ {% set locales = locale_menu %}
+ {% endif %}
+
+ {% for locale in locales %}
+
+ {{ locale|language_name }} ({{ locale|upper }})
+ {% endfor %}
+
+
-
- {% set locales = settings_instance('localization').languageMenuEntries %}
- {% if locales is empty %}
- {% set locales = locale_menu %}
- {% endif %}
- {% for locale in locales %}
-
- {{ locale|language_name }} ({{ locale|upper }})
- {% endfor %}
-
diff --git a/templates/admin/attachment_type_admin.html.twig b/templates/admin/attachment_type_admin.html.twig
index 87a053af..9aeba934 100644
--- a/templates/admin/attachment_type_admin.html.twig
+++ b/templates/admin/attachment_type_admin.html.twig
@@ -6,6 +6,7 @@
{% block additional_controls %}
{{ form_row(form.filetype_filter) }}
+ {{ form_row(form.allowed_targets) }}
{{ form_row(form.alternative_names) }}
{% endblock %}
diff --git a/templates/admin/update_manager/index.html.twig b/templates/admin/update_manager/index.html.twig
new file mode 100644
index 00000000..44b9f8c0
--- /dev/null
+++ b/templates/admin/update_manager/index.html.twig
@@ -0,0 +1,423 @@
+{% extends "main_card.html.twig" %}
+
+{% block title %}Part-DB {% trans %}update_manager.title{% endtrans %}{% endblock %}
+
+{% block card_title %}
+ Part-DB {% trans %}update_manager.title{% endtrans %}
+{% endblock %}
+
+{% block card_content %}
+
+
+ {# Maintenance Mode Warning #}
+ {% if is_maintenance %}
+
+
+ {% trans %}update_manager.maintenance_mode_active{% endtrans %}
+ {% if maintenance_info.reason is defined %}
+ - {{ maintenance_info.reason }}
+ {% endif %}
+
+ {% endif %}
+
+ {# Lock Warning #}
+ {% if is_locked %}
+
+ {% endif %}
+
+ {# Web Updates Disabled Warning #}
+ {% if web_updates_disabled %}
+
+
+
{% trans %}update_manager.web_updates_disabled{% endtrans %}
+
{% trans %}update_manager.web_updates_disabled_hint{% endtrans %}
+
+ {% endif %}
+
+ {# Backup Restore Disabled Warning #}
+ {% if backup_restore_disabled %}
+
+
+ {% trans %}update_manager.backup_restore_disabled{% endtrans %}
+
+ {% endif %}
+
+
+ {# Current Version Card #}
+
+
+
+
+
+
+
+ {% trans %}update_manager.version{% endtrans %}
+
+ {{ status.current_version }}
+
+
+
+ {% trans %}update_manager.installation_type{% endtrans %}
+
+ {{ status.installation.type_name }}
+
+
+ {% if status.git.is_git_install %}
+
+ {% trans %}update_manager.git_branch{% endtrans %}
+ {{ status.git.branch ?? 'N/A' }}
+
+
+ {% trans %}update_manager.git_commit{% endtrans %}
+ {{ status.git.commit ?? 'N/A' }}
+
+
+ {% trans %}update_manager.local_changes{% endtrans %}
+
+ {% if status.git.has_local_changes %}
+
+ {% trans %}Yes{% endtrans %}
+
+ {% else %}
+
+ {% trans %}No{% endtrans %}
+
+ {% endif %}
+
+
+ {% endif %}
+
+ {% trans %}update_manager.auto_update_supported{% endtrans %}
+
+ {% if status.can_auto_update %}
+
+ {% trans %}Yes{% endtrans %}
+
+ {% else %}
+
+ {% trans %}No{% endtrans %}
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+ {# Latest Version / Update Card #}
+
+
+
+
+ {% if status.latest_version %}
+
+
+ {{ status.latest_tag }}
+
+ {% if not status.update_available %}
+
+
+ {% trans %}update_manager.already_up_to_date{% endtrans %}
+
+ {% endif %}
+
+
+ {% if status.update_available and status.can_auto_update and validation.valid and not web_updates_disabled %}
+
+ {% endif %}
+
+ {% if status.published_at %}
+
+
+ {% trans %}update_manager.released{% endtrans %}: {{ status.published_at|date('Y-m-d') }}
+
+ {% endif %}
+ {% else %}
+
+
+
{% trans %}update_manager.could_not_fetch_releases{% endtrans %}
+
+ {% endif %}
+
+ {% if status.latest_tag %}
+
+ {% endif %}
+
+
+
+
+ {# Validation Issues #}
+ {% if not validation.valid %}
+
+
+ {% trans %}update_manager.validation_issues{% endtrans %}
+
+
+ {% for error in validation.errors %}
+ {{ error }}
+ {% endfor %}
+
+
+ {% endif %}
+
+ {# Non-auto-update installations info #}
+ {% if not status.can_auto_update %}
+
+
+ {% trans%}update_manager.cant_auto_update{% endtrans%}: {{ status.installation.type_name }}
+
+
{{ status.installation.update_instructions }}
+
+ {% endif %}
+
+
+ {# Available Versions #}
+
+
+
+
+
+
+
+
+ {% trans %}update_manager.version{% endtrans %}
+ {% trans %}update_manager.released{% endtrans %}
+
+
+
+
+ {% for release in all_releases %}
+
+
+ {{ release.tag }}
+ {% if release.prerelease %}
+ pre
+ {% endif %}
+ {% if release.version == status.current_version %}
+ {% trans %}update_manager.current{% endtrans %}
+ {% endif %}
+
+
+ {{ release.published_at|date('Y-m-d') }}
+
+
+
+
+
+
+ {% if release.version != status.current_version and status.can_auto_update and validation.valid and not web_updates_disabled %}
+
+ {% endif %}
+
+
+
+ {% else %}
+
+
+ {% trans %}update_manager.no_releases_found{% endtrans %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+ {# Update History & Backups #}
+
+
+
+
+
+
+
+
+
+
+ {% trans %}update_manager.date{% endtrans %}
+ {% trans %}update_manager.log_file{% endtrans %}
+
+
+
+
+ {% for log in update_logs %}
+
+
+ {{ log.date|date('Y-m-d H:i') }}
+
+ {{ log.file }}
+
+
+
+
+
+
+ {% else %}
+
+
+ {% trans %}update_manager.no_logs_found{% endtrans %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+ {% trans %}update_manager.date{% endtrans %}
+ {% trans %}update_manager.file{% endtrans %}
+ {% trans %}update_manager.size{% endtrans %}
+
+
+
+
+ {% for backup in backups %}
+
+
+ {{ backup.date|date('Y-m-d H:i') }}
+
+ {{ backup.file }}
+
+ {{ (backup.size / 1024 / 1024)|number_format(1) }} MB
+
+
+ {% if status.can_auto_update and validation.valid and not backup_restore_disabled %}
+
+ {% endif %}
+
+
+ {% else %}
+
+
+ {% trans %}update_manager.no_backups_found{% endtrans %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/update_manager/log_viewer.html.twig b/templates/admin/update_manager/log_viewer.html.twig
new file mode 100644
index 00000000..64412123
--- /dev/null
+++ b/templates/admin/update_manager/log_viewer.html.twig
@@ -0,0 +1,40 @@
+{% extends "main_card.html.twig" %}
+
+{% block title %}{{ filename }} - {% trans %}update_manager.log_viewer{% endtrans %}{% endblock %}
+
+{% block card_title %}
+ {{ filename }}
+{% endblock %}
+
+{% block card_content %}
+
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/update_manager/progress.html.twig b/templates/admin/update_manager/progress.html.twig
new file mode 100644
index 00000000..54ac6595
--- /dev/null
+++ b/templates/admin/update_manager/progress.html.twig
@@ -0,0 +1,196 @@
+{% extends "main_card.html.twig" %}
+
+{% block title %}
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_title{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.title{% endtrans %}
+ {% endif %}
+{% endblock %}
+
+{% block card_title %}
+ {% if progress and progress.status == 'running' %}
+
+ {% elseif progress and progress.status == 'completed' %}
+
+ {% elseif progress and progress.status == 'failed' %}
+
+ {% else %}
+
+ {% endif %}
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_title{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.title{% endtrans %}
+ {% endif %}
+{% endblock %}
+
+{% block head %}
+ {{ parent() }}
+ {# Auto-refresh while update is running - also refresh when 'starting' status #}
+ {% if not progress or progress.status == 'running' or progress.status == 'starting' %}
+
+ {% endif %}
+{% endblock %}
+
+{% block card_content %}
+
+
+ {# Progress Header #}
+
+
+ {% if progress and progress.status == 'completed' %}
+
+ {% elseif progress and progress.status == 'failed' %}
+
+ {% else %}
+
+ {% endif %}
+
+
+ {% if progress and progress.status == 'running' %}
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrading{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.updating{% endtrans %}
+ {% endif %}
+ {% elseif progress and progress.status == 'completed' %}
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_completed{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.completed{% endtrans %}
+ {% endif %}
+ {% elseif progress and progress.status == 'failed' %}
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_failed{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.failed{% endtrans %}
+ {% endif %}
+ {% else %}
+ {% trans %}update_manager.progress.initializing{% endtrans %}
+ {% endif %}
+
+
+ {% if progress %}
+ {% if is_downgrade|default(false) %}
+ {% trans with {'%version%': progress.target_version|default('unknown')} %}update_manager.progress.downgrading_to{% endtrans %}
+ {% else %}
+ {% trans with {'%version%': progress.target_version|default('unknown')} %}update_manager.progress.updating_to{% endtrans %}
+ {% endif %}
+ {% endif %}
+
+
+
+ {# Progress Bar #}
+ {% set percent = progress ? ((progress.current_step|default(0) / progress.total_steps|default(12)) * 100)|round : 0 %}
+ {% if progress and progress.status == 'completed' %}
+ {% set percent = 100 %}
+ {% endif %}
+
+
+ {# Current Step - shows what's currently being worked on #}
+ {% if progress and (progress.status == 'running' or progress.status == 'starting') %}
+
+ {{ progress.step_name|default('initializing')|replace({'_': ' '})|capitalize }} :
+ {{ progress.step_message|default('Processing...') }}
+
+ {% endif %}
+
+ {# Error Message #}
+ {% if progress and progress.status == 'failed' %}
+
+ {% trans %}update_manager.progress.error{% endtrans %}:
+ {{ progress.error|default('An unknown error occurred') }}
+
+ {% endif %}
+
+ {# Success Message #}
+ {% if progress and progress.status == 'completed' %}
+
+
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_success_message{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.success_message{% endtrans %}
+ {% endif %}
+
+ {% endif %}
+
+ {# Steps Timeline #}
+
+
+ {# Actions #}
+
+
+ {# Warning Notice #}
+ {% if not progress or progress.status == 'running' or progress.status == 'starting' %}
+
+
+ {% trans %}update_manager.progress.warning{% endtrans %}:
+ {% if is_downgrade|default(false) %}
+ {% trans %}update_manager.progress.downgrade_do_not_close{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.progress.do_not_close{% endtrans %}
+ {% endif %}
+
+
+ {# JavaScript refresh - more reliable than meta refresh #}
+
+ {% endif %}
+
+{% endblock %}
diff --git a/templates/admin/update_manager/release_notes.html.twig b/templates/admin/update_manager/release_notes.html.twig
new file mode 100644
index 00000000..9bcd9e04
--- /dev/null
+++ b/templates/admin/update_manager/release_notes.html.twig
@@ -0,0 +1,110 @@
+{% extends "main_card.html.twig" %}
+
+{% block title %}{{ release.name }} - {% trans %}update_manager.release_notes{% endtrans %}{% endblock %}
+
+{% block card_title %}
+ {{ release.name }}
+{% endblock %}
+
+{% block card_content %}
+
+
+
+
+
+
+ {% trans %}update_manager.version{% endtrans %}
+
+ {{ release.version }}
+ {% if release.prerelease %}
+ {% trans %}update_manager.prerelease{% endtrans %}
+ {% endif %}
+
+
+
+ {% trans %}update_manager.tag{% endtrans %}
+ {{ release.tag }}
+
+
+ {% trans %}update_manager.released{% endtrans %}
+ {{ release.published_at|date('Y-m-d H:i') }}
+
+
+ {% trans %}update_manager.status{% endtrans %}
+
+ {% if release.version == current_version %}
+ {% trans %}update_manager.current{% endtrans %}
+ {% elseif release.version > current_version %}
+ {% trans %}update_manager.newer{% endtrans %}
+ {% else %}
+ {% trans %}update_manager.older{% endtrans %}
+ {% endif %}
+
+
+
+
+
+
+
+{% if release.assets is not empty %}
+
+
+
+
+ {% for asset in release.assets %}
+
+
+ {{ asset.name }}
+
+ ({{ (asset.size / 1024 / 1024)|number_format(1) }} MB)
+
+ {% endfor %}
+
+
+
+{% endif %}
+
+
+
+
+ {% if release.body %}
+
+ {{ release.body|markdown_to_html }}
+
+ {% else %}
+
{% trans %}update_manager.no_release_notes{% endtrans %}
+ {% endif %}
+
+
+
+{% if release.version > current_version %}
+
+
+
+
{% trans %}update_manager.run_command_to_update{% endtrans %}
+
+ php bin/console partdb:update {{ release.tag }}
+
+
+
+{% endif %}
+{% endblock %}
diff --git a/templates/attachments/html_sandbox.html.twig b/templates/attachments/html_sandbox.html.twig
new file mode 100644
index 00000000..389ebc2e
--- /dev/null
+++ b/templates/attachments/html_sandbox.html.twig
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+ {# The content block is already escaped. so we must not escape it again. #}
+ {% trans %}attachment.sandbox.title{% endtrans %}: {{ attachment.filename }}
+
+
+
+
+{% block body %}
+ {# We have a fullscreen iframe, with an warning on top #}
+
+
+
+{% endblock %}
+
+
+
diff --git a/templates/base.html.twig b/templates/base.html.twig
index 2db726ee..8dc87239 100644
--- a/templates/base.html.twig
+++ b/templates/base.html.twig
@@ -26,6 +26,11 @@
+ {# Allow pages to request a fully reload of everything #}
+ {% if global_reload_needed is defined and global_reload_needed %}
+
+ {% endif %}
+
diff --git a/templates/form/extended_bootstrap_layout.html.twig b/templates/form/extended_bootstrap_layout.html.twig
index 75e44a15..1227750c 100644
--- a/templates/form/extended_bootstrap_layout.html.twig
+++ b/templates/form/extended_bootstrap_layout.html.twig
@@ -100,6 +100,17 @@
{%- endif -%}
{%- endblock tristate_widget %}
+{% block tristate_row -%}
+ {#--#}
+
{#--#}
+
+ {{- form_widget(form) -}}
+ {{- form_help(form) -}}
+ {{- form_errors(form) -}}
+
{#--#}
+
+{%- endblock tristate_row %}
+
{%- block choice_widget_collapsed -%}
{# Only add the BS5 form-select class if we dont use bootstrap-selectpicker #}
{# {% if attr["data-controller"] is defined and attr["data-controller"] not in ["elements--selectpicker"] %}
@@ -144,3 +155,8 @@
{{- parent() -}}
{% endif %}
{% endblock %}
+
+{% block boolean_constraint_widget %}
+ {{ form_widget(form.value) }}
+ {{ form_errors(form.value) }}
+{% endblock %}
diff --git a/templates/helper.twig b/templates/helper.twig
index 66268a96..9e68d56c 100644
--- a/templates/helper.twig
+++ b/templates/helper.twig
@@ -192,7 +192,7 @@
{% set preview_attach = part_preview_generator.tablePreviewAttachment(part) %}
{% if preview_attach %}
+ {{ stimulus_controller('elements/hoverpic') }} data-thumbnail="{{ attachment_thumbnail(preview_attach) }}">
{% endif %}
{{ part.name }}
{% endmacro %}
@@ -241,3 +241,11 @@
{{ datetime|format_datetime }}
{% endif %}
{% endmacro %}
+
+{% macro vat_text(bool) %}
+ {% if bool === true %}
+ ({% trans %}prices.incl_vat{% endtrans %})
+ {% elseif bool === false %}
+ ({% trans %}prices.excl_vat{% endtrans %})
+ {% endif %}
+{% endmacro %}
diff --git a/templates/info_providers/from_url/from_url.html.twig b/templates/info_providers/from_url/from_url.html.twig
new file mode 100644
index 00000000..5aad1a03
--- /dev/null
+++ b/templates/info_providers/from_url/from_url.html.twig
@@ -0,0 +1,21 @@
+{% extends "main_card.html.twig" %}
+
+{% import "info_providers/providers.macro.html.twig" as providers_macro %}
+{% import "helper.twig" as helper %}
+
+{% block title %}
+ {% trans %}info_providers.from_url.title{% endtrans %}
+{% endblock %}
+
+{% block card_title %}
+ {% trans %}info_providers.from_url.title{% endtrans %}
+{% endblock %}
+
+{% block card_content %}
+ {% trans %}info_providers.from_url.help{% endtrans %}
+
+ {{ form_start(form) }}
+ {{ form_row(form.url) }}
+ {{ form_row(form.submit) }}
+ {{ form_end(form) }}
+{% endblock %}
diff --git a/templates/info_providers/search/part_search.html.twig b/templates/info_providers/search/part_search.html.twig
index 3d741c34..a5602618 100644
--- a/templates/info_providers/search/part_search.html.twig
+++ b/templates/info_providers/search/part_search.html.twig
@@ -94,7 +94,13 @@
{{ dto.footprint }}
{% endif %}
- {{ helper.m_status_to_badge(dto.manufacturing_status) }}
+
+ {{ helper.m_status_to_badge(dto.manufacturing_status) }}
+ {% if dto.gtin %}
+
+ {{ dto.gtin }}
+ {% endif %}
+
{% if dto.provider_url %}
diff --git a/templates/info_providers/settings/provider_settings.html.twig b/templates/info_providers/settings/provider_settings.html.twig
index 1876c2eb..86e5bc9b 100644
--- a/templates/info_providers/settings/provider_settings.html.twig
+++ b/templates/info_providers/settings/provider_settings.html.twig
@@ -10,7 +10,7 @@
{% block card_content %}
- {% if info_provider_info.url %}
+ {% if info_provider_info.url is defined %}
{{ info_provider_info.name }}
{% else %}
{{ info_provider_info.name }}
diff --git a/templates/label_system/scanner/_info_mode.html.twig b/templates/label_system/scanner/_info_mode.html.twig
new file mode 100644
index 00000000..23deb6d3
--- /dev/null
+++ b/templates/label_system/scanner/_info_mode.html.twig
@@ -0,0 +1,154 @@
+{% import "helper.twig" as helper %}
+
+{% if decoded is not empty %}
+
+
+ {% if part %} {# Show detailed info when it is a part #}
+
+
+
+
+
+
+
+
+
+
{{ part.name }}
+
{{ part.description | format_markdown(true) }}
+
+
+ {% trans %}category.label{% endtrans %}
+
+
+
+ {{ helper.structural_entity_link(part.category) }}
+
+
+
+
+
+ {% trans %}footprint.label{% endtrans %}
+
+
+
+ {{ helper.structural_entity_link(part.footprint) }}
+
+
+
+ {# Show part lots / locations #}
+ {% if part.partLots is not empty %}
+
+
+
+ {% trans %}part_lots.storage_location{% endtrans %}
+
+ {% trans %}part_lots.amount{% endtrans %}
+
+
+
+
+ {% for lot in part.partLots %}
+
+
+ {% if lot.storageLocation %}
+ {{ helper.structural_entity_link(lot.storageLocation) }}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% if lot.instockUnknown %}
+ ?
+ {% else %}
+ {{ lot.amount | format_amount(part.partUnit, {'decimals': 5}) }}
+ {% endif %}
+
+
+ {% endfor %}
+
+
+ {% else %}
+
{% trans %}label_scanner.no_locations{% endtrans %}
+ {% endif %}
+
+
+
+
+
+ {% elseif entity %} {# If we have an entity but that is not an part #}
+
+
+
+
+
+
+
+
+
+
+
{{ entity.name }}
+
{% trans %}id.label{% endtrans %}: {{ entity.id }} ({{ type_label(entity) }})
+
+ {% if entity.fullPath is defined %}
+ {{ helper.breadcrumb_entity_link(entity)}}
+ {% endif %}
+
+
+
+
+ {% endif %}
+
+
+ {% if createUrl %}
+
+ {% endif %}
+
+
+ {% trans %}label_scanner.scan_result.title{% endtrans %}
+
+
+ {# Decoded barcode fields #}
+
+
+ {% for key, value in decoded %}
+
+ {{ key }}
+ {{ value }}
+
+ {% endfor %}
+
+
+
+ {# Whitespace under table and Input form fields #}
+
+
+{% endif %}
diff --git a/templates/label_system/scanner/scanner.html.twig b/templates/label_system/scanner/scanner.html.twig
index 1f978a9b..f9b51388 100644
--- a/templates/label_system/scanner/scanner.html.twig
+++ b/templates/label_system/scanner/scanner.html.twig
@@ -10,35 +10,28 @@
+
+ {% include "label_system/scanner/_info_mode.html.twig" %}
+
+
+ {{ form_start(form, {'attr': {'id': 'scan_dialog_form'}}) }}
+
+ {{ form_end(form) }}
-
- {{ form_start(form, {'attr': {'id': 'scan_dialog_form'}}) }}
-
- {{ form_end(form) }}
-
-
- {% if infoModeData %}
-
-
{% trans %}label_scanner.decoded_info.title{% endtrans %}
-
-
-
- {% for key, value in infoModeData %}
-
- {{ key }}
- {{ value }}
-
- {% endfor %}
-
-
-
- {% endif %}
-
+{% endblock %}
+
+{% block scan_results %}
+
+
+
+ {% include "label_system/scanner/_info_mode.html.twig" %}
+
+
+
{% endblock %}
diff --git a/templates/parts/edit/_advanced.html.twig b/templates/parts/edit/_advanced.html.twig
index b0f1ff86..30479d11 100644
--- a/templates/parts/edit/_advanced.html.twig
+++ b/templates/parts/edit/_advanced.html.twig
@@ -13,4 +13,5 @@
{{ form_row(form.ipn) }}
{{ form_row(form.partUnit) }}
-{{ form_row(form.partCustomState) }}
\ No newline at end of file
+{{ form_row(form.partCustomState) }}
+{{ form_row(form.gtin) }}
diff --git a/templates/parts/edit/_eda.html.twig b/templates/parts/edit/_eda.html.twig
index 4df675c4..1383871e 100644
--- a/templates/parts/edit/_eda.html.twig
+++ b/templates/parts/edit/_eda.html.twig
@@ -1,11 +1,7 @@
{{ form_row(form.eda_info.reference_prefix) }}
{{ form_row(form.eda_info.value) }}
-
-
- {{ form_row(form.eda_info.visibility) }}
-
-
+{{ form_row(form.eda_info.visibility) }}
{{ form_row(form.eda_info.kicad_symbol) }}
-{{ form_row(form.eda_info.kicad_footprint) }}
\ No newline at end of file
+{{ form_row(form.eda_info.kicad_footprint) }}
diff --git a/templates/parts/edit/edit_form_styles.html.twig b/templates/parts/edit/edit_form_styles.html.twig
index c2a89b6a..844c8700 100644
--- a/templates/parts/edit/edit_form_styles.html.twig
+++ b/templates/parts/edit/edit_form_styles.html.twig
@@ -32,6 +32,7 @@
{{ form_row(form.supplierpartnr, {'attr': {'class': 'form-control-sm'}}) }}
{{ form_row(form.supplier_product_url, {'attr': {'class': 'form-control-sm'}}) }}
{{ form_widget(form.obsolete) }}
+ {{ form_widget(form.pricesIncludesVAT) }}
@@ -109,6 +110,7 @@
{{ form_row(form.comment) }}
{{ form_row(form.owner) }}
{{ form_row(form.user_barcode) }}
+ {{ form_row(form.last_stocktake_at) }}
@@ -226,4 +228,4 @@
{{ form_errors(form) }}
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/templates/parts/info/_extended_infos.html.twig b/templates/parts/info/_extended_infos.html.twig
index 4ed60a09..9cb4e4e5 100644
--- a/templates/parts/info/_extended_infos.html.twig
+++ b/templates/parts/info/_extended_infos.html.twig
@@ -42,6 +42,11 @@
{{ part.ipn ?? 'part.ipn.not_defined'|trans }}
+
+ {% trans %}part.gtin{% endtrans %}
+ {{ part.gtin ?? '' }}
+
+
{# Favorite status #}
{% trans %}part.isFavorite{% endtrans %}
{{ helper.boolean_badge(part.favorite) }}
@@ -106,4 +111,4 @@
-
\ No newline at end of file
+
diff --git a/templates/parts/info/_order_infos.html.twig b/templates/parts/info/_order_infos.html.twig
index 68462de5..59b904df 100644
--- a/templates/parts/info/_order_infos.html.twig
+++ b/templates/parts/info/_order_infos.html.twig
@@ -24,8 +24,8 @@
{% if order.pricedetails is not empty %}
-
-
+
+
{% trans %}part.order.minamount{% endtrans %}
{% trans %}part.order.price{% endtrans %}
@@ -36,32 +36,35 @@
{% endif %}
-
-
- {% for detail in order.pricedetails %}
-
+
+
+ {% for detail in order.pricedetails %}
+ {# @var detail App\Entity\PriceInformations\Pricedetail #}
+
-
- {{ detail.MinDiscountQuantity | format_amount(part.partUnit) }}
-
-
- {{ detail.price | format_money(detail.currency) }} / {{ detail.PriceRelatedQuantity | format_amount(part.partUnit) }}
- {% set tmp = pricedetail_helper.convertMoneyToCurrency(detail.price, detail.currency) %}
- {% if detail.currency != (app.user.currency ?? null) and tmp is not null and tmp.GreaterThan(0) %}
- ({{ pricedetail_helper.convertMoneyToCurrency(detail.price, detail.currency, app.user.currency ?? null) | format_money(app.user.currency ?? null) }})
- {% endif %}
-
-
- {{ detail.PricePerUnit | format_money(detail.currency) }}
- {% set tmp = pricedetail_helper.convertMoneyToCurrency(detail.PricePerUnit, detail.currency) %}
- {% if detail.currency != (app.user.currency ?? null) and tmp is not null and tmp.GreaterThan(0) %}
- ({{ pricedetail_helper.convertMoneyToCurrency(detail.PricePerUnit, detail.currency, app.user.currency ?? null) | format_money(app.user.currency ?? null) }})
- {% endif %}
-
-
- {% endfor %}
-
-
+
+ {{ detail.MinDiscountQuantity | format_amount(part.partUnit) }}
+
+
+ {{ detail.price | format_money(detail.currency) }} / {{ detail.PriceRelatedQuantity | format_amount(part.partUnit) }}
+ {% set tmp = pricedetail_helper.convertMoneyToCurrency(detail.price, detail.currency) %}
+ {% if detail.currency != (app.user.currency ?? null) and tmp is not null and tmp.GreaterThan(0) %}
+ ({{ pricedetail_helper.convertMoneyToCurrency(detail.price, detail.currency, app.user.currency ?? null) | format_money(app.user.currency ?? null) }})
+ {% endif %}
+ {{- helper.vat_text(detail.includesVAT) -}}
+
+
+ {{ detail.PricePerUnit | format_money(detail.currency) }}
+ {% set tmp = pricedetail_helper.convertMoneyToCurrency(detail.PricePerUnit, detail.currency) %}
+ {% if detail.currency != (app.user.currency ?? null) and tmp is not null and tmp.GreaterThan(0) %}
+ ({{ pricedetail_helper.convertMoneyToCurrency(detail.PricePerUnit, detail.currency, app.user.currency ?? null) | format_money(app.user.currency ?? null) }})
+ {% endif %}
+ {{- helper.vat_text(detail.includesVAT) -}}
+
+
+ {% endfor %}
+
+
{% endif %}
{# Action for order information #}
@@ -80,4 +83,4 @@
{% endfor %}
-
\ No newline at end of file
+
diff --git a/templates/parts/info/_part_lots.html.twig b/templates/parts/info/_part_lots.html.twig
index b0dcb455..70e5dc4e 100644
--- a/templates/parts/info/_part_lots.html.twig
+++ b/templates/parts/info/_part_lots.html.twig
@@ -2,6 +2,7 @@
{% import "label_system/dropdown_macro.html.twig" as dropdown %}
{% include "parts/info/_withdraw_modal.html.twig" %}
+{% include "parts/info/_stocktake_modal.html.twig" %}
@@ -19,53 +20,58 @@
{% for lot in part.partLots %}
-
+ {# @var lot App\Entity\Parts\PartLot #}
+
{{ lot.description }}
{% if lot.storageLocation %}
{{ helper.structural_entity_link(lot.storageLocation) }}
{% else %}
-
+
{% trans %}part_lots.location_unknown{% endtrans %}
{% endif %}
{% if lot.instockUnknown %}
-
+
{% trans %}part_lots.instock_unknown{% endtrans %}
{% else %}
{{ lot.amount | format_amount(part.partUnit, {'decimals': 5}) }}
{% endif %}
-
-
+
+
{% if lot.owner %}
-
+
{{ helper.user_icon_link(lot.owner) }}
-
+
{% endif %}
{% if lot.expirationDate %}
-
+
{{ lot.expirationDate | format_date() }}
{% endif %}
{% if lot.expired %}
-
-
+
{% trans %}part_lots.is_expired{% endtrans %}
{% endif %}
{% if lot.needsRefill %}
-
-
-
- {% trans %}part_lots.need_refill{% endtrans %}
-
+
+
+ {% trans %}part_lots.need_refill{% endtrans %}
+
{% endif %}
-
+ {% if lot.lastStocktakeAt %}
+
+
+ {{ lot.lastStocktakeAt | format_datetime("short") }}
+
+ {% endif %}
+
@@ -90,12 +96,15 @@
>
+
+
{{ dropdown.profile_dropdown('part_lot', lot.id, false) }}
-
{# Action for order information #}
@@ -111,10 +120,9 @@
-
{% endfor %}
-
\ No newline at end of file
+
diff --git a/templates/parts/info/_sidebar.html.twig b/templates/parts/info/_sidebar.html.twig
index 0c353d8f..12060241 100644
--- a/templates/parts/info/_sidebar.html.twig
+++ b/templates/parts/info/_sidebar.html.twig
@@ -27,6 +27,14 @@
{% endif %}
+{% if part.gtin %}
+
+
+ {{ part.gtin }}
+
+
+{% endif %}
+
{# Needs Review tag #}
{% if part.needsReview %}
diff --git a/templates/parts/info/_stocktake_modal.html.twig b/templates/parts/info/_stocktake_modal.html.twig
new file mode 100644
index 00000000..5e8c1ae5
--- /dev/null
+++ b/templates/parts/info/_stocktake_modal.html.twig
@@ -0,0 +1,63 @@
+
diff --git a/templates/parts/lists/_filter.html.twig b/templates/parts/lists/_filter.html.twig
index 2fb5bff2..3130f379 100644
--- a/templates/parts/lists/_filter.html.twig
+++ b/templates/parts/lists/_filter.html.twig
@@ -65,6 +65,7 @@
{{ form_row(filterForm.mass) }}
{{ form_row(filterForm.dbId) }}
{{ form_row(filterForm.ipn) }}
+ {{ form_row(filterForm.gtin) }}
{{ form_row(filterForm.lastModified) }}
{{ form_row(filterForm.addedDate) }}
@@ -163,4 +164,4 @@
{{ form_end(filterForm) }}
-
\ No newline at end of file
+
diff --git a/templates/parts/lists/_info_card.html.twig b/templates/parts/lists/_info_card.html.twig
index 876bd31b..a35e2862 100644
--- a/templates/parts/lists/_info_card.html.twig
+++ b/templates/parts/lists/_info_card.html.twig
@@ -84,7 +84,7 @@
- {% if entity is instanceof("App\\Entity\\Parts\\Storelocation") %}
+ {% if entity is instanceof("App\\Entity\\Parts\\StorageLocation") %}
{{ dropdown.profile_dropdown('storelocation', entity.id, true, 'btn-secondary w-100 mt-2') }}
{% endif %}
@@ -136,4 +136,4 @@
{% if filterForm is defined %}
{% include "parts/lists/_filter.html.twig" %}
{% endif %}
-
\ No newline at end of file
+
diff --git a/tests/API/APIDocsAvailabilityTest.php b/tests/API/APIDocsAvailabilityTest.php
index b7caa873..a7bba3d6 100644
--- a/tests/API/APIDocsAvailabilityTest.php
+++ b/tests/API/APIDocsAvailabilityTest.php
@@ -28,7 +28,7 @@ use App\Entity\UserSystem\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class APIDocsAvailabilityTest extends WebTestCase
+final class APIDocsAvailabilityTest extends WebTestCase
{
#[DataProvider('urlProvider')]
public function testDocAvailabilityForLoggedInUser(string $url): void
diff --git a/tests/API/APITokenAuthenticationTest.php b/tests/API/APITokenAuthenticationTest.php
index a78b0594..803a1819 100644
--- a/tests/API/APITokenAuthenticationTest.php
+++ b/tests/API/APITokenAuthenticationTest.php
@@ -27,7 +27,7 @@ use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use App\DataFixtures\APITokenFixtures;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use ApiPlatform\Symfony\Bundle\Test\Client;
-class APITokenAuthenticationTest extends ApiTestCase
+final class APITokenAuthenticationTest extends ApiTestCase
{
public function testUnauthenticated(): void
{
diff --git a/tests/API/Endpoints/ApiTokenEnpointTest.php b/tests/API/Endpoints/ApiTokenEnpointTest.php
index 99340182..f21716bd 100644
--- a/tests/API/Endpoints/ApiTokenEnpointTest.php
+++ b/tests/API/Endpoints/ApiTokenEnpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\AuthenticatedApiTestCase;
-class ApiTokenEnpointTest extends AuthenticatedApiTestCase
+final class ApiTokenEnpointTest extends AuthenticatedApiTestCase
{
public function testGetCurrentToken(): void
{
diff --git a/tests/API/Endpoints/AttachmentTypeEndpointTest.php b/tests/API/Endpoints/AttachmentTypeEndpointTest.php
index f90f3d94..fb5770d5 100644
--- a/tests/API/Endpoints/AttachmentTypeEndpointTest.php
+++ b/tests/API/Endpoints/AttachmentTypeEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class AttachmentTypeEndpointTest extends CrudEndpointTestCase
+final class AttachmentTypeEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/AttachmentsEndpointTest.php b/tests/API/Endpoints/AttachmentsEndpointTest.php
index 8f4d7e77..999b7ad3 100644
--- a/tests/API/Endpoints/AttachmentsEndpointTest.php
+++ b/tests/API/Endpoints/AttachmentsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\AuthenticatedApiTestCase;
-class AttachmentsEndpointTest extends AuthenticatedApiTestCase
+final class AttachmentsEndpointTest extends AuthenticatedApiTestCase
{
public function testGetCollection(): void
{
diff --git a/tests/API/Endpoints/CategoryEndpointTest.php b/tests/API/Endpoints/CategoryEndpointTest.php
index 68f4fd2d..5f54d1dd 100644
--- a/tests/API/Endpoints/CategoryEndpointTest.php
+++ b/tests/API/Endpoints/CategoryEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class CategoryEndpointTest extends CrudEndpointTestCase
+final class CategoryEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/CurrencyEndpointTest.php b/tests/API/Endpoints/CurrencyEndpointTest.php
index a463daeb..a9f36633 100644
--- a/tests/API/Endpoints/CurrencyEndpointTest.php
+++ b/tests/API/Endpoints/CurrencyEndpointTest.php
@@ -24,7 +24,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class CurrencyEndpointTest extends CrudEndpointTestCase
+final class CurrencyEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/FootprintsEndpointTest.php b/tests/API/Endpoints/FootprintsEndpointTest.php
index f3f359a2..fd6374f9 100644
--- a/tests/API/Endpoints/FootprintsEndpointTest.php
+++ b/tests/API/Endpoints/FootprintsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class FootprintsEndpointTest extends CrudEndpointTestCase
+final class FootprintsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/InfoEndpointTest.php b/tests/API/Endpoints/InfoEndpointTest.php
index 09f02e8a..6e996c0c 100644
--- a/tests/API/Endpoints/InfoEndpointTest.php
+++ b/tests/API/Endpoints/InfoEndpointTest.php
@@ -25,7 +25,7 @@ namespace API\Endpoints;
use App\Tests\API\AuthenticatedApiTestCase;
-class InfoEndpointTest extends AuthenticatedApiTestCase
+final class InfoEndpointTest extends AuthenticatedApiTestCase
{
public function testGetInfo(): void
{
diff --git a/tests/API/Endpoints/LabelEndpointTest.php b/tests/API/Endpoints/LabelEndpointTest.php
new file mode 100644
index 00000000..338af836
--- /dev/null
+++ b/tests/API/Endpoints/LabelEndpointTest.php
@@ -0,0 +1,186 @@
+.
+ */
+
+declare(strict_types=1);
+
+namespace App\Tests\API\Endpoints;
+
+use App\Tests\API\AuthenticatedApiTestCase;
+
+class LabelEndpointTest extends AuthenticatedApiTestCase
+{
+ public function testGetLabelProfiles(): void
+ {
+ $response = self::createAuthenticatedClient()->request('GET', '/api/label_profiles');
+
+ self::assertResponseIsSuccessful();
+ self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
+
+ // Check that we get an array of label profiles
+ $json = $response->toArray();
+ self::assertIsArray($json['hydra:member']);
+ self::assertNotEmpty($json['hydra:member']);
+
+ // Check the structure of the first profile
+ $firstProfile = $json['hydra:member'][0];
+ self::assertArrayHasKey('@id', $firstProfile);
+ self::assertArrayHasKey('name', $firstProfile);
+ self::assertArrayHasKey('options', $firstProfile);
+ self::assertArrayHasKey('show_in_dropdown', $firstProfile);
+ }
+
+ public function testGetSingleLabelProfile(): void
+ {
+ $response = self::createAuthenticatedClient()->request('GET', '/api/label_profiles/1');
+
+ self::assertResponseIsSuccessful();
+ self::assertJsonContains([
+ '@id' => '/api/label_profiles/1',
+ ]);
+
+ $json = $response->toArray();
+ self::assertArrayHasKey('name', $json);
+ self::assertArrayHasKey('options', $json);
+ // Note: options is serialized but individual fields like width/height
+ // are only available in 'extended' or 'full' serialization groups
+ self::assertIsArray($json['options']);
+ }
+
+ public function testFilterLabelProfilesByElementType(): void
+ {
+ $response = self::createAuthenticatedClient()->request('GET', '/api/label_profiles?options.supported_element=part');
+
+ self::assertResponseIsSuccessful();
+
+ $json = $response->toArray();
+ // Check that we get results - the filter should work even if the field isn't in response
+ self::assertIsArray($json['hydra:member']);
+ // verify we got profiles
+ self::assertNotEmpty($json['hydra:member']);
+ }
+
+ public function testGenerateLabelPdf(): void
+ {
+ $response = self::createAuthenticatedClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => '1',
+ ],
+ ]);
+
+ self::assertResponseIsSuccessful();
+ self::assertResponseHeaderSame('content-type', 'application/pdf');
+
+ // Check that the response contains PDF data
+ $content = $response->getContent();
+ self::assertStringStartsWith('%PDF-', $content);
+
+ // Check Content-Disposition header contains attachment and .pdf
+ $headers = $response->getHeaders();
+ self::assertArrayHasKey('content-disposition', $headers);
+ $disposition = $headers['content-disposition'][0];
+ self::assertStringContainsString('attachment', $disposition);
+ self::assertStringContainsString('.pdf', $disposition);
+ }
+
+ public function testGenerateLabelPdfWithMultipleElements(): void
+ {
+ $response = self::createAuthenticatedClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => '1,2,3',
+ ],
+ ]);
+
+ self::assertResponseIsSuccessful();
+ self::assertResponseHeaderSame('content-type', 'application/pdf');
+ self::assertStringStartsWith('%PDF-', $response->getContent());
+ }
+
+ public function testGenerateLabelPdfWithRange(): void
+ {
+ $response = self::createAuthenticatedClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => '1-3',
+ ],
+ ]);
+
+ self::assertResponseIsSuccessful();
+ self::assertResponseHeaderSame('content-type', 'application/pdf');
+ self::assertStringStartsWith('%PDF-', $response->getContent());
+ }
+
+ public function testGenerateLabelPdfWithInvalidProfileId(): void
+ {
+ self::createAuthenticatedClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 99999,
+ 'elementIds' => '1',
+ ],
+ ]);
+
+ self::assertResponseStatusCodeSame(404);
+ }
+
+ public function testGenerateLabelPdfWithInvalidElementIds(): void
+ {
+ $client = self::createAuthenticatedClient();
+ $client->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => 'invalid',
+ ],
+ ]);
+
+ // Should return 400 or 422 (validation error)
+ $response = $client->getResponse();
+ $statusCode = $response->getStatusCode();
+ self::assertTrue(
+ $statusCode === 400 || $statusCode === 422,
+ "Expected status code 400 or 422, got {$statusCode}"
+ );
+ }
+
+ public function testGenerateLabelPdfWithNonExistentElements(): void
+ {
+ self::createAuthenticatedClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => '99999',
+ ],
+ ]);
+
+ self::assertResponseStatusCodeSame(404);
+ }
+
+ public function testGenerateLabelPdfRequiresAuthentication(): void
+ {
+ // Create a non-authenticated client
+ self::createClient()->request('POST', '/api/labels/generate', [
+ 'json' => [
+ 'profileId' => 1,
+ 'elementIds' => '1',
+ ],
+ ]);
+
+ self::assertResponseStatusCodeSame(401);
+ }
+}
diff --git a/tests/API/Endpoints/ManufacturersEndpointTest.php b/tests/API/Endpoints/ManufacturersEndpointTest.php
index 482ec98d..80447c93 100644
--- a/tests/API/Endpoints/ManufacturersEndpointTest.php
+++ b/tests/API/Endpoints/ManufacturersEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class ManufacturersEndpointTest extends CrudEndpointTestCase
+final class ManufacturersEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/MeasurementUnitsEndpointTest.php b/tests/API/Endpoints/MeasurementUnitsEndpointTest.php
index db7341db..d659fb1c 100644
--- a/tests/API/Endpoints/MeasurementUnitsEndpointTest.php
+++ b/tests/API/Endpoints/MeasurementUnitsEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class MeasurementUnitsEndpointTest extends CrudEndpointTestCase
+final class MeasurementUnitsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/OrderdetailsEndpointTest.php b/tests/API/Endpoints/OrderdetailsEndpointTest.php
index 92823103..d7d132d9 100644
--- a/tests/API/Endpoints/OrderdetailsEndpointTest.php
+++ b/tests/API/Endpoints/OrderdetailsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class OrderdetailsEndpointTest extends CrudEndpointTestCase
+final class OrderdetailsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/ParametersEndpointTest.php b/tests/API/Endpoints/ParametersEndpointTest.php
index 733df59a..323fc7b8 100644
--- a/tests/API/Endpoints/ParametersEndpointTest.php
+++ b/tests/API/Endpoints/ParametersEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class ParametersEndpointTest extends CrudEndpointTestCase
+final class ParametersEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/PartAssociationsEndpointTest.php b/tests/API/Endpoints/PartAssociationsEndpointTest.php
index 62408dbb..7ac81ff6 100644
--- a/tests/API/Endpoints/PartAssociationsEndpointTest.php
+++ b/tests/API/Endpoints/PartAssociationsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class PartAssociationsEndpointTest extends CrudEndpointTestCase
+final class PartAssociationsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/PartCustomStateEndpointTest.php b/tests/API/Endpoints/PartCustomStateEndpointTest.php
index ac353d9c..8d1253f3 100644
--- a/tests/API/Endpoints/PartCustomStateEndpointTest.php
+++ b/tests/API/Endpoints/PartCustomStateEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class PartCustomStateEndpointTest extends CrudEndpointTestCase
+final class PartCustomStateEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/PartEndpointTest.php b/tests/API/Endpoints/PartEndpointTest.php
index 9406fc78..8d66d362 100644
--- a/tests/API/Endpoints/PartEndpointTest.php
+++ b/tests/API/Endpoints/PartEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class PartEndpointTest extends CrudEndpointTestCase
+final class PartEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/PartLotsEndpointTest.php b/tests/API/Endpoints/PartLotsEndpointTest.php
index 38aa6b18..70f1f9ab 100644
--- a/tests/API/Endpoints/PartLotsEndpointTest.php
+++ b/tests/API/Endpoints/PartLotsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class PartLotsEndpointTest extends CrudEndpointTestCase
+final class PartLotsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/PricedetailsEndpointTest.php b/tests/API/Endpoints/PricedetailsEndpointTest.php
index 8895365f..5661c0c7 100644
--- a/tests/API/Endpoints/PricedetailsEndpointTest.php
+++ b/tests/API/Endpoints/PricedetailsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class PricedetailsEndpointTest extends CrudEndpointTestCase
+final class PricedetailsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/ProjectBOMEntriesEndpointTest.php b/tests/API/Endpoints/ProjectBOMEntriesEndpointTest.php
index cafb57dc..10dbf747 100644
--- a/tests/API/Endpoints/ProjectBOMEntriesEndpointTest.php
+++ b/tests/API/Endpoints/ProjectBOMEntriesEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class ProjectBOMEntriesEndpointTest extends CrudEndpointTestCase
+final class ProjectBOMEntriesEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/ProjectsEndpointTest.php b/tests/API/Endpoints/ProjectsEndpointTest.php
index 9daf584a..ea9cc6b4 100644
--- a/tests/API/Endpoints/ProjectsEndpointTest.php
+++ b/tests/API/Endpoints/ProjectsEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class ProjectsEndpointTest extends CrudEndpointTestCase
+final class ProjectsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/StorageLocationsEndpointTest.php b/tests/API/Endpoints/StorageLocationsEndpointTest.php
index 8d9641c4..11947e71 100644
--- a/tests/API/Endpoints/StorageLocationsEndpointTest.php
+++ b/tests/API/Endpoints/StorageLocationsEndpointTest.php
@@ -25,7 +25,7 @@ namespace API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class StorageLocationsEndpointTest extends CrudEndpointTestCase
+final class StorageLocationsEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/SuppliersEndpointTest.php b/tests/API/Endpoints/SuppliersEndpointTest.php
index 1941f849..bbb64e90 100644
--- a/tests/API/Endpoints/SuppliersEndpointTest.php
+++ b/tests/API/Endpoints/SuppliersEndpointTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\API\Endpoints;
use App\Tests\API\Endpoints\CrudEndpointTestCase;
-class SuppliersEndpointTest extends CrudEndpointTestCase
+final class SuppliersEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/API/Endpoints/UsersEndpointTest.php b/tests/API/Endpoints/UsersEndpointTest.php
index 0f075a7c..e6e18930 100644
--- a/tests/API/Endpoints/UsersEndpointTest.php
+++ b/tests/API/Endpoints/UsersEndpointTest.php
@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace App\Tests\API\Endpoints;
-class UsersEndpointTest extends CrudEndpointTestCase
+final class UsersEndpointTest extends CrudEndpointTestCase
{
protected function getBasePath(): string
diff --git a/tests/ApplicationAvailabilityFunctionalTest.php b/tests/ApplicationAvailabilityFunctionalTest.php
index d5bced49..c7449411 100644
--- a/tests/ApplicationAvailabilityFunctionalTest.php
+++ b/tests/ApplicationAvailabilityFunctionalTest.php
@@ -32,7 +32,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
*/
#[Group('DB')]
#[Group('slow')]
-class ApplicationAvailabilityFunctionalTest extends WebTestCase
+final class ApplicationAvailabilityFunctionalTest extends WebTestCase
{
#[DataProvider('urlProvider')]
public function testPageIsSuccessful(string $url): void
diff --git a/tests/Controller/AdminPages/AttachmentTypeController.php b/tests/Controller/AdminPages/AttachmentTypeController.php
index 599a6f69..90e6583d 100644
--- a/tests/Controller/AdminPages/AttachmentTypeController.php
+++ b/tests/Controller/AdminPages/AttachmentTypeController.php
@@ -27,7 +27,7 @@ use App\Entity\Attachments\AttachmentType;
#[Group('slow')]
#[Group('DB')]
-class AttachmentTypeController extends AbstractAdminController
+final class AttachmentTypeController extends AbstractAdminController
{
protected static string $base_path = '/en/attachment_type';
protected static string $entity_class = AttachmentType::class;
diff --git a/tests/Controller/AdminPages/CategoryController.php b/tests/Controller/AdminPages/CategoryController.php
index c1bac093..5d8396e7 100644
--- a/tests/Controller/AdminPages/CategoryController.php
+++ b/tests/Controller/AdminPages/CategoryController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\Category;
#[Group('slow')]
#[Group('DB')]
-class CategoryController extends AbstractAdminController
+final class CategoryController extends AbstractAdminController
{
protected static string $base_path = '/en/category';
protected static string $entity_class = Category::class;
diff --git a/tests/Controller/AdminPages/CurrencyController.php b/tests/Controller/AdminPages/CurrencyController.php
index 21f94a29..4ebd82e2 100644
--- a/tests/Controller/AdminPages/CurrencyController.php
+++ b/tests/Controller/AdminPages/CurrencyController.php
@@ -28,7 +28,7 @@ use App\Entity\Parts\Manufacturer;
#[Group('slow')]
#[Group('DB')]
-class CurrencyController extends AbstractAdminController
+final class CurrencyController extends AbstractAdminController
{
protected static string $base_path = '/en/currency';
protected static string $entity_class = Currency::class;
diff --git a/tests/Controller/AdminPages/FootprintController.php b/tests/Controller/AdminPages/FootprintController.php
index 7d617ba8..2643d3f1 100644
--- a/tests/Controller/AdminPages/FootprintController.php
+++ b/tests/Controller/AdminPages/FootprintController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\Footprint;
#[Group('slow')]
#[Group('DB')]
-class FootprintController extends AbstractAdminController
+final class FootprintController extends AbstractAdminController
{
protected static string $base_path = '/en/footprint';
protected static string $entity_class = Footprint::class;
diff --git a/tests/Controller/AdminPages/LabelProfileController.php b/tests/Controller/AdminPages/LabelProfileController.php
index 838d872e..d407701a 100644
--- a/tests/Controller/AdminPages/LabelProfileController.php
+++ b/tests/Controller/AdminPages/LabelProfileController.php
@@ -46,7 +46,7 @@ use PHPUnit\Framework\Attributes\Group;
use App\Entity\LabelSystem\LabelProfile;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
-class LabelProfileController extends AbstractAdminController
+final class LabelProfileController extends AbstractAdminController
{
protected static string $base_path = '/en/label_profile';
protected static string $entity_class = LabelProfile::class;
diff --git a/tests/Controller/AdminPages/ManufacturerController.php b/tests/Controller/AdminPages/ManufacturerController.php
index c2666f72..2a5ed386 100644
--- a/tests/Controller/AdminPages/ManufacturerController.php
+++ b/tests/Controller/AdminPages/ManufacturerController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\Manufacturer;
#[Group('slow')]
#[Group('DB')]
-class ManufacturerController extends AbstractAdminController
+final class ManufacturerController extends AbstractAdminController
{
protected static string $base_path = '/en/manufacturer';
protected static string $entity_class = Manufacturer::class;
diff --git a/tests/Controller/AdminPages/MeasurementUnitController.php b/tests/Controller/AdminPages/MeasurementUnitController.php
index 351f4e51..c15d4af4 100644
--- a/tests/Controller/AdminPages/MeasurementUnitController.php
+++ b/tests/Controller/AdminPages/MeasurementUnitController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\MeasurementUnit;
#[Group('slow')]
#[Group('DB')]
-class MeasurementUnitController extends AbstractAdminController
+final class MeasurementUnitController extends AbstractAdminController
{
protected static string $base_path = '/en/measurement_unit';
protected static string $entity_class = MeasurementUnit::class;
diff --git a/tests/Controller/AdminPages/PartCustomStateControllerTest.php b/tests/Controller/AdminPages/PartCustomStateControllerTest.php
index 3e87dfe2..77d1127c 100644
--- a/tests/Controller/AdminPages/PartCustomStateControllerTest.php
+++ b/tests/Controller/AdminPages/PartCustomStateControllerTest.php
@@ -27,7 +27,7 @@ use PHPUnit\Framework\Attributes\Group;
#[Group('slow')]
#[Group('DB')]
-class PartCustomStateControllerTest extends AbstractAdminController
+final class PartCustomStateControllerTest extends AbstractAdminController
{
protected static string $base_path = '/en/part_custom_state';
protected static string $entity_class = PartCustomState::class;
diff --git a/tests/Controller/AdminPages/ProjectController.php b/tests/Controller/AdminPages/ProjectController.php
index 1de4bf52..d7bec069 100644
--- a/tests/Controller/AdminPages/ProjectController.php
+++ b/tests/Controller/AdminPages/ProjectController.php
@@ -28,7 +28,7 @@ use App\Entity\ProjectSystem\Project;
#[Group('slow')]
#[Group('DB')]
-class ProjectController extends AbstractAdminController
+final class ProjectController extends AbstractAdminController
{
protected static string $base_path = '/en/project';
protected static string $entity_class = Project::class;
diff --git a/tests/Controller/AdminPages/StorelocationController.php b/tests/Controller/AdminPages/StorelocationController.php
index fee06c67..f19a5f6a 100644
--- a/tests/Controller/AdminPages/StorelocationController.php
+++ b/tests/Controller/AdminPages/StorelocationController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\StorageLocation;
#[Group('slow')]
#[Group('DB')]
-class StorelocationController extends AbstractAdminController
+final class StorelocationController extends AbstractAdminController
{
protected static string $base_path = '/en/store_location';
protected static string $entity_class = StorageLocation::class;
diff --git a/tests/Controller/AdminPages/SupplierController.php b/tests/Controller/AdminPages/SupplierController.php
index 3549eb4b..1e1d720a 100644
--- a/tests/Controller/AdminPages/SupplierController.php
+++ b/tests/Controller/AdminPages/SupplierController.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\Supplier;
#[Group('slow')]
#[Group('DB')]
-class SupplierController extends AbstractAdminController
+final class SupplierController extends AbstractAdminController
{
protected static string $base_path = '/en/supplier';
protected static string $entity_class = Supplier::class;
diff --git a/tests/Controller/BulkInfoProviderImportControllerTest.php b/tests/Controller/BulkInfoProviderImportControllerTest.php
index 8961d23b..ec3629fe 100644
--- a/tests/Controller/BulkInfoProviderImportControllerTest.php
+++ b/tests/Controller/BulkInfoProviderImportControllerTest.php
@@ -22,6 +22,8 @@ declare(strict_types=1);
namespace App\Tests\Controller;
+use App\Services\InfoProviderSystem\BulkInfoProviderService;
+use App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO;
use App\Entity\InfoProviderSystem\BulkImportJobStatus;
use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob;
use App\Entity\Parts\Part;
@@ -36,7 +38,7 @@ use Symfony\Component\HttpFoundation\Response;
#[Group("slow")]
#[Group("DB")]
-class BulkInfoProviderImportControllerTest extends WebTestCase
+final class BulkInfoProviderImportControllerTest extends WebTestCase
{
public function testStep1WithoutIds(): void
{
@@ -174,8 +176,8 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
// Verify the template rendered the source_field and source_keyword correctly
$content = $client->getResponse()->getContent();
- $this->assertStringContainsString('test_field', $content);
- $this->assertStringContainsString('test_keyword', $content);
+ $this->assertStringContainsString('test_field', (string) $content);
+ $this->assertStringContainsString('test_keyword', (string) $content);
// Clean up - find by ID to avoid detached entity issues
$jobId = $job->getId();
@@ -607,7 +609,7 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
$this->assertResponseStatusCodeSame(Response::HTTP_OK);
- $this->assertStringContainsString('Bulk Info Provider Import', $client->getResponse()->getContent());
+ $this->assertStringContainsString('Bulk Info Provider Import', (string) $client->getResponse()->getContent());
}
public function testStep1FormSubmissionWithErrors(): void
@@ -630,7 +632,7 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
$this->assertResponseStatusCodeSame(Response::HTTP_OK);
- $this->assertStringContainsString('Bulk Info Provider Import', $client->getResponse()->getContent());
+ $this->assertStringContainsString('Bulk Info Provider Import', (string) $client->getResponse()->getContent());
}
public function testBulkInfoProviderServiceKeywordExtraction(): void
@@ -647,18 +649,18 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
// Test that the service can extract keywords from parts
- $bulkService = $client->getContainer()->get(\App\Services\InfoProviderSystem\BulkInfoProviderService::class);
+ $bulkService = $client->getContainer()->get(BulkInfoProviderService::class);
// Create field mappings to verify the service works
$fieldMappings = [
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO('name', ['test'], 1),
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO('mpn', ['test'], 2)
+ new BulkSearchFieldMappingDTO('name', ['test'], 1),
+ new BulkSearchFieldMappingDTO('mpn', ['test'], 2)
];
// The service may return an empty result or throw when no results are found
try {
$result = $bulkService->performBulkSearch([$part], $fieldMappings, false);
- $this->assertInstanceOf(\App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO::class, $result);
+ $this->assertInstanceOf(BulkSearchResponseDTO::class, $result);
} catch (\RuntimeException $e) {
$this->assertStringContainsString('No search results found', $e->getMessage());
}
@@ -725,12 +727,12 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
// Test that the service can handle supplier part number fields
- $bulkService = $client->getContainer()->get(\App\Services\InfoProviderSystem\BulkInfoProviderService::class);
+ $bulkService = $client->getContainer()->get(BulkInfoProviderService::class);
// Create field mappings with supplier SPN field mapping
$fieldMappings = [
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO('invalid_field', ['test'], 1),
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO('test_supplier_spn', ['test'], 2)
+ new BulkSearchFieldMappingDTO('invalid_field', ['test'], 1),
+ new BulkSearchFieldMappingDTO('test_supplier_spn', ['test'], 2)
];
// The service should be able to process the request and throw an exception when no results are found
@@ -756,11 +758,11 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
// Test that the service can handle batch processing
- $bulkService = $client->getContainer()->get(\App\Services\InfoProviderSystem\BulkInfoProviderService::class);
+ $bulkService = $client->getContainer()->get(BulkInfoProviderService::class);
// Create field mappings with multiple keywords
$fieldMappings = [
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO('empty', ['test'], 1)
+ new BulkSearchFieldMappingDTO('empty', ['test'], 1)
];
// The service should be able to process the request and throw an exception when no results are found
@@ -786,7 +788,7 @@ class BulkInfoProviderImportControllerTest extends WebTestCase
}
// Test that the service can handle prefetch details
- $bulkService = $client->getContainer()->get(\App\Services\InfoProviderSystem\BulkInfoProviderService::class);
+ $bulkService = $client->getContainer()->get(BulkInfoProviderService::class);
// Create empty search results to test prefetch method
$searchResults = new BulkSearchResponseDTO([
diff --git a/tests/Controller/KiCadApiControllerTest.php b/tests/Controller/KiCadApiControllerTest.php
index a66cb8a4..9d33512a 100644
--- a/tests/Controller/KiCadApiControllerTest.php
+++ b/tests/Controller/KiCadApiControllerTest.php
@@ -27,7 +27,7 @@ use App\DataFixtures\APITokenFixtures;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class KiCadApiControllerTest extends WebTestCase
+final class KiCadApiControllerTest extends WebTestCase
{
private const BASE_URL = '/en/kicad-api/v1';
diff --git a/tests/Controller/PartControllerTest.php b/tests/Controller/PartControllerTest.php
index 8c9f3729..c15bdd51 100644
--- a/tests/Controller/PartControllerTest.php
+++ b/tests/Controller/PartControllerTest.php
@@ -38,7 +38,7 @@ use Symfony\Component\HttpFoundation\Response;
#[Group("slow")]
#[Group("DB")]
-class PartControllerTest extends WebTestCase
+final class PartControllerTest extends WebTestCase
{
public function testShowPart(): void
{
diff --git a/tests/Controller/RedirectControllerTest.php b/tests/Controller/RedirectControllerTest.php
index ac2776e5..420b0f49 100644
--- a/tests/Controller/RedirectControllerTest.php
+++ b/tests/Controller/RedirectControllerTest.php
@@ -33,7 +33,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
#[Group('slow')]
#[Group('DB')]
-class RedirectControllerTest extends WebTestCase
+final class RedirectControllerTest extends WebTestCase
{
protected EntityManagerInterface $em;
protected UserRepository $userRepo;
diff --git a/tests/Controller/ScanControllerTest.php b/tests/Controller/ScanControllerTest.php
index 98992e09..b504cd29 100644
--- a/tests/Controller/ScanControllerTest.php
+++ b/tests/Controller/ScanControllerTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class ScanControllerTest extends WebTestCase
+final class ScanControllerTest extends WebTestCase
{
private ?KernelBrowser $client = null;
diff --git a/tests/DataTables/Filters/CompoundFilterTraitTest.php b/tests/DataTables/Filters/CompoundFilterTraitTest.php
index 93f3c1e1..d9bf20b0 100644
--- a/tests/DataTables/Filters/CompoundFilterTraitTest.php
+++ b/tests/DataTables/Filters/CompoundFilterTraitTest.php
@@ -27,7 +27,7 @@ use App\DataTables\Filters\FilterInterface;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
-class CompoundFilterTraitTest extends TestCase
+final class CompoundFilterTraitTest extends TestCase
{
public function testFindAllChildFiltersEmpty(): void
@@ -49,9 +49,9 @@ class CompoundFilterTraitTest extends TestCase
public function testFindAllChildFilters(): void
{
- $f1 = $this->createMock(FilterInterface::class);
- $f2 = $this->createMock(FilterInterface::class);
- $f3 = $this->createMock(FilterInterface::class);
+ $f1 = $this->createStub(FilterInterface::class);
+ $f2 = $this->createStub(FilterInterface::class);
+ $f3 = $this->createStub(FilterInterface::class);
$filter = new class($f1, $f2, $f3, null) {
use CompoundFilterTrait;
@@ -108,7 +108,7 @@ class CompoundFilterTraitTest extends TestCase
}
};
- $qb = $this->createMock(QueryBuilder::class);
+ $qb = $this->createStub(QueryBuilder::class);
$filter->_applyAllChildFilters($qb);
}
diff --git a/tests/DataTables/Filters/Constraints/FilterTraitTest.php b/tests/DataTables/Filters/Constraints/FilterTraitTest.php
index e1e459d5..a7493dcf 100644
--- a/tests/DataTables/Filters/Constraints/FilterTraitTest.php
+++ b/tests/DataTables/Filters/Constraints/FilterTraitTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\DataTables\Filters\Constraints\FilterTrait;
use PHPUnit\Framework\TestCase;
-class FilterTraitTest extends TestCase
+final class FilterTraitTest extends TestCase
{
use FilterTrait;
diff --git a/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php b/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php
index 816a8035..333b9af5 100644
--- a/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php
+++ b/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php
@@ -28,7 +28,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
-class BulkImportJobStatusConstraintTest extends TestCase
+final class BulkImportJobStatusConstraintTest extends TestCase
{
private BulkImportJobStatusConstraint $constraint;
private QueryBuilder $queryBuilder;
@@ -46,7 +46,7 @@ class BulkImportJobStatusConstraintTest extends TestCase
public function testConstructor(): void
{
- $this->assertEquals([], $this->constraint->getValue());
+ $this->assertSame([], $this->constraint->getValue());
$this->assertEmpty($this->constraint->getOperator());
$this->assertFalse($this->constraint->isEnabled());
}
@@ -56,7 +56,7 @@ class BulkImportJobStatusConstraintTest extends TestCase
$values = ['pending', 'in_progress'];
$this->constraint->setValue($values);
- $this->assertEquals($values, $this->constraint->getValue());
+ $this->assertSame($values, $this->constraint->getValue());
}
public function testGetAndSetOperator(): void
@@ -64,7 +64,7 @@ class BulkImportJobStatusConstraintTest extends TestCase
$operator = 'ANY';
$this->constraint->setOperator($operator);
- $this->assertEquals($operator, $this->constraint->getOperator());
+ $this->assertSame($operator, $this->constraint->getOperator());
}
public function testIsEnabledWithEmptyValues(): void
diff --git a/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php b/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php
index bc110eda..e2b37287 100644
--- a/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php
+++ b/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php
@@ -28,7 +28,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
-class BulkImportPartStatusConstraintTest extends TestCase
+final class BulkImportPartStatusConstraintTest extends TestCase
{
private BulkImportPartStatusConstraint $constraint;
private QueryBuilder $queryBuilder;
@@ -46,7 +46,7 @@ class BulkImportPartStatusConstraintTest extends TestCase
public function testConstructor(): void
{
- $this->assertEquals([], $this->constraint->getValue());
+ $this->assertSame([], $this->constraint->getValue());
$this->assertEmpty($this->constraint->getOperator());
$this->assertFalse($this->constraint->isEnabled());
}
@@ -56,7 +56,7 @@ class BulkImportPartStatusConstraintTest extends TestCase
$values = ['pending', 'completed', 'skipped'];
$this->constraint->setValue($values);
- $this->assertEquals($values, $this->constraint->getValue());
+ $this->assertSame($values, $this->constraint->getValue());
}
public function testGetAndSetOperator(): void
@@ -64,7 +64,7 @@ class BulkImportPartStatusConstraintTest extends TestCase
$operator = 'ANY';
$this->constraint->setOperator($operator);
- $this->assertEquals($operator, $this->constraint->getOperator());
+ $this->assertSame($operator, $this->constraint->getOperator());
}
public function testIsEnabledWithEmptyValues(): void
@@ -294,6 +294,6 @@ class BulkImportPartStatusConstraintTest extends TestCase
$this->constraint->apply($this->queryBuilder);
- $this->assertEquals($statusValues, $this->constraint->getValue());
+ $this->assertSame($statusValues, $this->constraint->getValue());
}
}
diff --git a/tests/DatatablesAvailabilityTest.php b/tests/DatatablesAvailabilityTest.php
index dad61be3..1447da73 100644
--- a/tests/DatatablesAvailabilityTest.php
+++ b/tests/DatatablesAvailabilityTest.php
@@ -44,7 +44,7 @@ namespace App\Tests;
use PHPUnit\Framework\Attributes\DataProvider;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class DatatablesAvailabilityTest extends WebTestCase
+final class DatatablesAvailabilityTest extends WebTestCase
{
#[DataProvider('urlProvider')]
public function testDataTable(string $url, ?array $ordering = null): void
diff --git a/tests/Doctrine/SQLiteRegexMiddlewareTest.php b/tests/Doctrine/SQLiteRegexMiddlewareTest.php
index 67410f76..aa5e4da1 100644
--- a/tests/Doctrine/SQLiteRegexMiddlewareTest.php
+++ b/tests/Doctrine/SQLiteRegexMiddlewareTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Doctrine\Middleware\SQLiteRegexExtensionMiddlewareDriver;
use PHPUnit\Framework\TestCase;
-class SQLiteRegexMiddlewareTest extends TestCase
+final class SQLiteRegexMiddlewareTest extends TestCase
{
public static function regexpDataProvider(): \Generator
diff --git a/tests/Entity/Attachments/AttachmentTest.php b/tests/Entity/Attachments/AttachmentTest.php
index 35222d63..9e912b97 100644
--- a/tests/Entity/Attachments/AttachmentTest.php
+++ b/tests/Entity/Attachments/AttachmentTest.php
@@ -55,7 +55,7 @@ use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
-class AttachmentTest extends TestCase
+final class AttachmentTest extends TestCase
{
public function testEmptyState(): void
{
@@ -279,4 +279,32 @@ class AttachmentTest extends TestCase
$reflection_property->setAccessible(true);
$reflection_property->setValue($object, $value);
}
+
+ public function testIsLocalHTMLFile(): void
+ {
+ $attachment = new PartAttachment();
+
+ $attachment->setExternalPath('https://google.de');
+ $this->assertFalse($attachment->isLocalHTMLFile());
+
+ $attachment->setExternalPath('https://google.de/test.html');
+ $this->assertFalse($attachment->isLocalHTMLFile());
+
+ $attachment->setInternalPath('%MEDIA%/test.html');
+ $this->assertTrue($attachment->isLocalHTMLFile());
+
+ $attachment->setInternalPath('%MEDIA%/test.htm');
+ $this->assertTrue($attachment->isLocalHTMLFile());
+
+ $attachment->setInternalPath('%MEDIA%/test.txt');
+ $this->assertFalse($attachment->isLocalHTMLFile());
+
+ //It works however, if the file is stored as txt, and the internal filename ends with .html
+ $attachment->setInternalPath('%MEDIA%/test.txt');
+ $this->setProtectedProperty($attachment, 'original_filename', 'test.html');
+ $this->assertTrue($attachment->isLocalHTMLFile());
+
+ $this->setProtectedProperty($attachment, 'original_filename', 'test.htm');
+ $this->assertTrue($attachment->isLocalHTMLFile());
+ }
}
diff --git a/tests/Entity/Attachments/AttachmentTypeTest.php b/tests/Entity/Attachments/AttachmentTypeTest.php
index f9f781d8..c966d23f 100644
--- a/tests/Entity/Attachments/AttachmentTypeTest.php
+++ b/tests/Entity/Attachments/AttachmentTypeTest.php
@@ -23,10 +23,12 @@ declare(strict_types=1);
namespace App\Tests\Entity\Attachments;
use App\Entity\Attachments\AttachmentType;
+use App\Entity\Attachments\PartAttachment;
+use App\Entity\Attachments\UserAttachment;
use Doctrine\Common\Collections\Collection;
use PHPUnit\Framework\TestCase;
-class AttachmentTypeTest extends TestCase
+final class AttachmentTypeTest extends TestCase
{
public function testEmptyState(): void
{
@@ -34,4 +36,51 @@ class AttachmentTypeTest extends TestCase
$this->assertInstanceOf(Collection::class, $attachment_type->getAttachmentsForType());
$this->assertEmpty($attachment_type->getFiletypeFilter());
}
+
+ public function testSetAllowedTargets(): void
+ {
+ $attachmentType = new AttachmentType();
+
+
+ $this->expectException(\InvalidArgumentException::class);
+ $attachmentType->setAllowedTargets(['target1', 'target2']);
+ }
+
+ public function testGetSetAllowedTargets(): void
+ {
+ $attachmentType = new AttachmentType();
+
+ $attachmentType->setAllowedTargets([PartAttachment::class, UserAttachment::class]);
+ $this->assertSame([PartAttachment::class, UserAttachment::class], $attachmentType->getAllowedTargets());
+ //Caching should also work
+ $this->assertSame([PartAttachment::class, UserAttachment::class], $attachmentType->getAllowedTargets());
+
+ //Setting null should reset the allowed targets
+ $attachmentType->setAllowedTargets(null);
+ $this->assertNull($attachmentType->getAllowedTargets());
+ }
+
+ public function testIsAllowedForTarget(): void
+ {
+ $attachmentType = new AttachmentType();
+
+ //By default, all targets should be allowed
+ $this->assertTrue($attachmentType->isAllowedForTarget(PartAttachment::class));
+ $this->assertTrue($attachmentType->isAllowedForTarget(UserAttachment::class));
+
+ //Set specific allowed targets
+ $attachmentType->setAllowedTargets([PartAttachment::class]);
+ $this->assertTrue($attachmentType->isAllowedForTarget(PartAttachment::class));
+ $this->assertFalse($attachmentType->isAllowedForTarget(UserAttachment::class));
+
+ //Set both targets
+ $attachmentType->setAllowedTargets([PartAttachment::class, UserAttachment::class]);
+ $this->assertTrue($attachmentType->isAllowedForTarget(PartAttachment::class));
+ $this->assertTrue($attachmentType->isAllowedForTarget(UserAttachment::class));
+
+ //Reset allowed targets
+ $attachmentType->setAllowedTargets(null);
+ $this->assertTrue($attachmentType->isAllowedForTarget(PartAttachment::class));
+ $this->assertTrue($attachmentType->isAllowedForTarget(UserAttachment::class));
+ }
}
diff --git a/tests/Entity/Base/AbstractStructuralDBElementTest.php b/tests/Entity/Base/AbstractStructuralDBElementTest.php
index 3f8157ad..90a7dee2 100644
--- a/tests/Entity/Base/AbstractStructuralDBElementTest.php
+++ b/tests/Entity/Base/AbstractStructuralDBElementTest.php
@@ -31,7 +31,7 @@ use PHPUnit\Framework\TestCase;
* Test StructuralDBElement entities.
* Note: Because StructuralDBElement is abstract we use AttachmentType here as a placeholder.
*/
-class AbstractStructuralDBElementTest extends TestCase
+final class AbstractStructuralDBElementTest extends TestCase
{
protected AttachmentType $root;
protected AttachmentType $child1;
diff --git a/tests/Entity/BulkImportJobStatusTest.php b/tests/Entity/BulkImportJobStatusTest.php
index e8b4a977..c38d62e2 100644
--- a/tests/Entity/BulkImportJobStatusTest.php
+++ b/tests/Entity/BulkImportJobStatusTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Entity;
use App\Entity\InfoProviderSystem\BulkImportJobStatus;
use PHPUnit\Framework\TestCase;
-class BulkImportJobStatusTest extends TestCase
+final class BulkImportJobStatusTest extends TestCase
{
public function testEnumValues(): void
{
diff --git a/tests/Entity/BulkInfoProviderImportJobPartTest.php b/tests/Entity/BulkInfoProviderImportJobPartTest.php
index dd9600dd..94b05637 100644
--- a/tests/Entity/BulkInfoProviderImportJobPartTest.php
+++ b/tests/Entity/BulkInfoProviderImportJobPartTest.php
@@ -28,32 +28,25 @@ use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart;
use App\Entity\Parts\Part;
use PHPUnit\Framework\TestCase;
-class BulkInfoProviderImportJobPartTest extends TestCase
+final class BulkInfoProviderImportJobPartTest extends TestCase
{
- private BulkInfoProviderImportJob $job;
- private Part $part;
private BulkInfoProviderImportJobPart $jobPart;
protected function setUp(): void
{
- $this->job = $this->createMock(BulkInfoProviderImportJob::class);
- $this->part = $this->createMock(Part::class);
-
- $this->jobPart = new BulkInfoProviderImportJobPart($this->job, $this->part);
+ $this->jobPart = new BulkInfoProviderImportJobPart($this->createStub(BulkInfoProviderImportJob::class), $this->createStub(Part::class));
}
public function testConstructor(): void
{
- $this->assertSame($this->job, $this->jobPart->getJob());
- $this->assertSame($this->part, $this->jobPart->getPart());
- $this->assertEquals(BulkImportPartStatus::PENDING, $this->jobPart->getStatus());
+ $this->assertSame(BulkImportPartStatus::PENDING, $this->jobPart->getStatus());
$this->assertNull($this->jobPart->getReason());
$this->assertNull($this->jobPart->getCompletedAt());
}
public function testGetAndSetJob(): void
{
- $newJob = $this->createMock(BulkInfoProviderImportJob::class);
+ $newJob = $this->createStub(BulkInfoProviderImportJob::class);
$result = $this->jobPart->setJob($newJob);
@@ -63,7 +56,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
public function testGetAndSetPart(): void
{
- $newPart = $this->createMock(Part::class);
+ $newPart = $this->createStub(Part::class);
$result = $this->jobPart->setPart($newPart);
@@ -76,7 +69,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$result = $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED);
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus());
+ $this->assertSame(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus());
}
public function testGetAndSetReason(): void
@@ -86,7 +79,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$result = $this->jobPart->setReason($reason);
$this->assertSame($this->jobPart, $result);
- $this->assertEquals($reason, $this->jobPart->getReason());
+ $this->assertSame($reason, $this->jobPart->getReason());
}
public function testGetAndSetCompletedAt(): void
@@ -108,7 +101,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$afterTime = new \DateTimeImmutable();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus());
+ $this->assertSame(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
$this->assertGreaterThanOrEqual($beforeTime, $this->jobPart->getCompletedAt());
$this->assertLessThanOrEqual($afterTime, $this->jobPart->getCompletedAt());
@@ -124,8 +117,8 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$afterTime = new \DateTimeImmutable();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus());
- $this->assertEquals($reason, $this->jobPart->getReason());
+ $this->assertSame(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus());
+ $this->assertSame($reason, $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
$this->assertGreaterThanOrEqual($beforeTime, $this->jobPart->getCompletedAt());
$this->assertLessThanOrEqual($afterTime, $this->jobPart->getCompletedAt());
@@ -136,8 +129,8 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$result = $this->jobPart->markAsSkipped();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus());
- $this->assertEquals('', $this->jobPart->getReason());
+ $this->assertSame(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus());
+ $this->assertSame('', $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
}
@@ -151,8 +144,8 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$afterTime = new \DateTimeImmutable();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::FAILED, $this->jobPart->getStatus());
- $this->assertEquals($reason, $this->jobPart->getReason());
+ $this->assertSame(BulkImportPartStatus::FAILED, $this->jobPart->getStatus());
+ $this->assertSame($reason, $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
$this->assertGreaterThanOrEqual($beforeTime, $this->jobPart->getCompletedAt());
$this->assertLessThanOrEqual($afterTime, $this->jobPart->getCompletedAt());
@@ -163,8 +156,8 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$result = $this->jobPart->markAsFailed();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::FAILED, $this->jobPart->getStatus());
- $this->assertEquals('', $this->jobPart->getReason());
+ $this->assertSame(BulkImportPartStatus::FAILED, $this->jobPart->getStatus());
+ $this->assertSame('', $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
}
@@ -176,7 +169,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
$result = $this->jobPart->markAsPending();
$this->assertSame($this->jobPart, $result);
- $this->assertEquals(BulkImportPartStatus::PENDING, $this->jobPart->getStatus());
+ $this->assertSame(BulkImportPartStatus::PENDING, $this->jobPart->getStatus());
$this->assertNull($this->jobPart->getReason());
$this->assertNull($this->jobPart->getCompletedAt());
}
@@ -281,7 +274,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
// After marking as skipped, should have reason and completion time
$this->jobPart->markAsSkipped('Skipped reason');
- $this->assertEquals('Skipped reason', $this->jobPart->getReason());
+ $this->assertSame('Skipped reason', $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
// After marking as pending, reason and completion time should be cleared
@@ -291,7 +284,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase
// After marking as failed, should have reason and completion time
$this->jobPart->markAsFailed('Failed reason');
- $this->assertEquals('Failed reason', $this->jobPart->getReason());
+ $this->assertSame('Failed reason', $this->jobPart->getReason());
$this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt());
// After marking as completed, should have completion time (reason may remain from previous state)
diff --git a/tests/Entity/BulkInfoProviderImportJobTest.php b/tests/Entity/BulkInfoProviderImportJobTest.php
index c9841ac4..d1a854cd 100644
--- a/tests/Entity/BulkInfoProviderImportJobTest.php
+++ b/tests/Entity/BulkInfoProviderImportJobTest.php
@@ -22,6 +22,8 @@ declare(strict_types=1);
namespace App\Tests\Entity;
+use App\Entity\Parts\Part;
+use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO;
use App\Entity\InfoProviderSystem\BulkImportJobStatus;
use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob;
use App\Entity\UserSystem\User;
@@ -31,7 +33,7 @@ use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO;
use App\Services\InfoProviderSystem\DTOs\SearchResultDTO;
use PHPUnit\Framework\TestCase;
-class BulkInfoProviderImportJobTest extends TestCase
+final class BulkInfoProviderImportJobTest extends TestCase
{
private BulkInfoProviderImportJob $job;
private User $user;
@@ -45,9 +47,9 @@ class BulkInfoProviderImportJobTest extends TestCase
$this->job->setCreatedBy($this->user);
}
- private function createMockPart(int $id): \App\Entity\Parts\Part
+ private function createMockPart(int $id): Part
{
- $part = $this->createMock(\App\Entity\Parts\Part::class);
+ $part = $this->createMock(Part::class);
$part->method('getId')->willReturn($id);
$part->method('getName')->willReturn("Test Part {$id}");
return $part;
@@ -58,7 +60,7 @@ class BulkInfoProviderImportJobTest extends TestCase
$job = new BulkInfoProviderImportJob();
$this->assertInstanceOf(\DateTimeImmutable::class, $job->getCreatedAt());
- $this->assertEquals(BulkImportJobStatus::PENDING, $job->getStatus());
+ $this->assertSame(BulkImportJobStatus::PENDING, $job->getStatus());
$this->assertEmpty($job->getPartIds());
$this->assertEmpty($job->getFieldMappings());
$this->assertEmpty($job->getSearchResultsRaw());
@@ -70,14 +72,14 @@ class BulkInfoProviderImportJobTest extends TestCase
public function testBasicGettersSetters(): void
{
$this->job->setName('Test Job');
- $this->assertEquals('Test Job', $this->job->getName());
+ $this->assertSame('Test Job', $this->job->getName());
// Test with actual parts - this is what actually works
$parts = [$this->createMockPart(1), $this->createMockPart(2), $this->createMockPart(3)];
foreach ($parts as $part) {
$this->job->addPart($part);
}
- $this->assertEquals([1, 2, 3], $this->job->getPartIds());
+ $this->assertSame([1, 2, 3], $this->job->getPartIds());
$fieldMappings = [new BulkSearchFieldMappingDTO(field: 'field1', providers: ['provider1', 'provider2'])];
$this->job->setFieldMappings($fieldMappings);
@@ -98,24 +100,24 @@ class BulkInfoProviderImportJobTest extends TestCase
$this->assertFalse($this->job->isStopped());
$this->job->markAsInProgress();
- $this->assertEquals(BulkImportJobStatus::IN_PROGRESS, $this->job->getStatus());
+ $this->assertSame(BulkImportJobStatus::IN_PROGRESS, $this->job->getStatus());
$this->assertTrue($this->job->isInProgress());
$this->assertFalse($this->job->isPending());
$this->job->markAsCompleted();
- $this->assertEquals(BulkImportJobStatus::COMPLETED, $this->job->getStatus());
+ $this->assertSame(BulkImportJobStatus::COMPLETED, $this->job->getStatus());
$this->assertTrue($this->job->isCompleted());
$this->assertNotNull($this->job->getCompletedAt());
$job2 = new BulkInfoProviderImportJob();
$job2->markAsFailed();
- $this->assertEquals(BulkImportJobStatus::FAILED, $job2->getStatus());
+ $this->assertSame(BulkImportJobStatus::FAILED, $job2->getStatus());
$this->assertTrue($job2->isFailed());
$this->assertNotNull($job2->getCompletedAt());
$job3 = new BulkInfoProviderImportJob();
$job3->markAsStopped();
- $this->assertEquals(BulkImportJobStatus::STOPPED, $job3->getStatus());
+ $this->assertSame(BulkImportJobStatus::STOPPED, $job3->getStatus());
$this->assertTrue($job3->isStopped());
$this->assertNotNull($job3->getCompletedAt());
}
@@ -139,7 +141,7 @@ class BulkInfoProviderImportJobTest extends TestCase
public function testPartCount(): void
{
- $this->assertEquals(0, $this->job->getPartCount());
+ $this->assertSame(0, $this->job->getPartCount());
// Test with actual parts - setPartIds doesn't actually add parts
$parts = [
@@ -152,31 +154,31 @@ class BulkInfoProviderImportJobTest extends TestCase
foreach ($parts as $part) {
$this->job->addPart($part);
}
- $this->assertEquals(5, $this->job->getPartCount());
+ $this->assertSame(5, $this->job->getPartCount());
}
public function testResultCount(): void
{
- $this->assertEquals(0, $this->job->getResultCount());
+ $this->assertSame(0, $this->job->getResultCount());
$searchResults = new BulkSearchResponseDTO([
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO(
+ new BulkSearchPartResultsDTO(
part: $this->createMockPart(1),
searchResults: [new BulkSearchPartResultDTO(searchResult: new SearchResultDTO(provider_key: 'dummy', provider_id: '1234', name: 'Part 1', description: 'A part'))]
),
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO(
+ new BulkSearchPartResultsDTO(
part: $this->createMockPart(2),
searchResults: [new BulkSearchPartResultDTO(searchResult: new SearchResultDTO(provider_key: 'dummy', provider_id: '1234', name: 'Part 2', description: 'A part')),
new BulkSearchPartResultDTO(searchResult: new SearchResultDTO(provider_key: 'dummy', provider_id: '5678', name: 'Part 2 Alt', description: 'Another part'))]
),
- new \App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO(
+ new BulkSearchPartResultsDTO(
part: $this->createMockPart(3),
searchResults: []
)
]);
$this->job->setSearchResults($searchResults);
- $this->assertEquals(3, $this->job->getResultCount());
+ $this->assertSame(3, $this->job->getResultCount());
}
public function testPartProgressTracking(): void
@@ -222,21 +224,21 @@ class BulkInfoProviderImportJobTest extends TestCase
$this->job->addPart($part);
}
- $this->assertEquals(0, $this->job->getCompletedPartsCount());
- $this->assertEquals(0, $this->job->getSkippedPartsCount());
+ $this->assertSame(0, $this->job->getCompletedPartsCount());
+ $this->assertSame(0, $this->job->getSkippedPartsCount());
$this->job->markPartAsCompleted(1);
$this->job->markPartAsCompleted(2);
$this->job->markPartAsSkipped(3, 'Error');
- $this->assertEquals(2, $this->job->getCompletedPartsCount());
- $this->assertEquals(1, $this->job->getSkippedPartsCount());
+ $this->assertSame(2, $this->job->getCompletedPartsCount());
+ $this->assertSame(1, $this->job->getSkippedPartsCount());
}
public function testProgressPercentage(): void
{
$emptyJob = new BulkInfoProviderImportJob();
- $this->assertEquals(100.0, $emptyJob->getProgressPercentage());
+ $this->assertEqualsWithDelta(100.0, $emptyJob->getProgressPercentage(), PHP_FLOAT_EPSILON);
// Test with actual parts - setPartIds doesn't actually add parts
$parts = [
@@ -250,18 +252,18 @@ class BulkInfoProviderImportJobTest extends TestCase
$this->job->addPart($part);
}
- $this->assertEquals(0.0, $this->job->getProgressPercentage());
+ $this->assertEqualsWithDelta(0.0, $this->job->getProgressPercentage(), PHP_FLOAT_EPSILON);
$this->job->markPartAsCompleted(1);
$this->job->markPartAsCompleted(2);
- $this->assertEquals(40.0, $this->job->getProgressPercentage());
+ $this->assertEqualsWithDelta(40.0, $this->job->getProgressPercentage(), PHP_FLOAT_EPSILON);
$this->job->markPartAsSkipped(3, 'Error');
- $this->assertEquals(60.0, $this->job->getProgressPercentage());
+ $this->assertEqualsWithDelta(60.0, $this->job->getProgressPercentage(), PHP_FLOAT_EPSILON);
$this->job->markPartAsCompleted(4);
$this->job->markPartAsCompleted(5);
- $this->assertEquals(100.0, $this->job->getProgressPercentage());
+ $this->assertEqualsWithDelta(100.0, $this->job->getProgressPercentage(), PHP_FLOAT_EPSILON);
}
public function testIsAllPartsCompleted(): void
@@ -301,8 +303,8 @@ class BulkInfoProviderImportJobTest extends TestCase
$this->job->addPart($part);
}
- $this->assertEquals('info_providers.bulk_import.job_name_template', $this->job->getDisplayNameKey());
- $this->assertEquals(['%count%' => 3], $this->job->getDisplayNameParams());
+ $this->assertSame('info_providers.bulk_import.job_name_template', $this->job->getDisplayNameKey());
+ $this->assertSame(['%count%' => 3], $this->job->getDisplayNameParams());
}
public function testFormattedTimestamp(): void
diff --git a/tests/Entity/LogSystem/AbstractLogEntryTest.php b/tests/Entity/LogSystem/AbstractLogEntryTest.php
index 3f223693..d99b8e73 100644
--- a/tests/Entity/LogSystem/AbstractLogEntryTest.php
+++ b/tests/Entity/LogSystem/AbstractLogEntryTest.php
@@ -58,7 +58,7 @@ use App\Entity\UserSystem\Group;
use App\Entity\UserSystem\User;
use PHPUnit\Framework\TestCase;
-class AbstractLogEntryTest extends TestCase
+final class AbstractLogEntryTest extends TestCase
{
public function testSetGetTarget(): void
{
diff --git a/tests/Entity/LogSystem/LogLevelTest.php b/tests/Entity/LogSystem/LogLevelTest.php
index 402942e1..0125b0cd 100644
--- a/tests/Entity/LogSystem/LogLevelTest.php
+++ b/tests/Entity/LogSystem/LogLevelTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Entity\LogSystem;
use App\Entity\LogSystem\LogLevel;
use PHPUnit\Framework\TestCase;
-class LogLevelTest extends TestCase
+final class LogLevelTest extends TestCase
{
public function testToPSR3LevelString(): void
diff --git a/tests/Entity/LogSystem/LogTargetTypeTest.php b/tests/Entity/LogSystem/LogTargetTypeTest.php
index 46682496..06e2ead1 100644
--- a/tests/Entity/LogSystem/LogTargetTypeTest.php
+++ b/tests/Entity/LogSystem/LogTargetTypeTest.php
@@ -30,7 +30,7 @@ use App\Entity\Parts\Category;
use App\Entity\UserSystem\User;
use PHPUnit\Framework\TestCase;
-class LogTargetTypeTest extends TestCase
+final class LogTargetTypeTest extends TestCase
{
public function testToClass(): void
diff --git a/tests/Entity/Parameters/PartParameterTest.php b/tests/Entity/Parameters/PartParameterTest.php
index 64550eee..6a07468e 100644
--- a/tests/Entity/Parameters/PartParameterTest.php
+++ b/tests/Entity/Parameters/PartParameterTest.php
@@ -45,7 +45,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Entity\Parameters\PartParameter;
use PHPUnit\Framework\TestCase;
-class PartParameterTest extends TestCase
+final class PartParameterTest extends TestCase
{
public static function valueWithUnitDataProvider(): \Iterator
{
diff --git a/tests/Entity/Parts/InfoProviderReferenceTest.php b/tests/Entity/Parts/InfoProviderReferenceTest.php
index a1a8d5de..dcc6a43c 100644
--- a/tests/Entity/Parts/InfoProviderReferenceTest.php
+++ b/tests/Entity/Parts/InfoProviderReferenceTest.php
@@ -26,7 +26,7 @@ use App\Entity\Parts\InfoProviderReference;
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
use PHPUnit\Framework\TestCase;
-class InfoProviderReferenceTest extends TestCase
+final class InfoProviderReferenceTest extends TestCase
{
public function testNoProvider(): void
{
diff --git a/tests/Entity/Parts/PartAssociationTest.php b/tests/Entity/Parts/PartAssociationTest.php
index e002846e..25487d1f 100644
--- a/tests/Entity/Parts/PartAssociationTest.php
+++ b/tests/Entity/Parts/PartAssociationTest.php
@@ -26,7 +26,7 @@ use App\Entity\Parts\AssociationType;
use App\Entity\Parts\PartAssociation;
use PHPUnit\Framework\TestCase;
-class PartAssociationTest extends TestCase
+final class PartAssociationTest extends TestCase
{
public function testGetTypeTranslationKey(): void
diff --git a/tests/Entity/Parts/PartLotTest.php b/tests/Entity/Parts/PartLotTest.php
index 30687b72..10cc80b9 100644
--- a/tests/Entity/Parts/PartLotTest.php
+++ b/tests/Entity/Parts/PartLotTest.php
@@ -26,7 +26,7 @@ use App\Entity\Parts\PartLot;
use DateTime;
use PHPUnit\Framework\TestCase;
-class PartLotTest extends TestCase
+final class PartLotTest extends TestCase
{
public function testIsExpired(): void
{
diff --git a/tests/Entity/Parts/PartTest.php b/tests/Entity/Parts/PartTest.php
index c1ae8935..e855c340 100644
--- a/tests/Entity/Parts/PartTest.php
+++ b/tests/Entity/Parts/PartTest.php
@@ -29,7 +29,7 @@ use DateTime;
use Doctrine\Common\Collections\Collection;
use PHPUnit\Framework\TestCase;
-class PartTest extends TestCase
+final class PartTest extends TestCase
{
public function testAddRemovePartLot(): void
{
diff --git a/tests/Entity/PriceSystem/CurrencyTest.php b/tests/Entity/PriceSystem/CurrencyTest.php
index 0058d501..018092e5 100644
--- a/tests/Entity/PriceSystem/CurrencyTest.php
+++ b/tests/Entity/PriceSystem/CurrencyTest.php
@@ -26,7 +26,7 @@ use App\Entity\PriceInformations\Currency;
use Brick\Math\BigDecimal;
use PHPUnit\Framework\TestCase;
-class CurrencyTest extends TestCase
+final class CurrencyTest extends TestCase
{
public function testGetInverseExchangeRate(): void
{
diff --git a/tests/Entity/PriceSystem/OrderdetailTest.php b/tests/Entity/PriceSystem/OrderdetailTest.php
index 497f9ab3..2becb74e 100644
--- a/tests/Entity/PriceSystem/OrderdetailTest.php
+++ b/tests/Entity/PriceSystem/OrderdetailTest.php
@@ -27,7 +27,7 @@ use App\Entity\PriceInformations\Pricedetail;
use Doctrine\Common\Collections\Collection;
use PHPUnit\Framework\TestCase;
-class OrderdetailTest extends TestCase
+final class OrderdetailTest extends TestCase
{
public function testAddRemovePricdetails(): void
{
@@ -61,4 +61,18 @@ class OrderdetailTest extends TestCase
$this->assertSame($price5, $orderdetail->findPriceForQty(5.3));
$this->assertSame($price5, $orderdetail->findPriceForQty(10000));
}
+
+ public function testGetSetPricesIncludesVAT(): void
+ {
+ $orderdetail = new Orderdetail();
+
+ //By default, the pricesIncludesVAT property should be null for empty orderdetails
+ $this->assertNull($orderdetail->getPricesIncludesVAT());
+
+ $orderdetail->setPricesIncludesVAT(true);
+ $this->assertTrue($orderdetail->getPricesIncludesVAT());
+
+ $orderdetail->setPricesIncludesVAT(false);
+ $this->assertFalse($orderdetail->getPricesIncludesVAT());
+ }
}
diff --git a/tests/Entity/PriceSystem/PricedetailTest.php b/tests/Entity/PriceSystem/PricedetailTest.php
index 8a3cf328..effe6fd6 100644
--- a/tests/Entity/PriceSystem/PricedetailTest.php
+++ b/tests/Entity/PriceSystem/PricedetailTest.php
@@ -28,7 +28,7 @@ use App\Entity\PriceInformations\Pricedetail;
use Brick\Math\BigDecimal;
use PHPUnit\Framework\TestCase;
-class PricedetailTest extends TestCase
+final class PricedetailTest extends TestCase
{
public function testGetPricePerUnit(): void
{
diff --git a/tests/Entity/UserSystem/ApiTokenTypeTest.php b/tests/Entity/UserSystem/ApiTokenTypeTest.php
index a8e520f1..7a4506ba 100644
--- a/tests/Entity/UserSystem/ApiTokenTypeTest.php
+++ b/tests/Entity/UserSystem/ApiTokenTypeTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Entity\UserSystem;
use App\Entity\UserSystem\ApiTokenType;
use PHPUnit\Framework\TestCase;
-class ApiTokenTypeTest extends TestCase
+final class ApiTokenTypeTest extends TestCase
{
public function testGetTokenPrefix(): void
diff --git a/tests/Entity/UserSystem/PermissionDataTest.php b/tests/Entity/UserSystem/PermissionDataTest.php
index 4fd8c5ce..3d250a81 100644
--- a/tests/Entity/UserSystem/PermissionDataTest.php
+++ b/tests/Entity/UserSystem/PermissionDataTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Entity\UserSystem;
use App\Entity\UserSystem\PermissionData;
use PHPUnit\Framework\TestCase;
-class PermissionDataTest extends TestCase
+final class PermissionDataTest extends TestCase
{
public function testGetSetIs(): void
diff --git a/tests/Entity/UserSystem/UserTest.php b/tests/Entity/UserSystem/UserTest.php
index a4349e1d..12797ad1 100644
--- a/tests/Entity/UserSystem/UserTest.php
+++ b/tests/Entity/UserSystem/UserTest.php
@@ -31,7 +31,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Component\Uid\Uuid;
use Webauthn\TrustPath\EmptyTrustPath;
-class UserTest extends TestCase
+final class UserTest extends TestCase
{
public function testGetFullName(): void
{
diff --git a/tests/EnvVarProcessors/AddSlashEnvVarProcessorTest.php b/tests/EnvVarProcessors/AddSlashEnvVarProcessorTest.php
index 4099f0ee..c4c9f04b 100644
--- a/tests/EnvVarProcessors/AddSlashEnvVarProcessorTest.php
+++ b/tests/EnvVarProcessors/AddSlashEnvVarProcessorTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\EnvVarProcessors;
use App\EnvVarProcessors\AddSlashEnvVarProcessor;
use PHPUnit\Framework\TestCase;
-class AddSlashEnvVarProcessorTest extends TestCase
+final class AddSlashEnvVarProcessorTest extends TestCase
{
protected AddSlashEnvVarProcessor $processor;
diff --git a/tests/EventListener/RegisterSynonymsAsTranslationParametersTest.php b/tests/EventListener/RegisterSynonymsAsTranslationParametersTest.php
index 58573ae6..3a35c670 100644
--- a/tests/EventListener/RegisterSynonymsAsTranslationParametersTest.php
+++ b/tests/EventListener/RegisterSynonymsAsTranslationParametersTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\EventListener;
use App\EventListener\RegisterSynonymsAsTranslationParametersListener;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class RegisterSynonymsAsTranslationParametersTest extends KernelTestCase
+final class RegisterSynonymsAsTranslationParametersTest extends KernelTestCase
{
private RegisterSynonymsAsTranslationParametersListener $listener;
diff --git a/tests/EventSubscriber/PasswordChangeNeededSubscriberTest.php b/tests/EventSubscriber/PasswordChangeNeededSubscriberTest.php
index 0eaf931c..3d2089e1 100644
--- a/tests/EventSubscriber/PasswordChangeNeededSubscriberTest.php
+++ b/tests/EventSubscriber/PasswordChangeNeededSubscriberTest.php
@@ -33,7 +33,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Symfony\Component\Uid\Uuid;
use Webauthn\TrustPath\EmptyTrustPath;
-class PasswordChangeNeededSubscriberTest extends TestCase
+final class PasswordChangeNeededSubscriberTest extends TestCase
{
public function testTFARedirectNeeded(): void
{
diff --git a/tests/Exceptions/TwigModeExceptionTest.php b/tests/Exceptions/TwigModeExceptionTest.php
index 686a87a2..09468291 100644
--- a/tests/Exceptions/TwigModeExceptionTest.php
+++ b/tests/Exceptions/TwigModeExceptionTest.php
@@ -27,7 +27,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Twig\Error\Error;
-class TwigModeExceptionTest extends KernelTestCase
+final class TwigModeExceptionTest extends KernelTestCase
{
private string $projectPath;
diff --git a/tests/Form/InfoProviderSystem/GlobalFieldMappingTypeTest.php b/tests/Form/InfoProviderSystem/GlobalFieldMappingTypeTest.php
index 89e362e4..07106505 100644
--- a/tests/Form/InfoProviderSystem/GlobalFieldMappingTypeTest.php
+++ b/tests/Form/InfoProviderSystem/GlobalFieldMappingTypeTest.php
@@ -29,7 +29,7 @@ use Symfony\Component\Form\FormFactoryInterface;
#[Group("slow")]
#[Group("DB")]
-class GlobalFieldMappingTypeTest extends KernelTestCase
+final class GlobalFieldMappingTypeTest extends KernelTestCase
{
private FormFactoryInterface $formFactory;
diff --git a/tests/Helpers/BBCodeToMarkdownConverterTest.php b/tests/Helpers/BBCodeToMarkdownConverterTest.php
index 9506cba4..07fca505 100644
--- a/tests/Helpers/BBCodeToMarkdownConverterTest.php
+++ b/tests/Helpers/BBCodeToMarkdownConverterTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Helpers\BBCodeToMarkdownConverter;
use PHPUnit\Framework\TestCase;
-class BBCodeToMarkdownConverterTest extends TestCase
+final class BBCodeToMarkdownConverterTest extends TestCase
{
protected BBCodeToMarkdownConverter $converter;
diff --git a/tests/Helpers/IPAnonymizerTest.php b/tests/Helpers/IPAnonymizerTest.php
index e16368eb..7efd27ac 100644
--- a/tests/Helpers/IPAnonymizerTest.php
+++ b/tests/Helpers/IPAnonymizerTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Helpers\IPAnonymizer;
use PHPUnit\Framework\TestCase;
-class IPAnonymizerTest extends TestCase
+final class IPAnonymizerTest extends TestCase
{
public static function anonymizeDataProvider(): \Generator
diff --git a/tests/Helpers/Projects/ProjectBuildRequestTest.php b/tests/Helpers/Projects/ProjectBuildRequestTest.php
index 1158d89a..c1fd1498 100644
--- a/tests/Helpers/Projects/ProjectBuildRequestTest.php
+++ b/tests/Helpers/Projects/ProjectBuildRequestTest.php
@@ -30,7 +30,7 @@ use App\Entity\ProjectSystem\ProjectBOMEntry;
use App\Helpers\Projects\ProjectBuildRequest;
use PHPUnit\Framework\TestCase;
-class ProjectBuildRequestTest extends TestCase
+final class ProjectBuildRequestTest extends TestCase
{
/** @var Project */
diff --git a/tests/Helpers/TreeViewNodeTest.php b/tests/Helpers/TreeViewNodeTest.php
index 9005651d..b1179f6c 100644
--- a/tests/Helpers/TreeViewNodeTest.php
+++ b/tests/Helpers/TreeViewNodeTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Helpers;
use App\Helpers\Trees\TreeViewNode;
use PHPUnit\Framework\TestCase;
-class TreeViewNodeTest extends TestCase
+final class TreeViewNodeTest extends TestCase
{
/**
* @var TreeViewNode
diff --git a/tests/Helpers/TrinaryLogicHelperTest.php b/tests/Helpers/TrinaryLogicHelperTest.php
index 3082571b..4b8c9f01 100644
--- a/tests/Helpers/TrinaryLogicHelperTest.php
+++ b/tests/Helpers/TrinaryLogicHelperTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Helpers;
use App\Helpers\TrinaryLogicHelper;
use PHPUnit\Framework\TestCase;
-class TrinaryLogicHelperTest extends TestCase
+final class TrinaryLogicHelperTest extends TestCase
{
public function testNot()
diff --git a/tests/Repository/AttachmentContainingDBElementRepositoryTest.php b/tests/Repository/AttachmentContainingDBElementRepositoryTest.php
index f61750d9..38aca071 100644
--- a/tests/Repository/AttachmentContainingDBElementRepositoryTest.php
+++ b/tests/Repository/AttachmentContainingDBElementRepositoryTest.php
@@ -28,7 +28,7 @@ use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class AttachmentContainingDBElementRepositoryTest extends KernelTestCase
+final class AttachmentContainingDBElementRepositoryTest extends KernelTestCase
{
private EntityManagerInterface $entityManager;
diff --git a/tests/Repository/DBElementRepositoryTest.php b/tests/Repository/DBElementRepositoryTest.php
index 05ede7e2..5f1ac0e1 100644
--- a/tests/Repository/DBElementRepositoryTest.php
+++ b/tests/Repository/DBElementRepositoryTest.php
@@ -33,7 +33,7 @@ use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class DBElementRepositoryTest extends KernelTestCase
+final class DBElementRepositoryTest extends KernelTestCase
{
private EntityManagerInterface $entityManager;
diff --git a/tests/Repository/LogEntryRepositoryTest.php b/tests/Repository/LogEntryRepositoryTest.php
index f6cc991d..46093a9e 100644
--- a/tests/Repository/LogEntryRepositoryTest.php
+++ b/tests/Repository/LogEntryRepositoryTest.php
@@ -33,7 +33,7 @@ use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class LogEntryRepositoryTest extends KernelTestCase
+final class LogEntryRepositoryTest extends KernelTestCase
{
private EntityManagerInterface $entityManager;
@@ -75,6 +75,7 @@ class LogEntryRepositoryTest extends KernelTestCase
//We have a edit log entry for the category with ID 1
$category = $this->entityManager->find(Category::class, 1);
$adminUser = $this->entityManager->getRepository(User::class)->findOneBy(['name' => 'admin']);
+ $this->assertInstanceOf(Category::class, $category);
$user = $this->repo->getLastEditingUser($category);
@@ -83,6 +84,7 @@ class LogEntryRepositoryTest extends KernelTestCase
//For the category 2, the user must be null
$category = $this->entityManager->find(Category::class, 2);
+ $this->assertInstanceOf(Category::class, $category);
$user = $this->repo->getLastEditingUser($category);
$this->assertNull($user);
}
@@ -92,6 +94,7 @@ class LogEntryRepositoryTest extends KernelTestCase
//We have a edit log entry for the category with ID 1
$category = $this->entityManager->find(Category::class, 1);
$adminUser = $this->entityManager->getRepository(User::class)->findOneBy(['name' => 'admin']);
+ $this->assertInstanceOf(Category::class, $category);
$user = $this->repo->getCreatingUser($category);
@@ -100,6 +103,7 @@ class LogEntryRepositoryTest extends KernelTestCase
//For the category 2, the user must be null
$category = $this->entityManager->find(Category::class, 2);
+ $this->assertInstanceOf(Category::class, $category);
$user = $this->repo->getCreatingUser($category);
$this->assertNull($user);
}
@@ -119,6 +123,7 @@ class LogEntryRepositoryTest extends KernelTestCase
public function testGetElementExistedAtTimestamp(): void
{
$part = $this->entityManager->find(Part::class, 3);
+ $this->assertInstanceOf(Part::class, $part);
//Assume that the part is existing now
$this->assertTrue($this->repo->getElementExistedAtTimestamp($part, new \DateTimeImmutable()));
@@ -130,6 +135,7 @@ class LogEntryRepositoryTest extends KernelTestCase
public function testGetElementHistory(): void
{
$category = $this->entityManager->find(Category::class, 1);
+ $this->assertInstanceOf(Category::class, $category);
$history = $this->repo->getElementHistory($category);
@@ -141,6 +147,7 @@ class LogEntryRepositoryTest extends KernelTestCase
public function testGetTimetravelDataForElement(): void
{
$category = $this->entityManager->find(Category::class, 1);
+ $this->assertInstanceOf(Category::class, $category);
$data = $this->repo->getTimetravelDataForElement($category, new \DateTimeImmutable('2020-01-01'));
//The data must contain only ElementChangedLogEntry
diff --git a/tests/Repository/NamedDBElementRepositoryTest.php b/tests/Repository/NamedDBElementRepositoryTest.php
index 117d7d0e..dc8b2a5c 100644
--- a/tests/Repository/NamedDBElementRepositoryTest.php
+++ b/tests/Repository/NamedDBElementRepositoryTest.php
@@ -30,7 +30,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* @Group DB
*/
-class NamedDBElementRepositoryTest extends WebTestCase
+final class NamedDBElementRepositoryTest extends WebTestCase
{
/**
* @var StructuralDBElementRepository
diff --git a/tests/Repository/PartRepositoryTest.php b/tests/Repository/PartRepositoryTest.php
index 68b75abb..c2e7858a 100644
--- a/tests/Repository/PartRepositoryTest.php
+++ b/tests/Repository/PartRepositoryTest.php
@@ -60,8 +60,8 @@ final class PartRepositoryTest extends TestCase
$classMetadata = new ClassMetadata(Part::class);
$emMock->method('getClassMetadata')->with(Part::class)->willReturn($classMetadata);
- $translatorMock = $this->createMock(TranslatorInterface::class);
- $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class);
+ $translatorMock = $this->createStub(TranslatorInterface::class);
+ $ipnSuggestSettings = $this->createStub(IpnSuggestSettings::class);
$repo = $this->getMockBuilder(PartRepository::class)
->setConstructorArgs([$emMock, $translatorMock, $ipnSuggestSettings])
@@ -120,7 +120,7 @@ final class PartRepositoryTest extends TestCase
return $id;
});
- $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class);
+ $ipnSuggestSettings = $this->createStub(IpnSuggestSettings::class);
$ipnSuggestSettings->suggestPartDigits = 4;
$ipnSuggestSettings->useDuplicateDescription = false;
@@ -204,7 +204,7 @@ final class PartRepositoryTest extends TestCase
return $id;
});
- $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class);
+ $ipnSuggestSettings = $this->createStub(IpnSuggestSettings::class);
$ipnSuggestSettings->suggestPartDigits = 4;
$ipnSuggestSettings->useDuplicateDescription = false;
diff --git a/tests/Repository/StructuralDBElementRepositoryTest.php b/tests/Repository/StructuralDBElementRepositoryTest.php
index 5ab8b788..16e92837 100644
--- a/tests/Repository/StructuralDBElementRepositoryTest.php
+++ b/tests/Repository/StructuralDBElementRepositoryTest.php
@@ -22,6 +22,7 @@ declare(strict_types=1);
namespace App\Tests\Repository;
+use App\Entity\Base\AbstractStructuralDBElement;
use App\Entity\Attachments\AttachmentType;
use App\Helpers\Trees\TreeViewNode;
use App\Repository\StructuralDBElementRepository;
@@ -30,7 +31,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* @Group DB
*/
-class StructuralDBElementRepositoryTest extends WebTestCase
+final class StructuralDBElementRepositoryTest extends WebTestCase
{
/**
* @var StructuralDBElementRepository
@@ -108,6 +109,7 @@ class StructuralDBElementRepositoryTest extends WebTestCase
{
//List all nodes that are children to Node 1
$node1 = $this->repo->find(1);
+ $this->assertInstanceOf(AbstractStructuralDBElement::class, $node1);
$nodes = $this->repo->getFlatList($node1);
$this->assertCount(3, $nodes);
diff --git a/tests/Repository/UserRepositoryTest.php b/tests/Repository/UserRepositoryTest.php
index 67a77aea..24a2d657 100644
--- a/tests/Repository/UserRepositoryTest.php
+++ b/tests/Repository/UserRepositoryTest.php
@@ -27,7 +27,7 @@ use App\Repository\UserRepository;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class UserRepositoryTest extends WebTestCase
+final class UserRepositoryTest extends WebTestCase
{
/**
diff --git a/tests/Security/EnsureSAMLUserForSAMLLoginCheckerTest.php b/tests/Security/EnsureSAMLUserForSAMLLoginCheckerTest.php
index c9a14426..2fedf108 100644
--- a/tests/Security/EnsureSAMLUserForSAMLLoginCheckerTest.php
+++ b/tests/Security/EnsureSAMLUserForSAMLLoginCheckerTest.php
@@ -30,7 +30,7 @@ use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
-class EnsureSAMLUserForSAMLLoginCheckerTest extends WebTestCase
+final class EnsureSAMLUserForSAMLLoginCheckerTest extends WebTestCase
{
/** @var EnsureSAMLUserForSAMLLoginChecker */
protected $service;
diff --git a/tests/Security/SamlUserFactoryTest.php b/tests/Security/SamlUserFactoryTest.php
index 7780b4be..b975ca0d 100644
--- a/tests/Security/SamlUserFactoryTest.php
+++ b/tests/Security/SamlUserFactoryTest.php
@@ -26,7 +26,7 @@ use App\Entity\UserSystem\User;
use App\Security\SamlUserFactory;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class SamlUserFactoryTest extends WebTestCase
+final class SamlUserFactoryTest extends WebTestCase
{
/** @var SamlUserFactory */
diff --git a/tests/Security/UserCheckerTest.php b/tests/Security/UserCheckerTest.php
index 35c2e1e5..e32d5bfe 100644
--- a/tests/Security/UserCheckerTest.php
+++ b/tests/Security/UserCheckerTest.php
@@ -27,7 +27,7 @@ use App\Security\UserChecker;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
-class UserCheckerTest extends WebTestCase
+final class UserCheckerTest extends WebTestCase
{
protected $service;
diff --git a/tests/Serializer/BigNumberNormalizerTest.php b/tests/Serializer/BigNumberNormalizerTest.php
index f64347ee..509d6352 100644
--- a/tests/Serializer/BigNumberNormalizerTest.php
+++ b/tests/Serializer/BigNumberNormalizerTest.php
@@ -29,7 +29,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Brick\Math\BigDecimal;
use Brick\Math\BigNumber;
-class BigNumberNormalizerTest extends WebTestCase
+final class BigNumberNormalizerTest extends WebTestCase
{
/** @var BigNumberNormalizer */
protected $service;
diff --git a/tests/Serializer/PartNormalizerTest.php b/tests/Serializer/PartNormalizerTest.php
index 9baff750..2f07f36d 100644
--- a/tests/Serializer/PartNormalizerTest.php
+++ b/tests/Serializer/PartNormalizerTest.php
@@ -31,7 +31,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
-class PartNormalizerTest extends WebTestCase
+final class PartNormalizerTest extends WebTestCase
{
/** @var PartNormalizer */
protected DenormalizerInterface&NormalizerInterface $service;
diff --git a/tests/Serializer/StructuralElementDenormalizerTest.php b/tests/Serializer/StructuralElementDenormalizerTest.php
index 31c9f0bb..e8e46611 100644
--- a/tests/Serializer/StructuralElementDenormalizerTest.php
+++ b/tests/Serializer/StructuralElementDenormalizerTest.php
@@ -27,7 +27,7 @@ use App\Entity\Parts\Category;
use App\Serializer\StructuralElementDenormalizer;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class StructuralElementDenormalizerTest extends WebTestCase
+final class StructuralElementDenormalizerTest extends WebTestCase
{
/** @var StructuralElementDenormalizer */
diff --git a/tests/Serializer/StructuralElementFromNameDenormalizerTest.php b/tests/Serializer/StructuralElementFromNameDenormalizerTest.php
index b344508c..b4bdcdac 100644
--- a/tests/Serializer/StructuralElementFromNameDenormalizerTest.php
+++ b/tests/Serializer/StructuralElementFromNameDenormalizerTest.php
@@ -26,7 +26,7 @@ use App\Entity\Parts\Category;
use App\Serializer\StructuralElementFromNameDenormalizer;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class StructuralElementFromNameDenormalizerTest extends WebTestCase
+final class StructuralElementFromNameDenormalizerTest extends WebTestCase
{
/** @var StructuralElementFromNameDenormalizer */
diff --git a/tests/Serializer/StructuralElementNormalizerTest.php b/tests/Serializer/StructuralElementNormalizerTest.php
index 79f739fa..4b335bcd 100644
--- a/tests/Serializer/StructuralElementNormalizerTest.php
+++ b/tests/Serializer/StructuralElementNormalizerTest.php
@@ -30,7 +30,7 @@ use App\Serializer\StructuralElementNormalizer;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class StructuralElementNormalizerTest extends WebTestCase
+final class StructuralElementNormalizerTest extends WebTestCase
{
/** @var StructuralElementNormalizer */
diff --git a/tests/Services/Attachments/AttachmentPathResolverTest.php b/tests/Services/Attachments/AttachmentPathResolverTest.php
index 69658e13..b145e482 100644
--- a/tests/Services/Attachments/AttachmentPathResolverTest.php
+++ b/tests/Services/Attachments/AttachmentPathResolverTest.php
@@ -28,10 +28,8 @@ use App\Services\Attachments\AttachmentPathResolver;
use const DIRECTORY_SEPARATOR;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class AttachmentPathResolverTest extends WebTestCase
+final class AttachmentPathResolverTest extends WebTestCase
{
- protected string $media_path;
- protected string $footprint_path;
protected $projectDir_orig;
protected $projectDir;
/**
@@ -46,8 +44,8 @@ class AttachmentPathResolverTest extends WebTestCase
$this->projectDir_orig = realpath(self::$kernel->getProjectDir());
$this->projectDir = str_replace('\\', '/', $this->projectDir_orig);
- $this->media_path = $this->projectDir.'/public/media';
- $this->footprint_path = $this->projectDir.'/public/img/footprints';
+ $media_path = $this->projectDir.'/public/media';
+ $footprint_path = $this->projectDir.'/public/img/footprints';
$this->service = self::getContainer()->get(AttachmentPathResolver::class);
}
diff --git a/tests/Services/Attachments/AttachmentURLGeneratorTest.php b/tests/Services/Attachments/AttachmentURLGeneratorTest.php
index e9e6d992..4359c1b9 100644
--- a/tests/Services/Attachments/AttachmentURLGeneratorTest.php
+++ b/tests/Services/Attachments/AttachmentURLGeneratorTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\Attachments\AttachmentURLGenerator;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class AttachmentURLGeneratorTest extends WebTestCase
+final class AttachmentURLGeneratorTest extends WebTestCase
{
protected const PUBLIC_DIR = '/public';
diff --git a/tests/Services/Attachments/BuiltinAttachmentsFinderTest.php b/tests/Services/Attachments/BuiltinAttachmentsFinderTest.php
index 80c699ac..5198ddea 100644
--- a/tests/Services/Attachments/BuiltinAttachmentsFinderTest.php
+++ b/tests/Services/Attachments/BuiltinAttachmentsFinderTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\Attachments\BuiltinAttachmentsFinder;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class BuiltinAttachmentsFinderTest extends WebTestCase
+final class BuiltinAttachmentsFinderTest extends WebTestCase
{
protected static array $mock_list = [
'%FOOTPRINTS%/test/test.jpg', '%FOOTPRINTS%/test/test.png', '%FOOTPRINTS%/123.jpg', '%FOOTPRINTS%/123.jpeg',
diff --git a/tests/Services/Attachments/FileTypeFilterToolsTest.php b/tests/Services/Attachments/FileTypeFilterToolsTest.php
index 1b85eaeb..f089feec 100644
--- a/tests/Services/Attachments/FileTypeFilterToolsTest.php
+++ b/tests/Services/Attachments/FileTypeFilterToolsTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\Attachments\FileTypeFilterTools;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class FileTypeFilterToolsTest extends WebTestCase
+final class FileTypeFilterToolsTest extends WebTestCase
{
protected static $service;
diff --git a/tests/Services/ElementTypeNameGeneratorTest.php b/tests/Services/ElementTypeNameGeneratorTest.php
index 8739dd06..21797137 100644
--- a/tests/Services/ElementTypeNameGeneratorTest.php
+++ b/tests/Services/ElementTypeNameGeneratorTest.php
@@ -35,7 +35,7 @@ use App\Services\Formatters\AmountFormatter;
use App\Settings\SynonymSettings;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class ElementTypeNameGeneratorTest extends WebTestCase
+final class ElementTypeNameGeneratorTest extends WebTestCase
{
protected ElementTypeNameGenerator $service;
private SynonymSettings $synonymSettings;
diff --git a/tests/Services/ElementTypesTest.php b/tests/Services/ElementTypesTest.php
index d4fa77ff..15e5d8bb 100644
--- a/tests/Services/ElementTypesTest.php
+++ b/tests/Services/ElementTypesTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\Services;
use App\Entity\Parameters\CategoryParameter;
@@ -26,7 +28,7 @@ use App\Exceptions\EntityNotSupportedException;
use App\Services\ElementTypes;
use PHPUnit\Framework\TestCase;
-class ElementTypesTest extends TestCase
+final class ElementTypesTest extends TestCase
{
public function testFromClass(): void
diff --git a/tests/Services/EntityMergers/Mergers/EntityMergerHelperTraitTest.php b/tests/Services/EntityMergers/Mergers/EntityMergerHelperTraitTest.php
index 22fa220b..f5fd8334 100644
--- a/tests/Services/EntityMergers/Mergers/EntityMergerHelperTraitTest.php
+++ b/tests/Services/EntityMergers/Mergers/EntityMergerHelperTraitTest.php
@@ -28,7 +28,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
-class EntityMergerHelperTraitTest extends KernelTestCase
+final class EntityMergerHelperTraitTest extends KernelTestCase
{
use EntityMergerHelperTrait;
diff --git a/tests/Services/EntityMergers/Mergers/PartMergerTest.php b/tests/Services/EntityMergers/Mergers/PartMergerTest.php
index 7db4ddd6..f6a75790 100644
--- a/tests/Services/EntityMergers/Mergers/PartMergerTest.php
+++ b/tests/Services/EntityMergers/Mergers/PartMergerTest.php
@@ -36,7 +36,7 @@ use App\Services\EntityMergers\Mergers\PartMerger;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class PartMergerTest extends KernelTestCase
+final class PartMergerTest extends KernelTestCase
{
/** @var PartMerger|null */
diff --git a/tests/Services/Formatters/AmountFormatterTest.php b/tests/Services/Formatters/AmountFormatterTest.php
index 40f9b7cf..9fdeb441 100644
--- a/tests/Services/Formatters/AmountFormatterTest.php
+++ b/tests/Services/Formatters/AmountFormatterTest.php
@@ -27,7 +27,7 @@ use App\Services\Formatters\AmountFormatter;
use InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class AmountFormatterTest extends WebTestCase
+final class AmountFormatterTest extends WebTestCase
{
/**
* @var AmountFormatter
diff --git a/tests/Services/Formatters/SIFormatterTest.php b/tests/Services/Formatters/SIFormatterTest.php
index 79668589..62ca0187 100644
--- a/tests/Services/Formatters/SIFormatterTest.php
+++ b/tests/Services/Formatters/SIFormatterTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Services\Formatters;
use App\Services\Formatters\SIFormatter;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class SIFormatterTest extends WebTestCase
+final class SIFormatterTest extends WebTestCase
{
/**
* @var SIFormatter
diff --git a/tests/Services/ImportExportSystem/BOMImporterTest.php b/tests/Services/ImportExportSystem/BOMImporterTest.php
index 47ddcc24..5a9d4121 100644
--- a/tests/Services/ImportExportSystem/BOMImporterTest.php
+++ b/tests/Services/ImportExportSystem/BOMImporterTest.php
@@ -22,6 +22,8 @@ declare(strict_types=1);
*/
namespace App\Tests\Services\ImportExportSystem;
+use App\Entity\PriceInformations\Orderdetail;
+use App\Entity\Parts\Category;
use App\Entity\Parts\Part;
use App\Entity\Parts\Supplier;
use App\Entity\ProjectSystem\Project;
@@ -31,7 +33,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\File\File;
-class BOMImporterTest extends WebTestCase
+final class BOMImporterTest extends WebTestCase
{
/**
@@ -391,7 +393,7 @@ class BOMImporterTest extends WebTestCase
// Check first entry
$this->assertEquals('R1,R2', $bom_entries[0]->getMountnames());
- $this->assertEquals(2.0, $bom_entries[0]->getQuantity());
+ $this->assertEqualsWithDelta(2.0, $bom_entries[0]->getQuantity(), PHP_FLOAT_EPSILON);
$this->assertEquals('CRCW080510K0FKEA (R_0805_2012Metric)', $bom_entries[0]->getName());
$this->assertStringContainsString('Value: 10k', $bom_entries[0]->getComment());
$this->assertStringContainsString('MPN: CRCW080510K0FKEA', $bom_entries[0]->getComment());
@@ -402,7 +404,7 @@ class BOMImporterTest extends WebTestCase
// Check second entry
$this->assertEquals('C1', $bom_entries[1]->getMountnames());
- $this->assertEquals(1.0, $bom_entries[1]->getQuantity());
+ $this->assertEqualsWithDelta(1.0, $bom_entries[1]->getQuantity(), PHP_FLOAT_EPSILON);
$this->assertStringContainsString('LCSC SPN: C789012', $bom_entries[1]->getComment());
$this->assertStringContainsString('Mouser SPN: 80-CL21A104KOCLRNC', $bom_entries[1]->getComment());
@@ -542,7 +544,7 @@ class BOMImporterTest extends WebTestCase
$this->assertCount(1, $bom_entries); // Should merge into one entry
$this->assertEquals('R1,R2', $bom_entries[0]->getMountnames());
- $this->assertEquals(2.0, $bom_entries[0]->getQuantity());
+ $this->assertEqualsWithDelta(2.0, $bom_entries[0]->getQuantity(), PHP_FLOAT_EPSILON);
$this->assertEquals('CRCW080510K0FKEA', $bom_entries[0]->getName());
}
@@ -616,15 +618,190 @@ class BOMImporterTest extends WebTestCase
$this->assertEquals('R1,R2', $bom_entries[0]->getMountnames());
}
+ public function testStringToBOMEntriesKiCADSchematicWithSupplierSPN(): void
+ {
+ // Create test supplier
+ $lcscSupplier = new Supplier();
+ $lcscSupplier->setName('LCSC');
+ $this->entityManager->persist($lcscSupplier);
+
+ // Create a test part with required fields
+ $part = new Part();
+ $part->setName('Test Resistor 10k 0805');
+ $part->setCategory($this->getDefaultCategory($this->entityManager));
+ $this->entityManager->persist($part);
+
+ // Create orderdetail linking the part to a supplier SPN
+ $orderdetail = new Orderdetail();
+ $orderdetail->setPart($part);
+ $orderdetail->setSupplier($lcscSupplier);
+ $orderdetail->setSupplierpartnr('C123456');
+ $this->entityManager->persist($orderdetail);
+
+ $this->entityManager->flush();
+
+ // Import CSV with LCSC SPN matching the orderdetail
+ $input = << 'Designator',
+ 'Value' => 'Value',
+ 'LCSC SPN' => 'LCSC SPN',
+ 'Quantity' => 'Quantity'
+ ];
+
+ $bom_entries = $this->service->stringToBOMEntries($input, [
+ 'type' => 'kicad_schematic',
+ 'field_mapping' => $field_mapping,
+ 'delimiter' => ','
+ ]);
+
+ $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries);
+ $this->assertCount(1, $bom_entries);
+
+ // Verify that the BOM entry is linked to the correct part via supplier SPN
+ $this->assertSame($part, $bom_entries[0]->getPart());
+ $this->assertEquals('Test Resistor 10k 0805', $bom_entries[0]->getName());
+ $this->assertEquals('R1,R2', $bom_entries[0]->getMountnames());
+ $this->assertEqualsWithDelta(2.0, $bom_entries[0]->getQuantity(), PHP_FLOAT_EPSILON);
+ $this->assertStringContainsString('LCSC SPN: C123456', $bom_entries[0]->getComment());
+ $this->assertStringContainsString('Part-DB ID: ' . $part->getID(), $bom_entries[0]->getComment());
+
+ // Clean up
+ $this->entityManager->remove($orderdetail);
+ $this->entityManager->remove($part);
+ $this->entityManager->remove($lcscSupplier);
+ $this->entityManager->flush();
+ }
+
+ public function testStringToBOMEntriesKiCADSchematicWithMultipleSupplierSPNs(): void
+ {
+ // Create test suppliers
+ $lcscSupplier = new Supplier();
+ $lcscSupplier->setName('LCSC');
+ $mouserSupplier = new Supplier();
+ $mouserSupplier->setName('Mouser');
+ $this->entityManager->persist($lcscSupplier);
+ $this->entityManager->persist($mouserSupplier);
+
+ // Create first part linked via LCSC SPN
+ $part1 = new Part();
+ $part1->setName('Resistor 10k');
+ $part1->setCategory($this->getDefaultCategory($this->entityManager));
+ $this->entityManager->persist($part1);
+
+ $orderdetail1 = new Orderdetail();
+ $orderdetail1->setPart($part1);
+ $orderdetail1->setSupplier($lcscSupplier);
+ $orderdetail1->setSupplierpartnr('C123456');
+ $this->entityManager->persist($orderdetail1);
+
+ // Create second part linked via Mouser SPN
+ $part2 = new Part();
+ $part2->setName('Capacitor 100nF');
+ $part2->setCategory($this->getDefaultCategory($this->entityManager));
+ $this->entityManager->persist($part2);
+
+ $orderdetail2 = new Orderdetail();
+ $orderdetail2->setPart($part2);
+ $orderdetail2->setSupplier($mouserSupplier);
+ $orderdetail2->setSupplierpartnr('789-CAP100NF');
+ $this->entityManager->persist($orderdetail2);
+
+ $this->entityManager->flush();
+
+ // Import CSV with both LCSC and Mouser SPNs
+ $input = << 'Designator',
+ 'Value' => 'Value',
+ 'LCSC SPN' => 'LCSC SPN',
+ 'Mouser SPN' => 'Mouser SPN',
+ 'Quantity' => 'Quantity'
+ ];
+
+ $bom_entries = $this->service->stringToBOMEntries($input, [
+ 'type' => 'kicad_schematic',
+ 'field_mapping' => $field_mapping,
+ 'delimiter' => ','
+ ]);
+
+ $this->assertCount(2, $bom_entries);
+
+ // Verify first entry linked via LCSC SPN
+ $this->assertSame($part1, $bom_entries[0]->getPart());
+ $this->assertEquals('Resistor 10k', $bom_entries[0]->getName());
+
+ // Verify second entry linked via Mouser SPN
+ $this->assertSame($part2, $bom_entries[1]->getPart());
+ $this->assertEquals('Capacitor 100nF', $bom_entries[1]->getName());
+
+ // Clean up
+ $this->entityManager->remove($orderdetail1);
+ $this->entityManager->remove($orderdetail2);
+ $this->entityManager->remove($part1);
+ $this->entityManager->remove($part2);
+ $this->entityManager->remove($lcscSupplier);
+ $this->entityManager->remove($mouserSupplier);
+ $this->entityManager->flush();
+ }
+
+ public function testStringToBOMEntriesKiCADSchematicWithNonMatchingSPN(): void
+ {
+ // Create test supplier
+ $lcscSupplier = new Supplier();
+ $lcscSupplier->setName('LCSC');
+ $this->entityManager->persist($lcscSupplier);
+ $this->entityManager->flush();
+
+ // Import CSV with LCSC SPN that doesn't match any orderdetail
+ $input = << 'Designator',
+ 'Value' => 'Value',
+ 'LCSC SPN' => 'LCSC SPN',
+ 'Quantity' => 'Quantity'
+ ];
+
+ $bom_entries = $this->service->stringToBOMEntries($input, [
+ 'type' => 'kicad_schematic',
+ 'field_mapping' => $field_mapping,
+ 'delimiter' => ','
+ ]);
+
+ $this->assertCount(1, $bom_entries);
+
+ // Verify that no part is linked (SPN not found)
+ $this->assertNull($bom_entries[0]->getPart());
+ $this->assertEquals('10k', $bom_entries[0]->getName()); // Should use Value as name
+ $this->assertStringContainsString('LCSC SPN: C999999', $bom_entries[0]->getComment());
+
+ // Clean up
+ $this->entityManager->remove($lcscSupplier);
+ $this->entityManager->flush();
+ }
+
private function getDefaultCategory(EntityManagerInterface $entityManager)
{
// Get the first available category or create a default one
- $categoryRepo = $entityManager->getRepository(\App\Entity\Parts\Category::class);
+ $categoryRepo = $entityManager->getRepository(Category::class);
$categories = $categoryRepo->findAll();
if (empty($categories)) {
// Create a default category if none exists
- $category = new \App\Entity\Parts\Category();
+ $category = new Category();
$category->setName('Default Category');
$entityManager->persist($category);
$entityManager->flush();
diff --git a/tests/Services/ImportExportSystem/BOMValidationServiceTest.php b/tests/Services/ImportExportSystem/BOMValidationServiceTest.php
index 055db8b4..a6c103db 100644
--- a/tests/Services/ImportExportSystem/BOMValidationServiceTest.php
+++ b/tests/Services/ImportExportSystem/BOMValidationServiceTest.php
@@ -32,18 +32,16 @@ use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @see \App\Services\ImportExportSystem\BOMValidationService
*/
-class BOMValidationServiceTest extends WebTestCase
+final class BOMValidationServiceTest extends WebTestCase
{
private BOMValidationService $validationService;
- private EntityManagerInterface $entityManager;
- private TranslatorInterface $translator;
protected function setUp(): void
{
self::bootKernel();
- $this->entityManager = self::getContainer()->get(EntityManagerInterface::class);
- $this->translator = self::getContainer()->get(TranslatorInterface::class);
- $this->validationService = new BOMValidationService($this->entityManager, $this->translator);
+ $entityManager = self::getContainer()->get(EntityManagerInterface::class);
+ $translator = self::getContainer()->get(TranslatorInterface::class);
+ $this->validationService = new BOMValidationService($entityManager, $translator);
}
public function testValidateBOMEntryWithValidData(): void
@@ -244,7 +242,7 @@ class BOMValidationServiceTest extends WebTestCase
$this->assertTrue($result['is_valid']);
$this->assertCount(1, $result['info']);
- $this->assertStringContainsString('library prefix', $result['info'][0]);
+ $this->assertStringContainsString('library prefix', (string) $result['info'][0]);
}
public function testValidateBOMEntriesWithMultipleEntries(): void
@@ -314,7 +312,7 @@ class BOMValidationServiceTest extends WebTestCase
$this->assertEquals(2, $stats['error_count']);
$this->assertEquals(1, $stats['warning_count']);
$this->assertEquals(2, $stats['info_count']);
- $this->assertEquals(80.0, $stats['success_rate']);
+ $this->assertEqualsWithDelta(80.0, $stats['success_rate'], PHP_FLOAT_EPSILON);
}
public function testGetErrorMessage(): void
@@ -344,6 +342,6 @@ class BOMValidationServiceTest extends WebTestCase
$message = $this->validationService->getErrorMessage($validation_result);
- $this->assertEquals('', $message);
+ $this->assertSame('', $message);
}
}
\ No newline at end of file
diff --git a/tests/Services/ImportExportSystem/EntityExporterTest.php b/tests/Services/ImportExportSystem/EntityExporterTest.php
index e9b924b1..e4518961 100644
--- a/tests/Services/ImportExportSystem/EntityExporterTest.php
+++ b/tests/Services/ImportExportSystem/EntityExporterTest.php
@@ -28,7 +28,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Request;
use PhpOffice\PhpSpreadsheet\IOFactory;
-class EntityExporterTest extends WebTestCase
+final class EntityExporterTest extends WebTestCase
{
/**
* @var EntityExporter
@@ -43,9 +43,9 @@ class EntityExporterTest extends WebTestCase
private function getEntities(): array
{
- $entity1 = (new Category())->setName('Enitity 1')->setComment('Test');
- $entity1_1 = (new Category())->setName('Enitity 1.1')->setParent($entity1);
- $entity2 = (new Category())->setName('Enitity 2');
+ $entity1 = (new Category())->setName('Entity%1')->setComment('Test');
+ $entity1_1 = (new Category())->setName('Entity 1.1')->setParent($entity1);
+ $entity2 = (new Category())->setName('Entity 2');
return [$entity1, $entity1_1, $entity2];
}
@@ -55,12 +55,12 @@ class EntityExporterTest extends WebTestCase
$entities = $this->getEntities();
$json_without_children = $this->service->exportEntities($entities, ['format' => 'json', 'level' => 'simple']);
- $this->assertJsonStringEqualsJsonString('[{"name":"Enitity 1","type":"category","full_name":"Enitity 1"},{"name":"Enitity 1.1","type":"category","full_name":"Enitity 1->Enitity 1.1"},{"name":"Enitity 2","type":"category","full_name":"Enitity 2"}]',
+ $this->assertJsonStringEqualsJsonString('[{"name":"Entity%1","type":"category","full_name":"Entity%1"},{"name":"Entity 1.1","type":"category","full_name":"Entity%1->Entity 1.1"},{"name":"Entity 2","type":"category","full_name":"Entity 2"}]',
$json_without_children);
$json_with_children = $this->service->exportEntities($entities,
['format' => 'json', 'level' => 'simple', 'include_children' => true]);
- $this->assertJsonStringEqualsJsonString('[{"children":[{"children":[],"name":"Enitity 1.1","type":"category","full_name":"Enitity 1->Enitity 1.1"}],"name":"Enitity 1","type":"category","full_name":"Enitity 1"},{"children":[],"name":"Enitity 1.1","type":"category","full_name":"Enitity 1->Enitity 1.1"},{"children":[],"name":"Enitity 2","type":"category","full_name":"Enitity 2"}]',
+ $this->assertJsonStringEqualsJsonString('[{"children":[{"children":[],"name":"Entity 1.1","type":"category","full_name":"Entity%1->Entity 1.1"}],"name":"Entity%1","type":"category","full_name":"Entity%1"},{"children":[],"name":"Entity 1.1","type":"category","full_name":"Entity%1->Entity 1.1"},{"children":[],"name":"Entity 2","type":"category","full_name":"Entity 2"}]',
$json_with_children);
}
@@ -95,8 +95,8 @@ class EntityExporterTest extends WebTestCase
$this->assertSame('name', $worksheet->getCell('A1')->getValue());
$this->assertSame('full_name', $worksheet->getCell('B1')->getValue());
- $this->assertSame('Enitity 1', $worksheet->getCell('A2')->getValue());
- $this->assertSame('Enitity 1', $worksheet->getCell('B2')->getValue());
+ $this->assertSame('Entity%1', $worksheet->getCell('A2')->getValue());
+ $this->assertSame('Entity%1', $worksheet->getCell('B2')->getValue());
unlink($tempFile);
}
@@ -111,6 +111,6 @@ class EntityExporterTest extends WebTestCase
$response = $this->service->exportEntityFromRequest($entities, $request);
$this->assertSame('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $response->headers->get('Content-Type'));
- $this->assertStringContainsString('export_Category_simple.xlsx', $response->headers->get('Content-Disposition'));
+ $this->assertStringContainsString('export_Category_simple.xlsx', (string) $response->headers->get('Content-Disposition'));
}
}
diff --git a/tests/Services/ImportExportSystem/EntityImporterTest.php b/tests/Services/ImportExportSystem/EntityImporterTest.php
index 83367f80..b0044dda 100644
--- a/tests/Services/ImportExportSystem/EntityImporterTest.php
+++ b/tests/Services/ImportExportSystem/EntityImporterTest.php
@@ -41,7 +41,7 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
#[Group('DB')]
-class EntityImporterTest extends WebTestCase
+final class EntityImporterTest extends WebTestCase
{
/**
* @var EntityImporter
diff --git a/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php
index e300e2bf..2fd50f9a 100644
--- a/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\Services\InfoProviderSystem\DTOs;
+use App\Services\InfoProviderSystem\Providers\InfoProviderInterface;
use App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO;
use PHPUnit\Framework\TestCase;
-class BulkSearchFieldMappingDTOTest extends TestCase
+final class BulkSearchFieldMappingDTOTest extends TestCase
{
public function testProviderInstanceNormalization(): void
{
- $mockProvider = $this->createMock(\App\Services\InfoProviderSystem\Providers\InfoProviderInterface::class);
+ $mockProvider = $this->createMock(InfoProviderInterface::class);
$mockProvider->method('getProviderKey')->willReturn('mock_provider');
$fieldMapping = new BulkSearchFieldMappingDTO(field: 'mpn', providers: ['provider1', $mockProvider], priority: 5);
diff --git a/tests/Services/InfoProviderSystem/DTOs/BulkSearchPartResultsDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/BulkSearchPartResultsDTOTest.php
index 09fa4973..d3170d9e 100644
--- a/tests/Services/InfoProviderSystem/DTOs/BulkSearchPartResultsDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/BulkSearchPartResultsDTOTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\Services\InfoProviderSystem\DTOs;
+use App\Entity\Parts\Part;
+use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO;
use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO;
use PHPUnit\Framework\TestCase;
-class BulkSearchPartResultsDTOTest extends TestCase
+final class BulkSearchPartResultsDTOTest extends TestCase
{
public function testHasErrors(): void
{
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], []);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], []);
$this->assertFalse($test->hasErrors());
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], ['error1']);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], ['error1']);
$this->assertTrue($test->hasErrors());
}
public function testGetErrorCount(): void
{
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], []);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], []);
$this->assertCount(0, $test->errors);
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], ['error1', 'error2']);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], ['error1', 'error2']);
$this->assertCount(2, $test->errors);
}
public function testHasResults(): void
{
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], []);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], []);
$this->assertFalse($test->hasResults());
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [ $this->createMock(\App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO::class) ], []);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [ $this->createStub(BulkSearchPartResultDTO::class) ], []);
$this->assertTrue($test->hasResults());
}
public function testGetResultCount(): void
{
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [], []);
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [], []);
$this->assertCount(0, $test->searchResults);
- $test = new BulkSearchPartResultsDTO($this->createMock(\App\Entity\Parts\Part::class), [
- $this->createMock(\App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO::class),
- $this->createMock(\App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO::class)
+ $test = new BulkSearchPartResultsDTO($this->createStub(Part::class), [
+ $this->createStub(BulkSearchPartResultDTO::class),
+ $this->createStub(BulkSearchPartResultDTO::class)
], []);
$this->assertCount(2, $test->searchResults);
}
diff --git a/tests/Services/InfoProviderSystem/DTOs/BulkSearchResponseDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/BulkSearchResponseDTOTest.php
index b4dc0dea..f79d8ce8 100644
--- a/tests/Services/InfoProviderSystem/DTOs/BulkSearchResponseDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/BulkSearchResponseDTOTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\Services\InfoProviderSystem\DTOs;
use App\Entity\Parts\Part;
@@ -29,7 +31,7 @@ use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class BulkSearchResponseDTOTest extends KernelTestCase
+final class BulkSearchResponseDTOTest extends KernelTestCase
{
private EntityManagerInterface $entityManager;
@@ -108,6 +110,7 @@ class BulkSearchResponseDTOTest extends KernelTestCase
'manufacturing_status' => NULL,
'provider_url' => NULL,
'footprint' => NULL,
+ 'gtin' => NULL,
),
'source_field' => 'mpn',
'source_keyword' => '1234',
@@ -129,6 +132,7 @@ class BulkSearchResponseDTOTest extends KernelTestCase
'manufacturing_status' => NULL,
'provider_url' => NULL,
'footprint' => NULL,
+ 'gtin' => NULL,
),
'source_field' => 'name',
'source_keyword' => '1234',
diff --git a/tests/Services/InfoProviderSystem/DTOs/FileDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/FileDTOTest.php
index 10312aca..fe563fb1 100644
--- a/tests/Services/InfoProviderSystem/DTOs/FileDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/FileDTOTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\InfoProviderSystem\DTOs\FileDTO;
use PHPUnit\Framework\TestCase;
-class FileDTOTest extends TestCase
+final class FileDTOTest extends TestCase
{
diff --git a/tests/Services/InfoProviderSystem/DTOs/ParameterDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/ParameterDTOTest.php
index 4c4e9bfe..6361dc10 100644
--- a/tests/Services/InfoProviderSystem/DTOs/ParameterDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/ParameterDTOTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\InfoProviderSystem\DTOs\ParameterDTO;
use PHPUnit\Framework\TestCase;
-class ParameterDTOTest extends TestCase
+final class ParameterDTOTest extends TestCase
{
public static function parseValueFieldDataProvider(): \Generator
diff --git a/tests/Services/InfoProviderSystem/DTOs/PurchaseInfoDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/PurchaseInfoDTOTest.php
index 14a3c03f..480ff924 100644
--- a/tests/Services/InfoProviderSystem/DTOs/PurchaseInfoDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/PurchaseInfoDTOTest.php
@@ -22,10 +22,11 @@ declare(strict_types=1);
*/
namespace App\Tests\Services\InfoProviderSystem\DTOs;
+use App\Services\InfoProviderSystem\DTOs\PriceDTO;
use App\Services\InfoProviderSystem\DTOs\PurchaseInfoDTO;
use PHPUnit\Framework\TestCase;
-class PurchaseInfoDTOTest extends TestCase
+final class PurchaseInfoDTOTest extends TestCase
{
public function testThrowOnInvalidType(): void
{
@@ -33,4 +34,40 @@ class PurchaseInfoDTOTest extends TestCase
$this->expectExceptionMessage('The prices array must only contain PriceDTO instances');
new PurchaseInfoDTO('test', 'test', [new \stdClass()]);
}
+
+ public function testPricesIncludesVATHandling(): void
+ {
+ $pricesTrue = [
+ new PriceDTO(minimum_discount_amount: 1, price: '10.00', currency_iso_code: 'USD', includes_tax: true),
+ new PriceDTO(minimum_discount_amount: 5, price: '9.00', currency_iso_code: 'USD', includes_tax: true),
+ ];
+ $pricesFalse = [
+ new PriceDTO(minimum_discount_amount: 1, price: '10.00', currency_iso_code: 'USD', includes_tax: false),
+ new PriceDTO(minimum_discount_amount: 5, price: '9.00', currency_iso_code: 'USD', includes_tax: false),
+ ];
+ $pricesMixed = [
+ new PriceDTO(minimum_discount_amount: 1, price: '10.00', currency_iso_code: 'USD', includes_tax: true),
+ new PriceDTO(minimum_discount_amount: 5, price: '9.00', currency_iso_code: 'USD', includes_tax: false),
+ ];
+ $pricesNull = [
+ new PriceDTO(minimum_discount_amount: 1, price: '10.00', currency_iso_code: 'USD', includes_tax: null),
+ new PriceDTO(minimum_discount_amount: 5, price: '9.00', currency_iso_code: 'USD', includes_tax: null),
+ ];
+
+ //If the prices_include_vat parameter is given, use it:
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesMixed, prices_include_vat: true);
+ $this->assertTrue($dto->prices_include_vat);
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesMixed, prices_include_vat: false);
+ $this->assertFalse($dto->prices_include_vat);
+
+ //If the prices_include_vat parameter is not given, try to deduct it from the prices:
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesTrue);
+ $this->assertTrue($dto->prices_include_vat);
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesFalse);
+ $this->assertFalse($dto->prices_include_vat);
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesMixed);
+ $this->assertNull($dto->prices_include_vat);
+ $dto = new PurchaseInfoDTO('test', 'test', $pricesNull);
+ $this->assertNull($dto->prices_include_vat);
+ }
}
diff --git a/tests/Services/InfoProviderSystem/DTOs/SearchResultDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/SearchResultDTOTest.php
index dd516c8d..4fbac1f3 100644
--- a/tests/Services/InfoProviderSystem/DTOs/SearchResultDTOTest.php
+++ b/tests/Services/InfoProviderSystem/DTOs/SearchResultDTOTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Services\InfoProviderSystem\DTOs;
use App\Services\InfoProviderSystem\DTOs\SearchResultDTO;
use PHPUnit\Framework\TestCase;
-class SearchResultDTOTest extends TestCase
+final class SearchResultDTOTest extends TestCase
{
public function testPreviewImageURL(): void
{
diff --git a/tests/Services/InfoProviderSystem/DTOtoEntityConverterTest.php b/tests/Services/InfoProviderSystem/DTOtoEntityConverterTest.php
index 6c933472..8ea6c71a 100644
--- a/tests/Services/InfoProviderSystem/DTOtoEntityConverterTest.php
+++ b/tests/Services/InfoProviderSystem/DTOtoEntityConverterTest.php
@@ -35,7 +35,7 @@ use PhpParser\Node\Param;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class DTOtoEntityConverterTest extends WebTestCase
+final class DTOtoEntityConverterTest extends WebTestCase
{
private ?DTOtoEntityConverter $service = null;
@@ -94,7 +94,6 @@ class DTOtoEntityConverterTest extends WebTestCase
minimum_discount_amount: 5,
price: "10.0",
currency_iso_code: 'EUR',
- includes_tax: true,
);
$entity = $this->service->convertPrice($dto);
@@ -115,6 +114,7 @@ class DTOtoEntityConverterTest extends WebTestCase
order_number: 'TestOrderNumber',
prices: $prices,
product_url: 'https://example.com',
+ prices_include_vat: true,
);
$entity = $this->service->convertPurchaseInfo($dto);
@@ -122,6 +122,7 @@ class DTOtoEntityConverterTest extends WebTestCase
$this->assertSame($dto->distributor_name, $entity->getSupplier()->getName());
$this->assertSame($dto->order_number, $entity->getSupplierPartNr());
$this->assertEquals($dto->product_url, $entity->getSupplierProductUrl());
+ $this->assertTrue($dto->prices_include_vat);
}
public function testConvertFileWithName(): void
@@ -159,12 +160,13 @@ class DTOtoEntityConverterTest extends WebTestCase
$shopping_infos = [new PurchaseInfoDTO('TestDistributor', 'TestOrderNumber', [new PriceDTO(1, "10.0", 'EUR')])];
$dto = new PartDetailDTO(
- provider_key: 'test_provider', provider_id: 'test_id', provider_url: 'https://invalid.invalid/test_id',
- name: 'TestPart', description: 'TestDescription', category: 'TestCategory',
- manufacturer: 'TestManufacturer', mpn: 'TestMPN', manufacturing_status: ManufacturingStatus::EOL,
- preview_image_url: 'https://invalid.invalid/image.png',
- footprint: 'DIP8', notes: 'TestNotes', mass: 10.4,
- parameters: $parameters, datasheets: $datasheets, vendor_infos: $shopping_infos, images: $images
+ provider_key: 'test_provider', provider_id: 'test_id', name: 'TestPart',
+ description: 'TestDescription', category: 'TestCategory', manufacturer: 'TestManufacturer',
+ mpn: 'TestMPN', preview_image_url: 'https://invalid.invalid/image.png',
+ manufacturing_status: ManufacturingStatus::EOL,
+ provider_url: 'https://invalid.invalid/test_id',
+ footprint: 'DIP8', gtin: "1234567890123", notes: 'TestNotes', datasheets: $datasheets,
+ images: $images, parameters: $parameters, vendor_infos: $shopping_infos, mass: 10.4
);
$entity = $this->service->convertPart($dto);
@@ -180,6 +182,8 @@ class DTOtoEntityConverterTest extends WebTestCase
$this->assertEquals($dto->mass, $entity->getMass());
$this->assertEquals($dto->footprint, $entity->getFootprint());
+ $this->assertEquals($dto->gtin, $entity->getGtin());
+
//We just check that the lenghts of parameters, datasheets, images and shopping infos are the same
//The actual content is tested in the corresponding tests
$this->assertCount(count($parameters), $entity->getParameters());
diff --git a/tests/Services/InfoProviderSystem/ProviderRegistryTest.php b/tests/Services/InfoProviderSystem/ProviderRegistryTest.php
index 9026c5bf..d3fce441 100644
--- a/tests/Services/InfoProviderSystem/ProviderRegistryTest.php
+++ b/tests/Services/InfoProviderSystem/ProviderRegistryTest.php
@@ -24,9 +24,10 @@ namespace App\Tests\Services\InfoProviderSystem;
use App\Services\InfoProviderSystem\ProviderRegistry;
use App\Services\InfoProviderSystem\Providers\InfoProviderInterface;
+use App\Services\InfoProviderSystem\Providers\URLHandlerInfoProviderInterface;
use PHPUnit\Framework\TestCase;
-class ProviderRegistryTest extends TestCase
+final class ProviderRegistryTest extends TestCase
{
/** @var InfoProviderInterface[] */
@@ -44,9 +45,10 @@ class ProviderRegistryTest extends TestCase
public function getMockProvider(string $key, bool $active = true): InfoProviderInterface
{
- $mock = $this->createMock(InfoProviderInterface::class);
+ $mock = $this->createMockForIntersectionOfInterfaces([InfoProviderInterface::class, URLHandlerInfoProviderInterface::class]);
$mock->method('getProviderKey')->willReturn($key);
$mock->method('isActive')->willReturn($active);
+ $mock->method('getHandledDomains')->willReturn(["$key.com", "test.$key.de"]);
return $mock;
}
@@ -109,4 +111,18 @@ class ProviderRegistryTest extends TestCase
$registry->getProviders();
}
+
+ public function testGetProviderHandlingDomain(): void
+ {
+ $registry = new ProviderRegistry($this->providers);
+
+ $this->assertEquals($this->providers[0], $registry->getProviderHandlingDomain('test1.com'));
+ $this->assertEquals($this->providers[0], $registry->getProviderHandlingDomain('www.test1.com')); //Subdomain should also work
+
+ $this->assertEquals(
+ $this->providers[1],
+ $registry->getProviderHandlingDomain('test.test2.de')
+ );
+ }
+
}
diff --git a/tests/Services/InfoProviderSystem/Providers/BuerklinProviderTest.php b/tests/Services/InfoProviderSystem/Providers/BuerklinProviderTest.php
index 3193db89..ef446c9a 100644
--- a/tests/Services/InfoProviderSystem/Providers/BuerklinProviderTest.php
+++ b/tests/Services/InfoProviderSystem/Providers/BuerklinProviderTest.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Services\InfoProviderSystem\Providers;
+use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
use App\Services\InfoProviderSystem\DTOs\SearchResultDTO;
use App\Services\InfoProviderSystem\Providers\BuerklinProvider;
@@ -18,7 +19,7 @@ use Symfony\Contracts\HttpClient\ResponseInterface;
* Full behavioral test suite for BuerklinProvider.
* Includes parameter parsing, compliance parsing, images, prices and batch mode.
*/
-class BuerklinProviderTest extends TestCase
+final class BuerklinProviderTest extends TestCase
{
private HttpClientInterface $httpClient;
private CacheItemPoolInterface $cache;
@@ -108,14 +109,14 @@ class BuerklinProviderTest extends TestCase
$this->assertSame('Zener voltage', $params[0]->name);
$this->assertNull($params[0]->value_text);
- $this->assertSame(12.0, $params[0]->value_typ);
+ $this->assertEqualsWithDelta(12.0, $params[0]->value_typ, PHP_FLOAT_EPSILON);
$this->assertNull($params[0]->value_min);
$this->assertNull($params[0]->value_max);
$this->assertSame('V', $params[0]->unit);
$this->assertSame('Length', $params[1]->name);
$this->assertNull($params[1]->value_text);
- $this->assertSame(2.9, $params[1]->value_typ);
+ $this->assertEqualsWithDelta(2.9, $params[1]->value_typ, PHP_FLOAT_EPSILON);
$this->assertSame('mm', $params[1]->unit);
$this->assertSame('Assembly', $params[2]->name);
@@ -268,4 +269,75 @@ class BuerklinProviderTest extends TestCase
$this->assertSame('PartX', $dto->name);
$this->assertSame('https://img', $dto->preview_image_url);
}
+ public function testGetHandledDomains(): void
+ {
+ $this->assertSame(['buerklin.com'], $this->provider->getHandledDomains());
+ }
+
+ #[DataProvider('buerklinIdFromUrlProvider')]
+ public function testGetIDFromURLExtractsId(string $url, ?string $expected): void
+ {
+ $this->assertSame($expected, $this->provider->getIDFromURL($url));
+ }
+
+ public static function buerklinIdFromUrlProvider(): \Iterator
+ {
+ yield 'de long path' => [
+ 'https://www.buerklin.com/de/p/bkl-electronic/niedervoltsteckverbinder/072341-l/40F1332/',
+ '40F1332',
+ ];
+ yield 'de short path' => [
+ 'https://www.buerklin.com/de/p/40F1332/',
+ '40F1332',
+ ];
+ yield 'en long path' => [
+ 'https://www.buerklin.com/en/p/bkl-electronic/dc-connectors/072341-l/40F1332/',
+ '40F1332',
+ ];
+ yield 'en short path' => [
+ 'https://www.buerklin.com/en/p/40F1332/',
+ '40F1332',
+ ];
+ yield 'fragment should be ignored' => [
+ 'https://www.buerklin.com/de/p/bkl-electronic/niedervoltsteckverbinder/072341-l/40F1332/#download',
+ '40F1332',
+ ];
+ yield 'no trailing slash' => [
+ 'https://www.buerklin.com/en/p/40F1332',
+ '40F1332',
+ ];
+ yield 'query should be ignored' => [
+ 'https://www.buerklin.com/en/p/40F1332/?foo=bar',
+ '40F1332',
+ ];
+ yield 'query and fragment should be ignored' => [
+ 'https://www.buerklin.com/en/p/40F1332/?foo=bar#download',
+ '40F1332',
+ ];
+ // Negative cases
+ yield 'not a product url (no /p/ segment)' => [
+ 'https://www.buerklin.com/de/impressum/',
+ null,
+ ];
+ yield 'path contains "p" but not "/p/"' => [
+ 'https://www.buerklin.com/de/help/price/',
+ null,
+ ];
+ yield 'ends with /p/ (no id)' => [
+ 'https://www.buerklin.com/de/p/',
+ null,
+ ];
+ yield 'ends with /p (no trailing slash)' => [
+ 'https://www.buerklin.com/de/p',
+ null,
+ ];
+ yield 'empty string' => [
+ '',
+ null,
+ ];
+ yield 'not a url string' => [
+ 'not a url',
+ null,
+ ];
+ }
}
diff --git a/tests/Services/InfoProviderSystem/Providers/LCSCProviderTest.php b/tests/Services/InfoProviderSystem/Providers/LCSCProviderTest.php
index 57527f57..dc19de6b 100644
--- a/tests/Services/InfoProviderSystem/Providers/LCSCProviderTest.php
+++ b/tests/Services/InfoProviderSystem/Providers/LCSCProviderTest.php
@@ -37,7 +37,7 @@ use Symfony\Component\HttpClient\MockHttpClient;
use Symfony\Component\HttpClient\Response\MockResponse;
use Symfony\Contracts\HttpClient\HttpClientInterface;
-class LCSCProviderTest extends TestCase
+final class LCSCProviderTest extends TestCase
{
private LCSCSettings $settings;
private LCSCProvider $provider;
@@ -67,7 +67,7 @@ class LCSCProviderTest extends TestCase
public function testGetProviderKey(): void
{
- $this->assertEquals('lcsc', $this->provider->getProviderKey());
+ $this->assertSame('lcsc', $this->provider->getProviderKey());
}
public function testIsActiveWhenEnabled(): void
@@ -125,8 +125,8 @@ class LCSCProviderTest extends TestCase
$this->assertIsArray($results);
$this->assertCount(1, $results);
$this->assertInstanceOf(PartDetailDTO::class, $results[0]);
- $this->assertEquals('C123456', $results[0]->provider_id);
- $this->assertEquals('Test Component', $results[0]->name);
+ $this->assertSame('C123456', $results[0]->provider_id);
+ $this->assertSame('Test Component', $results[0]->name);
}
public function testSearchByKeywordWithRegularTerm(): void
@@ -162,8 +162,8 @@ class LCSCProviderTest extends TestCase
$this->assertIsArray($results);
$this->assertCount(1, $results);
$this->assertInstanceOf(PartDetailDTO::class, $results[0]);
- $this->assertEquals('C789012', $results[0]->provider_id);
- $this->assertEquals('Regular Component', $results[0]->name);
+ $this->assertSame('C789012', $results[0]->provider_id);
+ $this->assertSame('Regular Component', $results[0]->name);
}
public function testSearchByKeywordWithTipProduct(): void
@@ -202,8 +202,8 @@ class LCSCProviderTest extends TestCase
$this->assertIsArray($results);
$this->assertCount(1, $results);
$this->assertInstanceOf(PartDetailDTO::class, $results[0]);
- $this->assertEquals('C555555', $results[0]->provider_id);
- $this->assertEquals('Tip Component', $results[0]->name);
+ $this->assertSame('C555555', $results[0]->provider_id);
+ $this->assertSame('Tip Component', $results[0]->name);
}
public function testSearchByKeywordsBatch(): void
@@ -288,12 +288,12 @@ class LCSCProviderTest extends TestCase
$result = $this->provider->getDetails('C123456');
$this->assertInstanceOf(PartDetailDTO::class, $result);
- $this->assertEquals('C123456', $result->provider_id);
- $this->assertEquals('Detailed Component', $result->name);
- $this->assertEquals('Detailed description', $result->description);
- $this->assertEquals('Detailed Manufacturer', $result->manufacturer);
+ $this->assertSame('C123456', $result->provider_id);
+ $this->assertSame('Detailed Component', $result->name);
+ $this->assertSame('Detailed description', $result->description);
+ $this->assertSame('Detailed Manufacturer', $result->manufacturer);
$this->assertEquals('0603', $result->footprint);
- $this->assertEquals('https://www.lcsc.com/product-detail/C123456.html', $result->provider_url);
+ $this->assertSame('https://www.lcsc.com/product-detail/C123456.html', $result->provider_url);
$this->assertCount(1, $result->images);
$this->assertCount(2, $result->parameters);
$this->assertCount(1, $result->vendor_infos);
@@ -465,8 +465,8 @@ class LCSCProviderTest extends TestCase
$this->assertIsArray($result);
$this->assertCount(1, $result);
$this->assertInstanceOf(PurchaseInfoDTO::class, $result[0]);
- $this->assertEquals('LCSC', $result[0]->distributor_name);
- $this->assertEquals('C123456', $result[0]->order_number);
+ $this->assertSame('LCSC', $result[0]->distributor_name);
+ $this->assertSame('C123456', $result[0]->order_number);
$this->assertCount(2, $result[0]->prices);
}
@@ -493,7 +493,7 @@ class LCSCProviderTest extends TestCase
$this->httpClient->setResponseFactory([$mockResponse]);
$result = $this->provider->getDetails('C123456');
- $this->assertEquals('Electronic Components -> Resistors (SMT)', $result->category);
+ $this->assertSame('Electronic Components -> Resistors (SMT)', $result->category);
}
public function testEmptyFootprintHandling(): void
diff --git a/tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php b/tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php
deleted file mode 100644
index c40e141d..00000000
--- a/tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php
+++ /dev/null
@@ -1,85 +0,0 @@
-.
- */
-
-declare(strict_types=1);
-
-/**
- * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
- *
- * Copyright (C) 2019 - 2020 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 .
- */
-
-namespace App\Tests\Services\LabelSystem\BarcodeScanner;
-
-use PHPUnit\Framework\Attributes\DataProvider;
-use PHPUnit\Framework\Attributes\Group;
-use App\Entity\LabelSystem\LabelSupportedElement;
-use App\Services\LabelSystem\BarcodeScanner\BarcodeRedirector;
-use App\Services\LabelSystem\BarcodeScanner\BarcodeSourceType;
-use App\Services\LabelSystem\BarcodeScanner\LocalBarcodeScanResult;
-use Doctrine\ORM\EntityNotFoundException;
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-
-final class BarcodeRedirectorTest extends KernelTestCase
-{
- private ?BarcodeRedirector $service = null;
-
- protected function setUp(): void
- {
- self::bootKernel();
- $this->service = self::getContainer()->get(BarcodeRedirector::class);
- }
-
- public static function urlDataProvider(): \Iterator
- {
- yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL), '/en/part/1'];
- //Part lot redirects to Part info page (Part lot 1 is associated with part 3)
- yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL), '/en/part/3'];
- yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL), '/en/store_location/1/parts'];
- }
-
- #[DataProvider('urlDataProvider')]
- #[Group('DB')]
- public function testGetRedirectURL(LocalBarcodeScanResult $scanResult, string $url): void
- {
- $this->assertSame($url, $this->service->getRedirectURL($scanResult));
- }
-
- public function testGetRedirectEntityNotFount(): void
- {
- $this->expectException(EntityNotFoundException::class);
- //If we encounter an invalid lot, we must throw an exception
- $this->service->getRedirectURL(new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT,
- 12_345_678, BarcodeSourceType::INTERNAL));
- }
-}
diff --git a/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
index fcea7730..8f8c7a18 100644
--- a/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
+++ b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
@@ -49,8 +49,9 @@ use App\Services\LabelSystem\BarcodeScanner\BarcodeSourceType;
use App\Services\LabelSystem\BarcodeScanner\EIGP114BarcodeScanResult;
use App\Services\LabelSystem\BarcodeScanner\LocalBarcodeScanResult;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+use App\Services\LabelSystem\BarcodeScanner\LCSCBarcodeScanResult;
-class BarcodeScanHelperTest extends WebTestCase
+final class BarcodeScanHelperTest extends WebTestCase
{
private ?BarcodeScanHelper $service = null;
@@ -124,6 +125,14 @@ class BarcodeScanHelperTest extends WebTestCase
]);
yield [$eigp114Result, "[)>\x1E06\x1DP596-777A1-ND\x1D1PXAF4444\x1DQ3\x1D10D1452\x1D1TBF1103\x1D4LUS\x1E\x04"];
+
+ $lcscInput = '{pc:C138033,pm:RC0402FR-071ML,qty:10}';
+ $lcscResult = new LCSCBarcodeScanResult(
+ ['pc' => 'C138033', 'pm' => 'RC0402FR-071ML', 'qty' => '10'],
+ $lcscInput
+ );
+
+ yield [$lcscResult, $lcscInput];
}
public static function invalidDataProvider(): \Iterator
@@ -153,4 +162,33 @@ class BarcodeScanHelperTest extends WebTestCase
$this->expectException(\InvalidArgumentException::class);
$this->service->scanBarcodeContent($input);
}
+
+ public function testAutoDetectLcscBarcode(): void
+ {
+ $input = '{pbn:PB1,on:ON1,pc:C138033,pm:RC0402FR-071ML,qty:10}';
+
+ $result = $this->service->scanBarcodeContent($input);
+
+ $this->assertInstanceOf(LCSCBarcodeScanResult::class, $result);
+ $this->assertSame('C138033', $result->lcscCode);
+ $this->assertSame('RC0402FR-071ML', $result->mpn);
+ }
+
+ public function testLcscExplicitTypeParses(): void
+ {
+ $input = '{pc:C138033,pm:RC0402FR-071ML,qty:10}';
+
+ $result = $this->service->scanBarcodeContent($input, BarcodeSourceType::LCSC);
+
+ $this->assertInstanceOf(LCSCBarcodeScanResult::class, $result);
+ $this->assertSame('C138033', $result->lcscCode);
+ $this->assertSame('RC0402FR-071ML', $result->mpn);
+ }
+
+ public function testLcscExplicitTypeRejectsNonLcsc(): void
+ {
+ $this->expectException(\InvalidArgumentException::class);
+
+ $this->service->scanBarcodeContent('not-an-lcsc', BarcodeSourceType::LCSC);
+ }
}
diff --git a/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanResultHandlerTest.php b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanResultHandlerTest.php
new file mode 100644
index 00000000..95313e13
--- /dev/null
+++ b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanResultHandlerTest.php
@@ -0,0 +1,181 @@
+.
+ */
+
+declare(strict_types=1);
+
+/**
+ * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
+ *
+ * Copyright (C) 2019 - 2020 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 .
+ */
+
+namespace App\Tests\Services\LabelSystem\BarcodeScanner;
+
+use App\Entity\Parts\Part;
+use App\Entity\Parts\PartLot;
+use App\Entity\Parts\StorageLocation;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeScanResultHandler;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Group;
+use App\Entity\LabelSystem\LabelSupportedElement;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeSourceType;
+use App\Services\LabelSystem\BarcodeScanner\LocalBarcodeScanResult;
+use Doctrine\ORM\EntityNotFoundException;
+use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
+use App\Services\LabelSystem\BarcodeScanner\EIGP114BarcodeScanResult;
+use App\Services\LabelSystem\BarcodeScanner\LCSCBarcodeScanResult;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeScanResultInterface;
+use InvalidArgumentException;
+
+
+final class BarcodeScanResultHandlerTest extends KernelTestCase
+{
+ private ?BarcodeScanResultHandler $service = null;
+
+ protected function setUp(): void
+ {
+ self::bootKernel();
+ $this->service = self::getContainer()->get(BarcodeScanResultHandler::class);
+ }
+
+ public static function urlDataProvider(): \Iterator
+ {
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL), '/en/part/1'];
+ //Part lot redirects to Part info page (Part lot 1 is associated with part 3)
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL), '/en/part/3?highlightLot=1'];
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL), '/en/store_location/1/parts'];
+ }
+
+ #[DataProvider('urlDataProvider')]
+ #[Group('DB')]
+ public function testGetRedirectURL(LocalBarcodeScanResult $scanResult, string $url): void
+ {
+ $this->assertSame($url, $this->service->getInfoURL($scanResult));
+ }
+
+ public function testGetRedirectEntityNotFound(): void
+ {
+ //If we encounter an invalid lot, we must get an null result
+ $url = $this->service->getInfoURL(new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT,
+ 12_345_678, BarcodeSourceType::INTERNAL));
+
+ $this->assertNull($url);
+ }
+
+ public function testGetRedirectURLReturnsNullOnUnknownScanType(): void
+ {
+ $unknown = new class implements BarcodeScanResultInterface {
+ public function getDecodedForInfoMode(): array
+ {
+ return [];
+ }
+ };
+
+ $this->assertNull($this->service->getInfoURL($unknown));
+ }
+
+ public function testEIGPBarcodeResolvePartOrNullReturnsNullWhenNotFound(): void
+ {
+ $scan = new EIGP114BarcodeScanResult([]);
+
+ $this->assertNull($this->service->resolvePart($scan));
+ $this->assertNull($this->service->getInfoURL($scan));
+ }
+
+ public function testLCSCBarcodeResolvePartOrNullReturnsNullWhenNotFound(): void
+ {
+ $scan = new LCSCBarcodeScanResult(
+ fields: ['pc' => 'C0000000', 'pm' => ''],
+ rawInput: '{pc:C0000000,pm:}'
+ );
+
+ $this->assertNull($this->service->resolvePart($scan));
+ $this->assertNull($this->service->getInfoURL($scan));
+ }
+
+ public function testResolveEntityReturnNullOnUnknownScanType(): void
+ {
+ $unknown = new class implements BarcodeScanResultInterface {
+ public function getDecodedForInfoMode(): array
+ {
+ return [];
+ }
+ };
+
+ $this->assertNull($this->service->resolvePart($unknown));
+ }
+
+ public function testResolveEntity(): void
+ {
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL);
+ $part = $this->service->resolveEntity($scan);
+
+ $this->assertSame(1, $part->getId());
+ $this->assertInstanceOf(Part::class, $part);
+
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL);
+ $entity = $this->service->resolveEntity($scan);
+ $this->assertSame(1, $entity->getId());
+ $this->assertInstanceOf(PartLot::class, $entity);
+
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL);
+ $entity = $this->service->resolveEntity($scan);
+ $this->assertSame(1, $entity->getId());
+ $this->assertInstanceOf(StorageLocation::class, $entity);
+ }
+
+ public function testResolvePart(): void
+ {
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL);
+ $part = $this->service->resolvePart($scan);
+
+ $this->assertSame(1, $part->getId());
+
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL);
+ $part = $this->service->resolvePart($scan);
+ $this->assertSame(3, $part->getId());
+
+ $scan = new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL);
+ $part = $this->service->resolvePart($scan);
+ $this->assertNull($part); //Store location does not resolve to a part
+ }
+
+ public function testGetCreateInfos(): void
+ {
+ $lcscScan = LCSCBarcodeScanResult::parse('{pbn:PB1,on:ON1,pc:C138033,pm:RC0402FR-071ML,qty:10}');
+ $infos = $this->service->getCreateInfos($lcscScan);
+
+ $this->assertSame('lcsc', $infos['providerKey']);
+ $this->assertSame('C138033', $infos['providerId']);
+ }
+}
diff --git a/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php b/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php
index 3a414997..6d69a773 100644
--- a/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php
+++ b/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Services\LabelSystem\BarcodeScanner;
use App\Services\LabelSystem\BarcodeScanner\EIGP114BarcodeScanResult;
use PHPUnit\Framework\TestCase;
-class EIGP114BarcodeScanResultTest extends TestCase
+final class EIGP114BarcodeScanResultTest extends TestCase
{
public function testGuessBarcodeVendor(): void
diff --git a/tests/Services/LabelSystem/BarcodeScanner/LCSCBarcodeScanResultTest.php b/tests/Services/LabelSystem/BarcodeScanner/LCSCBarcodeScanResultTest.php
new file mode 100644
index 00000000..2128f113
--- /dev/null
+++ b/tests/Services/LabelSystem/BarcodeScanner/LCSCBarcodeScanResultTest.php
@@ -0,0 +1,86 @@
+.
+ */
+
+namespace App\Tests\Services\LabelSystem\BarcodeScanner;
+
+use App\Services\LabelSystem\BarcodeScanner\LCSCBarcodeScanResult;
+use InvalidArgumentException;
+use PHPUnit\Framework\TestCase;
+
+class LCSCBarcodeScanResultTest extends TestCase
+{
+ public function testIsLCSCBarcode(): void
+ {
+ $this->assertFalse(LCSCBarcodeScanResult::isLCSCBarcode('invalid'));
+ $this->assertFalse(LCSCBarcodeScanResult::isLCSCBarcode('LCSC-12345'));
+ $this->assertFalse(LCSCBarcodeScanResult::isLCSCBarcode(''));
+
+ $this->assertTrue(LCSCBarcodeScanResult::isLCSCBarcode('{pbn:PB1,on:ON1,pc:C138033,pm:RC0402FR-071ML,qty:10}'));
+ $this->assertTrue(LCSCBarcodeScanResult::isLCSCBarcode('{pbn:PICK2506270148,on:GB2506270877,pc:C22437266,pm:IA0509S-2W,qty:3,mc:,cc:1,pdi:164234874,hp:null,wc:ZH}'));
+ }
+
+ public function testConstruct(): void
+ {
+ $raw = '{pbn:PB1,on:ON1,pc:C138033,pm:RC0402FR-071ML,qty:10}';
+ $fields = ['pbn' => 'PB1', 'on' => 'ON1', 'pc' => 'C138033', 'pm' => 'RC0402FR-071ML', 'qty' => '10'];
+ $scan = new LCSCBarcodeScanResult($fields, $raw);
+ //Splitting up should work and assign the correct values to the properties:
+ $this->assertSame('RC0402FR-071ML', $scan->mpn);
+ $this->assertSame('C138033', $scan->lcscCode);
+
+ //Fields and raw input should be preserved
+ $this->assertSame($fields, $scan->fields);
+ $this->assertSame($raw, $scan->rawInput);
+ }
+
+ public function testLCSCParseInvalidFormatThrows(): void
+ {
+ $this->expectException(InvalidArgumentException::class);
+ LCSCBarcodeScanResult::parse('not-an-lcsc-barcode');
+ }
+
+ public function testParse(): void
+ {
+ $scan = LCSCBarcodeScanResult::parse('{pbn:PICK2506270148,on:GB2506270877,pc:C22437266,pm:IA0509S-2W,qty:3,mc:,cc:1,pdi:164234874,hp:null,wc:ZH}');
+
+ $this->assertSame('IA0509S-2W', $scan->mpn);
+ $this->assertSame('C22437266', $scan->lcscCode);
+ $this->assertSame('PICK2506270148', $scan->pickBatchNumber);
+ $this->assertSame('GB2506270877', $scan->orderNumber);
+ $this->assertSame(3, $scan->quantity);
+ $this->assertSame('1', $scan->countryChannel);
+ $this->assertSame('164234874', $scan->pdi);
+ $this->assertSame('null', $scan->hp);
+ $this->assertSame('ZH', $scan->warehouseCode);
+ }
+
+ public function testLCSCParseExtractsFields(): void
+ {
+ $scan = LCSCBarcodeScanResult::parse('{pbn:PB1,on:ON1,pc:C138033,pm:RC0402FR-071ML,qty:10}');
+
+ $this->assertSame('RC0402FR-071ML', $scan->mpn);
+ $this->assertSame('C138033', $scan->lcscCode);
+
+ $decoded = $scan->getDecodedForInfoMode();
+ $this->assertSame('LCSC', $decoded['Barcode type']);
+ $this->assertSame('RC0402FR-071ML', $decoded['MPN (pm)']);
+ $this->assertSame('C138033', $decoded['LCSC code (pc)']);
+ }
+}
diff --git a/tests/Services/LabelSystem/Barcodes/BarcodeContentGeneratorTest.php b/tests/Services/LabelSystem/Barcodes/BarcodeContentGeneratorTest.php
index 69458734..d9185735 100644
--- a/tests/Services/LabelSystem/Barcodes/BarcodeContentGeneratorTest.php
+++ b/tests/Services/LabelSystem/Barcodes/BarcodeContentGeneratorTest.php
@@ -48,7 +48,7 @@ use App\Entity\Parts\StorageLocation;
use App\Services\LabelSystem\Barcodes\BarcodeContentGenerator;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class BarcodeContentGeneratorTest extends KernelTestCase
+final class BarcodeContentGeneratorTest extends KernelTestCase
{
private ?object $service = null;
diff --git a/tests/Services/LabelSystem/Barcodes/BarcodeHelperTest.php b/tests/Services/LabelSystem/Barcodes/BarcodeHelperTest.php
index d681b3b9..e03221e5 100644
--- a/tests/Services/LabelSystem/Barcodes/BarcodeHelperTest.php
+++ b/tests/Services/LabelSystem/Barcodes/BarcodeHelperTest.php
@@ -27,7 +27,7 @@ use App\Services\LabelSystem\Barcodes\BarcodeHelper;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class BarcodeHelperTest extends WebTestCase
+final class BarcodeHelperTest extends WebTestCase
{
protected ?BarcodeHelper $service = null;
diff --git a/tests/Services/LabelSystem/LabelGeneratorTest.php b/tests/Services/LabelSystem/LabelGeneratorTest.php
index 916d4317..5f6d8f04 100644
--- a/tests/Services/LabelSystem/LabelGeneratorTest.php
+++ b/tests/Services/LabelSystem/LabelGeneratorTest.php
@@ -51,7 +51,7 @@ use App\Entity\Parts\StorageLocation;
use App\Services\LabelSystem\LabelGenerator;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class LabelGeneratorTest extends WebTestCase
+final class LabelGeneratorTest extends WebTestCase
{
/**
* @var LabelGenerator
diff --git a/tests/Services/LabelSystem/LabelTextReplacerTest.php b/tests/Services/LabelSystem/LabelTextReplacerTest.php
index 346d1bab..c4a140d8 100644
--- a/tests/Services/LabelSystem/LabelTextReplacerTest.php
+++ b/tests/Services/LabelSystem/LabelTextReplacerTest.php
@@ -47,7 +47,7 @@ use App\Entity\Parts\PartLot;
use App\Services\LabelSystem\LabelTextReplacer;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class LabelTextReplacerTest extends WebTestCase
+final class LabelTextReplacerTest extends WebTestCase
{
/**
* @var LabelTextReplacer
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/AbstractElementProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/AbstractElementProviderTest.php
index fb917b82..584f708a 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/AbstractElementProviderTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/AbstractElementProviderTest.php
@@ -46,7 +46,7 @@ use App\Entity\Base\AbstractDBElement;
use App\Services\LabelSystem\PlaceholderProviders\AbstractDBElementProvider;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class AbstractElementProviderTest extends WebTestCase
+final class AbstractElementProviderTest extends WebTestCase
{
/**
* @var AbstractDBElementProvider
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/GlobalProvidersTest.php b/tests/Services/LabelSystem/PlaceholderProviders/GlobalProvidersTest.php
index d74bb215..80b6b76f 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/GlobalProvidersTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/GlobalProvidersTest.php
@@ -46,7 +46,7 @@ use App\Entity\Parts\Part;
use App\Services\LabelSystem\PlaceholderProviders\GlobalProviders;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class GlobalProvidersTest extends WebTestCase
+final class GlobalProvidersTest extends WebTestCase
{
/**
* @var GlobalProviders
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/NamedElementProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/NamedElementProviderTest.php
index c5efc768..88b77e8e 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/NamedElementProviderTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/NamedElementProviderTest.php
@@ -46,7 +46,7 @@ use App\Entity\Contracts\NamedElementInterface;
use App\Services\LabelSystem\PlaceholderProviders\NamedElementProvider;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class NamedElementProviderTest extends WebTestCase
+final class NamedElementProviderTest extends WebTestCase
{
/**
* @var NamedElementProvider
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/PartLotProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/PartLotProviderTest.php
index 5aa8f1bd..68425250 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/PartLotProviderTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/PartLotProviderTest.php
@@ -49,7 +49,7 @@ use App\Entity\UserSystem\User;
use App\Services\LabelSystem\PlaceholderProviders\PartLotProvider;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class PartLotProviderTest extends WebTestCase
+final class PartLotProviderTest extends WebTestCase
{
/**
* @var PartLotProvider
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/PartProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/PartProviderTest.php
index 7af936cd..9f1c74f7 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/PartProviderTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/PartProviderTest.php
@@ -53,7 +53,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
#[Group('DB')]
-class PartProviderTest extends WebTestCase
+final class PartProviderTest extends WebTestCase
{
/**
* @var PartProvider
@@ -62,20 +62,15 @@ class PartProviderTest extends WebTestCase
protected Part $target;
- /**
- * @var EntityManager
- */
- protected $em;
-
protected function setUp(): void
{
self::bootKernel();
$this->service = self::getContainer()->get(PartProvider::class);
$this->target = new Part();
- $this->em = self::getContainer()->get(EntityManagerInterface::class);
+ $em = self::getContainer()->get(EntityManagerInterface::class);
- $this->target->setCategory($this->em->find(Category::class, 6));
- $this->target->setFootprint($this->em->find(Footprint::class, 6));
+ $this->target->setCategory($em->find(Category::class, 6));
+ $this->target->setFootprint($em->find(Footprint::class, 6));
$this->target->setManufacturer(null);
$this->target->setMass(1234.2);
diff --git a/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php
index 6aa152b9..b5415131 100644
--- a/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php
+++ b/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php
@@ -48,7 +48,7 @@ use App\Services\LabelSystem\PlaceholderProviders\TimestampableElementProvider;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class TimestampableElementProviderTest extends WebTestCase
+final class TimestampableElementProviderTest extends WebTestCase
{
/**
* @var GlobalProviders
diff --git a/tests/Services/LabelSystem/SandboxedTwigFactoryTest.php b/tests/Services/LabelSystem/SandboxedTwigFactoryTest.php
index 32317435..f10ef333 100644
--- a/tests/Services/LabelSystem/SandboxedTwigFactoryTest.php
+++ b/tests/Services/LabelSystem/SandboxedTwigFactoryTest.php
@@ -52,7 +52,7 @@ use App\Services\LabelSystem\SandboxedTwigFactory;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Twig\Sandbox\SecurityError;
-class SandboxedTwigFactoryTest extends WebTestCase
+final class SandboxedTwigFactoryTest extends WebTestCase
{
private ?SandboxedTwigFactory $service = null;
diff --git a/tests/Services/LogSystem/EventCommentHelperTest.php b/tests/Services/LogSystem/EventCommentHelperTest.php
index 9c78d4c6..616c1ddf 100644
--- a/tests/Services/LogSystem/EventCommentHelperTest.php
+++ b/tests/Services/LogSystem/EventCommentHelperTest.php
@@ -44,7 +44,7 @@ namespace App\Tests\Services\LogSystem;
use App\Services\LogSystem\EventCommentHelper;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class EventCommentHelperTest extends WebTestCase
+final class EventCommentHelperTest extends WebTestCase
{
/**
* @var EventCommentHelper
diff --git a/tests/Services/LogSystem/EventCommentNeededHelperTest.php b/tests/Services/LogSystem/EventCommentNeededHelperTest.php
index 2eb2aceb..3ef238c5 100644
--- a/tests/Services/LogSystem/EventCommentNeededHelperTest.php
+++ b/tests/Services/LogSystem/EventCommentNeededHelperTest.php
@@ -28,7 +28,7 @@ use App\Settings\SystemSettings\HistorySettings;
use App\Tests\SettingsTestHelper;
use PHPUnit\Framework\TestCase;
-class EventCommentNeededHelperTest extends TestCase
+final class EventCommentNeededHelperTest extends TestCase
{
public function testIsCommentNeeded(): void
{
diff --git a/tests/Services/LogSystem/EventLoggerTest.php b/tests/Services/LogSystem/EventLoggerTest.php
index 0dbb85a3..69870ac8 100644
--- a/tests/Services/LogSystem/EventLoggerTest.php
+++ b/tests/Services/LogSystem/EventLoggerTest.php
@@ -48,7 +48,7 @@ use App\Entity\LogSystem\UserLogoutLogEntry;
use App\Services\LogSystem\EventLogger;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class EventLoggerTest extends WebTestCase
+final class EventLoggerTest extends WebTestCase
{
/**
* @var EventLogger
diff --git a/tests/Services/LogSystem/TimeTravelTest.php b/tests/Services/LogSystem/TimeTravelTest.php
index f0068778..9b51592d 100644
--- a/tests/Services/LogSystem/TimeTravelTest.php
+++ b/tests/Services/LogSystem/TimeTravelTest.php
@@ -29,7 +29,7 @@ use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
-class TimeTravelTest extends KernelTestCase
+final class TimeTravelTest extends KernelTestCase
{
private TimeTravel $service;
diff --git a/tests/Services/Misc/FAIconGeneratorTest.php b/tests/Services/Misc/FAIconGeneratorTest.php
index 1aec5d02..445c167c 100644
--- a/tests/Services/Misc/FAIconGeneratorTest.php
+++ b/tests/Services/Misc/FAIconGeneratorTest.php
@@ -26,7 +26,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\Misc\FAIconGenerator;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class FAIconGeneratorTest extends WebTestCase
+final class FAIconGeneratorTest extends WebTestCase
{
/**
* @var FAIconGenerator
diff --git a/tests/Services/Misc/MySQLDumpXMLConverterTest.php b/tests/Services/Misc/MySQLDumpXMLConverterTest.php
index 98614b4b..a56083d8 100644
--- a/tests/Services/Misc/MySQLDumpXMLConverterTest.php
+++ b/tests/Services/Misc/MySQLDumpXMLConverterTest.php
@@ -25,7 +25,7 @@ namespace App\Tests\Services\Misc;
use App\Services\ImportExportSystem\PartKeeprImporter\MySQLDumpXMLConverter;
use PHPUnit\Framework\TestCase;
-class MySQLDumpXMLConverterTest extends TestCase
+final class MySQLDumpXMLConverterTest extends TestCase
{
public function testConvertMySQLDumpXMLDataToArrayStructure(): void
diff --git a/tests/Services/Misc/RangeParserTest.php b/tests/Services/Misc/RangeParserTest.php
index 084ca80b..894034be 100644
--- a/tests/Services/Misc/RangeParserTest.php
+++ b/tests/Services/Misc/RangeParserTest.php
@@ -45,7 +45,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
use App\Services\Misc\RangeParser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class RangeParserTest extends WebTestCase
+final class RangeParserTest extends WebTestCase
{
/**
* @var RangeParser
diff --git a/tests/Services/Parameters/ParameterExtractorTest.php b/tests/Services/Parameters/ParameterExtractorTest.php
index d0b8fed0..353a0697 100644
--- a/tests/Services/Parameters/ParameterExtractorTest.php
+++ b/tests/Services/Parameters/ParameterExtractorTest.php
@@ -46,7 +46,7 @@ use App\Entity\Parameters\AbstractParameter;
use App\Services\Parameters\ParameterExtractor;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class ParameterExtractorTest extends WebTestCase
+final class ParameterExtractorTest extends WebTestCase
{
protected $service;
diff --git a/tests/Services/Parts/PartLotWithdrawAddHelperTest.php b/tests/Services/Parts/PartLotWithdrawAddHelperTest.php
index 697d3983..de684094 100644
--- a/tests/Services/Parts/PartLotWithdrawAddHelperTest.php
+++ b/tests/Services/Parts/PartLotWithdrawAddHelperTest.php
@@ -18,7 +18,7 @@ class TestPartLot extends PartLot
}
}
-class PartLotWithdrawAddHelperTest extends WebTestCase
+final class PartLotWithdrawAddHelperTest extends WebTestCase
{
/**
@@ -154,4 +154,19 @@ class PartLotWithdrawAddHelperTest extends WebTestCase
$this->assertEqualsWithDelta(5.0, $this->partLot2->getAmount(), PHP_FLOAT_EPSILON);
$this->assertEqualsWithDelta(2.0, $this->partLot3->getAmount(), PHP_FLOAT_EPSILON);
}
+
+ public function testStocktake(): void
+ {
+ //Stocktake lot 1 to 20
+ $this->service->stocktake($this->partLot1, 20, "Test");
+ $this->assertEqualsWithDelta(20.0, $this->partLot1->getAmount(), PHP_FLOAT_EPSILON);
+ $this->assertNotNull($this->partLot1->getLastStocktakeAt()); //Stocktake date should be set
+
+ //Stocktake lot 2 to 5
+ $this->partLot2->setInstockUnknown(true);
+ $this->service->stocktake($this->partLot2, 0, "Test");
+ $this->assertEqualsWithDelta(0.0, $this->partLot2->getAmount(), PHP_FLOAT_EPSILON);
+ $this->assertFalse($this->partLot2->isInstockUnknown()); //Instock unknown should be cleared
+
+ }
}
diff --git a/tests/Services/Parts/PartsTableActionHandlerTest.php b/tests/Services/Parts/PartsTableActionHandlerTest.php
index c5105cd7..1772195e 100644
--- a/tests/Services/Parts/PartsTableActionHandlerTest.php
+++ b/tests/Services/Parts/PartsTableActionHandlerTest.php
@@ -27,7 +27,7 @@ use App\Services\Parts\PartsTableActionHandler;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\RedirectResponse;
-class PartsTableActionHandlerTest extends WebTestCase
+final class PartsTableActionHandlerTest extends WebTestCase
{
private PartsTableActionHandler $service;
diff --git a/tests/Services/Parts/PricedetailHelperTest.php b/tests/Services/Parts/PricedetailHelperTest.php
index 5d9bd351..08a5d6dd 100644
--- a/tests/Services/Parts/PricedetailHelperTest.php
+++ b/tests/Services/Parts/PricedetailHelperTest.php
@@ -30,7 +30,7 @@ use App\Services\Formatters\AmountFormatter;
use App\Services\Parts\PricedetailHelper;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class PricedetailHelperTest extends WebTestCase
+final class PricedetailHelperTest extends WebTestCase
{
/**
* @var AmountFormatter
diff --git a/tests/Services/ProjectSystem/ProjectBuildHelperTest.php b/tests/Services/ProjectSystem/ProjectBuildHelperTest.php
index 5009f849..fb31b51e 100644
--- a/tests/Services/ProjectSystem/ProjectBuildHelperTest.php
+++ b/tests/Services/ProjectSystem/ProjectBuildHelperTest.php
@@ -29,7 +29,7 @@ use App\Entity\ProjectSystem\ProjectBOMEntry;
use App\Services\ProjectSystem\ProjectBuildHelper;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class ProjectBuildHelperTest extends WebTestCase
+final class ProjectBuildHelperTest extends WebTestCase
{
/** @var ProjectBuildHelper */
protected $service;
diff --git a/tests/Services/ProjectSystem/ProjectBuildPartHelperTest.php b/tests/Services/ProjectSystem/ProjectBuildPartHelperTest.php
index 4baa7cf3..894f6315 100644
--- a/tests/Services/ProjectSystem/ProjectBuildPartHelperTest.php
+++ b/tests/Services/ProjectSystem/ProjectBuildPartHelperTest.php
@@ -26,7 +26,7 @@ use App\Entity\ProjectSystem\Project;
use App\Services\ProjectSystem\ProjectBuildPartHelper;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class ProjectBuildPartHelperTest extends WebTestCase
+final class ProjectBuildPartHelperTest extends WebTestCase
{
/** @var ProjectBuildPartHelper */
protected $service;
diff --git a/tests/Services/System/BackupManagerTest.php b/tests/Services/System/BackupManagerTest.php
new file mode 100644
index 00000000..f75ef8f3
--- /dev/null
+++ b/tests/Services/System/BackupManagerTest.php
@@ -0,0 +1,102 @@
+.
+ */
+
+declare(strict_types=1);
+
+namespace App\Tests\Services\System;
+
+use App\Services\System\BackupManager;
+use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
+
+final class BackupManagerTest extends KernelTestCase
+{
+ private ?BackupManager $backupManager = null;
+
+ protected function setUp(): void
+ {
+ self::bootKernel();
+ $this->backupManager = self::getContainer()->get(BackupManager::class);
+ }
+
+ public function testGetBackupDir(): void
+ {
+ $backupDir = $this->backupManager->getBackupDir();
+
+ // Should end with var/backups
+ $this->assertStringEndsWith('var/backups', $backupDir);
+ }
+
+ public function testGetBackupsReturnsEmptyArrayWhenNoBackups(): void
+ {
+ // If there are no backups (or the directory doesn't exist), should return empty array
+ $backups = $this->backupManager->getBackups();
+
+ $this->assertIsArray($backups);
+ }
+
+ public function testGetBackupDetailsReturnsNullForNonExistentFile(): void
+ {
+ $details = $this->backupManager->getBackupDetails('non-existent-backup.zip');
+
+ $this->assertNull($details);
+ }
+
+ public function testGetBackupDetailsReturnsNullForNonZipFile(): void
+ {
+ $details = $this->backupManager->getBackupDetails('not-a-zip.txt');
+
+ $this->assertNull($details);
+ }
+
+ /**
+ * Test that version parsing from filename works correctly.
+ * This tests the regex pattern used in getBackupDetails.
+ */
+ public function testVersionParsingFromFilename(): void
+ {
+ // Test the regex pattern directly
+ $filename = 'pre-update-v2.5.1-to-v2.6.0-2024-01-30-185400.zip';
+ $matches = [];
+
+ $result = preg_match('/pre-update-v([\d.]+)-to-v?([\d.]+)-/', $filename, $matches);
+
+ $this->assertSame(1, $result);
+ $this->assertSame('2.5.1', $matches[1]);
+ $this->assertSame('2.6.0', $matches[2]);
+ }
+
+ /**
+ * Test version parsing with different filename formats.
+ */
+ public function testVersionParsingVariants(): void
+ {
+ // Without 'v' prefix on target version
+ $filename1 = 'pre-update-v1.0.0-to-2.0.0-2024-01-30-185400.zip';
+ preg_match('/pre-update-v([\d.]+)-to-v?([\d.]+)-/', $filename1, $matches1);
+ $this->assertSame('1.0.0', $matches1[1]);
+ $this->assertSame('2.0.0', $matches1[2]);
+
+ // With 'v' prefix on target version
+ $filename2 = 'pre-update-v1.0.0-to-v2.0.0-2024-01-30-185400.zip';
+ preg_match('/pre-update-v([\d.]+)-to-v?([\d.]+)-/', $filename2, $matches2);
+ $this->assertSame('1.0.0', $matches2[1]);
+ $this->assertSame('2.0.0', $matches2[2]);
+ }
+}
diff --git a/tests/Services/System/UpdateExecutorTest.php b/tests/Services/System/UpdateExecutorTest.php
new file mode 100644
index 00000000..48cddf8d
--- /dev/null
+++ b/tests/Services/System/UpdateExecutorTest.php
@@ -0,0 +1,167 @@
+.
+ */
+
+declare(strict_types=1);
+
+namespace App\Tests\Services\System;
+
+use App\Services\System\UpdateExecutor;
+use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
+
+final class UpdateExecutorTest extends KernelTestCase
+{
+ private ?UpdateExecutor $updateExecutor = null;
+
+ protected function setUp(): void
+ {
+ self::bootKernel();
+ $this->updateExecutor = self::getContainer()->get(UpdateExecutor::class);
+ }
+
+ public function testIsLockedReturnsFalseWhenNoLockFile(): void
+ {
+ // Initially there should be no lock
+ // Note: This test assumes no concurrent update is running
+ $isLocked = $this->updateExecutor->isLocked();
+
+ $this->assertIsBool($isLocked);
+ }
+
+ public function testIsMaintenanceModeReturnsBool(): void
+ {
+ $isMaintenanceMode = $this->updateExecutor->isMaintenanceMode();
+
+ $this->assertIsBool($isMaintenanceMode);
+ }
+
+ public function testGetLockInfoReturnsNullOrArray(): void
+ {
+ $lockInfo = $this->updateExecutor->getLockInfo();
+
+ // Should be null when not locked, or array when locked
+ $this->assertTrue($lockInfo === null || is_array($lockInfo));
+ }
+
+ public function testGetMaintenanceInfoReturnsNullOrArray(): void
+ {
+ $maintenanceInfo = $this->updateExecutor->getMaintenanceInfo();
+
+ // Should be null when not in maintenance, or array when in maintenance
+ $this->assertTrue($maintenanceInfo === null || is_array($maintenanceInfo));
+ }
+
+ public function testGetUpdateLogsReturnsArray(): void
+ {
+ $logs = $this->updateExecutor->getUpdateLogs();
+
+ $this->assertIsArray($logs);
+ }
+
+
+ public function testValidateUpdatePreconditionsReturnsProperStructure(): void
+ {
+ $validation = $this->updateExecutor->validateUpdatePreconditions();
+
+ $this->assertIsArray($validation);
+ $this->assertArrayHasKey('valid', $validation);
+ $this->assertArrayHasKey('errors', $validation);
+ $this->assertIsBool($validation['valid']);
+ $this->assertIsArray($validation['errors']);
+ }
+
+ public function testGetProgressFilePath(): void
+ {
+ $progressPath = $this->updateExecutor->getProgressFilePath();
+
+ $this->assertIsString($progressPath);
+ $this->assertStringEndsWith('var/update_progress.json', $progressPath);
+ }
+
+ public function testGetProgressReturnsNullOrArray(): void
+ {
+ $progress = $this->updateExecutor->getProgress();
+
+ // Should be null when no progress file, or array when exists
+ $this->assertTrue($progress === null || is_array($progress));
+ }
+
+ public function testIsUpdateRunningReturnsBool(): void
+ {
+ $isRunning = $this->updateExecutor->isUpdateRunning();
+
+ $this->assertIsBool($isRunning);
+ }
+
+ public function testAcquireAndReleaseLock(): void
+ {
+ // First, ensure no lock exists
+ if ($this->updateExecutor->isLocked()) {
+ $this->updateExecutor->releaseLock();
+ }
+
+ // Acquire lock
+ $acquired = $this->updateExecutor->acquireLock();
+ $this->assertTrue($acquired);
+
+ // Should be locked now
+ $this->assertTrue($this->updateExecutor->isLocked());
+
+ // Lock info should exist
+ $lockInfo = $this->updateExecutor->getLockInfo();
+ $this->assertIsArray($lockInfo);
+ $this->assertArrayHasKey('started_at', $lockInfo);
+
+ // Trying to acquire again should fail
+ $acquiredAgain = $this->updateExecutor->acquireLock();
+ $this->assertFalse($acquiredAgain);
+
+ // Release lock
+ $this->updateExecutor->releaseLock();
+
+ // Should no longer be locked
+ $this->assertFalse($this->updateExecutor->isLocked());
+ }
+
+ public function testEnableAndDisableMaintenanceMode(): void
+ {
+ // First, ensure maintenance mode is off
+ if ($this->updateExecutor->isMaintenanceMode()) {
+ $this->updateExecutor->disableMaintenanceMode();
+ }
+
+ // Enable maintenance mode
+ $this->updateExecutor->enableMaintenanceMode('Test maintenance');
+
+ // Should be in maintenance mode now
+ $this->assertTrue($this->updateExecutor->isMaintenanceMode());
+
+ // Maintenance info should exist
+ $maintenanceInfo = $this->updateExecutor->getMaintenanceInfo();
+ $this->assertIsArray($maintenanceInfo);
+ $this->assertArrayHasKey('reason', $maintenanceInfo);
+ $this->assertEquals('Test maintenance', $maintenanceInfo['reason']);
+
+ // Disable maintenance mode
+ $this->updateExecutor->disableMaintenanceMode();
+
+ // Should no longer be in maintenance mode
+ $this->assertFalse($this->updateExecutor->isMaintenanceMode());
+ }
+}
diff --git a/tests/Services/Trees/NodesListBuilderTest.php b/tests/Services/Trees/NodesListBuilderTest.php
index 8f4bf23b..d314114d 100644
--- a/tests/Services/Trees/NodesListBuilderTest.php
+++ b/tests/Services/Trees/NodesListBuilderTest.php
@@ -30,7 +30,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* @Group DB
*/
-class NodesListBuilderTest extends WebTestCase
+final class NodesListBuilderTest extends WebTestCase
{
protected $em;
/**
diff --git a/tests/Services/Trees/TreeViewGeneratorTest.php b/tests/Services/Trees/TreeViewGeneratorTest.php
index ebec94d6..190f1068 100644
--- a/tests/Services/Trees/TreeViewGeneratorTest.php
+++ b/tests/Services/Trees/TreeViewGeneratorTest.php
@@ -31,7 +31,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
#[Group('DB')]
-class TreeViewGeneratorTest extends WebTestCase
+final class TreeViewGeneratorTest extends WebTestCase
{
protected $em;
/**
diff --git a/tests/Services/UserSystem/PermissionManagerTest.php b/tests/Services/UserSystem/PermissionManagerTest.php
index 478202f4..e6da72d4 100644
--- a/tests/Services/UserSystem/PermissionManagerTest.php
+++ b/tests/Services/UserSystem/PermissionManagerTest.php
@@ -30,7 +30,7 @@ use App\Services\UserSystem\PermissionManager;
use InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class PermissionManagerTest extends WebTestCase
+final class PermissionManagerTest extends WebTestCase
{
protected ?User $user_withoutGroup = null;
diff --git a/tests/Services/UserSystem/PermissionSchemaUpdaterTest.php b/tests/Services/UserSystem/PermissionSchemaUpdaterTest.php
index 1e41474c..738ff649 100644
--- a/tests/Services/UserSystem/PermissionSchemaUpdaterTest.php
+++ b/tests/Services/UserSystem/PermissionSchemaUpdaterTest.php
@@ -39,7 +39,7 @@ class TestPermissionHolder implements HasPermissionsInterface
}
}
-class PermissionSchemaUpdaterTest extends WebTestCase
+final class PermissionSchemaUpdaterTest extends WebTestCase
{
/**
* @var PermissionSchemaUpdater
diff --git a/tests/Services/UserSystem/TFA/BackupCodeGeneratorTest.php b/tests/Services/UserSystem/TFA/BackupCodeGeneratorTest.php
index 2b6c22d1..5a54f2f3 100644
--- a/tests/Services/UserSystem/TFA/BackupCodeGeneratorTest.php
+++ b/tests/Services/UserSystem/TFA/BackupCodeGeneratorTest.php
@@ -27,7 +27,7 @@ use App\Services\UserSystem\TFA\BackupCodeGenerator;
use PHPUnit\Framework\TestCase;
use RuntimeException;
-class BackupCodeGeneratorTest extends TestCase
+final class BackupCodeGeneratorTest extends TestCase
{
/**
* Test if an exception is thrown if you are using a too high code length.
diff --git a/tests/Services/UserSystem/TFA/BackupCodeManagerTest.php b/tests/Services/UserSystem/TFA/BackupCodeManagerTest.php
index 35b7f4f8..4b1a0496 100644
--- a/tests/Services/UserSystem/TFA/BackupCodeManagerTest.php
+++ b/tests/Services/UserSystem/TFA/BackupCodeManagerTest.php
@@ -26,7 +26,7 @@ use App\Entity\UserSystem\User;
use App\Services\UserSystem\TFA\BackupCodeManager;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class BackupCodeManagerTest extends WebTestCase
+final class BackupCodeManagerTest extends WebTestCase
{
/**
* @var BackupCodeManager
diff --git a/tests/Services/UserSystem/VoterHelperTest.php b/tests/Services/UserSystem/VoterHelperTest.php
index 53d7ee82..3f21c9ab 100644
--- a/tests/Services/UserSystem/VoterHelperTest.php
+++ b/tests/Services/UserSystem/VoterHelperTest.php
@@ -34,7 +34,7 @@ use Symfony\Component\Security\Core\Authentication\Token\NullToken;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Authenticator\Token\PostAuthenticationToken;
-class VoterHelperTest extends KernelTestCase
+final class VoterHelperTest extends KernelTestCase
{
protected ?VoterHelper $service = null;
diff --git a/tests/Settings/SynonymSettingsTest.php b/tests/Settings/SynonymSettingsTest.php
index 2d1407ac..00e5be4c 100644
--- a/tests/Settings/SynonymSettingsTest.php
+++ b/tests/Settings/SynonymSettingsTest.php
@@ -1,4 +1,7 @@
.
*/
-
namespace App\Tests\Settings;
use App\Services\ElementTypes;
@@ -25,7 +27,7 @@ use App\Settings\SynonymSettings;
use App\Tests\SettingsTestHelper;
use PHPUnit\Framework\TestCase;
-class SynonymSettingsTest extends TestCase
+final class SynonymSettingsTest extends TestCase
{
public function testGetSingularSynonymForType(): void
diff --git a/tests/Twig/EntityExtensionTest.php b/tests/Twig/EntityExtensionTest.php
index 18fe970b..d206b941 100644
--- a/tests/Twig/EntityExtensionTest.php
+++ b/tests/Twig/EntityExtensionTest.php
@@ -39,7 +39,7 @@ use App\Entity\UserSystem\User;
use App\Twig\EntityExtension;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class EntityExtensionTest extends WebTestCase
+final class EntityExtensionTest extends WebTestCase
{
/** @var EntityExtension */
protected $service;
@@ -55,20 +55,20 @@ class EntityExtensionTest extends WebTestCase
public function testGetEntityType(): void
{
- $this->assertSame('part', $this->service->getEntityType(new Part()));
- $this->assertSame('footprint', $this->service->getEntityType(new Footprint()));
- $this->assertSame('storelocation', $this->service->getEntityType(new StorageLocation()));
- $this->assertSame('manufacturer', $this->service->getEntityType(new Manufacturer()));
- $this->assertSame('category', $this->service->getEntityType(new Category()));
- $this->assertSame('device', $this->service->getEntityType(new Project()));
- $this->assertSame('attachment', $this->service->getEntityType(new PartAttachment()));
- $this->assertSame('supplier', $this->service->getEntityType(new Supplier()));
- $this->assertSame('user', $this->service->getEntityType(new User()));
- $this->assertSame('group', $this->service->getEntityType(new Group()));
- $this->assertSame('currency', $this->service->getEntityType(new Currency()));
- $this->assertSame('measurement_unit', $this->service->getEntityType(new MeasurementUnit()));
- $this->assertSame('label_profile', $this->service->getEntityType(new LabelProfile()));
- $this->assertSame('part_custom_state', $this->service->getEntityType(new PartCustomState()));
+ $this->assertSame('part', $this->service->entityType(new Part()));
+ $this->assertSame('footprint', $this->service->entityType(new Footprint()));
+ $this->assertSame('storelocation', $this->service->entityType(new StorageLocation()));
+ $this->assertSame('manufacturer', $this->service->entityType(new Manufacturer()));
+ $this->assertSame('category', $this->service->entityType(new Category()));
+ $this->assertSame('device', $this->service->entityType(new Project()));
+ $this->assertSame('attachment', $this->service->entityType(new PartAttachment()));
+ $this->assertSame('supplier', $this->service->entityType(new Supplier()));
+ $this->assertSame('user', $this->service->entityType(new User()));
+ $this->assertSame('group', $this->service->entityType(new Group()));
+ $this->assertSame('currency', $this->service->entityType(new Currency()));
+ $this->assertSame('measurement_unit', $this->service->entityType(new MeasurementUnit()));
+ $this->assertSame('label_profile', $this->service->entityType(new LabelProfile()));
+ $this->assertSame('part_custom_state', $this->service->entityType(new PartCustomState()));
}
}
diff --git a/tests/Twig/TwigCoreExtensionTest.php b/tests/Twig/TwigCoreExtensionTest.php
index 1aa1f7ca..be8ced04 100644
--- a/tests/Twig/TwigCoreExtensionTest.php
+++ b/tests/Twig/TwigCoreExtensionTest.php
@@ -26,7 +26,7 @@ use App\Twig\TwigCoreExtension;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class TwigCoreExtensionTest extends WebTestCase
+final class TwigCoreExtensionTest extends WebTestCase
{
/** @var TwigCoreExtension */
protected $service;
diff --git a/tests/Twig/UserExtensionTest.php b/tests/Twig/UserExtensionTest.php
index 235d39c1..f8422a2c 100644
--- a/tests/Twig/UserExtensionTest.php
+++ b/tests/Twig/UserExtensionTest.php
@@ -27,7 +27,7 @@ use App\Twig\UserExtension;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-class UserExtensionTest extends WebTestCase
+final class UserExtensionTest extends WebTestCase
{
protected $service;
diff --git a/tests/Validator/Constraints/NoneOfItsChildrenValidatorTest.php b/tests/Validator/Constraints/NoneOfItsChildrenValidatorTest.php
index 0efcd5de..e4b721ca 100644
--- a/tests/Validator/Constraints/NoneOfItsChildrenValidatorTest.php
+++ b/tests/Validator/Constraints/NoneOfItsChildrenValidatorTest.php
@@ -28,15 +28,12 @@ use App\Validator\Constraints\NoneOfItsChildren;
use App\Validator\Constraints\NoneOfItsChildrenValidator;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class NoneOfItsChildrenValidatorTest extends ConstraintValidatorTestCase
+final class NoneOfItsChildrenValidatorTest extends ConstraintValidatorTestCase
{
protected AttachmentType $root_node;
protected AttachmentType $child1;
- protected AttachmentType $child2;
- protected AttachmentType $child3;
protected AttachmentType $child1_1;
- protected AttachmentType $child1_2;
protected function setUp(): void
{
@@ -49,14 +46,14 @@ class NoneOfItsChildrenValidatorTest extends ConstraintValidatorTestCase
$this->root_node->setName('root')->setParent(null);
$this->child1 = new AttachmentType();
$this->child1->setParent($this->root_node)->setName('child1');
- $this->child2 = new AttachmentType();
- $this->child2->setName('child2')->setParent($this->root_node);
- $this->child3 = new AttachmentType();
- $this->child3->setName('child3')->setParent($this->root_node);
+ $child2 = new AttachmentType();
+ $child2->setName('child2')->setParent($this->root_node);
+ $child3 = new AttachmentType();
+ $child3->setName('child3')->setParent($this->root_node);
$this->child1_1 = new AttachmentType();
$this->child1_1->setName('child1_1')->setParent($this->child1);
- $this->child1_2 = new AttachmentType();
- $this->child1_2->setName('child1_2')->setParent($this->child1);
+ $child1_2 = new AttachmentType();
+ $child1_2->setName('child1_2')->setParent($this->child1);
}
diff --git a/tests/Validator/Constraints/SelectableValidatorTest.php b/tests/Validator/Constraints/SelectableValidatorTest.php
index bc520621..68f36f87 100644
--- a/tests/Validator/Constraints/SelectableValidatorTest.php
+++ b/tests/Validator/Constraints/SelectableValidatorTest.php
@@ -29,7 +29,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class SelectableValidatorTest extends ConstraintValidatorTestCase
+final class SelectableValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator(): SelectableValidator
{
diff --git a/tests/Validator/Constraints/UniqueObjectCollectionValidatorTest.php b/tests/Validator/Constraints/UniqueObjectCollectionValidatorTest.php
index d9fab6cf..3863d604 100644
--- a/tests/Validator/Constraints/UniqueObjectCollectionValidatorTest.php
+++ b/tests/Validator/Constraints/UniqueObjectCollectionValidatorTest.php
@@ -30,7 +30,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class UniqueObjectCollectionValidatorTest extends ConstraintValidatorTestCase
+final class UniqueObjectCollectionValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator(): UniqueObjectCollectionValidator
{
diff --git a/tests/Validator/Constraints/UrlOrBuiltinValidatorTest.php b/tests/Validator/Constraints/UrlOrBuiltinValidatorTest.php
index c75754df..326809df 100644
--- a/tests/Validator/Constraints/UrlOrBuiltinValidatorTest.php
+++ b/tests/Validator/Constraints/UrlOrBuiltinValidatorTest.php
@@ -27,7 +27,7 @@ use App\Validator\Constraints\UrlOrBuiltinValidator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class UrlOrBuiltinValidatorTest extends ConstraintValidatorTestCase
+final class UrlOrBuiltinValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator(): UrlOrBuiltinValidator
diff --git a/tests/Validator/Constraints/ValidGTINValidatorTest.php b/tests/Validator/Constraints/ValidGTINValidatorTest.php
new file mode 100644
index 00000000..6b01519b
--- /dev/null
+++ b/tests/Validator/Constraints/ValidGTINValidatorTest.php
@@ -0,0 +1,75 @@
+.
+ */
+namespace App\Tests\Validator\Constraints;
+
+use App\Validator\Constraints\ValidGTIN;
+use App\Validator\Constraints\ValidGTINValidator;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Validator\ConstraintValidatorInterface;
+use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
+
+final class ValidGTINValidatorTest extends ConstraintValidatorTestCase
+{
+
+ public function testAllowNull(): void
+ {
+ $this->validator->validate(null, new ValidGTIN());
+ $this->assertNoViolation();
+ }
+
+ public function testValidGTIN8(): void
+ {
+ $this->validator->validate('12345670', new ValidGTIN());
+ $this->assertNoViolation();
+ }
+
+ public function testValidGTIN12(): void
+ {
+ $this->validator->validate('123456789012', new ValidGTIN());
+ $this->assertNoViolation();
+ }
+
+ public function testValidGTIN13(): void
+ {
+ $this->validator->validate('1234567890128', new ValidGTIN());
+ $this->assertNoViolation();
+ }
+
+ public function testValidGTIN14(): void
+ {
+ $this->validator->validate('12345678901231', new ValidGTIN());
+ $this->assertNoViolation();
+ }
+
+ public function testInvalidGTIN(): void
+ {
+ $this->validator->validate('1234567890123', new ValidGTIN());
+ $this->buildViolation('validator.invalid_gtin')
+ ->assertRaised();
+ }
+
+ protected function createValidator(): ConstraintValidatorInterface
+ {
+ return new ValidGTINValidator();
+ }
+}
diff --git a/tests/Validator/Constraints/ValidGoogleAuthCodeValidatorTest.php b/tests/Validator/Constraints/ValidGoogleAuthCodeValidatorTest.php
index 6eb9270e..4924f34b 100644
--- a/tests/Validator/Constraints/ValidGoogleAuthCodeValidatorTest.php
+++ b/tests/Validator/Constraints/ValidGoogleAuthCodeValidatorTest.php
@@ -34,7 +34,7 @@ use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\ConstraintValidatorInterface;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class ValidGoogleAuthCodeValidatorTest extends ConstraintValidatorTestCase
+final class ValidGoogleAuthCodeValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator(): ConstraintValidatorInterface
diff --git a/tests/Validator/Constraints/ValidThemeValidatorTest.php b/tests/Validator/Constraints/ValidThemeValidatorTest.php
index 9db8f33b..50b11820 100644
--- a/tests/Validator/Constraints/ValidThemeValidatorTest.php
+++ b/tests/Validator/Constraints/ValidThemeValidatorTest.php
@@ -27,7 +27,7 @@ use App\Validator\Constraints\ValidThemeValidator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
-class ValidThemeValidatorTest extends ConstraintValidatorTestCase
+final class ValidThemeValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator(): ValidThemeValidator
diff --git a/translations/SchebTwoFactorBundle+intl-icu.de.xlf b/translations/SchebTwoFactorBundle+intl-icu.de.xlf
index e9fb4cc6..ebaf8ec0 100644
--- a/translations/SchebTwoFactorBundle+intl-icu.de.xlf
+++ b/translations/SchebTwoFactorBundle+intl-icu.de.xlf
@@ -8,4 +8,4 @@
-
+
\ No newline at end of file
diff --git a/translations/SchebTwoFactorBundle+intl-icu.en.xlf b/translations/SchebTwoFactorBundle+intl-icu.en.xlf
index 1b17584c..0d1b2cc7 100644
--- a/translations/SchebTwoFactorBundle+intl-icu.en.xlf
+++ b/translations/SchebTwoFactorBundle+intl-icu.en.xlf
@@ -8,4 +8,4 @@
-
+
\ No newline at end of file
diff --git a/translations/SchebTwoFactorBundle.de.xlf b/translations/SchebTwoFactorBundle.de.xlf
index 27ee3946..ebaf8ec0 100644
--- a/translations/SchebTwoFactorBundle.de.xlf
+++ b/translations/SchebTwoFactorBundle.de.xlf
@@ -2,13 +2,10 @@
-
- Part-DB1\templates\security\2fa_base_form.html.twig:52
-
login
Login
-
+
\ No newline at end of file
diff --git a/translations/SchebTwoFactorBundle.en.xlf b/translations/SchebTwoFactorBundle.en.xlf
index b43243a6..0d1b2cc7 100644
--- a/translations/SchebTwoFactorBundle.en.xlf
+++ b/translations/SchebTwoFactorBundle.en.xlf
@@ -2,13 +2,10 @@
-
- Part-DB1\templates\security\2fa_base_form.html.twig:52
-
login
Login
-
+
\ No newline at end of file
diff --git a/translations/frontend.cs.xlf b/translations/frontend.cs.xlf
index e13e5c4c..4ba1f913 100644
--- a/translations/frontend.cs.xlf
+++ b/translations/frontend.cs.xlf
@@ -1,80 +1,59 @@
-
+
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Hledat
-
-
+
+ search.placeholder
+ Hledat
+
+
-
- part.labelp
- Díly
-
-
+
+ part.labelp
+ Díly
+
+
-
- entity.select.group.new_not_added_to_DB
- Nový (zatím nebyl přidán do DB)
-
-
+
+ entity.select.group.new_not_added_to_DB
+ Nový (zatím nebyl přidán do DB)
+
+
-
- user.password_strength.very_weak
- Velmi slabé
-
-
+
+ user.password_strength.very_weak
+ Velmi slabé
+
+
-
- user.password_strength.weak
- Slabé
-
-
+
+ user.password_strength.weak
+ Slabé
+
+
-
- user.password_strength.medium
- Střední
-
-
+
+ user.password_strength.medium
+ Střední
+
+
-
- user.password_strength.strong
- Silné
-
-
+
+ user.password_strength.strong
+ Silné
+
+
-
- user.password_strength.very_strong
- Velmi silné
-
-
+
+ user.password_strength.very_strong
+ Velmi silné
+
+
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- Jdi!
-
-
+
+ search.submit
+ Jdi!
+
+
diff --git a/translations/frontend.da.xlf b/translations/frontend.da.xlf
index bb6a015d..4b6a15b9 100644
--- a/translations/frontend.da.xlf
+++ b/translations/frontend.da.xlf
@@ -2,23 +2,6 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Søg
@@ -67,10 +50,6 @@
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
search.submit
Kom nu!
diff --git a/translations/frontend.de.xlf b/translations/frontend.de.xlf
index f08d0295..9ebd0d32 100644
--- a/translations/frontend.de.xlf
+++ b/translations/frontend.de.xlf
@@ -2,23 +2,6 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Suche
@@ -67,10 +50,6 @@
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
search.submit
Los!
diff --git a/translations/frontend.el.xlf b/translations/frontend.el.xlf
index 6d734823..bab41358 100644
--- a/translations/frontend.el.xlf
+++ b/translations/frontend.el.xlf
@@ -2,27 +2,10 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Αναζήτηση
-
+
\ No newline at end of file
diff --git a/translations/frontend.en.xlf b/translations/frontend.en.xlf
index 4de45489..91617f79 100644
--- a/translations/frontend.en.xlf
+++ b/translations/frontend.en.xlf
@@ -2,23 +2,6 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Search
@@ -67,10 +50,6 @@
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
search.submit
Go!
diff --git a/translations/frontend.es.xlf b/translations/frontend.es.xlf
index dc96b800..7d339959 100644
--- a/translations/frontend.es.xlf
+++ b/translations/frontend.es.xlf
@@ -1,80 +1,59 @@
-
+
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Buscar
-
-
+
+ search.placeholder
+ Buscar
+
+
-
- part.labelp
- Componentes
-
-
+
+ part.labelp
+ Componentes
+
+
-
- entity.select.group.new_not_added_to_DB
- Nuevo (no añadido a la base de datos)
-
-
+
+ entity.select.group.new_not_added_to_DB
+ Nuevo (no añadido a la base de datos)
+
+
-
- user.password_strength.very_weak
- Muy débil
-
-
+
+ user.password_strength.very_weak
+ Muy débil
+
+
-
- user.password_strength.weak
- Débil
-
-
+
+ user.password_strength.weak
+ Débil
+
+
-
- user.password_strength.medium
- Medio
-
-
+
+ user.password_strength.medium
+ Medio
+
+
-
- user.password_strength.strong
- Fuerte
-
-
+
+ user.password_strength.strong
+ Fuerte
+
+
-
- user.password_strength.very_strong
- Muy fuerte
-
-
+
+ user.password_strength.very_strong
+ Muy fuerte
+
+
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- ¡Vamos!
-
-
+
+ search.submit
+ ¡Vamos!
+
+
diff --git a/translations/frontend.fr.xlf b/translations/frontend.fr.xlf
index 8363fabd..5ebfca51 100644
--- a/translations/frontend.fr.xlf
+++ b/translations/frontend.fr.xlf
@@ -1,44 +1,59 @@
-
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Recherche
-
-
+
+
+
+ search.placeholder
+ Recherche
+
+
-
- part.labelp
- Composants
-
-
-
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- Rechercher!
-
-
+
+ part.labelp
+ Composants
+
+
+
+
+ entity.select.group.new_not_added_to_DB
+ Nouveau (pas encore ajouté à la BDD)
+
+
+
+
+ user.password_strength.very_weak
+ Très faible
+
+
+
+
+ user.password_strength.weak
+ Faible
+
+
+
+
+ user.password_strength.medium
+ Moyen
+
+
+
+
+ user.password_strength.strong
+ Fort
+
+
+
+
+ user.password_strength.very_strong
+ Très fort
+
+
+
+
+ search.submit
+ Rechercher !
+
+
diff --git a/translations/frontend.hu.xlf b/translations/frontend.hu.xlf
index 123d0c46..c303dedc 100644
--- a/translations/frontend.hu.xlf
+++ b/translations/frontend.hu.xlf
@@ -2,23 +2,6 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Keresés
@@ -67,10 +50,6 @@
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
search.submit
Indítás!
diff --git a/translations/frontend.it.xlf b/translations/frontend.it.xlf
index 9df0eee0..f163e3e2 100644
--- a/translations/frontend.it.xlf
+++ b/translations/frontend.it.xlf
@@ -1,80 +1,59 @@
-
+
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Ricerca
-
-
+
+ search.placeholder
+ Ricerca
+
+
-
- part.labelp
- Componenti
-
-
+
+ part.labelp
+ Componenti
+
+
-
- entity.select.group.new_not_added_to_DB
- Nuovo (non ancora aggiunto al DB)
-
-
+
+ entity.select.group.new_not_added_to_DB
+ Nuovo (non ancora aggiunto al DB)
+
+
-
- user.password_strength.very_weak
- Molto debole
-
-
+
+ user.password_strength.very_weak
+ Molto debole
+
+
-
- user.password_strength.weak
- Debole
-
-
+
+ user.password_strength.weak
+ Debole
+
+
-
- user.password_strength.medium
- Media
-
-
+
+ user.password_strength.medium
+ Media
+
+
-
- user.password_strength.strong
- Forte
-
-
+
+ user.password_strength.strong
+ Forte
+
+
-
- user.password_strength.very_strong
- Molto forte
-
-
+
+ user.password_strength.very_strong
+ Molto forte
+
+
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- Cerca!
-
-
+
+ search.submit
+ Cerca!
+
+
diff --git a/translations/frontend.ja.xlf b/translations/frontend.ja.xlf
index 91a60f0d..90ffdf5f 100644
--- a/translations/frontend.ja.xlf
+++ b/translations/frontend.ja.xlf
@@ -2,23 +2,6 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
検索
@@ -31,14 +14,10 @@
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
search.submit
検索
-
+
\ No newline at end of file
diff --git a/translations/frontend.nl.xlf b/translations/frontend.nl.xlf
index 67514891..13187f62 100644
--- a/translations/frontend.nl.xlf
+++ b/translations/frontend.nl.xlf
@@ -2,27 +2,10 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Zoeken
-
+
\ No newline at end of file
diff --git a/translations/frontend.pl.xlf b/translations/frontend.pl.xlf
index 31f59cf4..fface684 100644
--- a/translations/frontend.pl.xlf
+++ b/translations/frontend.pl.xlf
@@ -1,80 +1,59 @@
-
+
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Szukaj
-
-
+
+ search.placeholder
+ Szukaj
+
+
-
- part.labelp
- Komponenty
-
-
+
+ part.labelp
+ Komponenty
+
+
-
- entity.select.group.new_not_added_to_DB
- Nowość (jeszcze niedodana do DB)
-
-
+
+ entity.select.group.new_not_added_to_DB
+ Nowość (jeszcze niedodana do DB)
+
+
-
- user.password_strength.very_weak
- Bardzo słabe
-
-
+
+ user.password_strength.very_weak
+ Bardzo słabe
+
+
-
- user.password_strength.weak
- Słabe
-
-
+
+ user.password_strength.weak
+ Słabe
+
+
-
- user.password_strength.medium
- Średnie
-
-
+
+ user.password_strength.medium
+ Średnie
+
+
-
- user.password_strength.strong
- Mocne
-
-
+
+ user.password_strength.strong
+ Mocne
+
+
-
- user.password_strength.very_strong
- Bardzo mocne
-
-
+
+ user.password_strength.very_strong
+ Bardzo mocne
+
+
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- Idź!
-
-
+
+ search.submit
+ Idź!
+
+
diff --git a/translations/frontend.ru.xlf b/translations/frontend.ru.xlf
index f63367d9..f4665a74 100644
--- a/translations/frontend.ru.xlf
+++ b/translations/frontend.ru.xlf
@@ -1,80 +1,59 @@
-
+
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- Поиск
-
-
+
+ search.placeholder
+ Поиск
+
+
-
- part.labelp
- Компоненты
-
-
+
+ part.labelp
+ Компоненты
+
+
-
- entity.select.group.new_not_added_to_DB
- Новый (еще не добавленный в БД)
-
-
+
+ entity.select.group.new_not_added_to_DB
+ Новый (еще не добавленный в БД)
+
+
-
- user.password_strength.very_weak
- Очень слабый
-
-
+
+ user.password_strength.very_weak
+ Очень слабый
+
+
-
- user.password_strength.weak
- Слабый
-
-
+
+ user.password_strength.weak
+ Слабый
+
+
-
- user.password_strength.medium
- Средний
-
-
+
+ user.password_strength.medium
+ Средний
+
+
-
- user.password_strength.strong
- Сильный
-
-
+
+ user.password_strength.strong
+ Сильный
+
+
-
- user.password_strength.very_strong
- Очень сильный
-
-
+
+ user.password_strength.very_strong
+ Очень сильный
+
+
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- Поехали!
-
-
+
+ search.submit
+ Поехали!
+
+
diff --git a/translations/frontend.uk.xlf b/translations/frontend.uk.xlf
new file mode 100644
index 00000000..fee1b03e
--- /dev/null
+++ b/translations/frontend.uk.xlf
@@ -0,0 +1,59 @@
+
+
+
+
+
+ search.placeholder
+ Пошук
+
+
+
+
+ part.labelp
+ Деталі
+
+
+
+
+ entity.select.group.new_not_added_to_DB
+ Нова (ще не додана до БД)
+
+
+
+
+ user.password_strength.very_weak
+ Дуже слабкий
+
+
+
+
+ user.password_strength.weak
+ Слабкий
+
+
+
+
+ user.password_strength.medium
+ Середній
+
+
+
+
+ user.password_strength.strong
+ Надійний
+
+
+
+
+ user.password_strength.very_strong
+ Дуже надійний
+
+
+
+
+ search.submit
+ Почати!
+
+
+
+
diff --git a/translations/frontend.zh.xlf b/translations/frontend.zh.xlf
index 08817189..8bb063b8 100644
--- a/translations/frontend.zh.xlf
+++ b/translations/frontend.zh.xlf
@@ -1,80 +1,59 @@
-
-
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
-
- search.placeholder
- 搜索
-
-
+
+
+
+
+ search.placeholder
+ 搜索
+
+
-
- part.labelp
- 部件
-
-
-
-
- entity.select.group.new_not_added_to_DB
- 新建(尚未添加到数据库)
-
-
-
-
- user.password_strength.very_weak
- 非常弱
-
-
-
-
- user.password_strength.weak
- 弱
-
-
-
-
- user.password_strength.medium
- 中
-
-
-
-
- user.password_strength.strong
- 强
-
-
-
-
- user.password_strength.very_strong
- 非常强
-
-
-
-
- Part-DB1\templates\_navbar_search.html.twig:68
- Part-DB1\templates\_navbar_search.html.twig:62
-
-
- search.submit
- GO!
-
-
+
+ part.labelp
+ 部件
+
+
+
+
+ entity.select.group.new_not_added_to_DB
+ 新建(尚未添加到数据库)
+
+
+
+
+ user.password_strength.very_weak
+ 非常弱
+
+
+
+
+ user.password_strength.weak
+ 弱
+
+
+
+
+ user.password_strength.medium
+ 中
+
+
+
+
+ user.password_strength.strong
+ 强
+
+
+
+
+ user.password_strength.very_strong
+ 非常强
+
+
+
+
+ search.submit
+ GO!
+
+
diff --git a/translations/messages.cs.xlf b/translations/messages.cs.xlf
index 298e1479..74ca2a26 100644
--- a/translations/messages.cs.xlf
+++ b/translations/messages.cs.xlf
@@ -2,11 +2,6 @@
-
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4
- templates\AdminPages\AttachmentTypeAdmin.html.twig:4
-
attachment_type.caption
Typy souborů pro přílohy
@@ -14,7 +9,6 @@
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12
new
@@ -24,7 +18,6 @@
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16
new
@@ -33,45 +26,18 @@
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:22
- Part-DB1\templates\_sidebar.html.twig:7
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:22
- Part-DB1\templates\_sidebar.html.twig:7
- templates\AdminPages\CategoryAdmin.html.twig:4
- templates\base.html.twig:163
- templates\base.html.twig:170
- templates\base.html.twig:197
- templates\base.html.twig:225
-
category.labelp
Kategorie
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:11
- templates\AdminPages\CategoryAdmin.html.twig:8
-
admin.options
Možnosti
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9
- Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9
- Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15
- templates\AdminPages\CategoryAdmin.html.twig:9
-
admin.advanced
Pokročilé
@@ -79,7 +45,6 @@
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13
new
@@ -89,7 +54,6 @@
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17
new
@@ -98,30 +62,18 @@
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4
-
currency.caption
Měna
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12
-
currency.iso_code.caption
Kód ISO
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15
-
currency.symbol.caption
Symbol měny
@@ -129,7 +81,6 @@
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29
new
@@ -139,7 +90,6 @@
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33
new
@@ -149,7 +99,6 @@
- Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:8
new
@@ -159,7 +108,6 @@
- Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:12
new
@@ -168,89 +116,36 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
search.placeholder
Hledat
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23
- Part-DB1\templates\_sidebar.html.twig:3
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23
- Part-DB1\templates\_sidebar.html.twig:3
- templates\AdminPages\EntityAdminBase.html.twig:13
- templates\base.html.twig:166
- templates\base.html.twig:193
- templates\base.html.twig:221
-
expandAll
Rozbalit vše
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:4
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:4
- templates\AdminPages\EntityAdminBase.html.twig:17
- templates\base.html.twig:167
- templates\base.html.twig:194
- templates\base.html.twig:222
-
reduceAll
Sbalit vše
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54
- Part-DB1\templates\Parts\info\_sidebar.html.twig:4
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54
- Part-DB1\templates\Parts\info\_sidebar.html.twig:4
-
part.info.timetravel_hint
Takto vypadal díl před %timestamp%. <i>Upozorňujeme, že tato funkce je experimentální, takže informace nemusí být správné.</i>
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60
- templates\AdminPages\EntityAdminBase.html.twig:42
-
standard.label
Vlastnosti
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61
- templates\AdminPages\EntityAdminBase.html.twig:43
-
infos.label
Informace
@@ -258,8 +153,6 @@
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63
new
@@ -268,120 +161,66 @@
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66
- templates\AdminPages\EntityAdminBase.html.twig:45
-
export.label
Export
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68
- templates\AdminPages\EntityAdminBase.html.twig:47
-
import_export.label
Import / Export
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69
-
mass_creation.label
Hromadné vytváření
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82
- templates\AdminPages\EntityAdminBase.html.twig:59
-
admin.common
Obecné
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86
-
admin.attachments
Přílohy
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90
-
admin.parameters
Parametr
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167
- templates\AdminPages\EntityAdminBase.html.twig:142
-
export_all.label
Exportovat všechny prvky
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173
-
mass_creation.help
Každý řádek bude interpretován jako název prvku, který bude vytvořen. Vnořené struktury můžete vytvářet pomocí odsazení.
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45
- templates\AdminPages\EntityAdminBase.html.twig:35
-
edit.caption
Upravit prvek "%name"
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50
- templates\AdminPages\EntityAdminBase.html.twig:37
-
new.caption
Nový prvek
-
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:9
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:9
- templates\base.html.twig:172
- templates\base.html.twig:199
- templates\base.html.twig:227
-
footprint.labelp
Otisky
@@ -389,7 +228,6 @@
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13
new
@@ -399,7 +237,6 @@
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17
new
@@ -408,22 +245,12 @@
-
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4
-
group.edit.caption
Skupiny
-
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:16
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:16
-
user.edit.permissions
Oprávnění
@@ -431,7 +258,6 @@
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24
new
@@ -441,7 +267,6 @@
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28
new
@@ -450,27 +275,18 @@
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4
-
label_profile.caption
Profily štítků
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8
-
label_profile.advanced
Pokročilé
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9
-
label_profile.comment
Poznámky
@@ -478,7 +294,6 @@
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55
new
@@ -488,7 +303,6 @@
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59
new
@@ -497,11 +311,6 @@
-
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4
- templates\AdminPages\ManufacturerAdmin.html.twig:4
-
manufacturer.caption
Výrobci
@@ -509,7 +318,6 @@
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8
new
@@ -519,7 +327,6 @@
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12
new
@@ -528,10 +335,6 @@
-
- Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4
- Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4
-
measurement_unit.caption
Měrné jednotky
@@ -544,15 +347,6 @@
-
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5
- Part-DB1\templates\_sidebar.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:8
- templates\base.html.twig:171
- templates\base.html.twig:198
- templates\base.html.twig:226
-
storelocation.labelp
Umístění
@@ -560,7 +354,6 @@
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32
new
@@ -570,7 +363,6 @@
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36
new
@@ -580,7 +372,6 @@
- Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16
new
@@ -590,7 +381,6 @@
- Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20
new
@@ -599,120 +389,66 @@
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:8
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:8
-
user.edit.caption
Uživatelé
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:14
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:14
-
user.edit.configuration
Konfigurace
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:15
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:15
-
user.edit.password
Heslo
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:45
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:45
-
user.edit.tfa.caption
Dvoufaktorové ověřování
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:47
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:47
-
user.edit.tfa.google_active
Aplikace Authenticator aktivní
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:48
- Part-DB1\templates\Users\backup_codes.html.twig:15
- Part-DB1\templates\Users\_2fa_settings.html.twig:95
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:48
- Part-DB1\templates\Users\backup_codes.html.twig:15
- Part-DB1\templates\Users\_2fa_settings.html.twig:95
-
tfa_backup.remaining_tokens
Počet zbývajících záložních kódů
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:49
- Part-DB1\templates\Users\backup_codes.html.twig:17
- Part-DB1\templates\Users\_2fa_settings.html.twig:96
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:49
- Part-DB1\templates\Users\backup_codes.html.twig:17
- Part-DB1\templates\Users\_2fa_settings.html.twig:96
-
tfa_backup.generation_date
Datum generování záložních kódů
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:53
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:60
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:53
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:60
-
user.edit.tfa.disabled
Metoda není povolena
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:56
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:56
-
user.edit.tfa.u2f_keys_count
Aktivní bezpečnostní klíče
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
-
user.edit.tfa.disable_tfa_title
Opravdu chcete pokračovat?
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
-
user.edit.tfa.disable_tfa_message
Tím deaktivujete <b>všechny aktivní dvoufaktorové metody ověřování uživatele</b> a odstraníte <b>záložní kódy</b>!
@@ -722,10 +458,6 @@ Uživatel bude muset znovu nastavit všechny metody dvoufaktorového ověřován
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:73
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:73
-
user.edit.tfa.disable_tfa.btn
Zakázat všechny metody dvoufaktorového ověřování
@@ -733,7 +465,6 @@ Uživatel bude muset znovu nastavit všechny metody dvoufaktorového ověřován
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:85
new
@@ -743,7 +474,6 @@ Uživatel bude muset znovu nastavit všechny metody dvoufaktorového ověřován
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:89
new
@@ -752,13 +482,6 @@ Uživatel bude muset znovu nastavit všechny metody dvoufaktorového ověřován
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:4
- Part-DB1\templates\Parts\edit\_attachments.html.twig:4
- Part-DB1\templates\AdminPages\_attachments.html.twig:4
- Part-DB1\templates\Parts\edit\_attachments.html.twig:4
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:63
-
attachment.delete
Smazat
@@ -771,102 +494,48 @@ Uživatel bude muset znovu nastavit všechny metody dvoufaktorového ověřován
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:49
- Part-DB1\templates\Parts\edit\_attachments.html.twig:47
- Part-DB1\templates\AdminPages\_attachments.html.twig:47
- Part-DB1\templates\Parts\edit\_attachments.html.twig:45
-
attachment.preview.alt
Náhled přílohy
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:52
- Part-DB1\templates\Parts\edit\_attachments.html.twig:50
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:62
- Part-DB1\templates\AdminPages\_attachments.html.twig:50
- Part-DB1\templates\Parts\edit\_attachments.html.twig:48
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:45
-
attachment.view_local
Zobrazit místní kopii
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:58
- Part-DB1\templates\Parts\edit\_attachments.html.twig:56
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:43
- Part-DB1\src\DataTables\AttachmentDataTable.php:166
- Part-DB1\templates\AdminPages\_attachments.html.twig:56
- Part-DB1\templates\Parts\edit\_attachments.html.twig:54
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:38
- Part-DB1\src\DataTables\AttachmentDataTable.php:166
-
attachment.file_not_found
Soubor nebyl nalezen
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:66
- Part-DB1\templates\Parts\edit\_attachments.html.twig:64
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:48
- Part-DB1\templates\Parts\edit\_attachments.html.twig:62
-
attachment.secure
Soukromá příloha
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:79
- Part-DB1\templates\Parts\edit\_attachments.html.twig:77
- Part-DB1\templates\AdminPages\_attachments.html.twig:77
- Part-DB1\templates\Parts\edit\_attachments.html.twig:75
-
attachment.create
Přidat přílohu
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:84
- Part-DB1\templates\Parts\edit\_attachments.html.twig:82
- Part-DB1\templates\Parts\edit\_lots.html.twig:33
- Part-DB1\templates\AdminPages\_attachments.html.twig:82
- Part-DB1\templates\Parts\edit\_attachments.html.twig:80
- Part-DB1\templates\Parts\edit\_lots.html.twig:33
-
part_lot.edit.delete.confirm
Opravdu chcete tuto zásobu smazat? To nelze vzít zpět!
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:2
- Part-DB1\templates\AdminPages\_delete_form.html.twig:2
- templates\AdminPages\_delete_form.html.twig:2
-
entity.delete.confirm_title
Opravdu chcete smazat %name%?
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:3
- Part-DB1\templates\AdminPages\_delete_form.html.twig:3
- templates\AdminPages\_delete_form.html.twig:3
-
entity.delete.message
To nelze vrátit zpět!
@@ -875,11 +544,6 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:11
- Part-DB1\templates\AdminPages\_delete_form.html.twig:11
- templates\AdminPages\_delete_form.html.twig:9
-
entity.delete
Odstranit prvek
@@ -887,12 +551,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\AdminPages\_delete_form.html.twig:16
- Part-DB1\templates\Parts\info\_tools.html.twig:45
- Part-DB1\src\Form\Part\PartBaseType.php:286
- Part-DB1\templates\AdminPages\_delete_form.html.twig:16
- Part-DB1\templates\Parts\info\_tools.html.twig:43
- Part-DB1\src\Form\Part\PartBaseType.php:267
new
@@ -901,561 +559,300 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:24
- Part-DB1\templates\AdminPages\_delete_form.html.twig:24
- templates\AdminPages\_delete_form.html.twig:12
-
entity.delete.recursive
Odstranit rekurzivně (všechny související prvky)
-
- Part-DB1\templates\AdminPages\_duplicate.html.twig:3
-
entity.duplicate
Duplikovat prvek
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:4
- Part-DB1\src\Form\AdminPages\ImportType.php:76
- Part-DB1\templates\AdminPages\_export_form.html.twig:4
- Part-DB1\src\Form\AdminPages\ImportType.php:76
- templates\AdminPages\_export_form.html.twig:4
- src\Form\ImportType.php:67
-
export.format
Formát souboru
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:16
- Part-DB1\templates\AdminPages\_export_form.html.twig:16
- templates\AdminPages\_export_form.html.twig:16
-
export.level
Úroveň podrobností
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:19
- Part-DB1\templates\AdminPages\_export_form.html.twig:19
- templates\AdminPages\_export_form.html.twig:19
-
export.level.simple
Jednoduchý
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:20
- Part-DB1\templates\AdminPages\_export_form.html.twig:20
- templates\AdminPages\_export_form.html.twig:20
-
export.level.extended
Rozšířený
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:21
- Part-DB1\templates\AdminPages\_export_form.html.twig:21
- templates\AdminPages\_export_form.html.twig:21
-
export.level.full
Úplný
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:31
- Part-DB1\templates\AdminPages\_export_form.html.twig:31
- templates\AdminPages\_export_form.html.twig:31
-
export.include_children
Zahrnutí podřízených prvků do exportu
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:39
- Part-DB1\templates\AdminPages\_export_form.html.twig:39
- templates\AdminPages\_export_form.html.twig:39
-
export.btn
Export
-
- Part-DB1\templates\AdminPages\_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12
- Part-DB1\templates\Parts\info\show_part_info.html.twig:24
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:36
- Part-DB1\templates\AdminPages\_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12
- Part-DB1\templates\Parts\info\show_part_info.html.twig:24
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:36
- templates\AdminPages\EntityAdminBase.html.twig:94
- templates\Parts\edit_part_info.html.twig:12
- templates\Parts\show_part_info.html.twig:11
-
id.label
ID
-
- Part-DB1\templates\AdminPages\_info.html.twig:11
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:76
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:77
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:6
- Part-DB1\templates\Parts\info\_order_infos.html.twig:69
- Part-DB1\templates\Parts\info\_sidebar.html.twig:12
- Part-DB1\templates\Parts\lists\_info_card.html.twig:77
- Part-DB1\templates\AdminPages\_info.html.twig:11
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:59
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:60
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:6
- Part-DB1\templates\Parts\info\_order_infos.html.twig:69
- Part-DB1\templates\Parts\info\_sidebar.html.twig:12
- Part-DB1\templates\Parts\lists\_info_card.html.twig:53
- templates\AdminPages\EntityAdminBase.html.twig:101
- templates\Parts\show_part_info.html.twig:248
-
createdAt
Vytvořeno
-
- Part-DB1\templates\AdminPages\_info.html.twig:25
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:21
- Part-DB1\templates\Parts\info\_sidebar.html.twig:8
- Part-DB1\templates\Parts\lists\_info_card.html.twig:73
- Part-DB1\templates\AdminPages\_info.html.twig:25
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:21
- Part-DB1\templates\Parts\info\_sidebar.html.twig:8
- Part-DB1\templates\Parts\lists\_info_card.html.twig:49
- templates\AdminPages\EntityAdminBase.html.twig:114
- templates\Parts\show_part_info.html.twig:263
-
lastModified
Naposledy upraveno
-
- Part-DB1\templates\AdminPages\_info.html.twig:38
- Part-DB1\templates\AdminPages\_info.html.twig:38
-
entity.info.parts_count
Počet dílů s tímto prvkem
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:6
- Part-DB1\templates\helper.twig:125
- Part-DB1\templates\Parts\edit\_specifications.html.twig:6
-
specifications.property
Parametr
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:7
- Part-DB1\templates\Parts\edit\_specifications.html.twig:7
-
specifications.symbol
Symbol
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:8
- Part-DB1\templates\Parts\edit\_specifications.html.twig:8
-
specifications.value_min
Min.
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:9
- Part-DB1\templates\Parts\edit\_specifications.html.twig:9
-
specifications.value_typ
Typ.
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:10
- Part-DB1\templates\Parts\edit\_specifications.html.twig:10
-
specifications.value_max
Max.
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:11
- Part-DB1\templates\Parts\edit\_specifications.html.twig:11
-
specifications.unit
Jednotka
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:12
- Part-DB1\templates\Parts\edit\_specifications.html.twig:12
-
specifications.text
Text
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:13
- Part-DB1\templates\Parts\edit\_specifications.html.twig:13
-
specifications.group
Skupina
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:26
- Part-DB1\templates\Parts\edit\_specifications.html.twig:26
-
specification.create
Nový parametr
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:31
- Part-DB1\templates\Parts\edit\_specifications.html.twig:31
-
parameter.delete.confirm
Opravdu chcete tento parametr odstranit?
-
- Part-DB1\templates\attachment_list.html.twig:3
- Part-DB1\templates\attachment_list.html.twig:3
-
attachment.list.title
Seznam příloh
-
- Part-DB1\templates\attachment_list.html.twig:10
- Part-DB1\templates\LogSystem\_log_table.html.twig:8
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:6
- Part-DB1\templates\attachment_list.html.twig:10
- Part-DB1\templates\LogSystem\_log_table.html.twig:8
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:6
-
part_list.loading.caption
Načítání
-
- Part-DB1\templates\attachment_list.html.twig:11
- Part-DB1\templates\LogSystem\_log_table.html.twig:9
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:7
- Part-DB1\templates\attachment_list.html.twig:11
- Part-DB1\templates\LogSystem\_log_table.html.twig:9
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:7
-
part_list.loading.message
To může chvíli trvat. Pokud tato zpráva nezmizí, zkuste stránku načíst znovu.
-
- Part-DB1\templates\base.html.twig:68
- Part-DB1\templates\base.html.twig:68
- templates\base.html.twig:246
-
vendor.base.javascript_hint
Chcete-li používat všechny funkce, aktivujte prosím JavaScript!
-
- Part-DB1\templates\base.html.twig:73
- Part-DB1\templates\base.html.twig:73
-
sidebar.big.toggle
Zobrazit/skrýt postranní panel
-
- Part-DB1\templates\base.html.twig:95
- Part-DB1\templates\base.html.twig:95
- templates\base.html.twig:271
-
loading.caption
Načítání:
-
- Part-DB1\templates\base.html.twig:96
- Part-DB1\templates\base.html.twig:96
- templates\base.html.twig:272
-
loading.message
To může chvíli trvat. Pokud tato zpráva zůstává dlouho, zkuste stránku znovu načíst.
-
- Part-DB1\templates\base.html.twig:101
- Part-DB1\templates\base.html.twig:101
- templates\base.html.twig:277
-
loading.bar
Načítání...
-
- Part-DB1\templates\base.html.twig:112
- Part-DB1\templates\base.html.twig:112
- templates\base.html.twig:288
-
back_to_top
Zpět na začátek stránky
-
- Part-DB1\templates\Form\permissionLayout.html.twig:35
- Part-DB1\templates\Form\permissionLayout.html.twig:35
-
permission.edit.permission
Oprávnění
-
- Part-DB1\templates\Form\permissionLayout.html.twig:36
- Part-DB1\templates\Form\permissionLayout.html.twig:36
-
permission.edit.value
Hodnota
-
- Part-DB1\templates\Form\permissionLayout.html.twig:53
- Part-DB1\templates\Form\permissionLayout.html.twig:53
-
permission.legend.title
Vysvětlení režimů
-
- Part-DB1\templates\Form\permissionLayout.html.twig:57
- Part-DB1\templates\Form\permissionLayout.html.twig:57
-
permission.legend.disallow
Zakázáno
-
- Part-DB1\templates\Form\permissionLayout.html.twig:61
- Part-DB1\templates\Form\permissionLayout.html.twig:61
-
permission.legend.allow
Povoleno
-
- Part-DB1\templates\Form\permissionLayout.html.twig:65
- Part-DB1\templates\Form\permissionLayout.html.twig:65
-
permission.legend.inherit
Převzít z (nadřazené) skupiny
-
- Part-DB1\templates\helper.twig:3
- Part-DB1\templates\helper.twig:3
-
bool.true
Ano
-
- Part-DB1\templates\helper.twig:5
- Part-DB1\templates\helper.twig:5
-
bool.false
Ne
-
- Part-DB1\templates\helper.twig:92
- Part-DB1\templates\helper.twig:87
-
Yes
Ano
-
- Part-DB1\templates\helper.twig:94
- Part-DB1\templates\helper.twig:89
-
No
Ne
-
- Part-DB1\templates\helper.twig:126
-
specifications.value
Hodnota
-
- Part-DB1\templates\homepage.html.twig:7
- Part-DB1\templates\homepage.html.twig:7
- templates\homepage.html.twig:7
-
version.caption
Verze
-
- Part-DB1\templates\homepage.html.twig:22
- Part-DB1\templates\homepage.html.twig:22
- templates\homepage.html.twig:19
-
homepage.license
Informace o licenci
-
- Part-DB1\templates\homepage.html.twig:31
- Part-DB1\templates\homepage.html.twig:31
- templates\homepage.html.twig:28
-
homepage.github.caption
Stránka projektu
-
- Part-DB1\templates\homepage.html.twig:31
- Part-DB1\templates\homepage.html.twig:31
- templates\homepage.html.twig:28
-
homepage.github.text
Zdrojové kódy, soubory ke stažení, hlášení chyb, seznam úkolů atd. najdete na <a href="%href%" class="link-external" target="_blank">stránce projektu GitHub</a>
-
- Part-DB1\templates\homepage.html.twig:32
- Part-DB1\templates\homepage.html.twig:32
- templates\homepage.html.twig:29
-
homepage.help.caption
Nápověda
-
- Part-DB1\templates\homepage.html.twig:32
- Part-DB1\templates\homepage.html.twig:32
- templates\homepage.html.twig:29
-
homepage.help.text
Nápovědu a tipy najdete na Wiki na <a href="%href%" class="link-external" target="_blank">stránce GitHub</a>
-
- Part-DB1\templates\homepage.html.twig:33
- Part-DB1\templates\homepage.html.twig:33
- templates\homepage.html.twig:30
-
homepage.forum.caption
Fórum
@@ -1463,8 +860,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\homepage.html.twig:45
- Part-DB1\templates\homepage.html.twig:45
new
@@ -1473,138 +868,90 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:3
- Part-DB1\templates\LabelSystem\dialog.html.twig:6
-
label_generator.title
Generátor štítků
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:16
-
label_generator.common
Obecné
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:20
-
label_generator.advanced
Pokročilé
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:24
-
label_generator.profiles
Profily
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:58
-
label_generator.selected_profile
Aktuálně vybraný profil
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:62
-
label_generator.edit_profile
Upravit profil
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:75
-
label_generator.load_profile
Načíst profil
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:102
-
label_generator.download
Stáhnout
-
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:3
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:5
-
label_generator.label_btn
Vytvořit štítek
-
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:20
-
label_generator.label_empty
Nový prázdný štítek
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:3
-
label_scanner.title
Čtečka štítků
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7
-
label_scanner.no_cam_found.title
Nebyla nalezena žádná webová kamera
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7
-
label_scanner.no_cam_found.text
Potřebujete webovou kameru a povolení k použití funkce čtečky. Kód čárového kódu můžete zadat ručně níže.
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:27
-
label_scanner.source_select
Vybrat zdroj
-
- Part-DB1\templates\LogSystem\log_list.html.twig:3
- Part-DB1\templates\LogSystem\log_list.html.twig:3
-
log.list.title
Systémový protokol
@@ -1612,8 +959,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\LogSystem\_log_table.html.twig:1
- Part-DB1\templates\LogSystem\_log_table.html.twig:1
new
@@ -1623,8 +968,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\LogSystem\_log_table.html.twig:2
- Part-DB1\templates\LogSystem\_log_table.html.twig:2
new
@@ -1633,194 +976,114 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\mail\base.html.twig:24
- Part-DB1\templates\mail\base.html.twig:24
-
mail.footer.email_sent_by
Tento e-mail byl automaticky odeslán
-
- Part-DB1\templates\mail\base.html.twig:24
- Part-DB1\templates\mail\base.html.twig:24
-
mail.footer.dont_reply
Na tento e-mail neodpovídejte.
-
- Part-DB1\templates\mail\pw_reset.html.twig:6
- Part-DB1\templates\mail\pw_reset.html.twig:6
-
email.hi %name%
Ahoj %name%
-
- Part-DB1\templates\mail\pw_reset.html.twig:7
- Part-DB1\templates\mail\pw_reset.html.twig:7
-
email.pw_reset.message
někdo (doufejme, že vy) požádal o obnovení vašeho hesla. Pokud jste tuto žádost nepodali vy, ignorujte tento e-mail.
-
- Part-DB1\templates\mail\pw_reset.html.twig:9
- Part-DB1\templates\mail\pw_reset.html.twig:9
-
email.pw_reset.button
Klikněte zde pro obnovení hesla
-
- Part-DB1\templates\mail\pw_reset.html.twig:11
- Part-DB1\templates\mail\pw_reset.html.twig:11
-
email.pw_reset.fallback
Pokud vám to nefunguje, přejděte na <a href="%url%">%url%</a> a zadejte následující informace.
-
- Part-DB1\templates\mail\pw_reset.html.twig:16
- Part-DB1\templates\mail\pw_reset.html.twig:16
-
email.pw_reset.username
Uživatelské jméno
-
- Part-DB1\templates\mail\pw_reset.html.twig:19
- Part-DB1\templates\mail\pw_reset.html.twig:19
-
email.pw_reset.token
Token
-
- Part-DB1\templates\mail\pw_reset.html.twig:24
- Part-DB1\templates\mail\pw_reset.html.twig:24
-
email.pw_reset.valid_unit %date%
Token obnovení bude platný do <i>%date%</i>.
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:18
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:78
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58
-
orderdetail.delete
Odstranit
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39
-
pricedetails.edit.min_qty
Minimální množství slevy
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40
-
pricedetails.edit.price
Cena
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41
-
pricedetails.edit.price_qty
za množství
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54
-
pricedetail.create
Přidat cenu
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4
- templates\Parts\edit_part_info.html.twig:4
-
part.edit.title
Upravit díl
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9
- templates\Parts\edit_part_info.html.twig:9
-
part.edit.card_title
Upravit díl
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22
-
part.edit.tab.common
Obecné
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28
-
part.edit.tab.manufacturer
Výrobce
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34
-
part.edit.tab.advanced
Pokročilé
@@ -1887,279 +1150,156 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40
-
part.edit.tab.part_lots
Zásoby
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46
-
part.edit.tab.attachments
Přílohy
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52
-
part.edit.tab.orderdetails
Informace o nákupu
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58
-
part.edit.tab.specifications
Parametry
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:64
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58
-
part.edit.tab.comment
Poznámky
-
- Part-DB1\templates\Parts\edit\new_part.html.twig:8
- Part-DB1\templates\Parts\edit\new_part.html.twig:8
- templates\Parts\new_part.html.twig:8
-
part.new.card_title
Přidat nový díl
-
- Part-DB1\templates\Parts\edit\_lots.html.twig:5
- Part-DB1\templates\Parts\edit\_lots.html.twig:5
-
part_lot.delete
Odstranit
-
- Part-DB1\templates\Parts\edit\_lots.html.twig:28
- Part-DB1\templates\Parts\edit\_lots.html.twig:28
-
part_lot.create
Přidat zásoby
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13
-
orderdetail.create
Přidat distributora
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18
-
pricedetails.edit.delete.confirm
Opravdu chcete tuto cenu smazat? To nelze vzít zpět.
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:62
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:61
-
orderdetails.edit.delete.confirm
Opravdu chcete smazat informace o distributorovi? To nelze vzít zpět!
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:4
- Part-DB1\templates\Parts\info\show_part_info.html.twig:19
- Part-DB1\templates\Parts\info\show_part_info.html.twig:4
- Part-DB1\templates\Parts\info\show_part_info.html.twig:19
- templates\Parts\show_part_info.html.twig:4
- templates\Parts\show_part_info.html.twig:9
-
part.info.title
Detailní informace o dílu
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:47
- Part-DB1\templates\Parts\info\show_part_info.html.twig:47
-
part.part_lots.label
Zásoby
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:56
- Part-DB1\templates\Parts\lists\_info_card.html.twig:43
- Part-DB1\templates\_navbar_search.html.twig:31
- Part-DB1\templates\_navbar_search.html.twig:26
- templates\base.html.twig:62
- templates\Parts\show_part_info.html.twig:74
- src\Form\PartType.php:86
-
comment.label
Poznámky
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:64
-
part.info.specifications
Parametry
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:74
- Part-DB1\templates\Parts\info\show_part_info.html.twig:64
- templates\Parts\show_part_info.html.twig:82
-
attachment.labelp
Přílohy
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:83
- Part-DB1\templates\Parts\info\show_part_info.html.twig:71
- templates\Parts\show_part_info.html.twig:88
-
vendor.partinfo.shopping_infos
Informace o nákupu
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:91
- Part-DB1\templates\Parts\info\show_part_info.html.twig:78
- templates\Parts\show_part_info.html.twig:94
-
vendor.partinfo.history
Historie
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:97
- Part-DB1\templates\_sidebar.html.twig:54
- Part-DB1\templates\_sidebar.html.twig:13
- Part-DB1\templates\Parts\info\show_part_info.html.twig:84
- Part-DB1\templates\_sidebar.html.twig:54
- Part-DB1\templates\_sidebar.html.twig:13
- templates\base.html.twig:176
- templates\base.html.twig:203
- templates\base.html.twig:217
- templates\base.html.twig:231
- templates\Parts\show_part_info.html.twig:100
-
tools.label
Nástroje
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:103
- Part-DB1\templates\Parts\info\show_part_info.html.twig:90
-
extended_info.label
Rozšířené informace
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:7
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:7
-
attachment.name
Jméno
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:8
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:8
-
attachment.attachment_type
Typ přílohy
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:9
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:9
-
attachment.file_name
Název souboru
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:10
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:10
-
attachment.file_size
Velikost souboru
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:54
-
attachment.preview
Náhled
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:67
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:50
-
attachment.download_local
Stáhnout místní kopii
@@ -2167,8 +1307,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:11
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:11
new
@@ -2177,14 +1315,6 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:13
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:28
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:50
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:13
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:28
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:50
-
Unknown
Neznámý
@@ -2192,10 +1322,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:15
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:30
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:15
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:30
new
@@ -2205,8 +1331,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:26
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:26
new
@@ -2215,49 +1339,24 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:41
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:41
-
part.isFavorite
Oblíbené
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:46
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:46
-
part.minOrderAmount
Minimální množství
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:8
- Part-DB1\templates\_navbar_search.html.twig:46
- Part-DB1\src\Services\ElementTypeNameGenerator.php:84
- Part-DB1\templates\Parts\info\_main_infos.html.twig:8
- Part-DB1\templates\_navbar_search.html.twig:41
- Part-DB1\src\Services\ElementTypeNameGenerator.php:84
- templates\base.html.twig:70
- templates\Parts\show_part_info.html.twig:24
- src\Form\PartType.php:80
-
manufacturer.label
Výrobce
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:24
- Part-DB1\templates\_navbar_search.html.twig:11
- templates\base.html.twig:54
- src\Form\PartType.php:62
-
name.label
Jméno
@@ -2265,8 +1364,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Parts\info\_main_infos.html.twig:27
- Part-DB1\templates\Parts\info\_main_infos.html.twig:27
new
@@ -2275,767 +1372,432 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:32
- Part-DB1\templates\_navbar_search.html.twig:19
- Part-DB1\templates\Parts\info\_main_infos.html.twig:32
- Part-DB1\templates\_navbar_search.html.twig:18
- templates\base.html.twig:58
- templates\Parts\show_part_info.html.twig:31
- src\Form\PartType.php:65
-
description.label
Popis
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:34
- Part-DB1\templates\_navbar_search.html.twig:15
- Part-DB1\src\Services\ElementTypeNameGenerator.php:80
- Part-DB1\templates\Parts\info\_main_infos.html.twig:34
- Part-DB1\templates\_navbar_search.html.twig:14
- Part-DB1\src\Services\ElementTypeNameGenerator.php:80
- templates\base.html.twig:56
- templates\Parts\show_part_info.html.twig:32
- src\Form\PartType.php:74
-
category.label
Kategorie
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:39
- Part-DB1\templates\Parts\info\_main_infos.html.twig:39
- templates\Parts\show_part_info.html.twig:42
- src\Form\PartType.php:69
-
instock.label
Skladem
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:41
- Part-DB1\templates\Parts\info\_main_infos.html.twig:41
- templates\Parts\show_part_info.html.twig:44
- src\Form\PartType.php:72
-
mininstock.label
Minimální skladová zásoba
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:45
- Part-DB1\templates\_navbar_search.html.twig:52
- Part-DB1\src\Services\ElementTypeNameGenerator.php:83
- Part-DB1\templates\Parts\info\_main_infos.html.twig:45
- Part-DB1\templates\_navbar_search.html.twig:47
- Part-DB1\src\Services\ElementTypeNameGenerator.php:83
- templates\base.html.twig:73
- templates\Parts\show_part_info.html.twig:47
-
footprint.label
Otisk
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:56
- Part-DB1\templates\Parts\info\_main_infos.html.twig:59
- Part-DB1\templates\Parts\info\_main_infos.html.twig:57
- Part-DB1\templates\Parts\info\_main_infos.html.twig:60
- templates\Parts\show_part_info.html.twig:51
-
part.avg_price.label
Průměrná cena
-
- Part-DB1\templates\Parts\info\_order_infos.html.twig:5
- Part-DB1\templates\Parts\info\_order_infos.html.twig:5
-
part.supplier.name
Jméno
-
- Part-DB1\templates\Parts\info\_order_infos.html.twig:6
- Part-DB1\templates\Parts\info\_order_infos.html.twig:6
-
part.supplier.partnr
Objednací číslo
-
- Part-DB1\templates\Parts\info\_order_infos.html.twig:28
- Part-DB1\templates\Parts\info\_order_infos.html.twig:28
-
part.order.minamount
Minimální množství
-
- Part-DB1\templates\Parts\info\_order_infos.html.twig:29
- Part-DB1\templates\Parts\info\_order_infos.html.twig:29
-
part.order.price
Cena
-
- Part-DB1\templates\Parts\info\_order_infos.html.twig:31
- Part-DB1\templates\Parts\info\_order_infos.html.twig:31
-
part.order.single_price
Jednotková cena
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:7
- Part-DB1\templates\Parts\info\_part_lots.html.twig:6
-
part_lots.description
Popis
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:8
- Part-DB1\templates\Parts\info\_part_lots.html.twig:7
-
part_lots.storage_location
Umístění
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:9
- Part-DB1\templates\Parts\info\_part_lots.html.twig:8
-
part_lots.amount
Množství
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:24
- Part-DB1\templates\Parts\info\_part_lots.html.twig:22
-
part_lots.location_unknown
Umístění neznámé
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:31
- Part-DB1\templates\Parts\info\_part_lots.html.twig:29
-
part_lots.instock_unknown
Množství neznámé
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:40
- Part-DB1\templates\Parts\info\_part_lots.html.twig:38
-
part_lots.expiration_date
Datum vypršení platnosti
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:48
- Part-DB1\templates\Parts\info\_part_lots.html.twig:46
-
part_lots.is_expired
Platnost vypršela
-
- Part-DB1\templates\Parts\info\_part_lots.html.twig:55
- Part-DB1\templates\Parts\info\_part_lots.html.twig:53
-
part_lots.need_refill
Potřebuje doplnit
-
- Part-DB1\templates\Parts\info\_picture.html.twig:15
- Part-DB1\templates\Parts\info\_picture.html.twig:15
-
part.info.prev_picture
Předchozí obrázek
-
- Part-DB1\templates\Parts\info\_picture.html.twig:19
- Part-DB1\templates\Parts\info\_picture.html.twig:19
-
part.info.next_picture
Další obrázek
-
- Part-DB1\templates\Parts\info\_sidebar.html.twig:21
- Part-DB1\templates\Parts\info\_sidebar.html.twig:21
-
part.mass.tooltip
Hromadné
-
- Part-DB1\templates\Parts\info\_sidebar.html.twig:30
- Part-DB1\templates\Parts\info\_sidebar.html.twig:30
-
part.needs_review.badge
Vyžaduje kontrolu
-
- Part-DB1\templates\Parts\info\_sidebar.html.twig:39
- Part-DB1\templates\Parts\info\_sidebar.html.twig:39
-
part.favorite.badge
Oblíbené
-
- Part-DB1\templates\Parts\info\_sidebar.html.twig:47
- Part-DB1\templates\Parts\info\_sidebar.html.twig:47
-
part.obsolete.badge
Již není k dispozici
-
- Part-DB1\templates\Parts\info\_specifications.html.twig:10
-
parameters.extracted_from_description
Automaticky extrahováno z popisu
-
- Part-DB1\templates\Parts\info\_specifications.html.twig:15
-
parameters.auto_extracted_from_comment
Automaticky extrahované z poznámek
-
- Part-DB1\templates\Parts\info\_tools.html.twig:6
- Part-DB1\templates\Parts\info\_tools.html.twig:4
- templates\Parts\show_part_info.html.twig:125
-
part.edit.btn
Upravit díl
-
- Part-DB1\templates\Parts\info\_tools.html.twig:16
- Part-DB1\templates\Parts\info\_tools.html.twig:14
- templates\Parts\show_part_info.html.twig:135
-
part.clone.btn
Duplikovat díl
-
- Part-DB1\templates\Parts\info\_tools.html.twig:24
- Part-DB1\templates\Parts\lists\_action_bar.html.twig:4
- templates\Parts\show_part_info.html.twig:143
-
part.create.btn
Přidat nový díl
-
- Part-DB1\templates\Parts\info\_tools.html.twig:31
- Part-DB1\templates\Parts\info\_tools.html.twig:29
-
part.delete.confirm_title
Opravdu chcete tento díl odstranit?
-
- Part-DB1\templates\Parts\info\_tools.html.twig:32
- Part-DB1\templates\Parts\info\_tools.html.twig:30
-
part.delete.message
Tento díl a všechny související informace (např. přílohy, informace o ceně atd.) budou odstraněny. Toto nelze vrátit zpět!
-
- Part-DB1\templates\Parts\info\_tools.html.twig:39
- Part-DB1\templates\Parts\info\_tools.html.twig:37
-
part.delete
Odstranit díl
-
- Part-DB1\templates\Parts\lists\all_list.html.twig:4
- Part-DB1\templates\Parts\lists\all_list.html.twig:4
-
parts_list.all.title
Všechny díly
-
- Part-DB1\templates\Parts\lists\category_list.html.twig:4
- Part-DB1\templates\Parts\lists\category_list.html.twig:4
-
parts_list.category.title
Díly s kategorií
-
- Part-DB1\templates\Parts\lists\footprint_list.html.twig:4
- Part-DB1\templates\Parts\lists\footprint_list.html.twig:4
-
parts_list.footprint.title
Díly s otiskem
-
- Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4
- Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4
-
parts_list.manufacturer.title
Díly s výrobcem
-
- Part-DB1\templates\Parts\lists\search_list.html.twig:4
- Part-DB1\templates\Parts\lists\search_list.html.twig:4
-
parts_list.search.title
Vyhledat díly
-
- Part-DB1\templates\Parts\lists\store_location_list.html.twig:4
- Part-DB1\templates\Parts\lists\store_location_list.html.twig:4
-
parts_list.storelocation.title
Díly s místy uložení
-
- Part-DB1\templates\Parts\lists\supplier_list.html.twig:4
- Part-DB1\templates\Parts\lists\supplier_list.html.twig:4
-
parts_list.supplier.title
Díly s dodavatelem
-
- Part-DB1\templates\Parts\lists\tags_list.html.twig:4
- Part-DB1\templates\Parts\lists\tags_list.html.twig:4
-
parts_list.tags.title
Díly se štítkem
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:22
- Part-DB1\templates\Parts\lists\_info_card.html.twig:17
-
entity.info.common.tab
Obecné
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:26
- Part-DB1\templates\Parts\lists\_info_card.html.twig:20
-
entity.info.statistics.tab
Statistika
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:31
-
entity.info.attachments.tab
Attachments
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:37
-
entity.info.parameters.tab
Parametry
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:54
- Part-DB1\templates\Parts\lists\_info_card.html.twig:30
-
entity.info.name
Jméno
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:58
- Part-DB1\templates\Parts\lists\_info_card.html.twig:96
- Part-DB1\templates\Parts\lists\_info_card.html.twig:34
- Part-DB1\templates\Parts\lists\_info_card.html.twig:67
-
entity.info.parent
Nadřazený
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:70
- Part-DB1\templates\Parts\lists\_info_card.html.twig:46
-
entity.edit.btn
Upravit
-
- Part-DB1\templates\Parts\lists\_info_card.html.twig:92
- Part-DB1\templates\Parts\lists\_info_card.html.twig:63
-
entity.info.children_count
Počet podřízených prvků
-
- Part-DB1\templates\security\2fa_base_form.html.twig:3
- Part-DB1\templates\security\2fa_base_form.html.twig:5
- Part-DB1\templates\security\2fa_base_form.html.twig:3
- Part-DB1\templates\security\2fa_base_form.html.twig:5
-
tfa.check.title
Potřeba dvoufaktorového ověřování
-
- Part-DB1\templates\security\2fa_base_form.html.twig:39
- Part-DB1\templates\security\2fa_base_form.html.twig:39
-
tfa.code.trusted_pc
Jedná se o důvěryhodný počítač (pokud je tato možnost povolena, neprovádějí se na tomto počítači žádné další dvoufaktorové dotazy).
-
- Part-DB1\templates\security\2fa_base_form.html.twig:52
- Part-DB1\templates\security\login.html.twig:58
- Part-DB1\templates\security\2fa_base_form.html.twig:52
- Part-DB1\templates\security\login.html.twig:58
-
login.btn
Přihlášení
-
- Part-DB1\templates\security\2fa_base_form.html.twig:53
- Part-DB1\templates\security\U2F\u2f_login.html.twig:13
- Part-DB1\templates\_navbar.html.twig:42
- Part-DB1\templates\security\2fa_base_form.html.twig:53
- Part-DB1\templates\security\U2F\u2f_login.html.twig:13
- Part-DB1\templates\_navbar.html.twig:40
-
user.logout
Odhlásit se
-
- Part-DB1\templates\security\2fa_form.html.twig:6
- Part-DB1\templates\security\2fa_form.html.twig:6
-
tfa.check.code.label
Kód aplikace Authenticator
-
- Part-DB1\templates\security\2fa_form.html.twig:10
- Part-DB1\templates\security\2fa_form.html.twig:10
-
tfa.check.code.help
Zde zadejte šestimístný kód z ověřovací aplikace nebo jeden ze záložních kódů, pokud ověřovací aplikace není k dispozici.
-
- Part-DB1\templates\security\login.html.twig:3
- Part-DB1\templates\security\login.html.twig:3
- templates\security\login.html.twig:3
-
login.title
Přihlášení
-
- Part-DB1\templates\security\login.html.twig:7
- Part-DB1\templates\security\login.html.twig:7
- templates\security\login.html.twig:7
-
login.card_title
Přihlášení
-
- Part-DB1\templates\security\login.html.twig:31
- Part-DB1\templates\security\login.html.twig:31
- templates\security\login.html.twig:31
-
login.username.label
Uživatelské jméno
-
- Part-DB1\templates\security\login.html.twig:34
- Part-DB1\templates\security\login.html.twig:34
- templates\security\login.html.twig:34
-
login.username.placeholder
Uživatelské jméno
-
- Part-DB1\templates\security\login.html.twig:38
- Part-DB1\templates\security\login.html.twig:38
- templates\security\login.html.twig:38
-
login.password.label
Heslo
-
- Part-DB1\templates\security\login.html.twig:40
- Part-DB1\templates\security\login.html.twig:40
- templates\security\login.html.twig:40
-
login.password.placeholder
Heslo
-
- Part-DB1\templates\security\login.html.twig:50
- Part-DB1\templates\security\login.html.twig:50
- templates\security\login.html.twig:50
-
login.rememberme
Zapamatovat si (nemělo by se používat na sdílených počítačích)
-
- Part-DB1\templates\security\login.html.twig:64
- Part-DB1\templates\security\login.html.twig:64
-
pw_reset.password_forget
Zapomněli jste uživatelské jméno/heslo?
-
- Part-DB1\templates\security\pw_reset_new_pw.html.twig:5
- Part-DB1\templates\security\pw_reset_new_pw.html.twig:5
-
pw_reset.new_pw.header.title
Nastavit nové heslo
-
- Part-DB1\templates\security\pw_reset_request.html.twig:5
- Part-DB1\templates\security\pw_reset_request.html.twig:5
-
pw_reset.request.header.title
Požádat o nové heslo
-
- Part-DB1\templates\security\U2F\u2f_login.html.twig:7
- Part-DB1\templates\security\U2F\u2f_register.html.twig:10
- Part-DB1\templates\security\U2F\u2f_login.html.twig:7
- Part-DB1\templates\security\U2F\u2f_register.html.twig:10
-
tfa_u2f.http_warning
Na tuto stránku přistupujete pomocí nezabezpečené metody HTTP, takže U2F pravděpodobně nebude fungovat (chybová zpráva Bad Request). Pokud chcete používat bezpečnostní klíče, požádejte správce o nastavení zabezpečené metody HTTPS.
-
- Part-DB1\templates\security\U2F\u2f_login.html.twig:10
- Part-DB1\templates\security\U2F\u2f_register.html.twig:22
- Part-DB1\templates\security\U2F\u2f_login.html.twig:10
- Part-DB1\templates\security\U2F\u2f_register.html.twig:22
-
r_u2f_two_factor.pressbutton
Připojte bezpečnostní klíč a stiskněte jeho tlačítko!
-
- Part-DB1\templates\security\U2F\u2f_register.html.twig:3
- Part-DB1\templates\security\U2F\u2f_register.html.twig:3
-
tfa_u2f.add_key.title
Přidání bezpečnostního klíče
-
- Part-DB1\templates\security\U2F\u2f_register.html.twig:6
- Part-DB1\templates\Users\_2fa_settings.html.twig:111
- Part-DB1\templates\security\U2F\u2f_register.html.twig:6
- Part-DB1\templates\Users\_2fa_settings.html.twig:111
-
tfa_u2f.explanation
Pomocí bezpečnostního klíče kompatibilního s U2F/FIDO (např. YubiKey nebo NitroKey) lze dosáhnout uživatelsky přívětivého a bezpečného dvoufaktorového ověřování. Bezpečnostní klíče lze zde zaregistrovat a pokud je vyžadováno dvoufaktorové ověření, stačí vložit klíč do USB, nebo zadat přes zařízení prostřednictvím NFC.
-
- Part-DB1\templates\security\U2F\u2f_register.html.twig:7
- Part-DB1\templates\security\U2F\u2f_register.html.twig:7
-
tfa_u2f.add_key.backup_hint
Pro zajištění přístupu i v případě ztráty klíče doporučujeme zaregistrovat druhý klíč jako zálohu a uložit jej na bezpečném místě!
-
- Part-DB1\templates\security\U2F\u2f_register.html.twig:19
- Part-DB1\templates\security\U2F\u2f_register.html.twig:19
-
tfa_u2f.add_key.add_button
Přidat bezpečnostní klíč
-
- Part-DB1\templates\security\U2F\u2f_register.html.twig:27
- Part-DB1\templates\security\U2F\u2f_register.html.twig:27
-
tfa_u2f.add_key.back_to_settings
Zpět do nastavení
@@ -3043,10 +1805,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:5
- Part-DB1\templates\Statistics\statistics.html.twig:8
- Part-DB1\templates\Statistics\statistics.html.twig:5
- Part-DB1\templates\Statistics\statistics.html.twig:8
new
@@ -3056,8 +1814,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:14
- Part-DB1\templates\Statistics\statistics.html.twig:14
new
@@ -3067,8 +1823,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:19
- Part-DB1\templates\Statistics\statistics.html.twig:19
new
@@ -3078,8 +1832,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:24
- Part-DB1\templates\Statistics\statistics.html.twig:24
new
@@ -3089,12 +1841,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:34
- Part-DB1\templates\Statistics\statistics.html.twig:59
- Part-DB1\templates\Statistics\statistics.html.twig:104
- Part-DB1\templates\Statistics\statistics.html.twig:34
- Part-DB1\templates\Statistics\statistics.html.twig:59
- Part-DB1\templates\Statistics\statistics.html.twig:104
new
@@ -3104,12 +1850,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:35
- Part-DB1\templates\Statistics\statistics.html.twig:60
- Part-DB1\templates\Statistics\statistics.html.twig:105
- Part-DB1\templates\Statistics\statistics.html.twig:35
- Part-DB1\templates\Statistics\statistics.html.twig:60
- Part-DB1\templates\Statistics\statistics.html.twig:105
new
@@ -3119,8 +1859,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:40
- Part-DB1\templates\Statistics\statistics.html.twig:40
new
@@ -3130,8 +1868,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:44
- Part-DB1\templates\Statistics\statistics.html.twig:44
new
@@ -3141,8 +1877,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:48
- Part-DB1\templates\Statistics\statistics.html.twig:48
new
@@ -3152,8 +1886,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:65
- Part-DB1\templates\Statistics\statistics.html.twig:65
new
@@ -3163,8 +1895,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:69
- Part-DB1\templates\Statistics\statistics.html.twig:69
new
@@ -3174,8 +1904,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:73
- Part-DB1\templates\Statistics\statistics.html.twig:73
new
@@ -3185,8 +1913,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:77
- Part-DB1\templates\Statistics\statistics.html.twig:77
new
@@ -3196,8 +1922,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:81
- Part-DB1\templates\Statistics\statistics.html.twig:81
new
@@ -3207,8 +1931,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:85
- Part-DB1\templates\Statistics\statistics.html.twig:85
new
@@ -3218,8 +1940,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:89
- Part-DB1\templates\Statistics\statistics.html.twig:89
new
@@ -3229,8 +1949,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:93
- Part-DB1\templates\Statistics\statistics.html.twig:93
new
@@ -3240,8 +1958,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:110
- Part-DB1\templates\Statistics\statistics.html.twig:110
new
@@ -3251,8 +1967,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:114
- Part-DB1\templates\Statistics\statistics.html.twig:114
new
@@ -3262,8 +1976,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:118
- Part-DB1\templates\Statistics\statistics.html.twig:118
new
@@ -3273,8 +1985,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:122
- Part-DB1\templates\Statistics\statistics.html.twig:122
new
@@ -3284,8 +1994,6 @@ Související prvky budou přesunuty nahoru.
- Part-DB1\templates\Statistics\statistics.html.twig:126
- Part-DB1\templates\Statistics\statistics.html.twig:126
new
@@ -3294,302 +2002,156 @@ Související prvky budou přesunuty nahoru.
-
- Part-DB1\templates\Users\backup_codes.html.twig:3
- Part-DB1\templates\Users\backup_codes.html.twig:9
- Part-DB1\templates\Users\backup_codes.html.twig:3
- Part-DB1\templates\Users\backup_codes.html.twig:9
-
tfa_backup.codes.title
Záložní kódy
-
- Part-DB1\templates\Users\backup_codes.html.twig:12
- Part-DB1\templates\Users\backup_codes.html.twig:12
-
tfa_backup.codes.explanation
Vytiskněte si tyto kódy a uschovejte je na bezpečném místě!
-
- Part-DB1\templates\Users\backup_codes.html.twig:13
- Part-DB1\templates\Users\backup_codes.html.twig:13
-
tfa_backup.codes.help
Pokud již nemáte přístup ke svému zařízení s aplikací Authenticator (ztráta smartphonu, ztráta dat atd.), můžete použít jeden z těchto kódů pro přístup ke svému účtu a případně nastavit novou aplikaci Authenticator. Každý z těchto kódů lze použít jednou, použité kódy se doporučuje odstranit. Kdokoli s přístupem k těmto kódům může potenciálně získat přístup k vašemu účtu, proto je uchovávejte na bezpečném místě.
-
- Part-DB1\templates\Users\backup_codes.html.twig:16
- Part-DB1\templates\Users\backup_codes.html.twig:16
-
tfa_backup.username
Uživatelské jméno
-
- Part-DB1\templates\Users\backup_codes.html.twig:29
- Part-DB1\templates\Users\backup_codes.html.twig:29
-
tfa_backup.codes.page_generated_on
Stránka vygenerovaná dne %date%
-
- Part-DB1\templates\Users\backup_codes.html.twig:32
- Part-DB1\templates\Users\backup_codes.html.twig:32
-
tfa_backup.codes.print
Tisk
-
- Part-DB1\templates\Users\backup_codes.html.twig:35
- Part-DB1\templates\Users\backup_codes.html.twig:35
-
tfa_backup.codes.copy_clipboard
Zkopírovat do schránky
-
- Part-DB1\templates\Users\user_info.html.twig:3
- Part-DB1\templates\Users\user_info.html.twig:6
- Part-DB1\templates\_navbar.html.twig:40
- Part-DB1\templates\Users\user_info.html.twig:3
- Part-DB1\templates\Users\user_info.html.twig:6
- Part-DB1\templates\_navbar.html.twig:38
- templates\base.html.twig:99
- templates\Users\user_info.html.twig:3
- templates\Users\user_info.html.twig:6
-
user.info.label
Informace o uživateli
-
- Part-DB1\templates\Users\user_info.html.twig:18
- Part-DB1\src\Form\UserSettingsType.php:77
- Part-DB1\templates\Users\user_info.html.twig:18
- Part-DB1\src\Form\UserSettingsType.php:77
- templates\Users\user_info.html.twig:18
- src\Form\UserSettingsType.php:32
-
user.firstName.label
Jméno
-
- Part-DB1\templates\Users\user_info.html.twig:24
- Part-DB1\src\Form\UserSettingsType.php:82
- Part-DB1\templates\Users\user_info.html.twig:24
- Part-DB1\src\Form\UserSettingsType.php:82
- templates\Users\user_info.html.twig:24
- src\Form\UserSettingsType.php:35
-
user.lastName.label
Příjmení
-
- Part-DB1\templates\Users\user_info.html.twig:30
- Part-DB1\src\Form\UserSettingsType.php:92
- Part-DB1\templates\Users\user_info.html.twig:30
- Part-DB1\src\Form\UserSettingsType.php:92
- templates\Users\user_info.html.twig:30
- src\Form\UserSettingsType.php:41
-
user.email.label
e-mail
-
- Part-DB1\templates\Users\user_info.html.twig:37
- Part-DB1\src\Form\UserSettingsType.php:87
- Part-DB1\templates\Users\user_info.html.twig:37
- Part-DB1\src\Form\UserSettingsType.php:87
- templates\Users\user_info.html.twig:37
- src\Form\UserSettingsType.php:38
-
user.department.label
Oddělení
-
- Part-DB1\templates\Users\user_info.html.twig:47
- Part-DB1\src\Form\UserSettingsType.php:73
- Part-DB1\templates\Users\user_info.html.twig:47
- Part-DB1\src\Form\UserSettingsType.php:73
- templates\Users\user_info.html.twig:47
- src\Form\UserSettingsType.php:30
-
user.username.label
Uživatelské jméno
-
- Part-DB1\templates\Users\user_info.html.twig:53
- Part-DB1\src\Services\ElementTypeNameGenerator.php:93
- Part-DB1\templates\Users\user_info.html.twig:53
- Part-DB1\src\Services\ElementTypeNameGenerator.php:93
- templates\Users\user_info.html.twig:53
-
group.label
Skupina
-
- Part-DB1\templates\Users\user_info.html.twig:67
- Part-DB1\templates\Users\user_info.html.twig:67
-
user.permissions
Oprávnění
-
- Part-DB1\templates\Users\user_settings.html.twig:3
- Part-DB1\templates\Users\user_settings.html.twig:6
- Part-DB1\templates\_navbar.html.twig:39
- Part-DB1\templates\Users\user_settings.html.twig:3
- Part-DB1\templates\Users\user_settings.html.twig:6
- Part-DB1\templates\_navbar.html.twig:37
- templates\base.html.twig:98
- templates\Users\user_settings.html.twig:3
- templates\Users\user_settings.html.twig:6
-
user.settings.label
Uživatelské nastavení
-
- Part-DB1\templates\Users\user_settings.html.twig:18
- Part-DB1\templates\Users\user_settings.html.twig:18
- templates\Users\user_settings.html.twig:14
-
user_settings.data.label
Osobní údaje
-
- Part-DB1\templates\Users\user_settings.html.twig:22
- Part-DB1\templates\Users\user_settings.html.twig:22
- templates\Users\user_settings.html.twig:18
-
user_settings.configuration.label
Konfigurace
-
- Part-DB1\templates\Users\user_settings.html.twig:55
- Part-DB1\templates\Users\user_settings.html.twig:55
- templates\Users\user_settings.html.twig:48
-
user.settings.change_pw
Změnit heslo
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:6
- Part-DB1\templates\Users\_2fa_settings.html.twig:6
-
user.settings.2fa_settings
Dvoufaktorové ověřování
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:13
- Part-DB1\templates\Users\_2fa_settings.html.twig:13
-
tfa.settings.google.tab
Authenticator app
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:17
- Part-DB1\templates\Users\_2fa_settings.html.twig:17
-
tfa.settings.bakup.tab
Záložní kódy
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:21
- Part-DB1\templates\Users\_2fa_settings.html.twig:21
-
tfa.settings.u2f.tab
Bezpečnostní klíče (U2F)
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:25
- Part-DB1\templates\Users\_2fa_settings.html.twig:25
-
tfa.settings.trustedDevices.tab
Důvěryhodná zařízení
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:33
- Part-DB1\templates\Users\_2fa_settings.html.twig:33
-
tfa_google.disable.confirm_title
Opravdu chcete aplikaci Authenticator zakázat?
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:33
- Part-DB1\templates\Users\_2fa_settings.html.twig:33
-
tfa_google.disable.confirm_message
Pokud aplikaci Authenticator deaktivujete, všechny záložní kódy budou smazány, takže je možná budete muset vytisknout znovu.<br>
@@ -3597,262 +2159,156 @@ Upozorňujeme také, že bez dvoufaktorového ověřování není váš účet t
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:39
- Part-DB1\templates\Users\_2fa_settings.html.twig:39
-
tfa_google.disabled_message
Aplikace Authenticator deaktivována!
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:48
- Part-DB1\templates\Users\_2fa_settings.html.twig:48
-
tfa_google.step.download
Stáhněte si aplikaci Authenticator (např. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> nebo <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>).
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:49
- Part-DB1\templates\Users\_2fa_settings.html.twig:49
-
tfa_google.step.scan
Naskenujte přiložený QR kód pomocí aplikace nebo zadejte údaje ručně.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:50
- Part-DB1\templates\Users\_2fa_settings.html.twig:50
-
tfa_google.step.input_code
Vygenerovaný kód zadejte do níže uvedeného pole a potvrďte.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:51
- Part-DB1\templates\Users\_2fa_settings.html.twig:51
-
tfa_google.step.download_backup
Vytiskněte si záložní kódy a uložte je na bezpečném místě.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:58
- Part-DB1\templates\Users\_2fa_settings.html.twig:58
-
tfa_google.manual_setup
Ruční nastavení
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:62
- Part-DB1\templates\Users\_2fa_settings.html.twig:62
-
tfa_google.manual_setup.type
Typ
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:63
- Part-DB1\templates\Users\_2fa_settings.html.twig:63
-
tfa_google.manual_setup.username
Uživatelské jméno
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:64
- Part-DB1\templates\Users\_2fa_settings.html.twig:64
-
tfa_google.manual_setup.secret
Tajné
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:65
- Part-DB1\templates\Users\_2fa_settings.html.twig:65
-
tfa_google.manual_setup.digit_count
Počet číslic
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:74
- Part-DB1\templates\Users\_2fa_settings.html.twig:74
-
tfa_google.enabled_message
Aplikace Authenticator povolena
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:83
- Part-DB1\templates\Users\_2fa_settings.html.twig:83
-
tfa_backup.disabled
Záložní kódy jsou zakázány. Nastavte aplikaci Authenticator pro povolení záložních kódů.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:84
- Part-DB1\templates\Users\_2fa_settings.html.twig:92
- Part-DB1\templates\Users\_2fa_settings.html.twig:84
- Part-DB1\templates\Users\_2fa_settings.html.twig:92
-
tfa_backup.explanation
Tyto záložní kódy můžete použít k přístupu k účtu i v případě ztráty zařízení s aplikací Authenticator. Kódy si vytiskněte a uschovejte na bezpečném místě.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:88
- Part-DB1\templates\Users\_2fa_settings.html.twig:88
-
tfa_backup.reset_codes.confirm_title
Opravdu resetovat kódy?
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:88
- Part-DB1\templates\Users\_2fa_settings.html.twig:88
-
tfa_backup.reset_codes.confirm_message
Tím se odstraní všechny předchozí kódy a vygeneruje se sada nových kódů. Tuto akci nelze vrátit zpět. Nezapomeňte si nové kódy vytisknout a uložit na bezpečném místě!
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:91
- Part-DB1\templates\Users\_2fa_settings.html.twig:91
-
tfa_backup.enabled
Záložní kódy povoleny
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:99
- Part-DB1\templates\Users\_2fa_settings.html.twig:99
-
tfa_backup.show_codes
Zobrazit záložní kódy
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:114
- Part-DB1\templates\Users\_2fa_settings.html.twig:114
-
tfa_u2f.table_caption
Registrované bezpečnostní klíče
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:115
- Part-DB1\templates\Users\_2fa_settings.html.twig:115
-
tfa_u2f.delete_u2f.confirm_title
Opravdu odstranit tento bezpečnostní klíč?
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:116
- Part-DB1\templates\Users\_2fa_settings.html.twig:116
-
tfa_u2f.delete_u2f.confirm_message
Pokud tento klíč odstraníte, nebude již možné se pomocí tohoto klíče přihlásit. Pokud nezůstanou žádné bezpečnostní klíče, dvoufaktorové ověřování bude zakázáno.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:123
- Part-DB1\templates\Users\_2fa_settings.html.twig:123
-
tfa_u2f.keys.name
Název klíče
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:124
- Part-DB1\templates\Users\_2fa_settings.html.twig:124
-
tfa_u2f.keys.added_date
Datum registrace
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:134
- Part-DB1\templates\Users\_2fa_settings.html.twig:134
-
tfa_u2f.key_delete
Smazat klíč
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:141
- Part-DB1\templates\Users\_2fa_settings.html.twig:141
-
tfa_u2f.no_keys_registered
Zatím nebyly zaregistrovány žádné klíče.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:144
- Part-DB1\templates\Users\_2fa_settings.html.twig:144
-
tfa_u2f.add_new_key
Registrace nového bezpečnostního klíče
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:148
- Part-DB1\templates\Users\_2fa_settings.html.twig:148
-
tfa_trustedDevices.explanation
Při kontrole druhého faktoru lze aktuální počítač označit jako důvěryhodný, takže na tomto počítači již není třeba provádět žádné další dvoufaktorové kontroly.
@@ -3860,326 +2316,168 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:149
- Part-DB1\templates\Users\_2fa_settings.html.twig:149
-
tfa_trustedDevices.invalidate.confirm_title
Opravdu odebrat všechny důvěryhodné počítače?
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:150
- Part-DB1\templates\Users\_2fa_settings.html.twig:150
-
tfa_trustedDevices.invalidate.confirm_message
Ve všech počítačích bude nutné znovu provést dvoufaktorové ověřování. Ujistěte se, že máte po ruce dvoufaktorové zařízení.
-
- Part-DB1\templates\Users\_2fa_settings.html.twig:154
- Part-DB1\templates\Users\_2fa_settings.html.twig:154
-
tfa_trustedDevices.invalidate.btn
Reset důvěryhodných zařízení
-
- Part-DB1\templates\_navbar.html.twig:4
- Part-DB1\templates\_navbar.html.twig:4
- templates\base.html.twig:29
-
sidebar.toggle
Přepnutí postranního panelu
-
- Part-DB1\templates\_navbar.html.twig:22
-
navbar.scanner.link
Čtečka štítků
-
- Part-DB1\templates\_navbar.html.twig:38
- Part-DB1\templates\_navbar.html.twig:36
- templates\base.html.twig:97
-
user.loggedin.label
Přihlášen jako
-
- Part-DB1\templates\_navbar.html.twig:44
- Part-DB1\templates\_navbar.html.twig:42
- templates\base.html.twig:103
-
user.login
Příhlásit
-
- Part-DB1\templates\_navbar.html.twig:50
- Part-DB1\templates\_navbar.html.twig:48
-
ui.toggle_darkmode
Tmavý režim
-
- Part-DB1\templates\_navbar.html.twig:54
- Part-DB1\src\Form\UserSettingsType.php:97
- Part-DB1\templates\_navbar.html.twig:52
- Part-DB1\src\Form\UserSettingsType.php:97
- templates\base.html.twig:106
- src\Form\UserSettingsType.php:44
-
user.language_select
Jazyk
-
- Part-DB1\templates\_navbar_search.html.twig:4
- Part-DB1\templates\_navbar_search.html.twig:4
- templates\base.html.twig:49
-
search.options.label
Možnosti hledání
-
- Part-DB1\templates\_navbar_search.html.twig:23
-
tags.label
Štítky
-
- Part-DB1\templates\_navbar_search.html.twig:27
- Part-DB1\src\Form\LabelOptionsType.php:68
- Part-DB1\src\Services\ElementTypeNameGenerator.php:88
- Part-DB1\src\Services\ElementTypeNameGenerator.php:88
- templates\base.html.twig:60
- templates\Parts\show_part_info.html.twig:36
- src\Form\PartType.php:77
-
storelocation.label
Umístění
-
- Part-DB1\templates\_navbar_search.html.twig:36
- Part-DB1\templates\_navbar_search.html.twig:31
- templates\base.html.twig:65
-
ordernumber.label.short
Číslo dílu dodavatele
-
- Part-DB1\templates\_navbar_search.html.twig:40
- Part-DB1\src\Services\ElementTypeNameGenerator.php:89
- Part-DB1\templates\_navbar_search.html.twig:35
- Part-DB1\src\Services\ElementTypeNameGenerator.php:89
- templates\base.html.twig:67
-
supplier.label
Dodavatel
-
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_navbar_search.html.twig:56
- templates\base.html.twig:77
-
search.regexmatching
Reg.Ex. shoda
-
- Part-DB1\templates\_sidebar.html.twig:37
- Part-DB1\templates\_sidebar.html.twig:12
- Part-DB1\templates\_sidebar.html.twig:37
- Part-DB1\templates\_sidebar.html.twig:12
- templates\base.html.twig:175
- templates\base.html.twig:189
- templates\base.html.twig:202
- templates\base.html.twig:230
-
project.labelp
Projekty
-
- Part-DB1\templates\_sidebar.html.twig:2
- Part-DB1\templates\_sidebar.html.twig:2
- templates\base.html.twig:165
- templates\base.html.twig:192
- templates\base.html.twig:220
-
actions
Akce
-
- Part-DB1\templates\_sidebar.html.twig:6
- Part-DB1\templates\_sidebar.html.twig:6
- templates\base.html.twig:169
- templates\base.html.twig:196
- templates\base.html.twig:224
-
datasource
Zdroj dat
-
- Part-DB1\templates\_sidebar.html.twig:10
- Part-DB1\templates\_sidebar.html.twig:10
- templates\base.html.twig:173
- templates\base.html.twig:200
- templates\base.html.twig:228
-
manufacturer.labelp
Výrobce
-
- Part-DB1\templates\_sidebar.html.twig:11
- Part-DB1\templates\_sidebar.html.twig:11
- templates\base.html.twig:174
- templates\base.html.twig:201
- templates\base.html.twig:229
-
supplier.labelp
Dodavatelé
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:213
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:293
- Part-DB1\src\Controller\PartController.php:173
- Part-DB1\src\Controller\PartController.php:293
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:181
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:243
- Part-DB1\src\Controller\PartController.php:173
- Part-DB1\src\Controller\PartController.php:268
-
attachment.download_failed
Stažení externí přílohy se nezdařilo.
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:222
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:190
-
entity.edit_flash
Změny byly úspěšně uloženy.
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:231
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:196
-
entity.edit_flash.invalid
Nelze uložit změnit. Zkontrolujte prosím své zadání!
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:302
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:252
-
entity.created_flash
Vytvořený prvek.
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:308
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:258
-
entity.created_flash.invalid
Nepodařilo se vytvořit prvek. Zkontrolujte prosím zadání!
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:399
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:352
- src\Controller\BaseAdminController.php:154
-
attachment_type.deleted
Prvek smazán!
-
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:401
- Part-DB1\src\Controller\UserController.php:109
- Part-DB1\src\Controller\UserSettingsController.php:159
- Part-DB1\src\Controller\UserSettingsController.php:193
- Part-DB1\src\Controller\AdminPages\BaseAdminController.php:354
- Part-DB1\src\Controller\UserController.php:101
- Part-DB1\src\Controller\UserSettingsController.php:150
- Part-DB1\src\Controller\UserSettingsController.php:182
-
csfr_invalid
Token CSFR je neplatný. Pokud tato zpráva přetrvává, načtěte prosím tuto stránku znovu nebo kontaktujte správce.
-
- Part-DB1\src\Controller\LabelController.php:125
-
label_generator.no_entities_found
Nebyly nalezeny žádné entity odpovídající zadání.
@@ -4187,8 +2485,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:149
- Part-DB1\src\Controller\LogController.php:154
new
@@ -4198,8 +2494,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:156
- Part-DB1\src\Controller\LogController.php:160
new
@@ -4209,8 +2503,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:176
- Part-DB1\src\Controller\LogController.php:180
new
@@ -4220,8 +2512,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:178
- Part-DB1\src\Controller\LogController.php:182
new
@@ -4231,8 +2521,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:185
- Part-DB1\src\Controller\LogController.php:189
new
@@ -4242,8 +2530,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:187
- Part-DB1\src\Controller\LogController.php:191
new
@@ -4253,8 +2539,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:194
- Part-DB1\src\Controller\LogController.php:198
new
@@ -4264,8 +2548,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:196
- Part-DB1\src\Controller\LogController.php:200
new
@@ -4275,8 +2557,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Controller\LogController.php:199
- Part-DB1\src\Controller\LogController.php:203
new
@@ -4285,306 +2565,168 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Controller\PartController.php:182
- Part-DB1\src\Controller\PartController.php:182
- src\Controller\PartController.php:80
-
part.edited_flash
Uložené změny!
-
- Part-DB1\src\Controller\PartController.php:216
- Part-DB1\src\Controller\PartController.php:219
-
part.deleted
Díl úspěšně vymazán.
-
- Part-DB1\src\Controller\PartController.php:302
- Part-DB1\src\Controller\PartController.php:277
- Part-DB1\src\Controller\PartController.php:317
- src\Controller\PartController.php:113
- src\Controller\PartController.php:142
-
part.created_flash
Díl vytvořen!
-
- Part-DB1\src\Controller\PartController.php:308
- Part-DB1\src\Controller\PartController.php:283
-
part.created_flash.invalid
Chyba při vytváření: Zkontrolujte prosím své zadání!
-
- Part-DB1\src\Controller\ScanController.php:68
- Part-DB1\src\Controller\ScanController.php:90
-
scan.qr_not_found
Pro daný čárový kód nebyl nalezen žádný prvek.
-
- Part-DB1\src\Controller\ScanController.php:71
-
scan.format_unknown
Neznámý formát!
-
- Part-DB1\src\Controller\ScanController.php:86
-
scan.qr_success
Nalezený prvek.
-
- Part-DB1\src\Controller\SecurityController.php:114
- Part-DB1\src\Controller\SecurityController.php:109
-
pw_reset.user_or_email
Uživatelské jméno / e-mail
-
- Part-DB1\src\Controller\SecurityController.php:131
- Part-DB1\src\Controller\SecurityController.php:126
-
pw_reset.request.success
Žádost o obnovení byla úspěšná! Zkontrolujte prosím své e-maily, kde najdete další pokyny.
-
- Part-DB1\src\Controller\SecurityController.php:162
- Part-DB1\src\Controller\SecurityController.php:160
-
pw_reset.username
Uživatelské jméno
-
- Part-DB1\src\Controller\SecurityController.php:165
- Part-DB1\src\Controller\SecurityController.php:163
-
pw_reset.token
Token
-
- Part-DB1\src\Controller\SecurityController.php:194
- Part-DB1\src\Controller\SecurityController.php:192
-
pw_reset.new_pw.error
Uživatelské jméno nebo token je neplatný! Zkontrolujte prosím své zadání.
-
- Part-DB1\src\Controller\SecurityController.php:196
- Part-DB1\src\Controller\SecurityController.php:194
-
pw_reset.new_pw.success
Heslo bylo úspěšně obnoveno. Nyní se můžete přihlásit pomocí nového hesla.
-
- Part-DB1\src\Controller\UserController.php:107
- Part-DB1\src\Controller\UserController.php:99
-
user.edit.reset_success
Všechny metody dvoufaktorového ověřování byly úspěšně zakázány.
-
- Part-DB1\src\Controller\UserSettingsController.php:101
- Part-DB1\src\Controller\UserSettingsController.php:92
-
tfa_backup.no_codes_enabled
Nejsou povoleny žádné zálohovací kódy!
-
- Part-DB1\src\Controller\UserSettingsController.php:138
- Part-DB1\src\Controller\UserSettingsController.php:132
-
tfa_u2f.u2f_delete.not_existing
Žádný bezpečnostní klíč s tímto ID neexistuje.
-
- Part-DB1\src\Controller\UserSettingsController.php:145
- Part-DB1\src\Controller\UserSettingsController.php:139
-
tfa_u2f.u2f_delete.access_denied
Bezpečnostní klíče jiných uživatelů nelze odstranit!
-
- Part-DB1\src\Controller\UserSettingsController.php:153
- Part-DB1\src\Controller\UserSettingsController.php:147
-
tfa.u2f.u2f_delete.success
Bezpečnostní klíč byl úspěšně odstraněn.
-
- Part-DB1\src\Controller\UserSettingsController.php:188
- Part-DB1\src\Controller\UserSettingsController.php:180
-
tfa_trustedDevice.invalidate.success
Důvěryhodná zařízení byla úspěšně resetována.
-
- Part-DB1\src\Controller\UserSettingsController.php:235
- Part-DB1\src\Controller\UserSettingsController.php:226
- src\Controller\UserController.php:98
-
user.settings.saved_flash
Nastavení uloženo!
-
- Part-DB1\src\Controller\UserSettingsController.php:297
- Part-DB1\src\Controller\UserSettingsController.php:288
- src\Controller\UserController.php:130
-
user.settings.pw_changed_flash
Heslo změněno!
-
- Part-DB1\src\Controller\UserSettingsController.php:317
- Part-DB1\src\Controller\UserSettingsController.php:306
-
user.settings.2fa.google.activated
Aplikace Authenticator byla úspěšně aktivována.
-
- Part-DB1\src\Controller\UserSettingsController.php:328
- Part-DB1\src\Controller\UserSettingsController.php:315
-
user.settings.2fa.google.disabled
Aplikace Authenticator byla úspěšně deaktivována.
-
- Part-DB1\src\Controller\UserSettingsController.php:346
- Part-DB1\src\Controller\UserSettingsController.php:332
-
user.settings.2fa.backup_codes.regenerated
Nové záložní kódy byly úspěšně vygenerovány.
-
- Part-DB1\src\DataTables\AttachmentDataTable.php:153
- Part-DB1\src\DataTables\AttachmentDataTable.php:153
-
attachment.table.filesize
Velikost souboru
-
- Part-DB1\src\DataTables\AttachmentDataTable.php:183
- Part-DB1\src\DataTables\AttachmentDataTable.php:191
- Part-DB1\src\DataTables\AttachmentDataTable.php:200
- Part-DB1\src\DataTables\AttachmentDataTable.php:209
- Part-DB1\src\DataTables\PartsDataTable.php:245
- Part-DB1\src\DataTables\PartsDataTable.php:252
- Part-DB1\src\DataTables\AttachmentDataTable.php:183
- Part-DB1\src\DataTables\AttachmentDataTable.php:191
- Part-DB1\src\DataTables\AttachmentDataTable.php:200
- Part-DB1\src\DataTables\AttachmentDataTable.php:209
- Part-DB1\src\DataTables\PartsDataTable.php:193
- Part-DB1\src\DataTables\PartsDataTable.php:200
-
true
pravda
-
- Part-DB1\src\DataTables\AttachmentDataTable.php:184
- Part-DB1\src\DataTables\AttachmentDataTable.php:192
- Part-DB1\src\DataTables\AttachmentDataTable.php:201
- Part-DB1\src\DataTables\AttachmentDataTable.php:210
- Part-DB1\src\DataTables\PartsDataTable.php:246
- Part-DB1\src\DataTables\PartsDataTable.php:253
- Part-DB1\src\Form\Type\SIUnitType.php:139
- Part-DB1\src\DataTables\AttachmentDataTable.php:184
- Part-DB1\src\DataTables\AttachmentDataTable.php:192
- Part-DB1\src\DataTables\AttachmentDataTable.php:201
- Part-DB1\src\DataTables\AttachmentDataTable.php:210
- Part-DB1\src\DataTables\PartsDataTable.php:194
- Part-DB1\src\DataTables\PartsDataTable.php:201
- Part-DB1\src\Form\Type\SIUnitType.php:139
-
false
nepravda
-
- Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:128
- Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:119
-
log.target_deleted
smazáno
@@ -4592,8 +2734,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:57
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:60
new
@@ -4603,8 +2743,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:63
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:66
new
@@ -4614,8 +2752,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:83
- Part-DB1\src\DataTables\Column\RevertLogColumn.php:86
new
@@ -4624,70 +2760,42 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\DataTables\LogDataTable.php:173
- Part-DB1\src\DataTables\LogDataTable.php:161
-
log.id
ID
-
- Part-DB1\src\DataTables\LogDataTable.php:178
- Part-DB1\src\DataTables\LogDataTable.php:166
-
log.timestamp
Časové razítko
-
- Part-DB1\src\DataTables\LogDataTable.php:183
- Part-DB1\src\DataTables\LogDataTable.php:171
-
log.type
Událost
-
- Part-DB1\src\DataTables\LogDataTable.php:191
- Part-DB1\src\DataTables\LogDataTable.php:179
-
log.level
Úroveň
-
- Part-DB1\src\DataTables\LogDataTable.php:200
- Part-DB1\src\DataTables\LogDataTable.php:188
-
log.user
Uživatel
-
- Part-DB1\src\DataTables\LogDataTable.php:213
- Part-DB1\src\DataTables\LogDataTable.php:201
-
log.target_type
Typ cíle
-
- Part-DB1\src\DataTables\LogDataTable.php:226
- Part-DB1\src\DataTables\LogDataTable.php:214
-
log.target
Cíl
@@ -4695,8 +2803,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\DataTables\LogDataTable.php:231
- Part-DB1\src\DataTables\LogDataTable.php:218
new
@@ -4705,100 +2811,60 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\DataTables\PartsDataTable.php:168
- Part-DB1\src\DataTables\PartsDataTable.php:116
-
part.table.name
Název
-
- Part-DB1\src\DataTables\PartsDataTable.php:178
- Part-DB1\src\DataTables\PartsDataTable.php:126
-
part.table.id
ID
-
- Part-DB1\src\DataTables\PartsDataTable.php:182
- Part-DB1\src\DataTables\PartsDataTable.php:130
-
part.table.description
Popis
-
- Part-DB1\src\DataTables\PartsDataTable.php:185
- Part-DB1\src\DataTables\PartsDataTable.php:133
-
part.table.category
Kategorie
-
- Part-DB1\src\DataTables\PartsDataTable.php:190
- Part-DB1\src\DataTables\PartsDataTable.php:138
-
part.table.footprint
Otisk
-
- Part-DB1\src\DataTables\PartsDataTable.php:194
- Part-DB1\src\DataTables\PartsDataTable.php:142
-
part.table.manufacturer
Výrobce
-
- Part-DB1\src\DataTables\PartsDataTable.php:197
- Part-DB1\src\DataTables\PartsDataTable.php:145
-
part.table.storeLocations
Umístění
-
- Part-DB1\src\DataTables\PartsDataTable.php:216
- Part-DB1\src\DataTables\PartsDataTable.php:164
-
part.table.amount
Množství
-
- Part-DB1\src\DataTables\PartsDataTable.php:224
- Part-DB1\src\DataTables\PartsDataTable.php:172
-
part.table.minamount
Min. množství
-
- Part-DB1\src\DataTables\PartsDataTable.php:232
- Part-DB1\src\DataTables\PartsDataTable.php:180
-
part.table.partUnit
Měrné jednotky
@@ -4811,864 +2877,522 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\DataTables\PartsDataTable.php:236
- Part-DB1\src\DataTables\PartsDataTable.php:184
-
part.table.addedDate
Vytvořeno
-
- Part-DB1\src\DataTables\PartsDataTable.php:240
- Part-DB1\src\DataTables\PartsDataTable.php:188
-
part.table.lastModified
Naposledy upraveno
-
- Part-DB1\src\DataTables\PartsDataTable.php:244
- Part-DB1\src\DataTables\PartsDataTable.php:192
-
part.table.needsReview
Vyžaduje kontrolu
-
- Part-DB1\src\DataTables\PartsDataTable.php:251
- Part-DB1\src\DataTables\PartsDataTable.php:199
-
part.table.favorite
Oblíbené
-
- Part-DB1\src\DataTables\PartsDataTable.php:258
- Part-DB1\src\DataTables\PartsDataTable.php:206
-
part.table.manufacturingStatus
Stav
-
- Part-DB1\src\DataTables\PartsDataTable.php:260
- Part-DB1\src\DataTables\PartsDataTable.php:262
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:208
- Part-DB1\src\DataTables\PartsDataTable.php:210
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.unknown
Neznámý
-
- Part-DB1\src\DataTables\PartsDataTable.php:263
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:211
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.announced
Oznámeno
-
- Part-DB1\src\DataTables\PartsDataTable.php:264
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:212
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.active
Aktivní
-
- Part-DB1\src\DataTables\PartsDataTable.php:265
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:213
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.nrfnd
Nedoporučuje se pro nové návrhy
-
- Part-DB1\src\DataTables\PartsDataTable.php:266
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:214
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.eol
Ukončeno
-
- Part-DB1\src\DataTables\PartsDataTable.php:267
- Part-DB1\src\Form\Part\PartBaseType.php:90
- Part-DB1\src\DataTables\PartsDataTable.php:215
- Part-DB1\src\Form\Part\PartBaseType.php:88
-
m_status.discontinued
Přerušeno
-
- Part-DB1\src\DataTables\PartsDataTable.php:271
- Part-DB1\src\DataTables\PartsDataTable.php:219
-
part.table.mpn
MPN
-
- Part-DB1\src\DataTables\PartsDataTable.php:275
- Part-DB1\src\DataTables\PartsDataTable.php:223
-
part.table.mass
Hmotnost
-
- Part-DB1\src\DataTables\PartsDataTable.php:279
- Part-DB1\src\DataTables\PartsDataTable.php:227
-
part.table.tags
Štítky
-
- Part-DB1\src\DataTables\PartsDataTable.php:283
- Part-DB1\src\DataTables\PartsDataTable.php:231
-
part.table.attachments
Přílohy
-
- Part-DB1\src\EventSubscriber\UserSystem\LoginSuccessSubscriber.php:82
- Part-DB1\src\EventSubscriber\LoginSuccessListener.php:82
-
flash.login_successful
Přihlášení bylo úspěšné
-
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- src\Form\ImportType.php:68
-
JSON
JSON
-
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- src\Form\ImportType.php:68
-
XML
XML
-
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- src\Form\ImportType.php:68
-
CSV
CSV
-
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- Part-DB1\src\Form\AdminPages\ImportType.php:77
- src\Form\ImportType.php:68
-
YAML
YAML
-
- Part-DB1\src\Form\AdminPages\ImportType.php:124
- Part-DB1\src\Form\AdminPages\ImportType.php:124
-
import.abort_on_validation.help
Pokud je tato možnost aktivována, celý proces importu se přeruší, pokud jsou zjištěna neplatná data. Není-li tato možnost vybrána, neplatná data jsou ignorována a importér se pokusí importovat ostatní prvky.
-
- Part-DB1\src\Form\AdminPages\ImportType.php:86
- Part-DB1\src\Form\AdminPages\ImportType.php:86
- src\Form\ImportType.php:70
-
import.csv_separator
CSV oddělovač
-
- Part-DB1\src\Form\AdminPages\ImportType.php:93
- Part-DB1\src\Form\AdminPages\ImportType.php:93
- src\Form\ImportType.php:72
-
parent.label
Nadřazený prvek
-
- Part-DB1\src\Form\AdminPages\ImportType.php:101
- Part-DB1\src\Form\AdminPages\ImportType.php:101
- src\Form\ImportType.php:75
-
import.file
Soubor
-
- Part-DB1\src\Form\AdminPages\ImportType.php:111
- Part-DB1\src\Form\AdminPages\ImportType.php:111
- src\Form\ImportType.php:78
-
import.preserve_children
Zachování podřízených prvků při importu
-
- Part-DB1\src\Form\AdminPages\ImportType.php:120
- Part-DB1\src\Form\AdminPages\ImportType.php:120
- src\Form\ImportType.php:80
-
import.abort_on_validation
Přerušit při neplatných datech
-
- Part-DB1\src\Form\AdminPages\ImportType.php:132
- Part-DB1\src\Form\AdminPages\ImportType.php:132
- src\Form\ImportType.php:85
-
import.btn
Import
-
- Part-DB1\src\Form\AttachmentFormType.php:113
- Part-DB1\src\Form\AttachmentFormType.php:109
-
attachment.edit.secure_file.help
K příloze označené jako soukromá mají přístup pouze ověření uživatelé s příslušným oprávněním. Pokud je tato funkce aktivována, negenerují se náhledy a přístup k souboru je méně výkonný.
-
- Part-DB1\src\Form\AttachmentFormType.php:127
- Part-DB1\src\Form\AttachmentFormType.php:123
-
attachment.edit.url.help
Zde můžete zadat adresu URL externího souboru nebo zadat klíčové slovo, které se používá k hledání ve vestavěných zdrojích (např. otisky).
-
- Part-DB1\src\Form\AttachmentFormType.php:82
- Part-DB1\src\Form\AttachmentFormType.php:79
-
attachment.edit.name
Název
-
- Part-DB1\src\Form\AttachmentFormType.php:85
- Part-DB1\src\Form\AttachmentFormType.php:82
-
attachment.edit.attachment_type
Typ přílohy
-
- Part-DB1\src\Form\AttachmentFormType.php:94
- Part-DB1\src\Form\AttachmentFormType.php:91
-
attachment.edit.show_in_table
Zobrazit v tabulce
-
- Part-DB1\src\Form\AttachmentFormType.php:105
- Part-DB1\src\Form\AttachmentFormType.php:102
-
attachment.edit.secure_file
Soukromá příloha
-
- Part-DB1\src\Form\AttachmentFormType.php:119
- Part-DB1\src\Form\AttachmentFormType.php:115
-
attachment.edit.url
URL
-
- Part-DB1\src\Form\AttachmentFormType.php:133
- Part-DB1\src\Form\AttachmentFormType.php:129
-
attachment.edit.download_url
Stáhnout externí soubor
-
- Part-DB1\src\Form\AttachmentFormType.php:146
- Part-DB1\src\Form\AttachmentFormType.php:142
-
attachment.edit.file
Nahrát soubor
-
- Part-DB1\src\Form\LabelOptionsType.php:68
- Part-DB1\src\Services\ElementTypeNameGenerator.php:86
-
part.label
Díl
-
- Part-DB1\src\Form\LabelOptionsType.php:68
- Part-DB1\src\Services\ElementTypeNameGenerator.php:87
-
part_lot.label
Inventář
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.none
Žádné
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.qr
QR kód (doporučeno)
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.code128
Kód 128 (doporučeno)
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.code39
Kód 39 (doporučeno)
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.code93
Kód 39
-
- Part-DB1\src\Form\LabelOptionsType.php:78
-
label_options.barcode_type.datamatrix
Datamatrix
-
- Part-DB1\src\Form\LabelOptionsType.php:122
-
label_options.lines_mode.html
Zástupné symboly
-
- Part-DB1\src\Form\LabelOptionsType.php:122
-
label.options.lines_mode.twig
Twig
-
- Part-DB1\src\Form\LabelOptionsType.php:126
-
label_options.lines_mode.help
Pokud zde vyberete Twig, bude pole obsahu interpretováno jako Twig šablona. Viz <a href="https://twig.symfony.com/doc/3.x/templates.html">dokumentace Twig</a> a <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a>, kde najdete další informace.
-
- Part-DB1\src\Form\LabelOptionsType.php:47
-
label_options.page_size.label
Velikost štítku
-
- Part-DB1\src\Form\LabelOptionsType.php:66
-
label_options.supported_elements.label
Typ cíle
-
- Part-DB1\src\Form\LabelOptionsType.php:75
-
label_options.barcode_type.label
Čárový kód
-
- Part-DB1\src\Form\LabelOptionsType.php:102
-
label_profile.lines.label
Obsah
-
- Part-DB1\src\Form\LabelOptionsType.php:111
-
label_options.additional_css.label
Další styly (CSS)
-
- Part-DB1\src\Form\LabelOptionsType.php:120
-
label_options.lines_mode.label
Režim parseru
-
- Part-DB1\src\Form\LabelOptionsType.php:51
-
label_options.width.placeholder
Šířka
-
- Part-DB1\src\Form\LabelOptionsType.php:60
-
label_options.height.placeholder
Výška
-
- Part-DB1\src\Form\LabelSystem\LabelDialogType.php:49
-
label_generator.target_id.range_hint
Zde můžete zadat více ID (např. 1,2,3) a/nebo rozsah (1-3), abyste mohli generovat štítky pro více prvků najednou.
-
- Part-DB1\src\Form\LabelSystem\LabelDialogType.php:46
-
label_generator.target_id.label
Cílové ID
-
- Part-DB1\src\Form\LabelSystem\LabelDialogType.php:59
-
label_generator.update
Aktualizovat
-
- Part-DB1\src\Form\LabelSystem\ScanDialogType.php:36
-
scan_dialog.input
Zadání
-
- Part-DB1\src\Form\LabelSystem\ScanDialogType.php:44
-
scan_dialog.submit
Odeslat
-
- Part-DB1\src\Form\ParameterType.php:41
-
parameters.name.placeholder
např. Stejnosměrný proudový zisk
-
- Part-DB1\src\Form\ParameterType.php:50
-
parameters.symbol.placeholder
např. h_{FE}
-
- Part-DB1\src\Form\ParameterType.php:60
-
parameters.text.placeholder
např. Testovací podmínky
-
- Part-DB1\src\Form\ParameterType.php:71
-
parameters.max.placeholder
např. 350
-
- Part-DB1\src\Form\ParameterType.php:82
-
parameters.min.placeholder
např. 100
-
- Part-DB1\src\Form\ParameterType.php:93
-
parameters.typical.placeholder
např. 200
-
- Part-DB1\src\Form\ParameterType.php:103
-
parameters.unit.placeholder
např. V
-
- Part-DB1\src\Form\ParameterType.php:114
-
parameter.group.placeholder
např. Technické specifikace
-
- Part-DB1\src\Form\Part\OrderdetailType.php:72
- Part-DB1\src\Form\Part\OrderdetailType.php:75
-
orderdetails.edit.supplierpartnr
Číslo dílu dodavatele
-
- Part-DB1\src\Form\Part\OrderdetailType.php:81
- Part-DB1\src\Form\Part\OrderdetailType.php:84
-
orderdetails.edit.supplier
Dodavatel
-
- Part-DB1\src\Form\Part\OrderdetailType.php:87
- Part-DB1\src\Form\Part\OrderdetailType.php:90
-
orderdetails.edit.url
Odkaz na nabídku
-
- Part-DB1\src\Form\Part\OrderdetailType.php:93
- Part-DB1\src\Form\Part\OrderdetailType.php:96
-
orderdetails.edit.obsolete
Již není k dispozici
-
- Part-DB1\src\Form\Part\OrderdetailType.php:75
- Part-DB1\src\Form\Part\OrderdetailType.php:78
-
orderdetails.edit.supplierpartnr.placeholder
např. BC 547
-
- Part-DB1\src\Form\Part\PartBaseType.php:101
- Part-DB1\src\Form\Part\PartBaseType.php:99
-
part.edit.name
Název
-
- Part-DB1\src\Form\Part\PartBaseType.php:109
- Part-DB1\src\Form\Part\PartBaseType.php:107
-
part.edit.description
Popis
-
- Part-DB1\src\Form\Part\PartBaseType.php:120
- Part-DB1\src\Form\Part\PartBaseType.php:118
-
part.edit.mininstock
Minimální zásoba
-
- Part-DB1\src\Form\Part\PartBaseType.php:129
- Part-DB1\src\Form\Part\PartBaseType.php:127
-
part.edit.category
Kategorie
-
- Part-DB1\src\Form\Part\PartBaseType.php:135
- Part-DB1\src\Form\Part\PartBaseType.php:133
-
part.edit.footprint
Otisk
-
- Part-DB1\src\Form\Part\PartBaseType.php:142
- Part-DB1\src\Form\Part\PartBaseType.php:140
-
part.edit.tags
Štítky
-
- Part-DB1\src\Form\Part\PartBaseType.php:154
- Part-DB1\src\Form\Part\PartBaseType.php:152
-
part.edit.manufacturer.label
Výrobce
-
- Part-DB1\src\Form\Part\PartBaseType.php:161
- Part-DB1\src\Form\Part\PartBaseType.php:159
-
part.edit.manufacturer_url.label
Odkaz na stránku produktu
-
- Part-DB1\src\Form\Part\PartBaseType.php:167
- Part-DB1\src\Form\Part\PartBaseType.php:165
-
part.edit.mpn
Číslo dílu výrobce
-
- Part-DB1\src\Form\Part\PartBaseType.php:173
- Part-DB1\src\Form\Part\PartBaseType.php:171
-
part.edit.manufacturing_status
Stav výroby
-
- Part-DB1\src\Form\Part\PartBaseType.php:181
- Part-DB1\src\Form\Part\PartBaseType.php:179
-
part.edit.needs_review
Vyžaduje kontrolu
-
- Part-DB1\src\Form\Part\PartBaseType.php:189
- Part-DB1\src\Form\Part\PartBaseType.php:187
-
part.edit.is_favorite
Oblíbené
-
- Part-DB1\src\Form\Part\PartBaseType.php:197
- Part-DB1\src\Form\Part\PartBaseType.php:195
-
part.edit.mass
Hmotnost
-
- Part-DB1\src\Form\Part\PartBaseType.php:203
- Part-DB1\src\Form\Part\PartBaseType.php:201
-
part.edit.partUnit
Měrná jednotka
@@ -5681,287 +3405,168 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Form\Part\PartBaseType.php:212
- Part-DB1\src\Form\Part\PartBaseType.php:210
-
part.edit.comment
Poznámky
-
- Part-DB1\src\Form\Part\PartBaseType.php:250
- Part-DB1\src\Form\Part\PartBaseType.php:246
-
part.edit.master_attachment
Náhled
-
- Part-DB1\src\Form\Part\PartBaseType.php:295
- Part-DB1\src\Form\Part\PartBaseType.php:276
- src\Form\PartType.php:91
-
part.edit.save
Uložit změny
-
- Part-DB1\src\Form\Part\PartBaseType.php:296
- Part-DB1\src\Form\Part\PartBaseType.php:277
- src\Form\PartType.php:92
-
part.edit.reset
Zrušit změny
-
- Part-DB1\src\Form\Part\PartBaseType.php:105
- Part-DB1\src\Form\Part\PartBaseType.php:103
-
part.edit.name.placeholder
např. BC547
-
- Part-DB1\src\Form\Part\PartBaseType.php:115
- Part-DB1\src\Form\Part\PartBaseType.php:113
-
part.edit.description.placeholder
např. NPN 45V, 0,1A, 0,5W
-
- Part-DB1\src\Form\Part\PartBaseType.php:123
- Part-DB1\src\Form\Part\PartBaseType.php:121
-
part.editmininstock.placeholder
např. 1
-
- Part-DB1\src\Form\Part\PartLotType.php:69
- Part-DB1\src\Form\Part\PartLotType.php:69
-
part_lot.edit.description
Popis
-
- Part-DB1\src\Form\Part\PartLotType.php:78
- Part-DB1\src\Form\Part\PartLotType.php:78
-
part_lot.edit.location
Umístění
-
- Part-DB1\src\Form\Part\PartLotType.php:89
- Part-DB1\src\Form\Part\PartLotType.php:89
-
part_lot.edit.amount
Množství
-
- Part-DB1\src\Form\Part\PartLotType.php:98
- Part-DB1\src\Form\Part\PartLotType.php:97
-
part_lot.edit.instock_unknown
Množství neznámé
-
- Part-DB1\src\Form\Part\PartLotType.php:109
- Part-DB1\src\Form\Part\PartLotType.php:108
-
part_lot.edit.needs_refill
Potřebuje doplnit
-
- Part-DB1\src\Form\Part\PartLotType.php:120
- Part-DB1\src\Form\Part\PartLotType.php:119
-
part_lot.edit.expiration_date
Datum vypršení platnosti
-
- Part-DB1\src\Form\Part\PartLotType.php:128
- Part-DB1\src\Form\Part\PartLotType.php:125
-
part_lot.edit.comment
Poznámky
-
- Part-DB1\src\Form\Permissions\PermissionsType.php:99
- Part-DB1\src\Form\Permissions\PermissionsType.php:99
-
perm.group.other
Různé
-
- Part-DB1\src\Form\TFAGoogleSettingsType.php:97
- Part-DB1\src\Form\TFAGoogleSettingsType.php:97
-
tfa_google.enable
Povolit aplikaci Authenticator
-
- Part-DB1\src\Form\TFAGoogleSettingsType.php:101
- Part-DB1\src\Form\TFAGoogleSettingsType.php:101
-
tfa_google.disable
Deaktivovat aplikaci Authenticator
-
- Part-DB1\src\Form\TFAGoogleSettingsType.php:74
- Part-DB1\src\Form\TFAGoogleSettingsType.php:74
-
google_confirmation
Potvrzovací kód
-
- Part-DB1\src\Form\UserSettingsType.php:108
- Part-DB1\src\Form\UserSettingsType.php:108
- src\Form\UserSettingsType.php:46
-
user.timezone.label
Časové pásmo
-
- Part-DB1\src\Form\UserSettingsType.php:133
- Part-DB1\src\Form\UserSettingsType.php:132
-
user.currency.label
Preferovaná měna
-
- Part-DB1\src\Form\UserSettingsType.php:140
- Part-DB1\src\Form\UserSettingsType.php:139
- src\Form\UserSettingsType.php:53
-
save
Použít změny
-
- Part-DB1\src\Form\UserSettingsType.php:141
- Part-DB1\src\Form\UserSettingsType.php:140
- src\Form\UserSettingsType.php:54
-
reset
Zrušit změny
-
- Part-DB1\src\Form\UserSettingsType.php:104
- Part-DB1\src\Form\UserSettingsType.php:104
- src\Form\UserSettingsType.php:45
-
user_settings.language.placeholder
Jazyk serveru
-
- Part-DB1\src\Form\UserSettingsType.php:115
- Part-DB1\src\Form\UserSettingsType.php:115
- src\Form\UserSettingsType.php:48
-
user_settings.timezone.placeholder
Časové pásmo serveru
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:79
- Part-DB1\src\Services\ElementTypeNameGenerator.php:79
-
attachment.label
Příloha
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:81
- Part-DB1\src\Services\ElementTypeNameGenerator.php:81
-
attachment_type.label
Typ přílohy
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:82
- Part-DB1\src\Services\ElementTypeNameGenerator.php:82
-
project.label
Projekt
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:85
- Part-DB1\src\Services\ElementTypeNameGenerator.php:85
-
measurement_unit.label
Měrná jednotka
@@ -5974,58 +3579,36 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:90
- Part-DB1\src\Services\ElementTypeNameGenerator.php:90
-
currency.label
Měna
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:91
- Part-DB1\src\Services\ElementTypeNameGenerator.php:91
-
orderdetail.label
Detail objednávky
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:92
- Part-DB1\src\Services\ElementTypeNameGenerator.php:92
-
pricedetail.label
Detail ceny
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:94
- Part-DB1\src\Services\ElementTypeNameGenerator.php:94
-
user.label
Uživatel
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:95
-
parameter.label
Parametr
-
- Part-DB1\src\Services\ElementTypeNameGenerator.php:96
-
label_profile.label
Profil štítku
@@ -6033,8 +3616,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:176
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:161
new
@@ -6043,174 +3624,102 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Services\MarkdownParser.php:73
- Part-DB1\src\Services\MarkdownParser.php:73
-
markdown.loading
Načítání markdown. Pokud tato zpráva nezmizí, zkuste stránku načíst znovu.
-
- Part-DB1\src\Services\PasswordResetManager.php:98
- Part-DB1\src\Services\PasswordResetManager.php:98
-
pw_reset.email.subject
Obnovení hesla k účtu Part-DB
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108
-
tree.tools.tools
Nástroje
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:107
- src\Services\ToolsTreeBuilder.php:74
-
tree.tools.edit
Upravit
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:110
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108
- src\Services\ToolsTreeBuilder.php:81
-
tree.tools.show
Zobrazit
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:111
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109
-
tree.tools.system
Systém
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:123
-
tree.tools.tools.label_dialog
Generátor štítků
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:130
-
tree.tools.tools.label_scanner
Čtečka štítků
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:149
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:126
- src\Services\ToolsTreeBuilder.php:62
-
tree.tools.edit.attachment_types
Typy příloh
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:155
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:132
- src\Services\ToolsTreeBuilder.php:64
-
tree.tools.edit.categories
Kategorie
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:161
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:138
- src\Services\ToolsTreeBuilder.php:66
-
tree.tools.edit.projects
Projekty
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:167
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:144
- src\Services\ToolsTreeBuilder.php:68
-
tree.tools.edit.suppliers
Dodavatelé
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:173
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:150
- src\Services\ToolsTreeBuilder.php:70
-
tree.tools.edit.manufacturer
Výrobce
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:179
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:156
-
tree.tools.edit.storelocation
Umístění
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:185
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:162
-
tree.tools.edit.footprint
Otisky
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:191
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:168
-
tree.tools.edit.currency
Měny
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:174
-
tree.tools.edit.measurement_unit
Měrné jednotky
@@ -6223,40 +3732,24 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203
-
tree.tools.edit.label_profile
Profily štítků
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:209
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:180
-
tree.tools.edit.part
Nový díl
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:226
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197
- src\Services\ToolsTreeBuilder.php:77
-
tree.tools.show.all_parts
Zobrazit všechny díly
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:232
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203
-
tree.tools.show.all_attachments
Přílohy
@@ -6264,8 +3757,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:239
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:210
new
@@ -6274,20 +3765,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:258
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:229
-
tree.tools.system.users
Uživatelé
-
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:264
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:235
-
tree.tools.system.groups
Skupiny
@@ -6295,8 +3778,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:271
- Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:242
new
@@ -6305,11 +3786,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
-
- Part-DB1\src\Services\Trees\TreeViewGenerator.php:95
- Part-DB1\src\Services\Trees\TreeViewGenerator.php:95
- src\Services\TreeBuilder.php:124
-
entity.tree.new
Nový prvek
@@ -6317,7 +3793,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:62
obsolete
@@ -6327,8 +3802,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\templates\_navbar.html.twig:27
- templates\base.html.twig:88
obsolete
@@ -6338,8 +3811,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Form\UserSettingsType.php:119
- src\Form\UserSettingsType.php:49
obsolete
@@ -6349,8 +3820,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Form\UserSettingsType.php:129
- src\Form\UserSettingsType.php:50
obsolete
@@ -6360,7 +3829,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:100
new
obsolete
@@ -6371,10 +3839,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:128
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:150
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:169
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:207
new
obsolete
@@ -6385,10 +3849,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:130
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:152
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:171
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:209
new
obsolete
@@ -6399,7 +3859,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:139
new
obsolete
@@ -6410,7 +3869,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:160
new
obsolete
@@ -6421,7 +3879,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:184
new
obsolete
@@ -6432,7 +3889,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:198
new
obsolete
@@ -6443,7 +3899,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:214
new
obsolete
@@ -6454,7 +3909,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- templates\base.html.twig:81
obsolete
obsolete
@@ -6465,7 +3919,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- templates\base.html.twig:109
obsolete
obsolete
@@ -6476,7 +3929,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- templates\base.html.twig:112
obsolete
obsolete
@@ -6767,7 +4219,6 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
- src\Form\PartType.php:63
obsolete
obsolete
@@ -7440,7 +4891,6 @@ Element 3
- templates\Parts\show_part_info.html.twig:194
obsolete
obsolete
@@ -7451,7 +4901,6 @@ Element 3
- src\Form\PartType.php:83
obsolete
obsolete
@@ -13465,4 +10914,4 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
-
+
\ No newline at end of file
diff --git a/translations/messages.da.xlf b/translations/messages.da.xlf
index 8ed10c07..9878a09e 100644
--- a/translations/messages.da.xlf
+++ b/translations/messages.da.xlf
@@ -1,30 +1,23 @@
-
+
-
-
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4
- templates\AdminPages\AttachmentTypeAdmin.html.twig:4
-
+
attachment_type.caption
- Bilags datatyper
+ Bilag-filtyper
-
+
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12
new
attachment_type.edit
- Ret bilags filtype
+ Ret bilag-filtype
-
+
- Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16
new
@@ -32,54 +25,26 @@
Ny filtype
-
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:22
- Part-DB1\templates\_sidebar.html.twig:7
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:22
- Part-DB1\templates\_sidebar.html.twig:7
- templates\AdminPages\CategoryAdmin.html.twig:4
- templates\base.html.twig:163
- templates\base.html.twig:170
- templates\base.html.twig:197
- templates\base.html.twig:225
-
+
category.labelp
Kategorier
-
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:11
- templates\AdminPages\CategoryAdmin.html.twig:8
-
+
admin.options
Optioner
-
-
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9
- Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9
- Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15
- templates\AdminPages\CategoryAdmin.html.twig:9
-
+
admin.advanced
- Advanceret
+ Avanceret
-
+
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13
new
@@ -87,9 +52,8 @@
Ret kategori
-
+
- Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17
new
@@ -97,39 +61,20 @@
Ny kategori
-
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4
-
-
- currency.caption
- Valuta
-
-
-
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12
-
+
currency.iso_code.caption
ISO kode
-
-
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15
-
+
currency.symbol.caption
Valutaenhed
-
+
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29
new
@@ -137,9 +82,8 @@
Ret valuta
-
+
- Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33
new
@@ -147,9 +91,8 @@
Ny valuta
-
+
- Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:8
new
@@ -157,9 +100,8 @@
Ret projekt
-
+
- Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:12
new
@@ -167,99 +109,44 @@
Nyt projekt
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:67
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19
- Part-DB1\templates\_navbar_search.html.twig:61
- Part-DB1\templates\_sidebar.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:43
- Part-DB1\templates\_sidebar.html.twig:63
- templates\AdminPages\EntityAdminBase.html.twig:9
- templates\base.html.twig:80
- templates\base.html.twig:179
- templates\base.html.twig:206
- templates\base.html.twig:237
-
+
search.placeholder
Søg
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23
- Part-DB1\templates\_sidebar.html.twig:3
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23
- Part-DB1\templates\_sidebar.html.twig:3
- templates\AdminPages\EntityAdminBase.html.twig:13
- templates\base.html.twig:166
- templates\base.html.twig:193
- templates\base.html.twig:221
-
+
expandAll
Udfold alle
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:4
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27
- Part-DB1\templates\_sidebar.html.twig:4
- templates\AdminPages\EntityAdminBase.html.twig:17
- templates\base.html.twig:167
- templates\base.html.twig:194
- templates\base.html.twig:222
-
+
reduceAll
Sammenfold alle
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54
- Part-DB1\templates\Parts\info\_sidebar.html.twig:4
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54
- Part-DB1\templates\Parts\info\_sidebar.html.twig:4
-
+
part.info.timetravel_hint
- Det er hvordan delen fromstod før %timestamp%. <i>Venligst bemærk at dette er en eksperimentel funktion. Så derfor kan info være ukorrekt.</i>
+ Det er hvordan delen fremstod før %timestamp%. <i>Venligst bemærk at dette er en eksperimentel funktion. Så derfor kan info være ukorrekt.</i>
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60
- templates\AdminPages\EntityAdminBase.html.twig:42
-
+
standard.label
Egenskaber
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61
- templates\AdminPages\EntityAdminBase.html.twig:43
-
+
infos.label
Info
-
+
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63
new
@@ -267,129 +154,74 @@
Historik
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66
- templates\AdminPages\EntityAdminBase.html.twig:45
-
+
export.label
Eksport
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68
- templates\AdminPages\EntityAdminBase.html.twig:47
-
+
import_export.label
Import
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69
-
+
mass_creation.label
Masseoprettelse
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82
- templates\AdminPages\EntityAdminBase.html.twig:59
-
+
admin.common
Fælles
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86
-
+
admin.attachments
Bilag
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90
-
+
admin.parameters
Parametre
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167
- templates\AdminPages\EntityAdminBase.html.twig:142
-
+
export_all.label
Eksportér alle elementer
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173
-
+
mass_creation.help
Hver linje fortolkes og oprettes som et navn til et nyt element. Ved at indrykke tekst kan du lave strukturer
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45
- templates\AdminPages\EntityAdminBase.html.twig:35
-
+
edit.caption
Ret element "%name"
-
-
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50
- Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50
- templates\AdminPages\EntityAdminBase.html.twig:37
-
+
new.caption
Nyt element
-
-
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:9
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:9
- templates\base.html.twig:172
- templates\base.html.twig:199
- templates\base.html.twig:227
-
+
footprint.labelp
Footprint
-
+
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13
new
@@ -397,9 +229,8 @@
Ret footprint
-
+
- Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17
new
@@ -407,31 +238,14 @@
Nyt footprint
-
-
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4
-
-
- group.edit.caption
- Grupper
-
-
-
-
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:16
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:16
-
+
user.edit.permissions
Rettigheder
-
+
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24
new
@@ -439,9 +253,8 @@
Ret gruppe
-
+
- Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28
new
@@ -449,36 +262,20 @@
Ny gruppe
-
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4
-
-
- label_profile.caption
- Labelprofiler
-
-
-
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8
-
+
label_profile.advanced
- Advanceret
+ Avanceret
-
-
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9
-
+
label_profile.comment
Notater
-
+
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55
new
@@ -486,9 +283,8 @@
Ret labelprofil
-
+
- Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59
new
@@ -496,20 +292,8 @@
Ny labelprofil
-
+
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4
- templates\AdminPages\ManufacturerAdmin.html.twig:4
-
-
- manufacturer.caption
- Fabrikant
-
-
-
-
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8
new
@@ -517,9 +301,8 @@
Ret fabrikanter
-
+
- Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12
new
@@ -527,40 +310,14 @@
Ny fabrikant
-
-
- Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4
- Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4
-
-
- measurement_unit.caption
- Måleenhed
-
-
-
-
- part_custom_state.caption
- Brugerdefineret komponentstatus
-
-
-
-
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5
- Part-DB1\templates\_sidebar.html.twig:8
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:4
- Part-DB1\templates\_sidebar.html.twig:8
- templates\base.html.twig:171
- templates\base.html.twig:198
- templates\base.html.twig:226
-
+
storelocation.labelp
Lagerlokationer
-
+
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32
new
@@ -568,9 +325,8 @@
Ret lagerlokation
-
+
- Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36
new
@@ -578,9 +334,8 @@
Ny lagerlokation
-
+
- Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16
new
@@ -588,9 +343,8 @@
Ret leverandør
-
+
- Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20
new
@@ -598,142 +352,77 @@
Ny leverandør
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:8
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:8
-
-
- user.edit.caption
- Brugere
-
-
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:14
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:14
-
+
user.edit.configuration
Opsætning
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:15
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:15
-
+
user.edit.password
Password
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:45
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:45
-
+
user.edit.tfa.caption
To-faktor godkendelse
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:47
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:47
-
+
user.edit.tfa.google_active
Godkendelses-app aktiv
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:48
- Part-DB1\templates\Users\backup_codes.html.twig:15
- Part-DB1\templates\Users\_2fa_settings.html.twig:95
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:48
- Part-DB1\templates\Users\backup_codes.html.twig:15
- Part-DB1\templates\Users\_2fa_settings.html.twig:95
-
+
tfa_backup.remaining_tokens
Antal resterende backupkoder
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:49
- Part-DB1\templates\Users\backup_codes.html.twig:17
- Part-DB1\templates\Users\_2fa_settings.html.twig:96
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:49
- Part-DB1\templates\Users\backup_codes.html.twig:17
- Part-DB1\templates\Users\_2fa_settings.html.twig:96
-
+
tfa_backup.generation_date
Oprettelsesdato for backupkoder
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:53
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:60
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:53
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:60
-
+
user.edit.tfa.disabled
Metode ikke aktiveret
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:56
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:56
-
+
user.edit.tfa.u2f_keys_count
Aktive sikkerhedsnøgler
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
-
+
user.edit.tfa.disable_tfa_title
Ønsker du at fortsætte?
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:72
-
+
user.edit.tfa.disable_tfa_message
- Dette vil deaktiver <b>alle aktive to-faktor godkendelses metoder af brugere</b> og slette <b>backupkoderne</b>!
+ Dette vil deaktivere <b>alle aktive to-faktor godkendelsesmetoder af brugere</b> og slette <b>backupkoderne</b>!
<br>
-Brugen skal sætte all to-faktor godkendelsesmetoder op igen og printe nye backupkoder! <br><br>
-<b>Gør kun dette hvis du er helt sikker på identiten af brugeren (som søger hjælp), eller kan kontoen blive kompromiteret af en som ønsker at angrive systemet!</b>
+Brugeren skal sætte alle to-faktor godkendelsesmetoder op igen og printe nye backupkoder! <br><br>
+<b>Gør kun dette hvis du er helt sikker på identiten af brugeren (som søger hjælp), ellers kan kontoen blive kompromiteret af en som ønsker at angrive systemet!</b>
-
-
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:73
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:73
-
+
user.edit.tfa.disable_tfa.btn
Deaktivér all to-faktor godkendelsesmetoder
-
+
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:85
new
@@ -741,9 +430,8 @@ Brugen skal sætte all to-faktor godkendelsesmetoder op igen og printe nye backu
Ret bruger
-
+
- Part-DB1\templates\AdminPages\UserAdmin.html.twig:89
new
@@ -751,130 +439,61 @@ Brugen skal sætte all to-faktor godkendelsesmetoder op igen og printe nye backu
Ny bruger
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:4
- Part-DB1\templates\Parts\edit\_attachments.html.twig:4
- Part-DB1\templates\AdminPages\_attachments.html.twig:4
- Part-DB1\templates\Parts\edit\_attachments.html.twig:4
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:63
-
+
attachment.delete
Slet
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:41
- Part-DB1\templates\Parts\edit\_attachments.html.twig:38
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:35
- Part-DB1\src\DataTables\AttachmentDataTable.php:159
- Part-DB1\templates\Parts\edit\_attachments.html.twig:38
- Part-DB1\src\DataTables\AttachmentDataTable.php:159
-
+
- attachment.external
- Ekstern
+ attachment.external_only
+ Kun eksternt
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:49
- Part-DB1\templates\Parts\edit\_attachments.html.twig:47
- Part-DB1\templates\AdminPages\_attachments.html.twig:47
- Part-DB1\templates\Parts\edit\_attachments.html.twig:45
-
+
attachment.preview.alt
Billede af bilag
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:52
- Part-DB1\templates\Parts\edit\_attachments.html.twig:50
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:62
- Part-DB1\templates\AdminPages\_attachments.html.twig:50
- Part-DB1\templates\Parts\edit\_attachments.html.twig:48
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:45
-
+
- attachment.view
- Vis
+ attachment.view_local
+ vedhæftning.vis_lokalt
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:58
- Part-DB1\templates\Parts\edit\_attachments.html.twig:56
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:43
- Part-DB1\src\DataTables\AttachmentDataTable.php:166
- Part-DB1\templates\AdminPages\_attachments.html.twig:56
- Part-DB1\templates\Parts\edit\_attachments.html.twig:54
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:38
- Part-DB1\src\DataTables\AttachmentDataTable.php:166
-
+
attachment.file_not_found
Fil ikke fundet
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:66
- Part-DB1\templates\Parts\edit\_attachments.html.twig:64
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:48
- Part-DB1\templates\Parts\edit\_attachments.html.twig:62
-
+
attachment.secure
Privat bilag
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:79
- Part-DB1\templates\Parts\edit\_attachments.html.twig:77
- Part-DB1\templates\AdminPages\_attachments.html.twig:77
- Part-DB1\templates\Parts\edit\_attachments.html.twig:75
-
+
attachment.create
Tilføj bilag
-
-
- Part-DB1\templates\AdminPages\_attachments.html.twig:84
- Part-DB1\templates\Parts\edit\_attachments.html.twig:82
- Part-DB1\templates\Parts\edit\_lots.html.twig:33
- Part-DB1\templates\AdminPages\_attachments.html.twig:82
- Part-DB1\templates\Parts\edit\_attachments.html.twig:80
- Part-DB1\templates\Parts\edit\_lots.html.twig:33
-
+
part_lot.edit.delete.confirm
Ønsker du virkeligt at slette dette lager? Du kan ikke fortryde det senere!
-
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:2
- Part-DB1\templates\AdminPages\_delete_form.html.twig:2
- templates\AdminPages\_delete_form.html.twig:2
-
+
entity.delete.confirm_title
Ønsker du virkeligt at slette %name%?
-
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:3
- Part-DB1\templates\AdminPages\_delete_form.html.twig:3
- templates\AdminPages\_delete_form.html.twig:3
-
+
entity.delete.message
Dette kan ikke fortrydes!
@@ -882,25 +501,14 @@ Brugen skal sætte all to-faktor godkendelsesmetoder op igen og printe nye backu
Underelementer vil blive flyttet opad.
-
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:11
- Part-DB1\templates\AdminPages\_delete_form.html.twig:11
- templates\AdminPages\_delete_form.html.twig:9
-
+
entity.delete
Slet element
-
+
- Part-DB1\templates\AdminPages\_delete_form.html.twig:16
- Part-DB1\templates\Parts\info\_tools.html.twig:45
- Part-DB1\src\Form\Part\PartBaseType.php:286
- Part-DB1\templates\AdminPages\_delete_form.html.twig:16
- Part-DB1\templates\Parts\info\_tools.html.twig:43
- Part-DB1\src\Form\Part\PartBaseType.php:267
new
@@ -908,571 +516,308 @@ Underelementer vil blive flyttet opad.
Ret kommentar
-
-
- Part-DB1\templates\AdminPages\_delete_form.html.twig:24
- Part-DB1\templates\AdminPages\_delete_form.html.twig:24
- templates\AdminPages\_delete_form.html.twig:12
-
+
entity.delete.recursive
Slet rekursivt (alle underelementer)
-
-
- Part-DB1\templates\AdminPages\_duplicate.html.twig:3
-
+
entity.duplicate
Kopier element
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:4
- Part-DB1\src\Form\AdminPages\ImportType.php:76
- Part-DB1\templates\AdminPages\_export_form.html.twig:4
- Part-DB1\src\Form\AdminPages\ImportType.php:76
- templates\AdminPages\_export_form.html.twig:4
- src\Form\ImportType.php:67
-
+
export.format
Filformat
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:16
- Part-DB1\templates\AdminPages\_export_form.html.twig:16
- templates\AdminPages\_export_form.html.twig:16
-
+
export.level
Detaljegrad
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:19
- Part-DB1\templates\AdminPages\_export_form.html.twig:19
- templates\AdminPages\_export_form.html.twig:19
-
+
export.level.simple
Simpel
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:20
- Part-DB1\templates\AdminPages\_export_form.html.twig:20
- templates\AdminPages\_export_form.html.twig:20
-
+
export.level.extended
Udvidet
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:21
- Part-DB1\templates\AdminPages\_export_form.html.twig:21
- templates\AdminPages\_export_form.html.twig:21
-
+
export.level.full
Fuldstændig
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:31
- Part-DB1\templates\AdminPages\_export_form.html.twig:31
- templates\AdminPages\_export_form.html.twig:31
-
+
export.include_children
medtag underelementer ved eksport
-
-
- Part-DB1\templates\AdminPages\_export_form.html.twig:39
- Part-DB1\templates\AdminPages\_export_form.html.twig:39
- templates\AdminPages\_export_form.html.twig:39
-
+
export.btn
Eksport
-
-
- Part-DB1\templates\AdminPages\_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12
- Part-DB1\templates\Parts\info\show_part_info.html.twig:24
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:36
- Part-DB1\templates\AdminPages\_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12
- Part-DB1\templates\Parts\info\show_part_info.html.twig:24
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:36
- templates\AdminPages\EntityAdminBase.html.twig:94
- templates\Parts\edit_part_info.html.twig:12
- templates\Parts\show_part_info.html.twig:11
-
+
id.label
ID
-
-
- Part-DB1\templates\AdminPages\_info.html.twig:11
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:76
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:77
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:6
- Part-DB1\templates\Parts\info\_order_infos.html.twig:69
- Part-DB1\templates\Parts\info\_sidebar.html.twig:12
- Part-DB1\templates\Parts\lists\_info_card.html.twig:77
- Part-DB1\templates\AdminPages\_info.html.twig:11
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:59
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:60
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:6
- Part-DB1\templates\Parts\info\_order_infos.html.twig:69
- Part-DB1\templates\Parts\info\_sidebar.html.twig:12
- Part-DB1\templates\Parts\lists\_info_card.html.twig:53
- templates\AdminPages\EntityAdminBase.html.twig:101
- templates\Parts\show_part_info.html.twig:248
-
+
createdAt
- Oprettet på
+ Oprettet d.
-
-
- Part-DB1\templates\AdminPages\_info.html.twig:25
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:21
- Part-DB1\templates\Parts\info\_sidebar.html.twig:8
- Part-DB1\templates\Parts\lists\_info_card.html.twig:73
- Part-DB1\templates\AdminPages\_info.html.twig:25
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:21
- Part-DB1\templates\Parts\info\_sidebar.html.twig:8
- Part-DB1\templates\Parts\lists\_info_card.html.twig:49
- templates\AdminPages\EntityAdminBase.html.twig:114
- templates\Parts\show_part_info.html.twig:263
-
+
lastModified
Sidst rettet
-
-
- Part-DB1\templates\AdminPages\_info.html.twig:38
- Part-DB1\templates\AdminPages\_info.html.twig:38
-
+
entity.info.parts_count
antal dele med dette element
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:6
- Part-DB1\templates\helper.twig:125
- Part-DB1\templates\Parts\edit\_specifications.html.twig:6
-
+
specifications.property
Parameter
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:7
- Part-DB1\templates\Parts\edit\_specifications.html.twig:7
-
+
specifications.symbol
Symbol
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:8
- Part-DB1\templates\Parts\edit\_specifications.html.twig:8
-
+
specifications.value_min
Min.
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:9
- Part-DB1\templates\Parts\edit\_specifications.html.twig:9
-
+
specifications.value_typ
Typ.
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:10
- Part-DB1\templates\Parts\edit\_specifications.html.twig:10
-
+
specifications.value_max
Max.
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:11
- Part-DB1\templates\Parts\edit\_specifications.html.twig:11
-
+
specifications.unit
Enhed
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:12
- Part-DB1\templates\Parts\edit\_specifications.html.twig:12
-
+
specifications.text
Tekst
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:13
- Part-DB1\templates\Parts\edit\_specifications.html.twig:13
-
+
specifications.group
Gruppe
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:26
- Part-DB1\templates\Parts\edit\_specifications.html.twig:26
-
+
specification.create
Ny parameter
-
-
- Part-DB1\templates\AdminPages\_parameters.html.twig:31
- Part-DB1\templates\Parts\edit\_specifications.html.twig:31
-
+
parameter.delete.confirm
Ønsker du at slette denne parameter?
-
-
- Part-DB1\templates\attachment_list.html.twig:3
- Part-DB1\templates\attachment_list.html.twig:3
-
+
attachment.list.title
Bilagsliste
-
-
- Part-DB1\templates\attachment_list.html.twig:10
- Part-DB1\templates\LogSystem\_log_table.html.twig:8
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:6
- Part-DB1\templates\attachment_list.html.twig:10
- Part-DB1\templates\LogSystem\_log_table.html.twig:8
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:6
-
+
part_list.loading.caption
Henter
-
-
- Part-DB1\templates\attachment_list.html.twig:11
- Part-DB1\templates\LogSystem\_log_table.html.twig:9
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:7
- Part-DB1\templates\attachment_list.html.twig:11
- Part-DB1\templates\LogSystem\_log_table.html.twig:9
- Part-DB1\templates\Parts\lists\_parts_list.html.twig:7
-
+
part_list.loading.message
Dette kan tage et øjeblik. Hvis denne meddelelse ikke forsvinder, prøv at genindlæse siden.
-
-
- Part-DB1\templates\base.html.twig:68
- Part-DB1\templates\base.html.twig:68
- templates\base.html.twig:246
-
+
vendor.base.javascript_hint
Sørg for at aktivere alle Javascriptfunktioner!
-
-
- Part-DB1\templates\base.html.twig:73
- Part-DB1\templates\base.html.twig:73
-
+
sidebar.big.toggle
Vis/skjul sidepanel
-
-
- Part-DB1\templates\base.html.twig:95
- Part-DB1\templates\base.html.twig:95
- templates\base.html.twig:271
-
+
loading.caption
Henter:
-
-
- Part-DB1\templates\base.html.twig:96
- Part-DB1\templates\base.html.twig:96
- templates\base.html.twig:272
-
+
loading.message
Dette kan taget noget tid. Hvis denne meddelelse bliver stående i lang tid, forsøg da at genindlæse siden.
-
-
- Part-DB1\templates\base.html.twig:101
- Part-DB1\templates\base.html.twig:101
- templates\base.html.twig:277
-
+
loading.bar
Henter...
-
-
- Part-DB1\templates\base.html.twig:112
- Part-DB1\templates\base.html.twig:112
- templates\base.html.twig:288
-
+
back_to_top
Tilbage til toppen af siden
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:35
- Part-DB1\templates\Form\permissionLayout.html.twig:35
-
+
permission.edit.permission
Rettigheder
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:36
- Part-DB1\templates\Form\permissionLayout.html.twig:36
-
+
permission.edit.value
Værdi
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:53
- Part-DB1\templates\Form\permissionLayout.html.twig:53
-
+
permission.legend.title
Forklaring til tilstande
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:57
- Part-DB1\templates\Form\permissionLayout.html.twig:57
-
+
permission.legend.disallow
Ej tilladt
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:61
- Part-DB1\templates\Form\permissionLayout.html.twig:61
-
+
permission.legend.allow
Tilladt
-
-
- Part-DB1\templates\Form\permissionLayout.html.twig:65
- Part-DB1\templates\Form\permissionLayout.html.twig:65
-
+
permission.legend.inherit
Nedarv fra (overordnet) gruppe
-
-
- Part-DB1\templates\helper.twig:3
- Part-DB1\templates\helper.twig:3
-
+
bool.true
Sand
-
-
- Part-DB1\templates\helper.twig:5
- Part-DB1\templates\helper.twig:5
-
+
bool.false
Falsk
-
-
- Part-DB1\templates\helper.twig:92
- Part-DB1\templates\helper.twig:87
-
+
Yes
Ja
-
-
- Part-DB1\templates\helper.twig:94
- Part-DB1\templates\helper.twig:89
-
+
No
Nej
-
-
- Part-DB1\templates\helper.twig:126
-
+
specifications.value
Værdi
-
-
- Part-DB1\templates\homepage.html.twig:7
- Part-DB1\templates\homepage.html.twig:7
- templates\homepage.html.twig:7
-
+
version.caption
Version
-
-
- Part-DB1\templates\homepage.html.twig:22
- Part-DB1\templates\homepage.html.twig:22
- templates\homepage.html.twig:19
-
+
homepage.license
Licensinformation
-
-
- Part-DB1\templates\homepage.html.twig:31
- Part-DB1\templates\homepage.html.twig:31
- templates\homepage.html.twig:28
-
+
homepage.github.caption
Projektoversigt
-
-
- Part-DB1\templates\homepage.html.twig:31
- Part-DB1\templates\homepage.html.twig:31
- templates\homepage.html.twig:28
-
+
homepage.github.text
Kilde, downloads, fejlrapporter, to-do-list etc. kan findes på <a href="%href%" class="link-external" target="_blank">GitHub project page</a>
-
-
- Part-DB1\templates\homepage.html.twig:32
- Part-DB1\templates\homepage.html.twig:32
- templates\homepage.html.twig:29
-
+
homepage.help.caption
Hjælp
-
-
- Part-DB1\templates\homepage.html.twig:32
- Part-DB1\templates\homepage.html.twig:32
- templates\homepage.html.twig:29
-
+
homepage.help.text
Hjælp og tips kan findes på Wiki <a href="%href%" class="link-external" target="_blank">GitHub siden</a>
-
-
- Part-DB1\templates\homepage.html.twig:33
- Part-DB1\templates\homepage.html.twig:33
- templates\homepage.html.twig:30
-
+
homepage.forum.caption
Forum
-
+
- Part-DB1\templates\homepage.html.twig:45
- Part-DB1\templates\homepage.html.twig:45
new
@@ -1480,148 +825,98 @@ Underelementer vil blive flyttet opad.
Sidste aktivitet
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:3
- Part-DB1\templates\LabelSystem\dialog.html.twig:6
-
+
label_generator.title
Labelgenerator
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:16
-
+
label_generator.common
Fælles
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:20
-
+
label_generator.advanced
Avanceret
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:24
-
+
label_generator.profiles
Profiler
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:58
-
+
label_generator.selected_profile
Valgte profil
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:62
-
+
label_generator.edit_profile
Ret profil
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:75
-
+
label_generator.load_profile
Hent profil
-
-
- Part-DB1\templates\LabelSystem\dialog.html.twig:102
-
+
label_generator.download
Hent
-
-
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:3
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:5
-
+
label_generator.label_btn
Opret label
-
-
- Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:20
-
+
label_generator.label_empty
Ny tom label
-
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:3
-
+
label_scanner.title
Label scanner
-
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7
-
+
label_scanner.no_cam_found.title
Intet webcam fundet
-
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7
-
+
label_scanner.no_cam_found.text
Du skal bruge et webcam og give lov til at bruge det som scanner. Du kan indtaste stregkoden manuelt nedenfor.
-
-
- Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:27
-
+
label_scanner.source_select
Vælg kilde
-
-
- Part-DB1\templates\LogSystem\log_list.html.twig:3
- Part-DB1\templates\LogSystem\log_list.html.twig:3
-
+
log.list.title
Systemlog
-
+
- Part-DB1\templates\LogSystem\_log_table.html.twig:1
- Part-DB1\templates\LogSystem\_log_table.html.twig:1
new
@@ -1629,10 +924,8 @@ Underelementer vil blive flyttet opad.
Er du sikker på at du vil fortryde ændringerne / gå tilbage til forrige version?
-
+
- Part-DB1\templates\LogSystem\_log_table.html.twig:2
- Part-DB1\templates\LogSystem\_log_table.html.twig:2
new
@@ -1640,570 +933,353 @@ Underelementer vil blive flyttet opad.
Er du sikker på at du vil fortryde ændringen / og gå tilbage til en tidligere version?
-
-
- Part-DB1\templates\mail\base.html.twig:24
- Part-DB1\templates\mail\base.html.twig:24
-
+
mail.footer.email_sent_by
Denne e-mail er afsendt automatisk af
-
-
- Part-DB1\templates\mail\base.html.twig:24
- Part-DB1\templates\mail\base.html.twig:24
-
+
mail.footer.dont_reply
Venligt undlad at svare på denne e-mail.
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:6
- Part-DB1\templates\mail\pw_reset.html.twig:6
-
+
email.hi %name%
Hej %name%
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:7
- Part-DB1\templates\mail\pw_reset.html.twig:7
-
+
email.pw_reset.message
En eller anden (forhåbentlig dig) har anmodet om at nulstille det gemte password. Hvis du ikke har anmodet om dette, venligst ignorér denne e-mail.
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:9
- Part-DB1\templates\mail\pw_reset.html.twig:9
-
+
email.pw_reset.button
Klik her for at nulstille password
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:11
- Part-DB1\templates\mail\pw_reset.html.twig:11
-
+
email.pw_reset.fallback
Hvis dette ikke virker, gå til <a href="%url%">%url%</a> og indtast følgende information
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:16
- Part-DB1\templates\mail\pw_reset.html.twig:16
-
+
email.pw_reset.username
Brugernavn
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:19
- Part-DB1\templates\mail\pw_reset.html.twig:19
-
+
email.pw_reset.token
Token
-
-
- Part-DB1\templates\mail\pw_reset.html.twig:24
- Part-DB1\templates\mail\pw_reset.html.twig:24
-
+
email.pw_reset.valid_unit %date%
Nulstillingstoken'en vil være gyldig indtil <i>%date%</i>.
-
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:18
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:78
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58
-
+
orderdetail.delete
Slet
-
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39
-
+
pricedetails.edit.min_qty
Minimum rabat-antal
-
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40
-
+
pricedetails.edit.price
Pris
-
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41
-
+
pricedetails.edit.price_qty
for mængde
-
-
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54
- Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54
-
+
pricedetail.create
Anfør pris
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4
- templates\Parts\edit_part_info.html.twig:4
-
+
part.edit.title
Rediger komponent %name%
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9
- templates\Parts\edit_part_info.html.twig:9
-
+
part.edit.card_title
Rediger del
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22
-
+
part.edit.tab.common
Fælles
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28
-
+
part.edit.tab.manufacturer
Fabrikant
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34
-
+
part.edit.tab.advanced
- Advanceret
+ Avanceret
-
+
part.edit.tab.advanced.ipn.commonSectionHeader
- Forslag uden del-inkrement
+ Forslag uden komponent-forøgelse
-
+
part.edit.tab.advanced.ipn.partIncrementHeader
- Forslag med numeriske deleforøgelser
+ Forslag med numerisk komponent-forøgelse
-
+
part.edit.tab.advanced.ipn.prefix.description.current-increment
- Aktuel IPN-specifikation for delen
+ Aktuel IPN-værdi for komponenten
-
+
part.edit.tab.advanced.ipn.prefix.description.increment
- Næste mulige IPN-specifikation baseret på en identisk delebeskrivelse
+ Næste mulige IPN-værdi baseret på den identiske komponentbeskrivelse
-
+
part.edit.tab.advanced.ipn.prefix_empty.direct_category
- IPN-præfikset for den direkte kategori er tomt, angiv det i kategorien "%name%"
+ IPN-præfikset for den direkte kategori er tomt. Du skal angive et præfiks i kategorien "%name%"
-
+
part.edit.tab.advanced.ipn.prefix.direct_category
- IPN-præfiks for direkte kategori
+ IPN præfiks for direkte kategori
-
+
part.edit.tab.advanced.ipn.prefix.direct_category.increment
- IPN-præfiks for den direkte kategori og en delspecifik inkrement
+ IPN-præfiks for den direkte kategori og komponentspecifik tilvækst
-
+
part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment
- IPN-præfikser med hierarkisk rækkefølge af overordnede præfikser
+ IPN præfiks med hierarkisk kategorirækkefølge af overordnede præfiks
-
+
part.edit.tab.advanced.ipn.prefix.hierarchical.increment
- IPN-præfikser med hierarkisk rækkefølge af overordnede præfikser og en del-specifik inkrement
+ IPN-præfikser med hierarkisk kategorirækkefølge af overordnede præfikser og del-specifik forøgelse
-
+
part.edit.tab.advanced.ipn.prefix.not_saved
- Opret først en komponent, og tildel den en kategori: med eksisterende kategorier og deres egne IPN-præfikser kan IPN-betegnelsen for komponenten foreslås automatisk
+ Venligst først opret del og tilføj den til en kategori: IPN præfiks for delen kan foreslås automatisk for eksisterede katogorier med egne IPN præfiks
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40
-
+
part.edit.tab.part_lots
Lagerbestand
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46
-
+
part.edit.tab.attachments
Vedhæftede filer
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52
-
+
part.edit.tab.orderdetails
indkøbsinformation
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58
-
+
part.edit.tab.specifications
Paremetre
-
-
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:64
- Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58
-
+
part.edit.tab.comment
Noter
-
-
- Part-DB1\templates\Parts\edit\new_part.html.twig:8
- Part-DB1\templates\Parts\edit\new_part.html.twig:8
- templates\Parts\new_part.html.twig:8
-
+
part.new.card_title
Opret ny del
-
-
- Part-DB1\templates\Parts\edit\_lots.html.twig:5
- Part-DB1\templates\Parts\edit\_lots.html.twig:5
-
+
part_lot.delete
Slet
-
-
- Part-DB1\templates\Parts\edit\_lots.html.twig:28
- Part-DB1\templates\Parts\edit\_lots.html.twig:28
-
+
part_lot.create
Opret beholdning
-
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13
-
+
orderdetail.create
tilføj distributør
-
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18
-
+
pricedetails.edit.delete.confirm
Er du sikker på, at du vil slette denne pris? Dette kan ikke fortrydes!
-
-
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:62
- Part-DB1\templates\Parts\edit\_orderdetails.html.twig:61
-
+
orderdetails.edit.delete.confirm
Er du sikker på, at du vil slette denne leverandør? Dette kan ikke fortrydes!
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:4
- Part-DB1\templates\Parts\info\show_part_info.html.twig:19
- Part-DB1\templates\Parts\info\show_part_info.html.twig:4
- Part-DB1\templates\Parts\info\show_part_info.html.twig:19
- templates\Parts\show_part_info.html.twig:4
- templates\Parts\show_part_info.html.twig:9
-
+
part.info.title
Detaljerede oplysninger vedr.
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:47
- Part-DB1\templates\Parts\info\show_part_info.html.twig:47
-
+
part.part_lots.label
Lagerbestand
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:56
- Part-DB1\templates\Parts\lists\_info_card.html.twig:43
- Part-DB1\templates\_navbar_search.html.twig:31
- Part-DB1\templates\_navbar_search.html.twig:26
- templates\base.html.twig:62
- templates\Parts\show_part_info.html.twig:74
- src\Form\PartType.php:86
-
+
comment.label
Noter
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:64
-
+
part.info.specifications
Paremeter
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:74
- Part-DB1\templates\Parts\info\show_part_info.html.twig:64
- templates\Parts\show_part_info.html.twig:82
-
+
attachment.labelp
Vedhæftede filer
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:83
- Part-DB1\templates\Parts\info\show_part_info.html.twig:71
- templates\Parts\show_part_info.html.twig:88
-
+
vendor.partinfo.shopping_infos
Indkøbsinformation
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:91
- Part-DB1\templates\Parts\info\show_part_info.html.twig:78
- templates\Parts\show_part_info.html.twig:94
-
+
vendor.partinfo.history
Historik
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:97
- Part-DB1\templates\_sidebar.html.twig:54
- Part-DB1\templates\_sidebar.html.twig:13
- Part-DB1\templates\Parts\info\show_part_info.html.twig:84
- Part-DB1\templates\_sidebar.html.twig:54
- Part-DB1\templates\_sidebar.html.twig:13
- templates\base.html.twig:176
- templates\base.html.twig:203
- templates\base.html.twig:217
- templates\base.html.twig:231
- templates\Parts\show_part_info.html.twig:100
-
+
tools.label
Værktøjer
-
-
- Part-DB1\templates\Parts\info\show_part_info.html.twig:103
- Part-DB1\templates\Parts\info\show_part_info.html.twig:90
-
+
extended_info.label
Yderligere Informationen
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:7
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:7
-
+
attachment.name
Navn
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:8
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:8
-
+
attachment.attachment_type
Vedhæft sikkerhedstype
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:9
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:9
-
+
attachment.file_name
vedhæft fil_navn
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:10
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:10
-
+
attachment.file_size
vedhæftet fil_størrelse
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:54
-
+
attachment.preview
Forhåndsvisningbillede
-
-
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:67
- Part-DB1\templates\Parts\info\_attachments_info.html.twig:50
-
+
- attachment.download
- Vedhæftet fil
+ attachment.download_local
+ vedhæftning.download_lokalt
-
+
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:11
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:11
new
user.creating_user
- Hvem oprettede denne del
+ Oprettet af
-
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:13
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:28
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:50
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:13
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:28
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:50
-
+
Unknown
Ukendt
-
+
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:15
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:30
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:15
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:30
new
@@ -2211,70 +1287,41 @@ Underelementer vil blive flyttet opad.
Adgang nægtet
-
+
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:26
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:26
new
user.last_editing_user
- Bruger som rettede denne del
+ Bruger som sidst rettede denne
-
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:41
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:41
-
+
part.isFavorite
Favorit
-
-
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:46
- Part-DB1\templates\Parts\info\_extended_infos.html.twig:46
-
+
part.minOrderAmount
- Minimum ordrestrørrelse
+ Minimum ordrestørrelse
-
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:8
- Part-DB1\templates\_navbar_search.html.twig:46
- Part-DB1\src\Services\ElementTypeNameGenerator.php:84
- Part-DB1\templates\Parts\info\_main_infos.html.twig:8
- Part-DB1\templates\_navbar_search.html.twig:41
- Part-DB1\src\Services\ElementTypeNameGenerator.php:84
- templates\base.html.twig:70
- templates\Parts\show_part_info.html.twig:24
- src\Form\PartType.php:80
-
+
manufacturer.label
Fabrikant
-
-
- Part-DB1\templates\Parts\info\_main_infos.html.twig:24
- Part-DB1\templates\_navbar_search.html.twig:11
- templates\base.html.twig:54
- src\Form\PartType.php:62
-
+