Commit graph

33 commits

Author SHA1 Message Date
Niklas
c17cf5e83c
Add price columns to project BOM table and build price summary (#1345)
* 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>
2026-04-15 22:13:07 +02:00
Copilot
f5841cc697
Remove outdated file source and path notes from translation files (#1225)
* Initial plan

* Remove outdated file source and path notes from all translation files

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

* Preserve XML declaration format with double quotes

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2026-02-07 18:33:31 +01:00
Copilot
a3d992a016
Move frontend translations to separate domain to reduce bundle size (#1197)
* Initial plan

* Create frontend translation files and update configuration

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

* Fix missing semicolon in password strength controller

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

* Remove frontend-only translations from messages domain and set frontend as default domain

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2026-01-18 18:50:38 +01:00
Copilot
60ff727896
Replace hardcoded entity type names with synonym placeholders in English and German translations (#1128)
* 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>
2025-12-07 14:09:22 +01:00
Copilot
9dc17ad9d0
Remove 25 unused/obsolete translation keys (#1131)
* Initial plan

* Remove 25 unused/obsolete translation keys from all message files

Removed keys:
- admin.comment
- api_tokens.added_date
- attachment.external_file
- attachment.table.filename
- datatable.datatable.lengthMenu
- delete.caption
- edit.caption_short
- part.add.caption
- part.add.comment
- part.description.placeholder
- part.edited_flash.invalid
- part.instock.placeholder
- part.mininstock.placeholder
- part.order.price_per
- part.withdraw.btn
- part.withdraw.caption
- part.withdraw.comment:
- project.caption
- r_u2f_two_factor.name
- search.deactivateBarcode
- selectpicker.empty
- supplier.caption
- tfa_u2f.key_added_successful
- tree.root_node.text
- validator.part_lot.location_full.no_increasment (typo of fixed key)

These keys have zero occurrences in the codebase and are safe to remove.

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2025-12-06 22:55:02 +01:00
Copilot
d244400f4f
Add missing plural label translations to 12 language files (#1126)
* Initial plan

* Add missing plural label translations to 12 language files

Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2025-12-06 22:24:14 +01:00
web-devinition.de
771857e014
Added feature for part IPN suggest with category prefixes (#1054)
* 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>
2025-11-03 00:31:47 +01:00
web-devinition.de
14a4f1f437
Added custom part status (#1053)
Some checks failed
Build assets artifact / Build assets artifact (push) Has been cancelled
Docker Image Build / docker (push) Has been cancelled
Docker Image Build (FrankenPHP) / docker (push) Has been cancelled
Static analysis / Static analysis (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, sqlite) (push) Has been cancelled
* Benutzerdefinierten Bauteilstatus einführen

* PartCustomStateController hinzufügen

* Umstellung Migrationen bzgl. Multi-Plattform-Support.
Zunächst MySQL, SQLite Statements integrieren.

* Postgre Statements integrieren

* Semikolon in Migration entfernen

* Migration für PartCustomState aktualisieren

* Benutzerdefinierten Bauteilstatus in TableSettings aufnehmen

* PartCustomStateControllerTest: Attribute für PHPUnit-Gruppen umgestellt

* PartCustomState: Mapping für Parameter korrigieren

* PartCustomState: Darstellung und Zuordnung von Anhängen ergänzt

Die Sidebar wurde um die Anzeige des benutzerdefinierten Bauteilstatus erweitert, inklusive Vorschaubild, sofern vorhanden.

* Migrationen zusammenführen

* PartCustomState: Anpassungen bzgl. Tests

* PartCustomStateEndpoint hinzufügen

* Made custom part states plural for consistency with other entity captions

* Fixed phpunit error

* Fixed phpstan issues

---------

Co-authored-by: Marcel Diegelmann <marcel.diegelmann@gmail.com>
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
2025-10-27 21:58:16 +01:00
Jan Böhmer
39f1960135 New translations messages.en.xlf (Chinese Simplified) 2024-04-27 21:30:19 +02:00
Jan Böhmer
293afc3998
New Crowdin updates (#532)
* New translations messages.en.xlf (Chinese Simplified)

* New translations messages.en.xlf (Chinese Simplified)
2024-02-28 13:00:59 +01:00
Jan Böhmer
0d5b7a0711
New translations messages.en.xlf (Chinese Simplified) (#511) 2024-02-06 21:42:33 +01:00
Jan Böhmer
852107f7f6
New Crowdin updates (#510)
* New translations messages.en.xlf (Chinese Simplified)

* New translations validators.en.xlf (Chinese Simplified)

* New translations security.en.xlf (Chinese Simplified)

* New translations messages.en.xlf (Chinese Simplified)

* New translations security.en.xlf (Chinese Simplified)
2024-02-06 09:41:15 +01:00
Jan Böhmer
22606f01d2 New translations messages.en.xlf (Chinese Simplified) 2023-11-16 10:10:33 +01:00
Jan Böhmer
3c2e535117 New translations messages.en.xlf (Chinese Simplified) 2023-11-16 09:10:25 +01:00
Jan Böhmer
bf4a23652c New translations messages.en.xlf (Chinese Simplified) 2023-08-22 08:00:22 +02:00
Jan Böhmer
2fe4def775 New translations messages.en.xlf (Chinese Simplified) 2023-07-16 20:30:24 +02:00
Jan Böhmer
81bfcdd158 New translations messages.en.xlf (Chinese Simplified) 2023-07-16 19:30:23 +02:00
Jan Böhmer
dd914d1d64 New translations messages.en.xlf (Chinese Simplified) 2023-07-16 16:56:03 +02:00
Jan Böhmer
5cf3624a3a New translations messages.en.xlf (Chinese Simplified) 2023-07-16 13:20:24 +02:00
Jan Böhmer
c7ff8c2dd1 New translations messages.en.xlf (Chinese Simplified) 2023-07-16 12:20:29 +02:00
Jan Böhmer
83c202d675 New translations messages.en.xlf (Chinese Simplified) 2023-07-16 11:20:25 +02:00
Jan Böhmer
db325525e4 New translations messages.en.xlf (Chinese Simplified) 2023-07-15 22:30:25 +02:00
Jan Böhmer
61ffb857ee New translations messages.en.xlf (Chinese Simplified) 2023-07-15 21:30:26 +02:00
Jan Böhmer
89f9249ec6 New translations messages.en.xlf (Chinese Simplified) 2023-07-10 23:36:27 +02:00
Jan Böhmer
24f572253f New translations messages.en.xlf (Chinese Simplified) 2023-07-10 22:36:25 +02:00
Jan Böhmer
9962784991 New translations messages.en.xlf (Chinese Simplified) 2023-07-08 23:16:12 +02:00
Jan Böhmer
d93b7b2cb2 New translations messages.en.xlf (Chinese Simplified) 2023-06-30 00:26:45 +02:00
Jan Böhmer
dcff8c0d9a New translations messages.en.xlf (Chinese Traditional) 2023-06-28 16:17:47 +02:00
Jan Böhmer
8f9122c706 New translations messages.en.xlf (Chinese Simplified) 2023-06-28 16:17:43 +02:00
Jan Böhmer
ac923fe669 New translations messages.en.xlf (Chinese Traditional) 2023-06-27 01:20:30 +02:00
Jan Böhmer
5ff47e63bc New translations messages.en.xlf (Chinese Simplified) 2023-06-27 01:20:27 +02:00
Jan Böhmer
8d29fe8679 New translations messages.en.xlf (Chinese Traditional) 2023-06-09 11:46:53 +02:00
Jan Böhmer
03dc6d63ed New translations messages.en.xlf (Chinese Simplified) 2023-06-09 11:46:51 +02:00