Statistik-Bereich um Tab für Projekte/Baugruppen erweitern

This commit is contained in:
Marcel Diegelmann 2026-02-12 12:46:59 +01:00
parent 74513b748d
commit d67e93064c
18 changed files with 754 additions and 1 deletions

View file

@ -0,0 +1,45 @@
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
static values = {
url: String,
confirmMsg: String,
successMsg: String,
errorMsg: String
}
static targets = ["count"]
async cleanup(event) {
event.preventDefault();
if (!confirm(this.confirmMsgValue)) {
return;
}
try {
const response = await fetch(this.urlValue, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
if (response.ok) {
const data = await response.json();
alert(this.successMsgValue.replace('%count%', data.count));
// Update the count displayed in the UI
if (this.hasCountTarget) {
this.countTarget.innerText = '0';
}
// Reload page to reflect changes if needed, or just let the user see 0
window.location.reload();
} else {
alert(this.errorMsgValue);
}
} catch (error) {
console.error('Cleanup failed:', error);
alert(this.errorMsgValue);
}
}
}

View file

@ -42,7 +42,10 @@ declare(strict_types=1);
namespace App\Controller;
use App\Services\Tools\StatisticsHelper;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
@ -57,4 +60,33 @@ class StatisticsController extends AbstractController
'helper' => $helper,
]);
}
#[Route(path: '/statistics/cleanup-assembly-bom-entries', name: 'statistics_cleanup_assembly_bom_entries', methods: ['POST'])]
public function cleanupAssemblyBOMEntries(EntityManagerInterface $em): JsonResponse
{
$this->denyAccessUnlessGranted('@tools.statistics');
$qb = $em->createQueryBuilder();
$qb->select('be', 'IDENTITY(be.part) AS part_id')
->from(AssemblyBOMEntry::class, 'be')
->leftJoin('be.part', 'p')
->where('be.part IS NOT NULL')
->andWhere('p.id IS NULL');
$results = $qb->getQuery()->getResult();
$count = count($results);
foreach ($results as $result) {
/** @var AssemblyBOMEntry $entry */
$entry = $result[0];
$part_id = $result['part_id'] ?? 'unknown';
$entry->setPart(null);
$entry->setName(sprintf('part-id=%s not found', $part_id));
}
$em->flush();
return new JsonResponse(['success' => true, 'count' => $count]);
}
}

View file

@ -41,8 +41,10 @@ declare(strict_types=1);
namespace App\Services\Tools;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\Attachments\Attachment;
use App\Entity\Attachments\AttachmentType;
use App\Entity\AssemblySystem\Assembly;
use App\Entity\ProjectSystem\Project;
use App\Entity\Parts\Category;
use App\Entity\Parts\Footprint;
@ -79,6 +81,14 @@ class StatisticsHelper
return $this->part_repo->count([]);
}
/**
* Returns the count of distinct projects.
*/
public function getDistinctProjectsCount(): int
{
return $this->em->getRepository(Project::class)->count([]);
}
/**
* Returns the summed instocked over all parts (only parts without a measurement unit).
*
@ -116,6 +126,7 @@ class StatisticsHelper
'storelocation' => StorageLocation::class,
'supplier' => Supplier::class,
'currency' => Currency::class,
'assembly' => Assembly::class,
];
if (!isset($arr[$type])) {
@ -164,4 +175,19 @@ class StatisticsHelper
{
return $this->attachment_repo->getUserUploadedAttachments();
}
/**
* Returns the count of BOM entries which point to a non-existent part ID.
*/
public function getInvalidPartBOMEntriesCount(): int
{
$qb = $this->em->createQueryBuilder();
$qb->select('COUNT(be.id)')
->from(AssemblyBOMEntry::class, 'be')
->leftJoin('be.part', 'p')
->where('be.part IS NOT NULL')
->andWhere('p.id IS NULL');
return (int) $qb->getQuery()->getSingleScalarResult();
}
}

View file

@ -14,6 +14,16 @@
{% trans %}statistics.parts{% endtrans %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="assemblies-tab" data-bs-toggle="tab" href="#assemblies" role="tab" aria-controls="assemblies" aria-selected="false">
{% trans %}statistics.assemblies{% endtrans %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="projects-tab" data-bs-toggle="tab" href="#projects" role="tab" aria-controls="projects" aria-selected="false">
{% trans %}statistics.projects{% endtrans %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="data_structures-tab" data-bs-toggle="tab" href="#data_structures" role="tab" aria-controls="profile" aria-selected="false">
{% trans %}statistics.data_structures{% endtrans %}
@ -52,6 +62,58 @@
</table>
</div>
<div class="tab-pane fade" id="assemblies" role="tabpanel" aria-labelledby="assemblies-tab"
{{ stimulus_controller('pages/statistics_assembly', {
url: path('statistics_cleanup_assembly_bom_entries'),
confirmMsg: 'statistics.cleanup_assembly_bom_entries.confirm'|trans,
successMsg: 'statistics.cleanup_assembly_bom_entries.success'|trans,
errorMsg: 'statistics.cleanup_assembly_bom_entries.error'|trans
}) }}
>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>{% trans %}statistics.property{% endtrans %}</th>
<th>{% trans %}statistics.value{% endtrans %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{% trans %}statistics.distinct_assemblies_count{% endtrans %}</td>
<td>{{ helper.dataStructuresCount("assembly") }}</td>
</tr>
<tr>
<td>{% trans %}statistics.invalid_part_bom_entries_count{% endtrans %}</td>
<td>
<span {{ stimulus_target('pages/statistics_assembly', 'count') }}>{{ helper.invalidPartBOMEntriesCount }}</span>
{% if helper.invalidPartBOMEntriesCount > 0 %}
<button class="btn btn-sm btn-outline-danger ms-2" {{ stimulus_action('pages/statistics_assembly', 'cleanup') }}>
<i class="fas fa-magic"></i> {% trans %}statistics.cleanup_assembly_bom_entries.button{% endtrans %}
</button>
{% endif %}
</td>
</tr>
</tbody>
</table>
</div>
<div class="tab-pane fade" id="projects" role="tabpanel" aria-labelledby="projects-tab">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>{% trans %}statistics.property{% endtrans %}</th>
<th>{% trans %}statistics.value{% endtrans %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{% trans %}statistics.distinct_projects_count{% endtrans %}</td>
<td>{{ helper.distinctProjectsCount }}</td>
</tr>
</tbody>
</table>
</div>
<div class="tab-pane fade" id="data_structures" role="tabpanel" aria-labelledby="data_structures-tab">
<table class="table table-striped table-hover">
<thead>
@ -131,4 +193,4 @@
</table>
</div>
</div>
{% endblock %}
{% endblock %}

View file

@ -1845,6 +1845,48 @@ Související prvky budou přesunuty nahoru.</target>
<target>Projekty</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Při čištění došlo k chybě.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% položek bylo úspěšně vyčištěno.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Chcete vyčistit všechny neplatné položky kusovníku? Odkaz na díl bude odstraněn a název nastaven na "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Vyčistit</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Neplatné položky kusovníku (díl nenalezen)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Počet [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Počet [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1803,6 +1803,48 @@ Underelementer vil blive flyttet opad.</target>
<target>Projekter</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Der opstod en fejl under oprydningen.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% poster blev ryddet op.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Vil du rydde op i alle ugyldige stykliste-poster? Forbindelsen til delen vil blive slettet, og navnet sat til "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Ryd op</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Ugyldige stykliste-poster (del ikke fundet)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Antal [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Antal [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1808,6 +1808,48 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
<target>Projekte</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Anzahl [[Assembly]]</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Anzahl [[Project]]</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Ungültige Stücklisteneinträge (Teil nicht gefunden)</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Bereinigen</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Möchten Sie alle ungültigen Stücklisteneinträge bereinigen? Die Verknüpfung zum Teil wird gelöscht und der Name auf "part-id=id not found" gesetzt.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% Einträge wurden erfolgreich bereinigt.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Bei der Bereinigung ist ein Fehler aufgetreten.</target>
</segment>
</unit>
<unit id="a2idAxu" name="statistics.data_structures">
<notes>
<note priority="1">new</note>

View file

@ -1883,5 +1883,47 @@
<target>Έργα</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Παρουσιάστηκε σφάλμα κατά την εκκαθάριση.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% εγγραφές εκκαθαρίστηκαν με επιτυχία.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Θέλετε να εκκαθαρίσετε όλες τις μη έγκυρες εγγραφές BOM; Ο σύνδεσμος προς το εξάρτημα θα διαγραφεί και το όνομα θα οριστεί σε "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Εκκαθάριση</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Μη έγκυρες εγγραφές BOM (το εξάρτημα δεν βρέθηκε)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Αριθμός [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Αριθμός [[Assembly]]</target>
</segment>
</unit>
</file>
</xliff>

View file

@ -1809,6 +1809,48 @@ Sub elements will be moved upwards.</target>
<target>Projects</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Number of [[Assembly]]</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Number of [[Project]]</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Invalid BOM entries (part not found)</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Cleanup</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Do you want to cleanup all invalid BOM entries? The link to the part will be removed and the name set to "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% entries were successfully cleaned up.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>An error occurred during cleanup.</target>
</segment>
</unit>
<unit id="a2idAxu" name="statistics.data_structures">
<notes>
<note priority="1">new</note>

View file

@ -1845,6 +1845,48 @@ Subelementos serán desplazados hacia arriba.</target>
<target>Proyectos</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Ocurrió un error durante la limpieza.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% entradas se limpiaron con éxito.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>¿Desea limpiar todas las entradas de lista de materiales no válidas? El enlace a la pieza se eliminará y el nombre se establecerá en "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Limpiar</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Entradas de lista de materiales no válidas (pieza no encontrada)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Número de [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Número de [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1828,6 +1828,48 @@ Show/Hide sidebar</target>
<target>Projets</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Une erreur est survenue lors du nettoyage.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% entrées ont été nettoyées avec succès.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Voulez-vous nettoyer toutes les entrées de nomenclature non valides ? Le lien vers la pièce sera supprimé et le nom sera défini sur "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Nettoyer</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Entrées de nomenclature non valides (pièce non trouvée)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Nombre de [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Nombre de [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1756,6 +1756,48 @@
<target>Projektek</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Hiba történt a tisztítás során.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% tétel sikeresen törölve.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Szeretné törölni az összes érvénytelen darabjegyzék tételt? Az alkatrészre mutató hivatkozás törlődik, a név pedig "part-id=id not found" lesz.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Tisztítás</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Érvénytelen darabjegyzék tételek (alkatrész nem található)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>[[Project]] száma</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>[[Assembly]] száma</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1845,6 +1845,48 @@ I sub elementi saranno spostati verso l'alto.</target>
<target>Progetti</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Si è verificato un errore durante la pulizia.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% voci sono state pulite con successo.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Vuoi pulire tutte le voci della distinta base non valide? Il collegamento alla parte verrà rimosso e il nome impostato su "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Pulisci</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Voci della distinta base non valide (parte non trovata)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Numero di [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Numero di [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1828,6 +1828,48 @@
<target>プロジェクト</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>クリーンアップ中にエラーが発生しました。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% 個のエントリが正常にクリーンアップされました。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>すべての無効な部品表エントリをクリーンアップしますか?部品へのリンクは削除され、名前は "part-id=id not found" に設定されます。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>クリーンアップ</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>無効な部品表エントリ (部品が見つかりません)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>[[Project]]の数</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>[[Assembly]]の数</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1560,5 +1560,47 @@
<target>Projecten</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Er is een fout opgetreden tijdens het opschonen.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% regels zijn succesvol opgeschoond.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Wilt u alle ongeldige stuklijstregels opschonen? De koppeling naar het onderdeel wordt verwijderd en de naam wordt ingesteld op "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Opschonen</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Ongeldige stuklijstregels (onderdeel niet gevonden)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Aantal [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Aantal [[Assembly]]</target>
</segment>
</unit>
</file>
</xliff>

View file

@ -1842,6 +1842,48 @@ Po usunięciu pod elementy zostaną przeniesione na górę.</target>
<target>Projekty</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Wystąpił błąd podczas czyszczenia.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>Pomyślnie wyczyszczono %count% wpisów.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Czy chcesz wyczyścić wszystkie nieprawidłowe wpisy w zestawieniu? Link do części zostanie usunięty, a nazwa ustawiona na "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Wyczyść</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Nieprawidłowe wpisy w zestawieniu (nie znaleziono części)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Liczba [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Liczba [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1846,6 +1846,48 @@
<target>Проекты</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>Произошла ошибка при очистке.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>%count% записей успешно очищено.</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>Вы хотите очистить все неверные записи в спецификации? Ссылка на деталь будет удалена, а имя установлено в "part-id=id not found".</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>Очистить</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>Недопустимые записи в спецификации (деталь не найдена)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>Количество [[Project]]</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>Количество [[Assembly]]</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>

View file

@ -1845,6 +1845,48 @@
<target>项目</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_error" name="statistics.cleanup_assembly_bom_entries.error">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.error</source>
<target>清理过程中发生错误。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_success" name="statistics.cleanup_assembly_bom_entries.success">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.success</source>
<target>成功清理了 %count% 条条目。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_confirm" name="statistics.cleanup_assembly_bom_entries.confirm">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.confirm</source>
<target>您想清理所有无效的物料清单条目吗?部件链接将被删除,名称将设置为 "part-id=id not found"。</target>
</segment>
</unit>
<unit id="stats_cleanup_bom_btn" name="statistics.cleanup_assembly_bom_entries.button">
<segment state="translated">
<source>statistics.cleanup_assembly_bom_entries.button</source>
<target>清理</target>
</segment>
</unit>
<unit id="stats_invalid_bom_count" name="statistics.invalid_part_bom_entries_count">
<segment state="translated">
<source>statistics.invalid_part_bom_entries_count</source>
<target>无效的物料清单条目(找不到部件)</target>
</segment>
</unit>
<unit id="statistics.distinct_projects_count" name="statistics.distinct_projects_count">
<segment state="translated">
<source>statistics.distinct_projects_count</source>
<target>[[Project]] 数量</target>
</segment>
</unit>
<unit id="stats_assemblies_count" name="statistics.distinct_assemblies_count">
<segment state="translated">
<source>statistics.distinct_assemblies_count</source>
<target>[[Assembly]] 数量</target>
</segment>
</unit>
<unit id="bd7zT1d" name="statistics.assemblies">
<segment state="translated">
<source>statistics.assemblies</source>