Skip to content

Release/4.4.1#325

Merged
lukas-staab merged 35 commits into
mainfrom
release/4.4.1
Jun 30, 2026
Merged

Release/4.4.1#325
lukas-staab merged 35 commits into
mainfrom
release/4.4.1

Conversation

@lukas-staab

Copy link
Copy Markdown
Member

Checklist for @DieMichii

  • Languaging
  • automated Testing
  • Documentation
  • Version bump (composer) and Version Tag
  • Changelog written

Changelog:

FIXME

lukas-staab and others added 30 commits June 19, 2026 10:52
- Rename bin scripts to PATH-friendly commands (drop .sh, stufis- prefix):
  setup.sh -> stufis-setup, update-stufis.sh -> stufis-update,
  rebuild-stufis.sh -> stufis-rebuild, common.sh -> stufis-common.
- Refocus stufis-rebuild on production caching: it now clears and warms the
  caches and rebuilds assets, without reinstalling dependencies (that overlap
  with stufis-setup is gone).
- Add shared rebuild_caches() helper using 'php artisan optimize'. config:cache
  is safe again (the markdown config is serializable), so the previously
  skipped config caching is back in.
- Update README + Hostsharing docs to the new command names.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…yout

- Added unit tests for `Linkify::segments()` with various scenarios including project references, URLs, and HTML entities.
- Improved layout of the transaction view by tweaking element order and border styles.
…basis handling

- Updated validation rules in project state classes to use `Rule::exists()` for consistency and improved maintainability.
- Renamed `recht-additional` to `recht_additional` to match the updated database schema.
- Added regression tests to ensure correct handling and persistence of legal basis fields (`recht` and `recht_additional`).
Add an ISO 20022 CAMT upload path alongside the existing CSV import,
sharing the same route and uploader; the format is auto-detected on
upload and branches the parse step. CAMT needs no column mapping —
rows are parsed into the BankTransaction shape via a fixed identity
mapping and fed through the existing save() pipeline (running-balance
calculation, Auslagen hookZahlung, redirect/flash).

- New genkgo/camt dependency; parsing isolated in App\Support\Import\
  CamtImportParser (booked-only entries, signed amounts, counterparty
  by direction, opening/closing balance incl. PRCD/ITBD fallback).
- Extract CsvImportParser from the component for symmetry.
- CAMT validation rules (App\Rules\CamtImport): account-IBAN sanity
  check, statement balance consistency, and saldo continuity; saldo is
  anchored to the statement opening balance.
- Rename the component/route from csv-import to manual-import and
  neutralise CSV-specific wording; add a CAMT recommendation callout.
- Tests + fixtures for camt.052/053 incl. sort, pending-skip,
  no-balance, parse-error and mismatch cases; changelog entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… cleanup

- Adjusted demo data SQL file to align with fiscal year logic, including dynamic year shifting for accurate date alignment.
- Replaced simplistic string substitution with regex-based year handling to prevent unintended replacements.
- Enhanced seeding by ensuring directory cleanup (`auslagen`) removes all contents before re-seeding, avoiding duplication or nesting issues.
…ility of encrypted fields

- Introduced `stufis:check-encryption` console command to check if encrypted model attributes can be decrypted using the current `APP_KEY`.
- Helps surface encryption mismatches early, avoiding runtime errors caused by invalid ciphertext.
- Supports filtering by model and configurable sample size for failing primary keys.
…bookings

- Introduced null coalescence in `TransactionView` controller and Blade template to handle nullable `expensesReceiptPost` and `receipt` fields safely.
- Enhanced error handling in `RestHandler` to address cases of missing `Haushaltstitel`, preventing silent failures during transaction processing.
…ct and tests

- Added exception handling for `InvalidStateException` in `bootstrap/app.php` to redirect users to the login page instead of returning a 500 error.
- Prevented logging of `InvalidStateException` as an error, treating it as a user-flow condition.
- Introduced tests to validate proper redirection and suppression of error reporting for `InvalidStateException`.
… environments

- Added `bin/artisan` script to run Laravel Artisan with a pinned PHP version (`php8.4`) for compatibility with Hostsharing's versioned binaries.
- Enabled Symfony shell completion by making `artisan` executable on PATH.
- Implemented static bash completion pre-generation for `artisan`, sourced during interactive shell logins.
- Updated `setup_profile` to export `PHP_VERSION`, set PATH for bin, and integrate `artisan` tab completion if available.
The state rules keyed the protocol field as `protocol`, but the data key and
DB column are `protokoll`, so $validator->validate() dropped it and the value
was never saved. Align the rule (and the validation attribute name) to
`protokoll`.

Also remove the unused `project.protocol_url.prefix` setting (defaults +
config migration) — the protocol link is stored as a full URL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add two creation flows to the edit-project component via the `sourceId` +
`sourceKind` URL params (entry-only; ignored/validated server-side):

- copy: duplicate a project as a fresh draft in the same budget plan,
  carrying meta, posts and attachments (files duplicated on save).
- leftovers: carry the unspent remainder of a *terminated* project into a
  new draft in the latest budget plan, remapping each post's Titel across
  plans by the stable titel_nr (unmatched -> empty Titel).

Changing the budget plan now live-remaps every post's Titel too. The origin
is persisted via new nullable `projekte.source_id`/`source_kind` columns
(self-FK, nullOnDelete) and rendered as a clickable "P#<id>" backlink.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Relocate the status-change action into the "…" menu and make the whole
  state card a click target (frosted "Status ändern" hover overlay).
- Make the budget-plan card a clickable link to the legacy plan view.
- Show neutral (gray) summary cards and a "–" ratio when a side has no
  budget, instead of a misleading warning colour / "0 %".
- Rename the available cards to "Ungenutzte Ausgaben" / "Ausgefallene
  Einnahmen" for terminated projects.
- Append copy/leftover references (back- and forward-links) to the header
  meta line as clickable P#<id> badges.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… and therefore not rendered properly. Also introducing a command to invalidate cached Belege PDFs
lukas-staab and others added 5 commits June 23, 2026 11:19
Replace the read-only /config dump with an admin-gated Livewire settings
editor (pages::settings) for the runtime Setting keys. Split the app-config
ability into view-app-configuration (open) and update-app-configuration (save).

Wire the previously-dormant project.description.min_length/max_length into
project validation via DescriptionLengthRule: counts only visible characters
(HTML stripped), with max -1 disabling the upper bound and min 0 the lower.
Default max_length is now -1 (unlimited) in defaults() and the legacy import.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a legal_bases (Rechtsgrundlagen) editor to the settings page: add / edit /
activate rows with drag-and-drop ordering via Livewire 4 wire:sort (persisted as
sort_order on save). Slug is read-only once created, and a basis still referenced
by a project cannot be deleted (deactivate instead) to keep project lookups intact.

Remove the finance_mail setting: nothing consumed it, and the legacy import even
read the wrong key, so it only ever stored an empty string.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Prefer the refs/tags/ namespace and check out detached when deploying a
specific ref, so a release tag never resolves ambiguously to a stale
local branch of the same name (e.g. v4.4.0 tag vs v4.4.0 branch). This
also stops accumulating same-named local branches on the prod box.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lukas-staab lukas-staab merged commit cd93021 into main Jun 30, 2026
5 checks passed
@lukas-staab lukas-staab deleted the release/4.4.1 branch June 30, 2026 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants