Phase 118 complete: - migration 20260512_000109 adds single global Fakturownia settings row - FakturowniaIntegrationRepository simplified to one-instance API - FakturowniaIntegrationController + edit view collapsed to one settings page - Integrations hub shows Fakturownia as single instance - Invoice config delegated flow always uses global integration_id Note: shared routes/web.php and DOCS/* updates from Phase 118 are bundled into the follow-up feat(121+122) commit because Phase 121/122 modified the same files; hunk-level split was not performed. Co-Authored-By: Claude <noreply@anthropic.com>
10 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
| phase | plan | type | wave | depends_on | files_modified | autonomous | delegation | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 118-fakturownia-single-instance | 01 | execute | 1 |
|
true | off |
Purpose
The operator should configure Fakturownia once. Invoice configs may still delegate invoice issuing to Fakturownia, but they must all point to the single global Fakturownia integration row.
Output
One migration, one single-instance repository/controller/UI flow, updated invoice config handling, and updated technical documentation.
- **Migracja** - Co zrobic z istniejacymi wieloma kontami Fakturowni, jesli sa juz w bazie? -> Odpowiedz: Wybrac aktywne konto. - **Kontrakty** - Czy delegowane konfiguracje faktur maja nadal trzymac `integration_id`, ale zawsze wskazywac jedyna globalna Fakturownie? -> Odpowiedz: Tak. - **UI** - Jak ma wygladac UI Fakturowni? -> Odpowiedz: Jedna strona z formularzem konfiguracji i testem polaczenia, bez dodawania wielu instancji.Project Context
@.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md @DOCS/DB_SCHEMA.md @DOCS/ARCHITECTURE.md
Source Files
@src/Modules/Settings/FakturowniaIntegrationRepository.php @src/Modules/Settings/FakturowniaIntegrationController.php @src/Modules/Settings/HostedSmsIntegrationRepository.php @src/Modules/Settings/IntegrationsHubController.php @src/Modules/Settings/InvoiceConfigRepository.php @src/Modules/Settings/InvoiceConfigController.php @src/Modules/Accounting/InvoiceService.php @resources/views/settings/fakturownia.php @resources/views/settings/fakturownia-edit.php @resources/views/settings/accounting-invoice-edit.php @routes/web.php
Prior Work
@.paul/phases/113-fakturownia-integration/113-01-SUMMARY.md @.paul/phases/114-accounting-configs-refactor/114-01-SUMMARY.md @.paul/phases/115-invoice-from-order/115-01-SUMMARY.md @.paul/phases/116-hostedsms-integration/116-01-SUMMARY.md
## Required SkillsNo blocking skills before APPLY.
Project SPECIAL-FLOWS requires sonar-scanner after APPLY and before UNIFY when available in PATH.
<acceptance_criteria>
AC-1: Jedna globalna konfiguracja Fakturowni
Given the operator opens /settings/integrations/fakturownia
When the page renders
Then there is one settings form with save and test actions, and no UI for adding, listing, or deleting multiple Fakturownia accounts
AC-2: Migracja wybiera aktywna instancje
Given multiple integrations with type "fakturownia" exist before migration
When the migration runs
Then the active integration is preserved as the single global row, invoice_configs.integration_id values are reassigned to it, settings are preserved for that row, and extra unused Fakturownia rows are removed or detached safely
AC-3: Delegacja faktur pozostaje kompatybilna
Given an invoice config has is_delegated = 1
When it is saved or used to issue an invoice
Then it points to the single global Fakturownia integration_id and InvoiceService can still call Fakturownia without schema changes
AC-4: Hub integracji pokazuje pojedynczy status
Given the integrations hub is opened
When Fakturownia row is displayed
Then it shows one provider row with configured/active/token/test status for the global instance, not a count of instances
AC-5: Dokumentacja jest aktualna
Given the implementation is complete
When DOCS are reviewed
Then DB_SCHEMA, ARCHITECTURE, and TECH_CHANGELOG describe Fakturownia as a fixed single-instance integration and note the migration behavior
</acceptance_criteria>
Task 1: Add single-instance migration database/migrations/20260512_000109_fakturownia_single_instance.sql, DOCS/DB_SCHEMA.md Create an idempotent migration that enforces the single-instance Fakturownia model without dropping existing invoice history. - Pick the preserved row by priority: active Fakturownia integration first, then the one referenced by invoice_configs, then the lowest id. - Ensure a base integrations row exists with type=fakturownia and name=Fakturownia if none exists. - Ensure one fakturownia_integration_settings row exists for the preserved integration. - Reassign invoice_configs.integration_id for delegated configs to the preserved integration. - Remove extra fakturownia_integration_settings/integrations rows only after reassignment, using prepared migration SQL and FK-safe order. - Add/adjust constraints so settings are fixed to id=1 when feasible without breaking MySQL compatibility. Avoid: deleting invoices, changing invoices.config_id, or removing the invoice_configs.integration_id column. C:\xampp\php\php.exe bin\migrate.php on a database with zero, one, and multiple Fakturownia rows; inspect integrations/fakturownia_integration_settings/invoice_configs after migration. AC-2 and AC-3 satisfied. Task 2: Refactor Fakturownia repository/controller/UI to single settings page src/Modules/Settings/FakturowniaIntegrationRepository.php, src/Modules/Settings/FakturowniaIntegrationController.php, resources/views/settings/fakturownia.php, resources/views/settings/fakturownia-edit.php, routes/web.php, src/Modules/Settings/IntegrationsHubController.php Replace the multi-account behavior with HostedSMS-style single settings behavior. - Repository exposes getSettings(), saveSettings(), getCredentials()/getDecryptedToken() and getIntegrationId() for the fixed integration. - Save updates the single integration row and single settings row; empty token preserves the old encrypted token. - Controller index renders one page with the form and test panel; save/test redirect back to /settings/integrations/fakturownia. - Remove or neutralize /new, /edit, /delete routes and links for Fakturownia. - Hub row uses the single settings object and no longer displays instance counts. Avoid: native alert()/confirm(), inline CSS in new view code, and SQL string concatenation. C:\xampp\php\php.exe -l on touched PHP files; manually open /settings/integrations and /settings/integrations/fakturownia, save settings, and run connection test. AC-1 and AC-4 satisfied. Task 3: Keep invoice config delegation compatible with the global integration src/Modules/Settings/InvoiceConfigRepository.php, src/Modules/Settings/InvoiceConfigController.php, src/Modules/Accounting/InvoiceService.php, resources/views/settings/accounting-invoice-edit.php, DOCS/ARCHITECTURE.md, DOCS/TECH_CHANGELOG.md Update invoice config handling so delegated configs always use the single Fakturownia integration. - When saving delegated invoice configs, ignore user-supplied multi-account choice and resolve the global Fakturownia integration_id from the repository. - Simplify accounting invoice edit UI so delegation does not show a multi-account selector; show a compact hint/status that Fakturownia must be configured globally. - Ensure InvoiceService still reads config integration_id and retrieves credentials through the updated repository. - Update docs and changelog with new single-instance contract and migration behavior. Avoid: schema removal of invoice_configs.integration_id and behavior changes for local non-delegated invoice configs. C:\xampp\php\php.exe -l on touched PHP files; create/edit local and delegated invoice configs; issue a delegated invoice against a configured Fakturownia account in manual UAT. AC-3 and AC-5 satisfied.DO NOT CHANGE
- Do not remove
invoice_configs.integration_id. - Do not change existing
invoicesrows or invoice PDF rendering. - Do not add
invoice.createdautomation event. - Do not implement Fakturownia double-POST idempotency in this plan.
- Do not change HostedSMS/SMSPLANET behavior.
SCOPE LIMITS
- This plan only changes Fakturownia account configuration from multi-instance to single-instance.
- Existing delegated invoice issuing remains functionally the same after it resolves the global account.
- Live Fakturownia API testing depends on operator credentials and network access.
<success_criteria>
- Fakturownia has exactly one configurable instance from the UI.
- Migration preserves one active Fakturownia row and rewires delegated invoice configs to it.
- No route or view offers adding/deleting multiple Fakturownia accounts.
- Delegated invoice configs and delegated invoice issuing remain compatible.
- All verification checks pass or environment-dependent gaps are documented in SUMMARY.md. </success_criteria>