WShells
81213f0434
Assignable Keyboard Shortcuts Updates ( #4532 )
...
* Add configurable sales shortcuts
* Fix sales shortcut payment flow
* Resolve shortcut keys review comment
* Sanitize shortcut config notifications
* Clarify keyboard shortcut configuration labels
---------
Co-authored-by: WShells <26513147+WShells@users.noreply.github.com >
2026-05-07 22:53:25 +04:00
khao_lek
7edefe8ee1
Translated using Weblate (Thai)
...
Currently translated at 100.0% (15 of 15 strings)
Translation: opensourcepos/login
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/login/th/
2026-04-28 10:06:38 +02:00
khao_lek
68e14191f9
Translated using Weblate (Thai)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/th/
2026-04-28 10:05:06 +02:00
khao_lek
a381c3ca54
Translated using Weblate (Thai)
...
Currently translated at 99.5% (227 of 228 strings)
Translation: opensourcepos/sales
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/sales/th/
2026-04-28 10:05:06 +02:00
jekkos
ff7a8d2e88
fix: Update calendar translations ( #4498 )
...
- Fix typo 'mayl' to 'may' in Calendar.php for lo, ka, ml, nb locales
- Improve Spanish translation in Items.php for csv_import_invalid_location
- Add trailing newlines to Calendar.php files (ka, ml, nb, lo) per PSR-12
Co-authored-by: Ollama <ollama@steganos.dev >
2026-04-20 06:48:57 +00:00
jekkos
7f9321eca0
fix: Handle empty database on fresh install ( #4467 )
...
* fix: Handle empty database on fresh install
* feat: Add migration progress bar with jQuery AJAX
- Session.php: Switch to file-based sessions when migrations table doesn't exist
- OSPOS.php: Catch DatabaseException when config table missing, set defaults
- MY_Migration.php: Handle database connection failures gracefully
- Load_config.php: Set default language settings when config empty
---------
Co-authored-by: Ollama <ollama@steganos.dev >
2026-04-08 20:19:25 +00:00
objecttothis
ce7a3ce341
Translated using Weblate (Swahili (Tanzania))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/sw_TZ/
2026-04-07 20:47:37 +02:00
objecttothis
d99d2855ec
Translated using Weblate (Swahili (sw_KE))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/sw_KE/
2026-04-07 20:47:37 +02:00
objecttothis
96b4b24d9b
Translated using Weblate (Kurdish (Central))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ckb/
2026-04-07 20:47:37 +02:00
objecttothis
871231e406
Translated using Weblate (Ukrainian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/uk/
2026-04-07 20:47:37 +02:00
objecttothis
e62477ed4e
Translated using Weblate (Tamil)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ta/
2026-04-07 20:47:37 +02:00
objecttothis
2a0997f267
Translated using Weblate (Bosnian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/bs/
2026-04-07 20:47:37 +02:00
objecttothis
1ca8effe08
Translated using Weblate (Chinese (Traditional))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/zh_Hant/
2026-04-07 20:47:37 +02:00
objecttothis
ed2c975ad5
Translated using Weblate (Chinese (Simplified))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/zh_Hans/
2026-04-07 20:47:37 +02:00
objecttothis
403feed3e5
Translated using Weblate (Vietnamese)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/vi/
2026-04-07 20:47:37 +02:00
objecttothis
7f6f36210c
Translated using Weblate (Turkish)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/tr/
2026-04-07 20:47:37 +02:00
objecttothis
1121ced532
Translated using Weblate (Tagalog)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/tl/
2026-04-07 20:47:37 +02:00
objecttothis
632a18212d
Translated using Weblate (Swedish)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/sv/
2026-04-07 20:47:37 +02:00
objecttothis
3208f15244
Translated using Weblate (Russian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ru/
2026-04-07 20:47:37 +02:00
objecttothis
079b809622
Translated using Weblate (Romanian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ro/
2026-04-07 20:47:37 +02:00
objecttothis
d685e09c29
Translated using Weblate (Portuguese (Brazil))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/pt_BR/
2026-04-07 20:47:37 +02:00
objecttothis
149c27d60f
Translated using Weblate (Polish)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/pl/
2026-04-07 20:47:37 +02:00
objecttothis
57b7705cd4
Translated using Weblate (Dutch)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/nl/
2026-04-07 20:47:37 +02:00
objecttothis
e8951422c0
Translated using Weblate (Dutch (Belgium))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/nl_BE/
2026-04-07 20:47:37 +02:00
objecttothis
8afc57fcf4
Translated using Weblate (Lao)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/lo/
2026-04-07 20:47:37 +02:00
objecttothis
7af64a9a21
Translated using Weblate (Khmer (Central))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/km/
2026-04-07 20:47:37 +02:00
objecttothis
46d5781498
Translated using Weblate (Italian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/it/
2026-04-07 20:47:37 +02:00
objecttothis
66b61c0554
Translated using Weblate (Indonesian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/id/
2026-04-07 20:47:37 +02:00
objecttothis
6b97131c48
Translated using Weblate (Hungarian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/hu/
2026-04-07 20:47:37 +02:00
objecttothis
a4c19a3c2c
Translated using Weblate (Croatian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/hr/
2026-04-07 20:47:37 +02:00
objecttothis
7ca8c9561a
Translated using Weblate (Hebrew)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/he/
2026-04-07 20:47:37 +02:00
objecttothis
4fac5d9198
Translated using Weblate (French)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/fr/
2026-04-07 20:47:37 +02:00
objecttothis
221995b6db
Translated using Weblate (Persian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/fa/
2026-04-07 20:47:37 +02:00
objecttothis
91dbe5b869
Translated using Weblate (Spanish (Mexico))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/es_MX/
2026-04-07 20:47:37 +02:00
objecttothis
afd908327b
Translated using Weblate (Spanish)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/es/
2026-04-07 20:47:37 +02:00
objecttothis
cfde66481d
Translated using Weblate (English (United Kingdom))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/en_GB/
2026-04-07 20:47:37 +02:00
objecttothis
80f00c8552
Translated using Weblate (German)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/de/
2026-04-07 20:47:37 +02:00
objecttothis
dbdf4db4fb
Translated using Weblate (German (Switzerland))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/de_CH/
2026-04-07 20:47:37 +02:00
objecttothis
64004db271
Translated using Weblate (Danish)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/da/
2026-04-07 20:47:37 +02:00
objecttothis
7f20a5dd4c
Translated using Weblate (Czech)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/cs/
2026-04-07 20:47:37 +02:00
objecttothis
d7a276b488
Translated using Weblate (Bulgarian)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/bg/
2026-04-07 20:47:37 +02:00
objecttothis
57dbe43313
Translated using Weblate (Azerbaijani)
...
Currently translated at 87.5% (7 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/az/
2026-04-07 20:47:37 +02:00
objecttothis
6f1c39d99e
Translated using Weblate (Arabic (ar_LB))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ar_LB/
2026-04-07 20:47:37 +02:00
objecttothis
45902caa67
Translated using Weblate (Arabic (Egypt))
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/ar_EG/
2026-04-07 20:47:37 +02:00
objecttothis
1fe865a100
Translated using Weblate (English)
...
Currently translated at 100.0% (8 of 8 strings)
Translation: opensourcepos/bootstrap_tables
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/bootstrap_tables/en/
2026-04-07 20:47:37 +02:00
Ollama
8da4aff262
fix(security): prevent command injection in sendmail path configuration
...
Add validation for the mailpath POST parameter to prevent command injection
attacks. The path is validated to only allow alphanumeric characters,
underscores, dashes, forward slashes, and dots.
- Required mailpath when protocol is "sendmail"
- Validates format for all non-empty mailpath values
- Blocks common injection vectors: ; | & ` $() spaces newlines
- Added mailpath_invalid translation to all 43 language files
- Simplified validation logic to avoid redundant conditions
Files changed:
- app/Controllers/Config.php: Add regex validation with protocol check
- app/Language/*/Config.php: Add mailpath_invalid error message (43 languages)
- tests/Controllers/ConfigTest.php: Unit tests for validation
2026-04-06 18:37:07 +00:00
Nozomu Sasaki (Paul)
85c7ce2da4
Fix negative price/quantity/discount validation (GHSA-wv3j-pp8r-7q43) ( #4450 )
...
* Fix business logic vulnerability allowing negative sale totals (GHSA-wv3j-pp8r-7q43)
Add server-side validation in postEditItem() to reject negative prices,
quantities, and discounts, as well as percentage discounts exceeding 100%
and fixed discounts exceeding the item total. Also block sale completion
with negative totals in non-return mode to prevent fraud/theft.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* Fix: exempt return mode from negative quantity validation
Return mode legitimately stores items with negative quantities.
The quantity validation now skips the non-negative check in return mode,
consistent with the existing return mode exemption in postComplete().
Also use abs() for fixed discount comparison to handle return quantities.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* Refactor: use $rules + validate() pattern per review feedback
Address review comments from jekkos on PR #4450 :
1. Use CI4 $rules variable with custom non_negative_decimal validation
rule instead of manual if-checks for price/discount validation.
2. Add validation error strings to all 44 non-English language files
(English fallback values used until translations are contributed).
3. Use validate() method with $messages array for localized error
display, maintaining the existing controller pattern.
Additional improvements:
- Add non_negative_decimal rule to OSPOSRules.php (leverages
parse_decimals() for locale-aware decimal parsing)
- Preserve manual checks for business logic (return mode quantity
exemption, discount bounds via bccomp)
- Fix PHP 8.1+ compatibility: avoid passing method return to reset()
- Explicit empty discount handling for bc-math safety
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* Fix: rename to nonNegativeDecimal (PSR), clear non-English translation strings
- Rename validation rule method non_negative_decimal → nonNegativeDecimal in
OSPOSRules.php and all $rules/$messages references in Sales.php (PSR naming
per @objecttothis review)
- Replace English fallback text with "" in 43 non-English language files so
CI4 falls back to the base language string; weblate will handle translations
(per @jekkos and @objecttothis agreement)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
---------
Co-authored-by: Paul <morimori-dev@github.com >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
Co-authored-by: objecttothis <17935339+objecttothis@users.noreply.github.com >
2026-04-03 14:49:42 +04:00
Ollama
71eb8de7fe
feat: Improve migration UX on login page
...
- Show 'Database Migration Required' heading instead of welcome message when migrations pending
- Add warning alert explaining credentials needed to authorize migration
- Change button text from 'Go' to 'Migrate' during migration flow
- Add language strings for clear migration messaging
This makes it clear to the user that they are performing a migration
authorization step (not a regular login), and will need to re-authenticate
after migrations complete.
2026-04-02 06:50:38 +00:00
Ollama
7180ec33e8
Add Calendar.php translations for missing languages
...
- es-MX: Spanish (Mexico) calendar translations
- nb: Norwegian Bokmål calendar translations
- he: Hebrew calendar translations
- ml: Malayalam calendar translations
- tl: Tagalog calendar translations
- ar-EG: Arabic (Egypt) calendar translations
- ka, lo, ur: Empty placeholders (cannot translate these languages)
2026-04-01 13:01:54 +00:00
Ollama
496c8a8262
Remove English fallbacks from non-English translations
...
Use empty strings for sale_not_found in Khmer, Malayalam, and Urdu
as these languages cannot be translated by this model.
2026-04-01 13:01:54 +00:00