Files
orderPRO/.paul/phases/118-fakturownia-single-instance/118-01-PLAN.md
Jacek Pyziak 8f14851d85 feat(118): fakturownia single instance
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>
2026-05-12 20:37:19 +02:00

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
database/migrations/20260512_000109_fakturownia_single_instance.sql
src/Modules/Settings/FakturowniaIntegrationRepository.php
src/Modules/Settings/FakturowniaIntegrationController.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
DOCS/DB_SCHEMA.md
DOCS/ARCHITECTURE.md
DOCS/TECH_CHANGELOG.md
true off
## Goal Convert Fakturownia from a multi-account integration to one global integration instance, like HostedSMS/SMSPLANET.

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 Skills

No 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 invoices rows or invoice PDF rendering.
  • Do not add invoice.created automation 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.
Before declaring plan complete: - [ ] `C:\xampp\php\php.exe bin\migrate.php` - [ ] `C:\xampp\php\php.exe -l` for all touched PHP files - [ ] Manual UI smoke: integrations hub, Fakturownia settings save, Fakturownia test - [ ] Manual UI smoke: invoice config create/edit for local and delegated modes - [ ] Delegated invoice issue still calls Fakturownia with the global account - [ ] DOCS/DB_SCHEMA.md, DOCS/ARCHITECTURE.md, DOCS/TECH_CHANGELOG.md updated - [ ] `sonar-scanner` run after APPLY if available in PATH

<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>
After completion, create `.paul/phases/118-fakturownia-single-instance/118-01-SUMMARY.md`.