* New translations messages.en.xlf (Danish)
* New translations validators.en.xlf (Danish)
* New translations messages.en.xlf (German)
* New translations messages.en.xlf (English)
* New translations messages.en.xlf (French)
* New translations validators.en.xlf (French)
* New translations messages.en.xlf (English)
* New translations messages.en.xlf (English)
* New translations messages.en.xlf (German)
* Add unit price and extended price columns to project BOM table
Adds two optional columns to the project BOM datatable (hidden by
default, toggleable via column visibility):
- **Price**: unit price for the BOM entry in the base currency,
looked up via PricedetailHelper. For parts whose BOM quantity falls
below the minimum order amount the minimum order amount is used for
the price tier lookup so that a price is always returned.
- **Extended Price**: unit price multiplied by the BOM quantity.
Prices are rendered via MoneyFormatter (locale-aware, with currency
symbol). Both columns round up to 2 decimal places to avoid displaying
0.00 for very small prices.
* Add translation key for project.bom.ext_price
Adds the English translation "Extended Price" for the new BOM extended
price column. Other languages are marked needs-translation and will be
picked up by Crowdin.
* Add build price summary to project info tab
Displays the total BOM price for N builds on the project info page,
using the existing price-tier logic from PricedetailHelper. The user
can adjust the number of builds via a small form; the unit price is
also shown when N > 1.
New backend:
- ProjectBuildHelper gains calculateTotalBuildPrice(),
calculateUnitBuildPrice(), roundedTotalBuildPrice(), and
roundedUnitBuildPrice() — bulk-order quantities are factored in so
that price tiers apply correctly across N builds.
- ProjectController::info() now reads ?n= and passes number_of_builds
to the template.
Template (_info.html.twig):
- Adds price badge (hidden when no pricing data is available).
- Adds number-of-builds form that reloads the info page.
* Add tests for build price calculation in ProjectBuildHelper
Covers calculateTotalBuildPrice(), calculateUnitBuildPrice(),
roundedTotalBuildPrice(), and the private getBomEntryUnitPrice()
helper. Scenarios tested: empty project, no pricing data, non-part BOM
entries with manual prices, part entries with pricedetails, mixed
entries, rounding-up of sub-cent prices, and minimum order amount
floor for price tier lookup.
* Deduplicate BOM entry price logic into ProjectBuildHelper
The private getBomEntryUnitPrice() in ProjectBomEntriesDataTable was
identical to the one in ProjectBuildHelper. Replaced it with a new
public getEntryUnitPrice() on ProjectBuildHelper (returns BigDecimal,
never null) and delegate to it from the DataTable.
This eliminates the duplicate code and brings the DataTable lines under
the existing ProjectBuildHelper test coverage. Added three tests for
getEntryUnitPrice() covering the no-pricing, non-part, and part cases.
* Added type hint to service
---------
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* Initial plan
* Initial plan for replacing entity type names with placeholders
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Replace entity type names with synonym placeholders in English translations
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Add more synonym placeholders for storage location, project, and part patterns
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Update tree navigation labels with synonym placeholders
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fix remaining entity type placeholders identified in code review
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fix placeholder syntax: use [Type]/[[Type]] instead of {type}/{{type}} and add German translations
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fix German translation to avoid awkward word concatenation with placeholder
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Use capitalized placeholders in German translations (nouns are always capitalized in German)
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fixed length menu for datatable views
* Capitalize placeholders at the beginning of sentences/titles in English translations
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Ensure that synonym placeholders get cached on a per locale level
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* Erweiterungstätigkeiten zur IPN-Vorschlagsliste anhand von Präfixen aus den Kategorien
* Umstellung Migrationen bzgl. Multi-Plattform-Support.
Zunächst MySQL, SQLite Statements integrieren.
* Postgre Statements integrieren
* SQL-Formatierung in Migration verbessern
* Erweitere IPN-Suggest um Bauteilbeschreibung.
Die Implementierung berücksichtigt nun zusätzlich die Bauteilbeschreibung zu maximal 150 Zeichen Länge für die Generierung von IPN-Vorschlägen und Inkrementen.
* Anpassungen aus Analyse vornehmen
* IPN-Validierung für Parts überarbeiten
* IPN-Vorschlagslogik um Konfiguration erweitert
* Anpassungen aus phpstan Analyse
* IPN-Vorschlagslogik erweitert und Bauteil-IPN vereindeutigt
Die IPN-Logik wurde um eine Konfiguration zur automatischen Suffix-Anfügung und die Berücksichtigung von doppelten Beschreibungen bei Bedarf ergänzt. Zudem wurde das Datenmodell angepasst, um eine eindeutige Speicherung der IPN zu gewährleisten.
* Regex-Konfigurationsmöglichkeit für IPN-Vorschläge einführen
Die Einstellungen für die IPN-Vorschlagslogik wurden um eine Regex-Validierung und eine Hilfetext-Konfiguration erweitert. Tests und Änderungen an den Formularoptionen wurden implementiert.
* Match range assert and form limits in suggestPartDigits
* Keep existing behavior with autoAppend suffix by default
* Show the regex hint in the browser validation notice.
* Improved translations
* Removed unnecessary service definition
* Removed german comments
---------
Co-authored-by: Marcel Diegelmann <marcel.diegelmann@gmail.com>
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations security.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations validators.en.xlf (Danish)
* New translations security.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations validators.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Czech)
* New translations validators.en.xlf (Czech)
* New translations security.en.xlf (Czech)
* New translations messages.en.xlf (Danish)
* New translations messages.en.xlf (Czech)
* New translations validators.en.xlf (Czech)
* New translations security.en.xlf (Czech)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Czech)
* New translations messages.en.xlf (Dutch)
* New translations messages.en.xlf (Dutch)