====== Architektur ======
===== 5-Schichten-Modell =====
graph TD
GUI["GUI
Main, Wizard Steps, MessageLog,
DiffFrame, MappingPane, FKResolver"]
ENGINE["Engine
Mapping, SqlBuilder, Sync,
AuditLog, Crypto, FillBack"]
OUTLOOK["Outlook
COM-Abstraktion,
ContactItem, UserProperties"]
DAL["DAL
DB-Zugriff
(ODBC / SQLDB)"]
TYPES["Types
Records, Enums, Interfaces,
Resourcestrings"]
GUI --> ENGINE
GUI --> OUTLOOK
GUI --> DAL
ENGINE --> OUTLOOK
ENGINE --> DAL
ENGINE --> TYPES
OUTLOOK --> TYPES
DAL --> TYPES
GUI --> TYPES
style TYPES fill:#e8f5e9,stroke:#4caf50
style DAL fill:#e3f2fd,stroke:#2196f3
style OUTLOOK fill:#e3f2fd,stroke:#2196f3
style ENGINE fill:#fff3e0,stroke:#ff9800
style GUI fill:#fce4ec,stroke:#e91e63
===== Abhängigkeitsregeln =====
* **Types** darf NIE GUI, Engine, DAL oder Outlook importieren.
* **Engine** darf NIE GUI importieren.
* **DAL** und **Outlook** sind Peers auf derselben Ebene.
===== Unit-Übersicht pro Schicht =====
==== Types (ZERO project-internal deps) ====
^ Unit ^ Inhalt ^
| ''OutlookSync.Types.pas'' | Records (''TFieldMapping'', ''TTableRelation'', ''TMappingConfig''), Enums (''TFieldMappingSource'', ''TSyncDirection'', ''TConflictPolicy'', ''TDeletePolicy'', ''TDiffStatus''), Resourcestrings |
==== DAL ====
^ Unit ^ Inhalt ^
| ''OutlookSync.DAL.pas'' | ODBC-Verbindung, parametrisierte Queries, Schema-Abfragen (Tabellen, Spalten, FK-Constraints) |
==== Outlook ====
^ Unit ^ Inhalt ^
| ''OutlookSync.Outlook.pas'' | COM-Wrapper (''TOutlookApplication'', ''TOutlookContactItem''), Store/Folder-Navigation, UserProperties-API |
==== Engine ====
^ Unit ^ Inhalt ^
| ''OutlookSync.Mapping.pas'' | JSON-Serialisierung (''TMappingConfig'' ↔ JSON), Validierung, Laden/Speichern |
| ''OutlookSync.SqlBuilder.pas'' | SELECT/INSERT/UPDATE-Generierung, Alias-Konventionen, ''IsValidIdent'', ''QuoteIdent'' |
| ''OutlookSync.Sync.pas'' | Diff-Algorithmus, Match-Key-Vergleich, Einzel-/Massen-/Bidir-Sync |
| ''OutlookSync.FillBack.pas'' | PK-Retrieval (''OUTPUT INSERTED''), bidirektionales Fill-Back nach INSERT |
| ''OutlookSync.Crypto.pas'' | DPAPI-Wrapper (''CryptProtectData''/''CryptUnprotectData''), ''SecureZeroString'' |
| ''OutlookSync.AuditLog.pas'' | Audit-Trail mit SHA-1-Hashkette, ''TOutlookSyncAudit.Log()'' |
| ''OutlookSync.SyncState.pas'' | Persistenter Sync-State (DB-PK ↔ Outlook-EntryID, SHA-1-Feldhashes für Änderungs-/Löscherkennung) |
==== GUI ====
^ Unit ^ Inhalt ^
| ''OutlookSync.Main.pas'' | VSCode-Shell (integrierte Titelleiste, Menu, Tabs, Dock-Panes) |
| ''OutlookSync.DiffFrame.pas'' | Diff-Grid mit zweizeiligem Layout, Farbcodierung, Filter |
| ''OutlookSync.MappingPane.pas'' | 3-Zonen-Designer (Step-Tree, Dependency-Tree, PropertyGrid) |
| ''OutlookSync.FKResolver.pas'' | FK-Resolver-Dialog (Suchfeld, Grid, Bulk-Optionen) |
| ''OutlookSync.MessageLog.pas'' | Meldungsprotokoll (Grid + Detail-Tab) |
===== Namenskonventionen =====
^ Element ^ Prefix ^ Beispiel ^
| Private Felder | ''F'' | ''FMappings'', ''FCachedRootCols'' |
| Parameter | ''A'' | ''AMapping'', ''ALimit'', ''AJoinColumn'' |
| Property | (keins) | ''Mapping'', ''Engine'' |
| Resourcestrings | ''SBtn''/''SMsg''/''SErr''/''SLbl'' | ''SErrNoFieldMapped'' |
| Klassen | ''T'' | ''TOutlookSyncEngine'' |
| Interfaces | ''I'' | ''ISyncCallback'' |
===== Funktionsdesign (12-14-40 SoC) =====
^ Metrik ^ Ideal ^ Maximum ^ Aktion bei Überschreitung ^
| Funktionslänge | 12–14 Zeilen | 40 Zeilen | Extrahiere Hilfsfunktion |
| Parameter | 3–4 | 7 | Gruppiere in Record |
| Verantwortung | Single Responsibility | — | Trenne in eigene Methode |
| Benennung | Verb-first | — | ''Build'', ''Find'', ''Validate'', ''Emit'' |
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. — Outlook Sync//
{{tag>outlooksync entwickler architektur schichten abhängigkeiten}}