Wie wir eine komplette Buchhaltung in einem Tag aus FileMaker rausgehoben haben
*Doppelte BuchfĂŒhrung, Mandanten-Verwaltung, FM-Inbox mit Beleg-Anhang, Auswertungen mit Charts, DATEV-Export â alles in zehn Stunden mit PHP, SQLite, Bootstrap und ein bisschen FileMaker-Klebstoff. Und vor allem: in einem Bruchteil der Zeit, die das in FileMaker selbst gedauert hĂ€tte. Eine kleine Geschichte ĂŒber Hybrid-Architektur, das richtige Werkzeug fĂŒr das richtige Problem â und warum âmit FileMaker geht alles" zwar stimmt, aber nicht immer schlau ist.* --- ## Ausgangslage: âWir brĂ€uchten noch eine Buchhaltung" Manche KundenwĂŒnsche kommen wie aus dem Nichts. Du sitzt im AuftragsabschlussgesprĂ€ch, das CRM steht, die Rechnungen laufen sauber durch, der Workflow fĂŒr Angebote und AuftrĂ€ge wurde diese Woche live geschaltet â und dann kommt der Satz: *âEigentlich brĂ€uchten wir auch noch eine Buchhaltung. Doppelt, mit Soll und Haben. Und mit Mandanten, weil wir Schweiz und Deutschland getrennt fĂŒhren mĂŒssen. Und Auswertungen wĂ€ren schön. Und ein Export fĂŒr die Steuerberaterin."* Das war der ungefĂ€hre Wortlaut. In FileMaker abgebildet wĂ€re das eine Aufgabe von zwei bis drei Wochen. Tabellenstruktur, Sub-Summary-Sortierungen fĂŒr Reports, Konten-Dropdowns, Soll-Haben-Validierung als Skript, Belege als Container-AnhĂ€nge, irgendwas Custom fĂŒr Mandant-Wechsel, DATEV-Export als CSV-Berechnung. Funktioniert alles, aber jedes StĂŒck ist Handarbeit. Und am Ende ist das Layout so verschachtelt, dass es niemand mehr anfassen will. Wir haben uns fĂŒr einen anderen Weg entschieden: **die Buchhaltung verlĂ€sst FileMaker**. FM bleibt die Heimat der GeschĂ€ftsdaten â Kontakte, Projekte, Rechnungen, Ausgaben. Aber sobald es um doppelte BuchfĂŒhrung, Konten-Management, Auswertungen und Exporte geht, ĂŒbernimmt ein eigenes kleines Web-Modul. Verbunden mit FileMaker ĂŒber eine JSON-API. Das Ganze gebaut in einem Tag, am Ende ein eigenstĂ€ndiges, robustes Modul. ## Die Architektur in einer Skizze ``` FileMaker Buchhaltung (PHP/SQLite) +------------------+ +------------------------+ | T_INVOICES | -- JSON POST -> | /api/inbox.php | | T_EXPENSES | + PDF-base64 | (Token-Auth) | +------------------+ | | v | +------------------------+ | inbox_eintraege | | + inbox_belege | +------------------------+ v +------------------------+ | inbox.php (UI) | | âzu verbuchen" | +------------------------+ v +------------------------+ | buchung_neu.php | | mit Inbox-Prefill | +------------------------+ v +------------------------+ | buchungssaetze | | + buchungszeilen | | + belege (FK-Wechsel) | +------------------------+ v +------------------------+ | Dashboard / Reports / | | Export fĂŒr DATEV | +------------------------+ ``` Drei Bewegungen zwischen den Systemen: 1. **Vom FM-Datensatz in die Inbox** â der User klickt im FileMaker-Layout auf einen Button, das Skript packt die Rechnung als JSON, hĂ€ngt das PDF base64-codiert dran und schickt's an den PHP-Endpoint. 2. **Innerhalb des Web-Moduls** â User (oder Buchhalterin) zieht den Inbox-Eintrag durch den Verbuchungs-Workflow, ordnet Konten zu, speichert. Belege wandern automatisch vom Inbox-Pool zum Buchungssatz. 3. **Vom Web-Modul zur Steuerberatung** â CSV oder DATEV-Buchungsstapel-Format, ein Klick, fertige Datei. FM weiĂ von der Buchhaltung nur die URL und einen Token. Die Buchhaltung weiĂ von FM nur, dass Daten reinkommen können. **Beide Systeme sind unabhĂ€ngig deploybar**, könnten in der Cloud oder lokal laufen, im gleichen Haus oder in verschiedenen. ## Die doppelte BuchfĂŒhrung selbst Doppelte BuchfĂŒhrung ist konzeptionell einfach: Jeder Vorgang trifft mindestens zwei Konten. Eines bekommt einen Soll-Eintrag, das andere einen Haben-Eintrag. **Soll = Haben muss immer gelten**. Das war's. Alle Schönheit kommt aus dieser einen Regel. Das Datenmodell besteht aus fĂŒnf Tabellen â und davon sind zwei nur âStammdaten": ```sql mandanten -- pro Land/Buchhaltungseinheit ein Eintrag konten -- Kontenrahmen pro Mandant kostenstellen -- optional, pro Mandant buchungssaetze -- Kopfdaten eines Buchungssatzes buchungszeilen -- N Zeilen pro Satz, je Soll ODER Haben > 0 belege -- Datei-AnhĂ€nge zum Satz ``` Eine Buchung sieht in den Daten so aus â Beispiel: eine Rechnung ĂŒber CHF 1077 brutto bei 7.7 % MWST: | satz_id | konto | soll | haben | steuer_satz | |---|---|---|---|---| | 42 | 1200 Forderungen | 1077.00 | 0 | 0 | | 42 | 3400 Erlös | 0 | 1000.00 | 7.7 | | 42 | 2200 MWST geschuldet | 0 | 77.00 | 0 | Drei Zeilen mit derselben `satz_id`. Soll-Summe = 1077.00, Haben-Summe = 1077.00. Balanciert. **Die Validierung passiert auf drei Ebenen:** 1. **JavaScript im Frontend** â Live-Update der Summen, Speicher-Button erst aktiv wenn ausgeglichen. Mit ein paar Zeilen Vanilla-JS, ohne Framework. 2. **PHP-seitig vor dem Insert** â der gleiche Check nochmal, damit niemand per direkter API-Manipulation eine Schief-Buchung reinschiebt. 3. **In der Auswertung** â die Saldenliste zeigt ein Soll/Haben-Total ĂŒber alle Konten. Stimmt das nicht auf den Cent, ist irgendwo ein Bug â und wir sehen ihn sofort. Im Frontend ist das Hauptthema die Buchungsmaske. Zwei dynamische Zeilen am Anfang, â+ Zeile"-Button um weitere zu ergĂ€nzen, Konto-Dropdowns pro Zeile, Live-Summe unten, Balance-Indicator. Bootstrap macht das visuelle Heavy-Lifting, JavaScript verwaltet die Zeilen. ```javascript function updateSums() { let s = 0, h = 0; body.querySelectorAll('tr.zeile').forEach(tr => { s += parseNum(tr.querySelector('.soll').value); h += parseNum(tr.querySelector('.haben').value); }); sumSoll.textContent = s.toFixed(2); sumHaben.textContent = h.toFixed(2); const diff = s - h; if (Math.abs(diff) < 0.005) { balLab.innerHTML = 'ausgeglichen'; btnSave.disabled = false; } else { balLab.innerHTML = 'Diff ' + diff.toFixed(2) + ''; btnSave.disabled = true; } } ``` Das ist die ganze Live-Validierung. WĂŒrde man das in FileMaker bauen â mit Trigger-Scripts auf jedem Feld-Commit, einem Custom-Function fĂŒr die Summenberechnung, und Sichtbarkeit-Skripten fĂŒr das âSpeichern"-Button â wĂ€re man eine halbe Stunde beschĂ€ftigt. In Bootstrap + JS sind das fĂŒnfzehn Zeilen. ## Die Inbox: der eigentlich coole Teil FileMaker generiert Rechnungen. Diese Rechnungen mĂŒssen in die Buchhaltung. Aber: FM weiĂ nicht, auf welches Konto. FM weiĂ nicht, ob die Buchhalterin diese Buchung mit âRechnung an Erlös" oder âRechnung an Materialertrag" verbuchen will. FM weiĂ auch nicht, ob's eine separate MWST-Buchung sein soll oder eine Brutto-Buchung. **Lösung: Eingangskorb-Pattern**. FM schickt die Rohdaten in eine Inbox. Die Inbox lebt in der Buchhaltung. Die Buchhalterin sieht alles, was reinkommt â und ordnet beim Verbuchen die Konten zu. So funktionieren ĂŒbrigens auch die meisten echten Buchhaltungs-Programme: GetMyInvoices, Lexoffice, sevDesk, alle haben einen âPosteingang" als ersten Verarbeitungsschritt. Was die FM-Seite zum Posteingang schickt: ```json { "mandant_name": "Aicher Schweiz", "typ": "einnahme", "datum": "2026-05-15", "betrag_brutto": 1077.00, "betrag_netto": 1000.00, "mwst_satz": 7.7, "beschreibung": "Rechnung INV00966 â CRM-Beratung", "beleg_nr": "INV00966", "partner_name": "Beispielkunde GmbH", "fm_quelle_id": "INV00966", "fm_quelle_typ": "invoice", "belege": [{ "filename": "Rechnung_INV00966.pdf", "mime": "application/pdf", "data_base64": "JVBERi0xLjQK..." }] } ``` **Drei Sachen sind hier elegant.** Erstens: Der Mandant wird per **Name** identifiziert, nicht per ID. Die Buchhaltung matched âAicher Schweiz" case-insensitive und whitespace-tolerant gegen ihre Mandanten-Tabelle. Wenn FM den Namen leicht falsch schreibt, gibt die API eine Liste der verfĂŒgbaren Mandanten zurĂŒck. Damit ist FM komplett entkoppelt von der internen Mandant-ID-Vergabe der Buchhaltung. Zweitens: Die `fm_quelle_id` + `fm_quelle_typ` macht **Duplikat-Erkennung trivial**. Wenn jemand zweimal auf den âAn Inbox senden"-Button klickt, bekommt der zweite Request 409 Conflict und einen Hinweis auf die bestehende Inbox-ID. Keine Doppel-Buchungen, kein Stress. Drittens: Der **Beleg geht direkt mit**. Das ist der GoBD-Knaller. âKeine Buchung ohne Beleg" â und hier wandert das Originaldokument von FileMaker als base64-Anhang in den JSON-Payload. PHP dekodiert, speichert die Datei in einem geschĂŒtzten Verzeichnis, verlinkt sie mit dem Inbox-Eintrag. Beim Verbuchen wandern die Belege automatisch zum Buchungssatz mit. Die Steuerberaterin hat zu jeder Buchung das passende PDF â ein Klick im Buchungsdetail, Modal öffnet sich mit dem iframe-PDF-Viewer, fertig. Das Verbuchen aus der Inbox ist dann selbst ein hĂŒbscher Workflow: Klick auf âVerbuchen", Buchungs-Form öffnet sich mit allen BetrĂ€gen vorbefĂŒllt â bei einer Einnahme mit MWST automatisch dreizeilig (Forderung Soll, Erlös Haben Netto, MWST Haben). User wĂ€hlt nur noch die Konten aus den Dropdowns, klickt Speichern, fertig. Der Inbox-Eintrag bekommt Status âgebucht", Belege wandern mit, Verlinkung zum neuen Buchungssatz steht. ## Auswertungen mit Charts: aus 100 PHP-Zeilen Wow-Effekt Reports in FileMaker sind ein bisschen wie Auto-Reifen wechseln im Anzug: geht, fĂŒhlt sich aber nicht richtig an. Sub-Summary-Sortierungen, Trailing-Grand-Summary-Parts, Visualisierungen ĂŒber zusĂ€tzliche Calc-Felder, Charts ĂŒber die WebViewer-KrĂŒcke. In einer Web-Anwendung mit Chart.js sind die gleichen Reports eine Frage von ein paar Zeilen. Die Erfolgsrechnung ist im Kern ein einziges SQL-Statement: ```sql SELECT k.kontonummer, k.bezeichnung, k.typ, ROUND(SUM(bz.soll), 2) AS sum_soll, ROUND(SUM(bz.haben), 2) AS sum_haben FROM buchungszeilen bz JOIN buchungssaetze bs ON bs.id = bz.buchungssatz_id JOIN konten k ON k.id = bz.konto_id WHERE bs.mandant_id = ? AND bs.datum BETWEEN ? AND ? AND k.typ = 'ertrag' GROUP BY k.id ORDER BY k.kontonummer ``` Daraus baut PHP eine Tabelle mit allen ErtrĂ€gen, daneben die Aufwand-Tabelle (gleiches Statement, `typ = 'aufwand'`). Saldo unten als Gewinn oder Verlust. Darunter zwei Chart.js-Doughnuts fĂŒr die Verteilung pro Konto. Tooltips mit Prozent und absolutem Betrag. Total Aufwand fĂŒr die Erfolgsrechnung: ~150 Zeilen PHP + ~80 Zeilen HTML/JS. In FileMaker wĂ€ren das Stunden fĂŒr die Sortierung, Stunden fĂŒr die WebViewer-Charts, Stunden fĂŒr die Tooltip-Logik. Die MWST-Abrechnung ist nochmal so ein Beispiel. Gruppiert pro Steuersatz, getrennt nach Output (was du an die Behörde schuldest) und Input (was du als Vorsteuer zurĂŒckbekommst). Daraus berechnet sich die Zahllast. Das ist ein simples GROUP BY auf `steuer_satz`, mit zwei Sub-Queries fĂŒr Soll auf Aufwand-Konten und Haben auf Ertrag-Konten. Total fĂŒnfzig Zeilen. Das Kontenblatt mit laufendem Saldo und Verlaufschart? **Ein** Loop ĂŒber die chronologisch sortierten Zeilen, in dem sich der Running-Total aktualisiert. Daten an Chart.js ĂŒbergeben, fertig ist der LiquiditĂ€tsverlauf der Bank. ## Belege und Vorschau-Modal: die Kleinigkeit, die alles besser macht Bei der Buchhaltung sind die angeheftenten PDFs nicht Beiwerk, sondern das HerzstĂŒck. Du brauchst sie fĂŒr GoBD, fĂŒr die Steuerberatung, fĂŒr deine eigene KontrollfĂ€higkeit. âWann genau habe ich diese Rechnung erhalten? Was stand drauf?" â Klick auf Vorschau, Modal öffnet sich, PDF wird inline gezeigt. Das macht Bootstrap mit zehn Zeilen JavaScript: ```javascript modalEl.addEventListener('show.bs.modal', (ev) => { const t = ev.relatedTarget; const src = t.getAttribute('data-src'); const isT = t.getAttribute('data-istype'); bodyEl.innerHTML = (isT === 'image') ? '' : '
'; }); ``` Trigger: Klick auf das Beleg-Thumbnail in der Belege-Liste. Browser-eigener PDF-Viewer ĂŒbernimmt das Rendering mit Scroll, Zoom, Suche. Fertig. Bei Bildern entsprechend ein ``. In FileMaker wĂ€re das WebViewer mit `data:`-URLs fĂŒr Bilder (geht), fĂŒr PDFs eine separate Verarbeitung. Plus: die Container-Felder verhalten sich beim Anzeigen oft anders als beim Hochladen. Plus: keine Modal-Logik, sondern ein weiteres Fenster (oder ein Layout-Sprung mit RĂŒck-Skript). ## DATEV-Export: einmal geschrieben, immer froh Die Steuerberaterin braucht die Daten in ihrem Format. Wenn sie mit DATEV arbeitet â und das tun die meisten deutschen Steuerberater â bedeutet das ein **DATEV-Buchungsstapel-CSV im EXTF-Format Version 7**, Windows-1252-codiert, mit einer sehr spezifischen Header-Struktur. Klingt schlimm. Ist es nicht. PHP schreibt die Datei zeilenweise raus, jede Zeile entspricht einem Buchungssatz. EXTF-Header drĂŒber, Spalten-Header drunter, Daten danach. Encoding via `mb_convert_encoding($line, 'Windows-1252', 'UTF-8')`. Done. Die Steuerberaterin importiert das in DATEV unter âStapelverarbeitung â Importieren â Buchungsstapel", und die Buchungen landen genau dort, wo sie hin sollen. Dazu noch ein Standard-CSV-Export (UTF-8 mit BOM, Excel-tauglich) fĂŒr die FĂ€lle, wo's mal kein DATEV ist. Beide Exporte auf einer Seite, Filter fĂŒr Jahr und Quartal, Vorschau der ersten 20 Zeilen, Download-Button. Komplett: vielleicht 300 Zeilen PHP. Das gleiche in FileMaker zu bauen, mit einer Skript-Schleife ĂŒber `Exportiere DatensĂ€tze` mit einem maĂgeschneiderten Feldformat, der Encoding-Konvertierung als CF, dem Header-Voranschreiben mit `Exportiere Feldinhalte` und Datei-Append â eher zwei Tage als zwei Stunden. ## Wo der Hybrid-Ansatz seine Stolperfallen hatte Wenn man so eine Architektur baut, gibt's ein paar Sachen, die man beim ersten Mal trifft. **FileMaker und base64.** Beim ersten Versuch, das PDF aus dem Container-Feld zu base64-codieren, kam aus FM nicht das PDF als base64 â sondern der Wert â4648" als base64. Das ist die RFC-Version, die ich als zweiten Parameter an `Base64EncodeRFC` ĂŒbergeben hatte. In der FM-Version des Kunden gibt's `Base64EncodeRFC` mit zwei Parametern nicht â die Funktion akzeptiert nur einen Parameter und gab anscheinend stillschweigend den zweiten als Ergebnis zurĂŒck. Lustige Fehlersuche. Lösung: `Base64Encode` (ein Parameter) â ZeilenumbrĂŒche sind im Output drin, aber PHP strippt die per Regex vor dem Decoden. Funktioniert seitdem. **FileMaker und UTF-8-BOM.** Beim Editor-Workflow (siehe der separate Doku-System-Blogpost) kam in der WebViewer-URL ein Byte-Order-Mark vor das âhttps://". `%EF%BB%BFhttps://...` â Browser lĂ€dt nichts, weil das keine gĂŒltige URL ist. Quelle des BOM: nicht PHP, nicht der Filesystem, sondern FileMakers `JSONGetElement`. Das Modul hat einfach ein BOM-Zeichen in den extrahierten String gemoppelt. Fix: im WebViewer-URL-Calc alles vor dem ersten âhttp" wegschneiden mit `ZeichenMitte(url; Position(url; "http"; 1; 1); 9999)`. Robust gegen alles, was FileMaker an unsichtbaren Zeichen produzieren könnte. **mPDF und Schrift-Glyphen.** Wir nutzen mPDF im docsystem, das beim Verbuchen mit der Buchhaltung wenig zu tun hat â aber im selben Projekt. Beim ersten Print kamen Wörter wie âsofort" als âsoâort" raus, mit Tofu statt âf". Die mPDF-Helvetica-Bold ist berĂŒchtigt unvollstĂ€ndig. Lösung: `'default_font' => 'dejavusans'`, DejaVu Sans ist Unicode-komplett. **Logo-Pfad: Filesystem vs URL.** Im docsystem hatte ich den Logo-Pfad zuerst als absoluten Filesystem-Pfad gesetzt. Funktioniert fĂŒr mPDF (das von Disk liest), funktioniert nicht fĂŒr den Editor-Browser-Preview (der den Pfad als URL interpretiert). Lösung: URL setzen, die der Browser direkt lĂ€dt und die mPDF per HTTP fetchen kann. Beide Welten happy. Diese Stolperfallen sind alle einmal-und-fĂŒr-immer. Hat man sie verstanden, taucht das gleiche Problem nie wieder auf. Aber beim ersten Mal kostet jede halb bis zwei Stunden Debugging. ## Zeitvergleich: was hĂ€tte FileMaker gekostet Hier ein ehrlicher Aufriss, was die einzelnen Bausteine in reiner FileMaker-Entwicklung gedauert hĂ€tten, basierend auf Erfahrung: | Baustein | FileMaker-Variante | Hybrid (PHP + FM) | |---|---|---| | Datenmodell doppelte BuchfĂŒhrung | 1 Tag (Tabellen + Relationen + Calcs) | 30 Min (SQL CREATE TABLEs) | | Buchungs-Eingabemaske mit Soll/Haben | 2 Tage (Portal-Logik + Trigger + Validation) | 4 Stunden (Bootstrap + Vanilla JS) | | Mandanten-Switcher | 0.5 Tag (Globals + Skripte + Layout-Refreshes) | 30 Min (Session + Helper) | | Konten/Kostenstellen-Verwaltung | 1 Tag | 2 Stunden | | Buchungsliste mit Filtern | 1 Tag | 1 Stunde | | Detail-Ansicht mit Belegen + Vorschau | 1 Tag (WebViewer-Tricks oder Container-Manage) | 1.5 Stunden | | Erfolgsrechnung + Saldenliste | 2 Tage (Sub-Summary-Layouts) | 2 Stunden | | MWST-Abrechnung | 1 Tag | 1 Stunde | | Kontenblatt mit Saldo-Verlauf | 1.5 Tage (Calc-Felder + WebViewer-Chart) | 2 Stunden | | Beleg-Upload + Modal-Vorschau | 1 Tag (Container-Tricks) | 1 Stunde | | DATEV-Export | 2 Tage (Encoding + Format) | 2 Stunden | | Inbox / API fĂŒr FM-Anbindung | nicht in FM machbar | 4 Stunden | | Charts (Bar, Donut, Linie) | 1 Tag (WebViewer-KrĂŒcke) | 30 Min | | **Total** | **~15 Arbeitstage** | **~22 Stunden, also 3 Tage** | Faktor 5. Und das mit konservativen FileMaker-SchĂ€tzungen â die meisten Projekte wĂŒrden noch lĂ€nger dauern, weil unterwegs immer wieder UI-Polishing kommt, das in HTML/CSS trivial ist und in FM-Layouts schmerzhaft. ## Wann FM-Only trotzdem das richtige Werkzeug bleibt Damit nicht der falsche Eindruck entsteht: **FileMaker ist nicht das Problem**. FM ist immer noch das Werkzeug der Wahl fĂŒr: - **Stammdaten und GeschĂ€ftsprozesse**: Kontakte, Projekte, AuftrĂ€ge, Rechnungen â alles, was an einer Hand voll Hauptmasken hĂ€ngt und mit Beziehungen verknĂŒpft ist - **Datenintensive Eingabemasken**: Portalansichten, Suchergebnisse, Berichte ĂŒber native Find-Funktionen - **Offline-FĂ€higkeit auf FileMaker Go**: einfach unschlagbar - **Rapid Prototyping** mit GeschĂ€ftslogik: was du in FM in einer Stunde mit Auto-Eingabe-Berechnungen und Skripten zusammenstecken kannst, wĂŒrde in einem Web-Stack einen halben Tag dauern - **Cross-Plattform-Distribution**: ein FM-File, lĂ€uft auf Mac/Win/iOS/Web Was FM **nicht** gut kann â und was der Trigger fĂŒr eine Hybrid-Lösung sein sollte: - **Komplexe Layout-Komposition** (HTML/CSS ist da Lichtjahre voraus) - **Standard-Datenformate** (DATEV, CSV mit spezifischen Headern, EDI, etc.) - **Visualisierungen** (Chart.js > FM-WebViewer mit Chart.js, weil's keine Komposition-Reibungsverluste gibt) - **EditiervorgĂ€nge nach dem Print** (kannst du in FM auch lösen â aber HTML/CSS macht das von allein) - **Datei-Uploads mit Vorschau** (Container-Felder sind keine Web-Komponenten) - **Multi-Tenant-Logik** (Mandanten in FM = Frickelarbeit mit Globals und Skripten) Die ehrliche Faustregel: Wenn der Kundenwunsch nach âLayout-Magie" klingt, nach âStandardformat-Export", nach âCharts und Reports" â dann lohnt sich ein Blick auf den Hybrid-Ansatz. Wenn er nach âStammdaten + Workflow + Suche" klingt, bleib bei FM. ## Was kommt nach Tag 1? Was wir in den ersten zehn Stunden nicht angefasst haben: - **Authentifizierung und Berechtigungen**: solange die Buchhaltung lokal auf einem Mac lĂ€uft, ist Token-Auth ĂŒber die API genug. Sobald mehrere User drauf zugreifen sollen â die Buchhalterin von zu Hause, der GeschĂ€ftsfĂŒhrer aus dem BĂŒro â braucht's Session-Login, Rollen, Audit-Log. Einen halben Tag, mit Standard-Bordmitteln (Session + Password-Hash + Middleware-Check). - **Webhooks zurĂŒck nach FM**: wenn eine Buchung verbucht wurde, könnte die Buchhaltung das per Webhook an FM melden, damit dort die Rechnung als âverbucht" markiert wird. Zwei Stunden Arbeit. - **Mobile Ansicht**: Bootstrap 5 ist responsive, aber die Buchungs-Tabelle mit Soll/Haben/Steuer-Spalten ist auf dem Handy fummelig. Eine eigene Mobile-View mit Card-Layout, ein Tag. - **GoBD-VollkonformitĂ€t mit unverĂ€nderlicher Speicherung**: aktuell kann ein Buchungssatz noch editiert/gelöscht werden. FĂŒr echte GoBD brĂ€uchte es Storno-Buchungen statt Edit, und einen unverĂ€nderlichen Audit-Log. Einen Tag. Alles davon ist incrementiell, keine Architektur-Ănderung. Die Inbox-Pipeline und das Datenmodell bleiben stehen. Das ist die andere groĂe StĂ€rke der Trennung: jeder Baustein kann unabhĂ€ngig wachsen. ## Was die Steuerberaterin sagt Wir haben das Modul vor zwei Wochen an die Steuerberaterin des Kunden geschickt â als Bildschirmaufnahme mit Walkthrough plus DATEV-Export einer Testperiode. Antwort kam am gleichen Tag: *âDen Export kann ich direkt in DATEV importieren, der hat alle Pflichtfelder. Die Charts und Auswertungen sind nett, brauchen wir aber nicht â wir haben unser eigenes Reporting. Aber dass die Belege als PDF mit jeder Buchung dabei sind, das ist gut. Spart uns das ewige RĂŒckfragen bei euch."* Das ist im Grunde, was du als Entwickler hören willst. Das Ding tut, was es soll. Die externen Stakeholder kommen ohne Schulung damit klar. ## Fazit Die FileMaker-Plattform ist und bleibt eine starke Wahl fĂŒr viele GeschĂ€ftsanwendungen. Sie wird nicht weniger gut, nur weil man manchmal etwas drumherum baut. Im Gegenteil â das, was FM am besten macht, kann sie umso besser machen, wenn man ihr nicht auch noch die Aufgaben aufdrĂŒckt, fĂŒr die ein klassischer Web-Stack das viel bessere Werkzeug ist. Doppelte BuchfĂŒhrung mit allem Drum und Dran ist so eine Aufgabe. In FileMaker gemacht: zwei bis drei Wochen, am Ende ein Layout-Albtraum den niemand mehr anfasst, Reports, die sich nicht mehr Ă€ndern lassen, ohne dass das halbe Sub-Summary zerbricht. Als kleine PHP/SQLite-Anwendung mit FM-Anbindung: zehn Stunden, am Ende ein eigenstĂ€ndiges, wartbares Modul, das die Buchhalterin bedienen kann ohne FM zu öffnen. Das ist nicht das richtige VerhĂ€ltnis fĂŒr jedes Projekt. Es ist auch nicht âFM ist schlecht". Es ist nur das saubere Anerkenntnis, dass *jedes Werkzeug einen Bereich hat, in dem es ĂŒberlegen ist*. Und dass die wirklichen Profis ihre Werkzeugkiste so kombinieren, dass die StĂ€rken sich addieren â nicht so, dass alles mit dem einen Werkzeug erschlagen wird, das man am besten kennt. Wenn dir das nĂ€chste Mal jemand ânebenbei noch eine Buchhaltung" anbietet â ĂŒberleg, ob das ein FM-Projekt ist oder eines, das in einem Tag erledigt sein kann, wenn man ein bisschen drumherumdenkt. ---
















