* Migrated the Currency module to Doctrine
* Caching and other improvements
* Types, error handling and other improvements
* Don't return false but throw an exception
* Types
* Refactor currency model usage to new Currency entity
* Remove Fastnetmon submodule
Deleted the Fastnetmon submodule from src/modules. This change may be part of a cleanup or migration away from using Fastnetmon as a submodule.
* Refactor currency API admin get test
* Fix failing Currency-related tests after Doctrine migration
Updated test files to work with the new Doctrine-based Currency implementation.
* Refactor currency retrieval to use repository
* Refactor Currency database handling in several services and tests
* Replace anonymous class mocks with standard PHPUnit mocks in Invoice tests (#3037)
* Refactor currency retrieval and currency service
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Confirm updateCurrencyRates() method signature alignment (#3034)
* Add null check for currency in Cart::toApiArray to prevent fatal error (#3035)
* Initial plan
* Add null check for currency in toApiArray method
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Initial plan
* Replace anonymous class mocks with standard PHPUnit mocks for consistency
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: Adam Daley <admdly@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix incorrect getRateByCode call in Order service (#3039)
* Initial plan
* Fix getRateByCode call and add null check with proper exception
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix silent failure in Currency::getBaseCurrencyRate when currency not found (#3040)
* Initial plan
* Throw exception when currency not found in getBaseCurrencyRate
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Use FOSSBilling\Exception for currency conversion rate failures (#3041)
Use FOSSBilling\Exception for conversion rate fetch failures
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Remove problematic reflection usage in Cart service tests (#3042)
Remove problematic reflection usage in Cart test
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Update tests-legacy/modules/Cart/Api/GuestTest.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Entity/Currency.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Use FOSSBilling\Exception for null currency check in Cart service (#3058)
* Initial plan
* Use FOSSBilling\Exception for null currency check in Cart service
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Use consistent error message for default currency not found
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Remove silent fallback in CurrencyRepository::findDefault() (#3057)
* Add logging for default currency fallback behavior
- Log warning when no default currency is found and falling back to ID 1
- Log critical error when neither default currency nor ID 1 exists
- Clarify return type documentation
- Cache result even if null to avoid repeated warnings
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Remove silent fallback to currency ID 1 in findDefault()
Instead of silently falling back to currency ID 1 when no default
is found, the method now returns null and lets callers handle it.
This addresses the feedback about the silent fallback hiding
configuration issues. All existing callers already properly handle
null by throwing exceptions, so this change makes the error
visible rather than hidden.
Benefits:
- No silent failures hiding misconfiguration
- Cleaner separation of concerns (repositories for data access only)
- Better adherence to Doctrine repository pattern
- All callers already handle null appropriately
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Remove redundant documentation in findDefault()
Simplified @return annotation to avoid redundancy with the description.
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix Currency entity getId() to handle uninitialized state (#3059)
Make Currency::getId() return nullable int to prevent runtime errors
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Remove static cache from CurrencyRepository to fix long-running process issues (#3061)
* Initial plan
* Remove static cache from CurrencyRepository to fix long-running process issues
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix inconsistent null handling in CurrencyRepository::getRateByCode callers (#3062)
* Fix null handling in Invoice/Service.php getRateByCode call
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix Invoice test to mock getRateByCode with valid return value
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor Qwen `settings.json` structure and update version
* Verify null handling consistency in CurrencyRepository::getRateByCode (#3073)
Initial plan
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* Update src/modules/Order/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Repository/CurrencyRepository.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Improve return type annotation for Currency Admin API get_pairs method (#3075)
* Initial plan
* Improve return type annotation for get_pairs method in Currency Admin API
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix return type description to accurately reflect the return format
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix nullable type inconsistency in Currency entity setCode/getCode methods (#3074)
* Initial plan
* Fix nullable type in Currency entity setCode and getCode methods
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix PHPUnit test failures by updating mock return values for getCode
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Restore deleted Cart API Guest tests for Doctrine Currency migration (#3076)
* Initial plan
* Restore deleted Cart API Guest tests and update for Doctrine Currency migration
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix testAddItemSingle mock to return boolean instead of cart object
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor currency handling in `Cart` and `Invoice` services
Updated `Cart` and `Invoice` services to consistently use `CurrencyRepository` for retrieving currency entities and default currency. Improved error handling for missing currencies and updated related tests to mock new repository methods. Also fixed minor typos and improved code clarity in tests.
* Refactor currency handling in `Cart` Service
Replaced direct property access of currency code and conversion rate with getter methods in `Cart` Service. This improves encapsulation and consistency when handling currency-related operations.
* Update src/modules/Cart/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update tests-legacy/modules/Order/ServiceTest.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Service.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/modules/Currency/Entity/Currency.php
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix exception signature and type hint in `Currency` service
Updated the exception thrown in `validateCurrencyForma`t to include a null second parameter for compatibility. Also added a return type to the closure in `Cart` `ServiceTest` for better type safety.
* Refactor currency selection logic in `Cart` Service
Improves clarity by separating client currency retrieval and default currency fallback. Ensures that the default currency is only checked and exception thrown if both client and default currencies are unavailable.
* Add precision handling and caching for Currency conversionRate property (#3082)
* Add documentation and caching for conversionRate precision handling
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Use sprintf for float-to-string conversion to avoid scientific notation
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix Doctrine identity map caching issue when changing default currency (#3081)
* Fix Doctrine identity map caching issue in setAsDefault method
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Store currency code before clearing identity map to avoid detached entity access
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix PHPUnit test for setAsDefault method by mocking findOneByCode and clear
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor currency test mocks for static data providers
Replaces direct mock object creation in static data providers with string flags or placeholders, enabling proper mock instantiation within test methods. Updates test signatures and logic to handle these flags, improving test maintainability and compatibility with PHPUnit static context constraints.
---------
Co-authored-by: Adam Daley <admdly@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor tests to replace depreciated functions
* Update Rector config and dependencies
* Rector: Add explicit string casting for stricter type safety
* Rector: Add return type hints to methods across codebase
* Rector: Increase dead code level and refactor invoice item logic
* Remove unnecessary `willReturn` from test mocks
Eliminate redundant `willReturn(null)` and similar calls from PHPUnit mock setups in legacy module tests, leaving only method expectations. Also update some test values to use floats for consistency.
* Refactor API controller and email adapter return values
* Update formatting and guidelines in `AGENTS.md`
* Update CI for PHP 8.4
* Update composer deps for PHP 8.4
* Updates
* This is the default mode and this constant causes test failutes
* Explicily install the PDO extensions
* Temporarily downgrade the live tests to PHP 8.3
It would seem that there is some kind of problem with PHP 8.4 in regards to these tests. I believe it is outside of our control however as it installs fine for me with PHP 8.4 under DirectAdmin
* Update to address deprecations
* Make that nullable
* Fixed my typo
* Bump PHPunit to v11
* Also take care of two minor things
* Formatting fix
* Wrote a few more tests, improvements
* Ran Rector & PHP-CS-Fixer
* Append a capital letter to the test client passwords
* Minor tweaks
* Display more info after the tests run
* Oops, I forgot to set the dir
* Fix cron behavior for test env, dropped legacy tests
* Rename the empty test suite so PHPUnit ignores it
* Update cspell.json
* Minor tweaks to the tests
* Fixes
* Rename tests to tests-legacy
* Groundwork for live tests
* Somewhat working tests on a live instance
* Hmmmmmm
* Fix
* Fixed the other bug
* Added a handful of various tests
* Typos, all these are admin endpoints
* Bypass this check for testing envs
* Disable it for now
* Mini cleanup
* Cleanup from debugging, ran PHP-CS-Fixer