asdasd
This commit is contained in:
@@ -2226,6 +2226,7 @@
|
|||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(raw),
|
body: JSON.stringify(raw),
|
||||||
});
|
});
|
||||||
|
invalidateProjectBootstrapCache(projectKey);
|
||||||
setMessage(successMessage);
|
setMessage(successMessage);
|
||||||
setOcrPreview(null);
|
setOcrPreview(null);
|
||||||
await reloadBootstrapAfterMutation(successMessage);
|
await reloadBootstrapAfterMutation(successMessage);
|
||||||
@@ -2459,7 +2460,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setMessage('OCR-Ergebnis geladen. Bei Bedarf direkt speichern.');
|
setMessage('OCR-Ergebnis geladen, aber noch nicht gespeichert. Bitte den Vorschlag pruefen und anschliessend speichern.');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ Empfohlene Umgebungsvariablen:
|
|||||||
|
|
||||||
Laut OCR.space-Doku wird `POST https://api.ocr.space/parse/image` mit `file`, Header-`apikey`, optional `language`, `scale`, `detectOrientation`, `isTable` und `OCREngine` verwendet. Der Modulparser wertet die OCR.space-Felder `ParsedResults`, `ParsedText`, `IsErroredOnProcessing`, `ErrorMessage` und `OCRExitCode` aus. Quellen: https://ocr.space/ocrapi
|
Laut OCR.space-Doku wird `POST https://api.ocr.space/parse/image` mit `file`, Header-`apikey`, optional `language`, `scale`, `detectOrientation`, `isTable` und `OCREngine` verwendet. Der Modulparser wertet die OCR.space-Felder `ParsedResults`, `ParsedText`, `IsErroredOnProcessing`, `ErrorMessage` und `OCRExitCode` aus. Quellen: https://ocr.space/ocrapi
|
||||||
|
|
||||||
|
Bei Wallet-Screenshots gilt der erkannte positive Asset-Bestand als Snapshot. Sichtbare negative Transaktionsbetraege, etwa die letzte Abbuchung oberhalb der Asset-Liste, duerfen nicht als positiver Wallet-Bestand uebernommen werden. Ein fehlender oder abgeschnittener Gesamtsaldo verhindert die automatische Speicherung nicht, wenn Hauptbestand, Waehrung und Wallet-Kontext eindeutig erkannt wurden. Niedriger bewertete OCR-Ergebnisse werden ausdruecklich als noch nicht gespeichert gekennzeichnet und muessen bestaetigt werden.
|
||||||
|
|
||||||
## Wechselkurse und Waehrungen
|
## Wechselkurse und Waehrungen
|
||||||
|
|
||||||
Der Mining-Checker speichert keine eigenen FX-Snapshots mehr, sondern referenziert die `fetch_id` aus `fx-rates`.
|
Der Mining-Checker speichert keine eigenen FX-Snapshots mehr, sondern referenziert die `fetch_id` aus `fx-rates`.
|
||||||
|
|||||||
@@ -1563,7 +1563,7 @@ final class Router
|
|||||||
'payouts' => true,
|
'payouts' => true,
|
||||||
'wallet_withdrawals' => true,
|
'wallet_withdrawals' => true,
|
||||||
'miner_offers' => false,
|
'miner_offers' => false,
|
||||||
'purchased_miners' => false,
|
'purchased_miners' => true,
|
||||||
],
|
],
|
||||||
'dashboards' => [
|
'dashboards' => [
|
||||||
'cost_plans' => false,
|
'cost_plans' => false,
|
||||||
|
|||||||
@@ -507,12 +507,19 @@ final class OcrService
|
|||||||
|
|
||||||
$assetRows = [];
|
$assetRows = [];
|
||||||
foreach ($lines as $lineIndex => $line) {
|
foreach ($lines as $lineIndex => $line) {
|
||||||
if (!preg_match('/(\d+(?:[.,]\d+)?)\s*([A-Z]{2,10})\b/u', $line, $match)) {
|
if (!preg_match_all('/(?<![\d.,])([+\-\x{2212}\x{2013}]?)\s*(\d+(?:[.,]\d+)?)\s*([A-Z]{2,10})\b/u', $line, $matches, PREG_SET_ORDER)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$amount = round((float) str_replace(',', '.', $match[1]), 10);
|
|
||||||
$currency = strtoupper((string) $match[2]);
|
foreach ($matches as $match) {
|
||||||
if ($amount < 0 || $currency === '' || in_array($currency, ['USD', 'EUR'], true)) {
|
$sign = trim((string) $match[1]);
|
||||||
|
$amount = round((float) str_replace(',', '.', $match[2]), 10);
|
||||||
|
$currency = strtoupper((string) $match[3]);
|
||||||
|
if (in_array($sign, ['-', "\u{2212}", "\u{2013}"], true)) {
|
||||||
|
$flags[] = 'wallet_transaction_amount_ignored';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($currency === '' || in_array($currency, ['USD', 'EUR'], true)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,6 +529,7 @@ final class OcrService
|
|||||||
'balance' => $amount,
|
'balance' => $amount,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($assetRows as $assetIndex => $assetRow) {
|
foreach ($assetRows as $assetIndex => $assetRow) {
|
||||||
$currency = (string) $assetRow['currency'];
|
$currency = (string) $assetRow['currency'];
|
||||||
@@ -596,14 +604,23 @@ final class OcrService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$matchedFields = 0;
|
$hasWalletBalance = $walletBalance !== null;
|
||||||
foreach ([$totalValueAmount, $walletBalance, $walletCurrency] as $field) {
|
$hasWalletCurrency = $walletCurrency !== '';
|
||||||
if ($field !== null && $field !== '') {
|
$hasTotalValue = $totalValueAmount !== null && $totalValueCurrency !== null;
|
||||||
$matchedFields++;
|
$matchedFields = (int) $hasWalletBalance + (int) $hasWalletCurrency + (int) $hasTotalValue;
|
||||||
}
|
|
||||||
}
|
|
||||||
$score = $matchedFields + ($walletIndicators * 2);
|
$score = $matchedFields + ($walletIndicators * 2);
|
||||||
$confidence = max(0.05, min(0.99, ($matchedFields / 3) + (min(3, $walletIndicators) * 0.12) - (count($flags) * 0.03)));
|
// Der Hauptbestand ist fuer einen autoritativen Wallet-Snapshot ausreichend.
|
||||||
|
// Ein im Screenshot abgeschnittener Gesamtsaldo ist dagegen kein Grund, einen
|
||||||
|
// sauber erkannten Asset-Bestand nur als ungespeicherte Vorschau zu behandeln.
|
||||||
|
$confidence = 0.05
|
||||||
|
+ ($hasWalletBalance ? 0.60 : 0.0)
|
||||||
|
+ ($hasWalletCurrency ? 0.10 : 0.0)
|
||||||
|
+ ($hasTotalValue ? 0.10 : 0.0)
|
||||||
|
+ (min(3, $walletIndicators) * 0.10);
|
||||||
|
if (!$hasWalletBalance) {
|
||||||
|
$confidence -= 0.15;
|
||||||
|
}
|
||||||
|
$confidence = max(0.05, min(0.99, $confidence));
|
||||||
|
|
||||||
ksort($balances);
|
ksort($balances);
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,13 @@ Der `Waehrungs-Checker` verwaltet gespeicherte Wechselkurse, Kurs-Historie, Umre
|
|||||||
- mit `force` kann ein Abruf bewusst erzwungen werden
|
- mit `force` kann ein Abruf bewusst erzwungen werden
|
||||||
- das zugehoerige Widget nutzt dieselbe Regel wie App und API
|
- das zugehoerige Widget nutzt dieselbe Regel wie App und API
|
||||||
|
|
||||||
|
## Mining-Checker Wallet-Screenshots
|
||||||
|
|
||||||
|
- Ein eindeutig erkannter Wallet-Screenshot wird nach dem Upload als autoritativer Wallet-Snapshot gespeichert und die Wallet-Anzeige danach neu geladen.
|
||||||
|
- Negative Betraege aus einer eingeblendeten letzten Transaktion werden nicht als Wallet-Bestand uebernommen.
|
||||||
|
- Fehlt der Gesamtsaldo im Bild, koennen die eindeutig erkannten einzelnen Asset-Bestaende trotzdem gespeichert werden.
|
||||||
|
- Wird ein OCR-Ergebnis nicht automatisch gespeichert, weist die Upload-Ansicht ausdruecklich darauf hin; der Vorschlag muss dann geprueft und manuell gespeichert werden.
|
||||||
|
|
||||||
## Benutzerdaten
|
## Benutzerdaten
|
||||||
|
|
||||||
Aktuell gelten folgende Regeln:
|
Aktuell gelten folgende Regeln:
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ Aus [custom/apps/README.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berl
|
|||||||
- `Mining-Checker` ist eine Desktop-App aus `custom/apps/mining-checker/`
|
- `Mining-Checker` ist eine Desktop-App aus `custom/apps/mining-checker/`
|
||||||
- Historische Mining-Nachtraege verwenden ihren belegten Zeitpunkt; fuer feste Krypto-Buchungen ist ein zeitnaher, referenzierter `fx-rates`-Snapshot Pflicht und ein aktueller Kurs darf keinen historischen Snapshot ersetzen.
|
- Historische Mining-Nachtraege verwenden ihren belegten Zeitpunkt; fuer feste Krypto-Buchungen ist ein zeitnaher, referenzierter `fx-rates`-Snapshot Pflicht und ein aktueller Kurs darf keinen historischen Snapshot ersetzen.
|
||||||
- Der Bereich `Nachtragen` im Mining-Checker speichert zusammenhaengende historische Miner-, Transfer-, Wallet- und Mining-Daten in chronologischer Reihenfolge und legt den belegten FX-Snapshot davor an.
|
- Der Bereich `Nachtragen` im Mining-Checker speichert zusammenhaengende historische Miner-, Transfer-, Wallet- und Mining-Daten in chronologischer Reihenfolge und legt den belegten FX-Snapshot davor an.
|
||||||
|
- Wallet-Screenshots uebernehmen positive Asset-Bestaende autoritativ; eingeblendete negative Transaktionen werden nicht als Wallet-Bestand interpretiert. Eindeutige Wallet-Erkennungen koennen auch ohne sichtbaren Gesamtsaldo automatisch gespeichert werden.
|
||||||
- `Bisher verdient` trennt variable Coin-Bestaende von fixen, bereits ausgezahlten und reinvestierten Coin-Werten; Krypto-Mieten bleiben dabei zugleich historische Ausgaben.
|
- `Bisher verdient` trennt variable Coin-Bestaende von fixen, bereits ausgezahlten und reinvestierten Coin-Werten; Krypto-Mieten bleiben dabei zugleich historische Ausgaben.
|
||||||
- `Waehrungs-Checker` ist eine Desktop-App aus `custom/apps/fx-rates/`
|
- `Waehrungs-Checker` ist eine Desktop-App aus `custom/apps/fx-rates/`
|
||||||
- die Desktop-Shell kann Moduldefinitionen zentral erkennen und als `App` bereitstellen
|
- die Desktop-Shell kann Moduldefinitionen zentral erkennen und als `App` bereitstellen
|
||||||
|
|||||||
Reference in New Issue
Block a user