**Source:** coord:task:precisionledger-avalonia
**Time:** 2026-06-30T12:11:08
---
## PrecisionLedger — Port to AvaloniaUI (Cross-Platform)
**Status:** pending
**Assigned to:** SAGE
**Source:** coord:task:precisionledger-avalonia
**Created:** 2026-06-30T09:40:00+00:00
### Mission
Port PrecisionLedger from WinForms (.NET 8, Windows-only) to **Avalonia UI** (.NET 8, cross-platform: Linux + Windows). Single codebase, single build.
### Current Repo
```
git clone https://github.com/txlobst717/PrecisionLedger.git
→ /root/PrecisionLedger/ (trenutno WinForms, main branch)
```
### Šta je izgrađeno u WinForms (šta treba da portuješ)
| Fajl | Šta radi | Linija koda |
|------|----------|-------------|
| `Models.cs` | 3 model klase: `Nalog`, `Box`, `LedgerEntry`, `Operator` | 107 |
| `IDatabaseHelper.cs` | Interface sa 5 metoda (TestConnection, EnsureLedgerSKTable, GetNalozi, GenerateBoxes, SaveLedgerBatch, GetLedgerEntries) | 15 |
| `DatabaseHelper.cs` | ACE OLEDB provider — Access produkcija. Detekcija providera (16.0 → 12.0), range parsing, Nalozi JOIN, batch insert sa transakcijom | 345 |
| `SqliteDatabaseHelper.cs` | SQLite fallback — ista logika, radi na Linuxu. Factory pattern auto-detekcija (OleDb → SQLite) | 268 |
| `MainForm.cs` | **Glavna forma** — header (nalog/opseg), operator bar, radna površina (drag boxes), pool kutija, PRIMENI button, DataGridView ledger, paginacija, info row, MenuStrip (Operateri Ctrl+O, Log Ctrl+L) | 1193 |
| `OperatorRegistryForm.cs` | Dijalog za operatere — lista, dodaj/ukloni, auto-generisanje inicijala, dedupligacija (MM, MM2...) | 300 |
| `LogViewerForm.cs` | Pregled log fajla — dark tema, poslednjih 200 linija, refresh | 123 |
| `DatabaseConfigForm.cs` | Dijalog za putanju do baze — browse, test konekcije, sačuvaj | 133 |
| `ConfigStore.cs` | SQLite config store (operatori, linija) — perzistencija pored exe fajla | 126 |
| `LogHelper.cs` | Serilog logger — file + console, rolling daily, 30 dana | 95 |
| `AppPath.cs` | Path resolution za single-file publish | 14 |
| `Program.cs` | Entry point — config init, visual styles, LogHelper, MainForm | 54 |
| `PrecisionLedger.csproj` | Target: net8.0-windows, WinForms, NuGet: OleDb, SQLite, Serilog | 29 |
**Ukupno:** ~2,800 linija koda, 12 fajlova.
### Dizajn izgled
Boje: Teal (#008080), TealDark (#004D4D), TealLight (#E6F7F7), TealBg (#FAFCFC). Font: Calibri 11pt. Moderan flat dizajn.
### Šta se NE menja (migrira direktno)
- **Models.cs** — `Nalog`, `Box`, `LedgerEntry`, `Operator` klase (isti C# code)
- **IDatabaseHelper.cs** — isti interface
- **SqliteDatabaseHelper.cs** — isti kod, samo namespace
- **ConfigStore.cs** — isti (koristi SQLite, radi svuda)
- **LogHelper.cs** — isti (Serilog, radi svuda)
- **AppPath.cs** — isti
- **DatabaseHelper.cs** — ostaje za Windows (ACE OLEDB access) ali se ne kompajlira na Linuxu
### Šta se menja (Avalonia UI ekvivalenti)
| WinForms | Avalonia UI | Napomena |
|----------|-------------|----------|
| `Form` | `Window` | Main window |
| `TableLayoutPanel` | `Grid` (panel) | Layout |
| `FlowLayoutPanel` | `WrapPanel` / `StackPanel` | Box pool/surface |
| `DataGridView` | `DataGrid` | Ledger grid |
| `Button` | `Button` | Isto ime |
| `Label` | `TextBlock` | Display text |
| `TextBox` | `TextBox` | Isto ime |
| `DateTimePicker` | `DatePicker` | Date selection |
| `MenuStrip` | `Menu` / `NativeMenuItem` | Menu bar |
| `Panel.Paint` (gradient) | `DrawingContext` / `Border` | Background rendering |
| `LinkLabel` | `Button` sa stilom | Klikabilan link |
| `ListBox` | `ListBox` | Isto ime |
| `OpenFileDialog` | `OpenFileDialog` (Avalonia) | Isto |
| `BindingSource` | `ObservableCollection` + `INotifyPropertyChanged` | Data binding |
| `FlowLayoutPanel.AutoScroll` | `ScrollViewer` | Scrolling |
### Ključne funkcionalnosti koje moraju da rade
1. **Header** — gradient teal pozadina, nalog klikabilan (dropdown sa listom naloga), opseg prikaz
2. **Operator bar** — linija (klikabilna za promenu), operatori (prikaz imena), "Izmeni" link
3. **Radna površina** — flow panel sa box karticama, "PRIMENI" button, count label
4. **Pool kutija** — 3 kolone, flow layout, horizontal scroll
5. **MenuStrip** — Podešavanja → Operateri (Ctrl+O), Alati → Pregled loga (Ctrl+L)
6. **DataGrid ledger** — paginacija (12 po strani), filter po datumu, search po nalogu
7. **Drag & drop** — box sa pool → surface (Avalonia ima DragDrop)
8. **Log viewer** — dark tema, Consolas font, poslednjih 200 linija
9. **Operator registry** — ListBox + dodaj/ukloni + auto inicijali + dedup + sačuvaj
10. **Database config** — TextBox + Browse + Test Connection
### Database layer za Linux
Na Linuxu: `SqliteDatabaseHelper` radi out-of-box. Potrebna je test baza (`proizvodnja_test.db`) sa istom šemom (Nalozi, BaseBox, LedgerSK). Možeš je kreirati iz `Program.cs` ili seed skriptom.
### Build
```bash
# Linux
dotnet build -f net8.0
dotnet publish -c Release -r linux-x64 --self-contained
# Windows (cross-compile from Linux)
dotnet publish -c Release -r win-x64 --self-contained
```
### Preporučena struktura projekta
```
PrecisionLedger/
├── Models/ # Modeli (Nalog, Box, LedgerEntry, Operator)
├── Data/ # Database helpers (interface, sqlite, oleDb)
├── Views/ # Avalonia Windows (MainWindow, OperatorEditor, LogViewer, DbConfig)
├── ViewModels/ # MVVM ViewModels (MainViewModel, OperatorViewModel)
├── Services/ # ConfigStore, LogHelper, AppPath
├── App.axaml # Application entry
├── Program.cs # Entry point
└── PrecisionLedger.csproj # Target: net8.0, NOT windows-specific
```
### Deliverables
1. ✅ Avalonia UI projekat koji se builda na Linuxu (`dotnet build` prolazi)
2. ✅ MainWindow sa svim funkcionalnostima (header, operator bar, work surface, pool, ledger grid)
3. ✅ OperatorRegistryWindow (dodaj/ukloni operatere)
4. ✅ LogViewerWindow (dark tema)
5. ✅ DatabaseConfigWindow (path + test)
6. ✅ SQLite fallback radi (proizvodnja_test.db)
7. ✅ Menu + keyboard shortcuts
8. ✅ Drag & drop (box pool → surface)
9. ✅ Push na GitHub: branch `avalonia` ili novi repo
### Checklist za SAGE
- [ ] Instalirati Avalonia template: `dotnet new install Avalonia.Templates`
- [ ] Kreirati projekat: `dotnet new avalonia.mvvm -n PrecisionLedger`
- [ ] Prebaciti `Models.cs` u `Models/` folder
- [ ] Prebaciti `IDatabaseHelper.cs`, `SqliteDatabaseHelper.cs`, `DatabaseHelper.cs` u `Data/`
- [ ] Prebaciti `ConfigStore.cs`, `LogHelper.cs`, `AppPath.cs` u `Services/`
- [ ] Napisati `MainWindow.axaml` + `MainWindow.axaml.cs` (layout, controls, events)
- [ ] Napisati MainViewModel (ili code-behind za jednostavnost)
- [ ] DataGrid za ledger
- [ ] WrapPanel za box pool (3 kolone)
- [ ] DragDrop za box premeštanje
- [ ] MenuStrip → Menu (Podešavanja, Alati)
- [ ] Keyboard shortcuts (Ctrl+O, Ctrl+L)
- [ ] OperatorRegistryWindow
- [ ] LogViewerWindow (dark tema)
- [ ] DatabaseConfigWindow
- [ ] Testirati na Linuxu (SAGE laptop)
- [ ] Testirati SQLite operacije (ucitaj naloge, generisi kutije, sacuvaj ledger)
- [ ] Push na GitHub
- [ ] Javiti TZEDEK-u da je spremno za test