mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-20 11:33:59 +00:00
Add a command to sync up currency information
This commit is contained in:
@@ -44,56 +44,8 @@ class FixUnevenAmount extends Command
|
|||||||
*/
|
*/
|
||||||
public function handle(): int
|
public function handle(): int
|
||||||
{
|
{
|
||||||
$count = 0;
|
$this->fixUnevenAmounts();
|
||||||
$journals = \DB::table('transactions')
|
$this->matchCurrencies();
|
||||||
->groupBy('transaction_journal_id')
|
|
||||||
->whereNull('deleted_at')
|
|
||||||
->get(['transaction_journal_id', \DB::raw('SUM(amount) AS the_sum')])
|
|
||||||
;
|
|
||||||
|
|
||||||
/** @var \stdClass $entry */
|
|
||||||
foreach ($journals as $entry) {
|
|
||||||
$sum = (string)$entry->the_sum;
|
|
||||||
if (!is_numeric($sum)
|
|
||||||
|| '' === $sum // @phpstan-ignore-line
|
|
||||||
|| str_contains($sum, 'e')
|
|
||||||
|| str_contains($sum, ',')) {
|
|
||||||
$message = sprintf(
|
|
||||||
'Journal #%d has an invalid sum ("%s"). No sure what to do.',
|
|
||||||
$entry->transaction_journal_id,
|
|
||||||
$entry->the_sum
|
|
||||||
);
|
|
||||||
$this->friendlyWarning($message);
|
|
||||||
app('log')->warning($message);
|
|
||||||
++$count;
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$res = -1;
|
|
||||||
|
|
||||||
try {
|
|
||||||
$res = bccomp($sum, '0');
|
|
||||||
} catch (\ValueError $e) {
|
|
||||||
$this->friendlyError(sprintf('Could not bccomp("%s", "0").', $sum));
|
|
||||||
Log::error($e->getMessage());
|
|
||||||
Log::error($e->getTraceAsString());
|
|
||||||
}
|
|
||||||
if (0 !== $res) {
|
|
||||||
$message = sprintf(
|
|
||||||
'Sum of journal #%d is %s instead of zero.',
|
|
||||||
$entry->transaction_journal_id,
|
|
||||||
$entry->the_sum
|
|
||||||
);
|
|
||||||
$this->friendlyWarning($message);
|
|
||||||
app('log')->warning($message);
|
|
||||||
$this->fixJournal($entry->transaction_journal_id);
|
|
||||||
++$count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (0 === $count) {
|
|
||||||
$this->friendlyPositive('Database amount integrity is OK');
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,4 +101,74 @@ class FixUnevenAmount extends Command
|
|||||||
$message = sprintf('Corrected amount in transaction journal #%d', $param);
|
$message = sprintf('Corrected amount in transaction journal #%d', $param);
|
||||||
$this->friendlyInfo($message);
|
$this->friendlyInfo($message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function fixUnevenAmounts(): void
|
||||||
|
{
|
||||||
|
$count = 0;
|
||||||
|
$journals = \DB::table('transactions')
|
||||||
|
->groupBy('transaction_journal_id')
|
||||||
|
->whereNull('deleted_at')
|
||||||
|
->get(['transaction_journal_id', \DB::raw('SUM(amount) AS the_sum')]);
|
||||||
|
|
||||||
|
/** @var \stdClass $entry */
|
||||||
|
foreach ($journals as $entry) {
|
||||||
|
$sum = (string) $entry->the_sum;
|
||||||
|
if (!is_numeric($sum)
|
||||||
|
|| '' === $sum // @phpstan-ignore-line
|
||||||
|
|| str_contains($sum, 'e')
|
||||||
|
|| str_contains($sum, ',')) {
|
||||||
|
$message = sprintf(
|
||||||
|
'Journal #%d has an invalid sum ("%s"). No sure what to do.',
|
||||||
|
$entry->transaction_journal_id,
|
||||||
|
$entry->the_sum
|
||||||
|
);
|
||||||
|
$this->friendlyWarning($message);
|
||||||
|
app('log')->warning($message);
|
||||||
|
++$count;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$res = -1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$res = bccomp($sum, '0');
|
||||||
|
} catch (\ValueError $e) {
|
||||||
|
$this->friendlyError(sprintf('Could not bccomp("%s", "0").', $sum));
|
||||||
|
Log::error($e->getMessage());
|
||||||
|
Log::error($e->getTraceAsString());
|
||||||
|
}
|
||||||
|
if (0 !== $res) {
|
||||||
|
$message = sprintf(
|
||||||
|
'Sum of journal #%d is %s instead of zero.',
|
||||||
|
$entry->transaction_journal_id,
|
||||||
|
$entry->the_sum
|
||||||
|
);
|
||||||
|
$this->friendlyWarning($message);
|
||||||
|
app('log')->warning($message);
|
||||||
|
$this->fixJournal($entry->transaction_journal_id);
|
||||||
|
++$count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (0 === $count) {
|
||||||
|
$this->friendlyPositive('Database amount integrity is OK');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function matchCurrencies(): void
|
||||||
|
{
|
||||||
|
$journals = TransactionJournal
|
||||||
|
::leftJoin('transactions', 'transaction_journals.id', 'transactions.transaction_journal_id')
|
||||||
|
->where('transactions.transaction_currency_id', '!=', \DB::raw('transaction_journals.transaction_currency_id'))
|
||||||
|
->get(['transaction_journals.*']);
|
||||||
|
if (0 === $journals->count()) {
|
||||||
|
$this->friendlyPositive('Journal currency integrity is OK');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/** @var TransactionJournal $journal */
|
||||||
|
foreach($journals as $journal) {
|
||||||
|
Transaction::where('transaction_journal_id', $journal->id)->update(['transaction_currency_id' => $journal->transaction_currency_id]);
|
||||||
|
}
|
||||||
|
$this->friendlyPositive(sprintf('Fixed %d journal(s) with mismatched currencies.', $journals->count()));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user