mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2026-03-03 06:21:32 +00:00
Compare commits
16 Commits
develop-20
...
develop-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6e9db7339 | ||
|
|
374fdbe1d4 | ||
|
|
e0b05b63ec | ||
|
|
342ca61fb6 | ||
|
|
e9d21faf08 | ||
|
|
847800f81f | ||
|
|
b1e6f6b264 | ||
|
|
91d282c9cf | ||
|
|
c53ed44ea3 | ||
|
|
70b12354e8 | ||
|
|
6e8d204f00 | ||
|
|
f1578b2c90 | ||
|
|
90e4ca78a4 | ||
|
|
aae855ed16 | ||
|
|
2056ba5e08 | ||
|
|
2cd7983f51 |
@@ -77,10 +77,18 @@ class ConfigurationController extends Controller
|
||||
$staticData = $this->getStaticConfiguration();
|
||||
$return = [];
|
||||
foreach ($dynamicData as $key => $value) {
|
||||
$return[] = ['title' => sprintf('configuration.%s', $key), 'value' => $value, 'editable' => true];
|
||||
$return[] = [
|
||||
'title' => sprintf('configuration.%s', $key),
|
||||
'value' => $value,
|
||||
'editable' => true,
|
||||
];
|
||||
}
|
||||
foreach ($staticData as $key => $value) {
|
||||
$return[] = ['title' => $key, 'value' => $value, 'editable' => false];
|
||||
$return[] = [
|
||||
'title' => $key,
|
||||
'value' => $value,
|
||||
'editable' => false,
|
||||
];
|
||||
}
|
||||
|
||||
return response()->api($return);
|
||||
@@ -95,18 +103,30 @@ class ConfigurationController extends Controller
|
||||
$dynamic = $this->getDynamicConfiguration();
|
||||
$shortKey = str_replace('configuration.', '', $configKey);
|
||||
if (str_starts_with($configKey, 'configuration.')) {
|
||||
$data = ['title' => $configKey, 'value' => $dynamic[$shortKey], 'editable' => true];
|
||||
$data = [
|
||||
'title' => $configKey,
|
||||
'value' => $dynamic[$shortKey],
|
||||
'editable' => true,
|
||||
];
|
||||
|
||||
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||
}
|
||||
if (str_starts_with($configKey, 'webhook.')) {
|
||||
$data = ['title' => $configKey, 'value' => $this->getWebhookConfiguration($configKey), 'editable' => false];
|
||||
$data = [
|
||||
'title' => $configKey,
|
||||
'value' => $this->getWebhookConfiguration($configKey),
|
||||
'editable' => false,
|
||||
];
|
||||
|
||||
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||
}
|
||||
|
||||
// fallback
|
||||
$data = ['title' => $configKey, 'value' => config($shortKey), 'editable' => false];
|
||||
$data = [
|
||||
'title' => $configKey,
|
||||
'value' => config($shortKey),
|
||||
'editable' => false,
|
||||
];
|
||||
|
||||
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||
}
|
||||
@@ -134,7 +154,11 @@ class ConfigurationController extends Controller
|
||||
|
||||
// get updated config:
|
||||
$newConfig = $this->getDynamicConfiguration();
|
||||
$data = ['title' => $name, 'value' => $newConfig[$shortName], 'editable' => true];
|
||||
$data = [
|
||||
'title' => $name,
|
||||
'value' => $newConfig[$shortName],
|
||||
'editable' => true,
|
||||
];
|
||||
|
||||
return response()->api(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
||||
}
|
||||
@@ -146,16 +170,30 @@ class ConfigurationController extends Controller
|
||||
*/
|
||||
private function getDynamicConfiguration(): array
|
||||
{
|
||||
$isDemoSite = FireflyConfig::get('is_demo_site');
|
||||
$updateCheck = FireflyConfig::get('permission_update_check');
|
||||
$lastCheck = FireflyConfig::get('last_update_check');
|
||||
$singleUser = FireflyConfig::get('single_user_mode');
|
||||
$isDemoSite = FireflyConfig::get('is_demo_site', false);
|
||||
$updateCheck = FireflyConfig::get('permission_update_check', -1);
|
||||
$singleUser = FireflyConfig::get('single_user_mode', true);
|
||||
$lastCheck = FireflyConfig::get('last_update_check', 1);
|
||||
$enableExchangeRates = FireflyConfig::get('enable_exchange_rates', config('cer.enabled'));
|
||||
$useRunningBalance = FireflyConfig::get('use_running_balance', true);
|
||||
$enableExternalMap = FireflyConfig::get('enable_external_map', false);
|
||||
$enableExternalRates = FireflyConfig::get('enable_external_rates', false);
|
||||
$allowWebhooks = FireflyConfig::get('allow_webhooks', false);
|
||||
$enableBatchProcessing = FireflyConfig::get('enable_batch_processing', false);
|
||||
$validUrlProtocols = FireflyConfig::get('valid_url_protocols', 'http,https');
|
||||
|
||||
return [
|
||||
'is_demo_site' => $isDemoSite?->data,
|
||||
'permission_update_check' => null === $updateCheck ? null : (int) $updateCheck->data,
|
||||
'last_update_check' => null === $lastCheck ? null : (int) $lastCheck->data,
|
||||
'single_user_mode' => $singleUser?->data,
|
||||
'last_update_check' => null === $lastCheck ? null : (int) $lastCheck->data,
|
||||
'enable_exchange_rates' => $enableExchangeRates?->data,
|
||||
'use_running_balance' => $useRunningBalance?->data,
|
||||
'enable_external_map' => $enableExternalMap?->data,
|
||||
'enable_external_rates' => $enableExternalRates?->data,
|
||||
'allow_webhooks' => $allowWebhooks?->data,
|
||||
'enable_batch_processing' => $enableBatchProcessing?->data,
|
||||
'valid_url_protocols' => $validUrlProtocols?->data ?? 'http,https',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -778,9 +778,10 @@ class GroupCollector implements GroupCollectorInterface
|
||||
{
|
||||
$newArray = $newJournal->toArray();
|
||||
if (array_key_exists('attachment_id', $newArray)) {
|
||||
$attachmentId = (int) $newJournal['attachment_id'];
|
||||
|
||||
$existingJournal['attachments'][$attachmentId] = ['id' => $attachmentId];
|
||||
$attachmentId = (int) $newJournal['attachment_id'];
|
||||
if (0 !== $attachmentId) {
|
||||
$existingJournal['attachments'][$attachmentId] = ['id' => $attachmentId];
|
||||
}
|
||||
}
|
||||
|
||||
return $existingJournal;
|
||||
|
||||
@@ -151,9 +151,8 @@ class ReportController extends Controller
|
||||
$cache->addProperty($end);
|
||||
$cache->addProperty($this->convertToPrimary);
|
||||
if ($cache->has()) {
|
||||
// return response()->json($cache->get());
|
||||
// return response()->json($cache->get());
|
||||
}
|
||||
|
||||
Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray());
|
||||
Log::debug(sprintf('Period: %s to %s', $start->toW3cString(), $end->toW3cString()));
|
||||
$format = Navigation::preferredCarbonFormat($start, $end);
|
||||
@@ -247,10 +246,6 @@ class ReportController extends Controller
|
||||
if ('1Y' === $preferredRange) {
|
||||
$currentEnd = Navigation::endOfPeriod($currentEnd, $preferredRange);
|
||||
}
|
||||
// 2026-03-01 similar fix for monthly ranges.
|
||||
if ('1M' === $preferredRange) {
|
||||
$currentEnd = Navigation::endOfPeriod($currentEnd, $preferredRange);
|
||||
}
|
||||
Log::debug(sprintf('Start of sub-loop, current end is %s', $currentEnd->toW3cString()));
|
||||
while ($currentStart <= $currentEnd) {
|
||||
Log::debug(sprintf('Current start: %s', $currentStart->toW3cString()));
|
||||
|
||||
@@ -246,12 +246,17 @@ class TagController extends Controller
|
||||
/** @var GroupCollectorInterface $collector */
|
||||
$collector = app(GroupCollectorInterface::class);
|
||||
|
||||
// collect transaction journal IDs in repository,
|
||||
// this makes the collector faster and more accurate.
|
||||
$journalIds = $this->repository->getJournalIds($tag);
|
||||
|
||||
$collector
|
||||
->setRange($start, $end)
|
||||
->setLimit($pageSize)
|
||||
->setPage($page)
|
||||
->setJournalIds($journalIds)
|
||||
->withAccountInformation()
|
||||
->setTag($tag)
|
||||
// ->setTag($tag)
|
||||
->withBudgetInformation()
|
||||
->withCategoryInformation()
|
||||
->withAttachmentInformation()
|
||||
@@ -296,6 +301,10 @@ class TagController extends Controller
|
||||
$path = route('tags.show', [$tag->id, 'all']);
|
||||
$location = $this->repository->getLocation($tag);
|
||||
|
||||
// collect transaction journal IDs in repository,
|
||||
// this makes the collector faster and more accurate.
|
||||
$journalIds = $this->repository->getJournalIds($tag);
|
||||
|
||||
/** @var GroupCollectorInterface $collector */
|
||||
$collector = app(GroupCollectorInterface::class);
|
||||
$collector
|
||||
@@ -303,7 +312,7 @@ class TagController extends Controller
|
||||
->setLimit($pageSize)
|
||||
->setPage($page)
|
||||
->withAccountInformation()
|
||||
->setTag($tag)
|
||||
->setJournalIds($journalIds)
|
||||
->withBudgetInformation()
|
||||
->withCategoryInformation()
|
||||
->withAttachmentInformation()
|
||||
|
||||
@@ -51,7 +51,7 @@ class UpdatesAccountInformation implements ShouldQueue
|
||||
|
||||
private function correctRuleActions(Account $account, array $oldData, Rule $rule): void
|
||||
{
|
||||
$fields = ['set_source_account', 'set_destination_account'];
|
||||
$fields = ['set_source_account', 'set_destination_account', 'convert_withdrawal', 'convert_deposit', 'convert_transfer'];
|
||||
|
||||
Log::debug(sprintf('Check if rule #%d actions reference account #%d "%s"', $rule->id, $account->id, $account->name));
|
||||
$fixed = 0;
|
||||
|
||||
@@ -135,6 +135,12 @@ class TagRepository implements TagRepositoryInterface, UserGroupInterface
|
||||
});
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function getJournalIds(Tag $tag): array
|
||||
{
|
||||
return $tag->transactionJournals->pluck('id')->toArray();
|
||||
}
|
||||
|
||||
public function getLocation(Tag $tag): ?Location
|
||||
{
|
||||
/** @var null|Location */
|
||||
|
||||
@@ -71,6 +71,8 @@ interface TagRepositoryInterface
|
||||
|
||||
public function getAttachments(Tag $tag): Collection;
|
||||
|
||||
public function getJournalIds(Tag $tag): array;
|
||||
|
||||
/**
|
||||
* Return location, or NULL.
|
||||
*/
|
||||
|
||||
@@ -78,8 +78,8 @@ return [
|
||||
'running_balance_column' => (bool)envNonEmpty('USE_RUNNING_BALANCE', true), // this is only the default value, is not used.
|
||||
// see cer.php for exchange rates feature flag.
|
||||
],
|
||||
'version' => 'develop/2026-03-01',
|
||||
'build_time' => 1772348761,
|
||||
'version' => 'develop/2026-03-03',
|
||||
'build_time' => 1772515381,
|
||||
'api_version' => '2.1.0', // field is no longer used.
|
||||
'db_version' => 28, // field is no longer used.
|
||||
|
||||
|
||||
6
package-lock.json
generated
6
package-lock.json
generated
@@ -9005,9 +9005,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
|
||||
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
|
||||
"version": "8.5.8",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
||||
"integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
|
||||
@@ -724,12 +724,11 @@ Route::group(
|
||||
'namespace' => 'FireflyIII\Api\V1\Controllers\System',
|
||||
'prefix' => 'v1/configuration',
|
||||
'as' => 'api.v1.configuration.',
|
||||
'middleware' => ['api-admin'],
|
||||
],
|
||||
static function (): void {
|
||||
Route::get('', ['uses' => 'ConfigurationController@index', 'as' => 'index']);
|
||||
Route::get('{eitherConfigKey}', ['uses' => 'ConfigurationController@show', 'as' => 'show']);
|
||||
Route::put('{dynamicConfigKey}', ['uses' => 'ConfigurationController@update', 'as' => 'update']);
|
||||
Route::get('{eitherConfigKey}', ['uses' => 'ConfigurationController@show', 'as' => 'show']);
|
||||
}
|
||||
);
|
||||
// Users API routes:
|
||||
|
||||
Reference in New Issue
Block a user