--- phase: 117-smsplanet-integration plan: 01 completed: 2026-05-12 status: complete-with-environment-gaps --- # Summary: SMSPLANET Integration Settings + Test SMS ## Result Implemented the first SMSPLANET integration slice: one global configuration screen, encrypted credentials, support for Bearer token and key + password authorization, hub visibility, and a real test SMS flow using `POST https://api2.smsplanet.pl/sms`. The implementation also fixes the integration settings checkbox/radio layout reported during UAT by moving the options into the existing compact SCSS component. ## Acceptance Criteria | AC | Status | Notes | |----|--------|-------| | AC-1 Configuration save | PASS | `SmsplanetIntegrationRepository` stores one global row, encrypts token/key/password, and never returns secrets to the view. | | AC-2 Two auth methods | PASS | Bearer token sends `Authorization: Bearer ...`; key + password sends credentials in form payload. First save requires complete credentials for the selected method. | | AC-3 Validation | PASS | Save/test validate CSRF, sender, selected auth method, phone number and message length before API calls. | | AC-4 Real test SMS | IMPLEMENTED, MANUAL PENDING | API client performs real send and does not set `test=1`. Manual live send is pending because local DB/migration verification was blocked. | | AC-5 Hub visibility | PASS | `IntegrationsHubController` includes SMSPLANET with configuration, secret, active and last-test status. | | AC-6 Docs/compliance | PASS WITH TOOLING GAPS | DOCS and `.paul/codebase` updated. PHP lint/build passed. Migration, PHPUnit and Sonar were blocked by local tooling/environment. | ## Verification Passed: - `C:\xampp\php\php.exe -l` for all new/modified PHP files in this phase. - `npm run build --if-present`. - `git diff --check`. Blocked or unavailable: - `C:\xampp\php\php.exe bin\migrate.php` failed because local MySQL refused the connection: `SQLSTATE[HY000] [2002]`. - `vendor\bin\phpunit` was not available: `Could not open input file`. - `sonar-scanner` was not available in PATH. - Manual real SMSPLANET send remains pending until the migration is applied and valid SMSPLANET credentials are tested. ## Deviations - `api_key` is stored as `api_key_encrypted` rather than plaintext. This is stricter than the draft task and consistent with the requirement that credentials are secrets. - `IntegrationSecretCipher` had an invalid namespace import and was fixed because SMSPLANET and existing integrations depend on it at runtime. - Checkbox/radio UI was adjusted in `resources/scss/app.scss` after the UAT screenshot showed inconsistent native control sizing/alignment. ## Files Changed - `.paul/codebase/architecture.md` - `.paul/codebase/db_schema.md` - `.paul/codebase/tech_changelog.md` - `.paul/phases/117-smsplanet-integration/117-01-PLAN.md` - `.paul/phases/117-smsplanet-integration/117-01-SUMMARY.md` - `DOCS/ARCHITECTURE.md` - `DOCS/DB_SCHEMA.md` - `DOCS/TECH_CHANGELOG.md` - `database/migrations/20260512_000108_create_smsplanet_integration_settings.sql` - `resources/lang/pl.php` - `resources/scss/app.scss` - `resources/views/settings/smsplanet.php` - `routes/web.php` - `src/Modules/Settings/IntegrationSecretCipher.php` - `src/Modules/Settings/IntegrationsHubController.php` - `src/Modules/Settings/SmsplanetApiClient.php` - `src/Modules/Settings/SmsplanetIntegrationController.php` - `src/Modules/Settings/SmsplanetIntegrationRepository.php` ## Follow-Up - Start local MySQL/XAMPP and run `C:\xampp\php\php.exe bin\migrate.php`. - Save real SMSPLANET credentials and run both manual test paths: Bearer token and key + password. - Run Sonar once `sonar-scanner` is available.