mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-11-18 15:39:50 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72fb534eb4 | ||
|
|
69b46af245 | ||
|
|
4a901a1b42 | ||
|
|
a8fffc25c0 | ||
|
|
d0dab136b1 | ||
|
|
91184489da | ||
|
|
e4e6cc71c3 | ||
|
|
33d637e618 | ||
|
|
42eb4410f8 | ||
|
|
5f6b345c79 | ||
|
|
30b48a479c | ||
|
|
55d23af802 | ||
|
|
34bfeba63a | ||
|
|
761c20b670 | ||
|
|
d756977ee0 |
2
.ci/php-cs-fixer/composer.lock
generated
2
.ci/php-cs-fixer/composer.lock
generated
@@ -2675,5 +2675,5 @@
|
|||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": {},
|
"platform": {},
|
||||||
"platform-dev": {},
|
"platform-dev": {},
|
||||||
"plugin-api-version": "2.6.0"
|
"plugin-api-version": "2.9.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,15 +173,15 @@ class EditController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
|
public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
|
||||||
{
|
{
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$this->repository->update($recurrence, $data);
|
$recurrence = $this->repository->update($recurrence, $data);
|
||||||
|
|
||||||
$request->session()->flash('success', (string) trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
|
$request->session()->flash('success', (string) trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
|
||||||
Log::channel('audit')->info(sprintf('Updated recurrence #%d.', $recurrence->id), $data);
|
Log::channel('audit')->info(sprintf('Updated recurrence #%d.', $recurrence->id), $data);
|
||||||
|
|
||||||
// store new attachment(s):
|
// store new attachment(s):
|
||||||
/** @var null|array $files */
|
/** @var null|array $files */
|
||||||
$files = $request->hasFile('attachments') ? $request->file('attachments') : null;
|
$files = $request->hasFile('attachments') ? $request->file('attachments') : null;
|
||||||
if (null !== $files && !auth()->user()->hasRole('demo')) {
|
if (null !== $files && !auth()->user()->hasRole('demo')) {
|
||||||
$this->attachments->saveAttachmentsForModel($recurrence, $files);
|
$this->attachments->saveAttachmentsForModel($recurrence, $files);
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ class EditController extends Controller
|
|||||||
$request->session()->flash('info', $this->attachments->getMessages()->get('attachments'));
|
$request->session()->flash('info', $this->attachments->getMessages()->get('attachments'));
|
||||||
}
|
}
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
$redirect = redirect($this->getPreviousUrl('recurrences.edit.url'));
|
$redirect = redirect($this->getPreviousUrl('recurrences.edit.url'));
|
||||||
if (1 === (int) $request->get('return_to_edit')) {
|
if (1 === (int) $request->get('return_to_edit')) {
|
||||||
// set value so edit routine will not overwrite URL:
|
// set value so edit routine will not overwrite URL:
|
||||||
$request->session()->put('recurrences.edit.fromUpdate', true);
|
$request->session()->put('recurrences.edit.fromUpdate', true);
|
||||||
|
|||||||
@@ -56,23 +56,24 @@ use function Safe\json_decode;
|
|||||||
|
|
||||||
class RecurringEnrichment implements EnrichmentInterface
|
class RecurringEnrichment implements EnrichmentInterface
|
||||||
{
|
{
|
||||||
private array $accounts = [];
|
private array $accounts = [];
|
||||||
private Collection $collection;
|
private Collection $collection;
|
||||||
// private array $transactionTypeIds = [];
|
// private array $transactionTypeIds = [];
|
||||||
// private array $transactionTypes = [];
|
// private array $transactionTypes = [];
|
||||||
private readonly bool $convertToPrimary;
|
private readonly bool $convertToPrimary;
|
||||||
private array $currencies = [];
|
private array $currencies = [];
|
||||||
private array $currencyIds = [];
|
private array $currencyIds = [];
|
||||||
private array $destinationAccountIds = [];
|
private array $destinationAccountIds = [];
|
||||||
private array $foreignCurrencyIds = [];
|
private array $foreignCurrencyIds = [];
|
||||||
private array $ids = [];
|
private array $ids = [];
|
||||||
private string $language = 'en_US';
|
private string $language = 'en_US';
|
||||||
private array $notes = [];
|
private array $notes = [];
|
||||||
private readonly TransactionCurrency $primaryCurrency;
|
private readonly TransactionCurrency $primaryCurrency;
|
||||||
private array $recurrenceIds = [];
|
private array $recurrenceIds = [];
|
||||||
private array $repetitions = [];
|
private array $recurrenceByTransaction = [];
|
||||||
private array $sourceAccountIds = [];
|
private array $repetitions = [];
|
||||||
private array $transactions = [];
|
private array $sourceAccountIds = [];
|
||||||
|
private array $transactions = [];
|
||||||
private User $user;
|
private User $user;
|
||||||
private UserGroup $userGroup;
|
private UserGroup $userGroup;
|
||||||
|
|
||||||
@@ -84,6 +85,7 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
|
|
||||||
public function enrich(Collection $collection): Collection
|
public function enrich(Collection $collection): Collection
|
||||||
{
|
{
|
||||||
|
Log::debug(__METHOD__);
|
||||||
$this->collection = $collection;
|
$this->collection = $collection;
|
||||||
$this->collectIds();
|
$this->collectIds();
|
||||||
$this->collectRepetitions();
|
$this->collectRepetitions();
|
||||||
@@ -194,6 +196,7 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$id = (int)$account->id;
|
$id = (int)$account->id;
|
||||||
$this->accounts[$id] = $account;
|
$this->accounts[$id] = $account;
|
||||||
|
Log::debug(sprintf('Collected account #%d', $id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,6 +282,7 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
foreach ($currencies as $currency) {
|
foreach ($currencies as $currency) {
|
||||||
$id = (int)$currency->id;
|
$id = (int)$currency->id;
|
||||||
$this->currencies[$id] = $currency;
|
$this->currencies[$id] = $currency;
|
||||||
|
Log::debug(sprintf('Collected currency #%d', $id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,18 +291,11 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
/** @var Recurrence $recurrence */
|
/** @var Recurrence $recurrence */
|
||||||
foreach ($this->collection as $recurrence) {
|
foreach ($this->collection as $recurrence) {
|
||||||
$id = (int)$recurrence->id;
|
$id = (int)$recurrence->id;
|
||||||
// $typeId = (int)$recurrence->transaction_type_id;
|
|
||||||
$this->ids[] = $id;
|
$this->ids[] = $id;
|
||||||
// $this->transactionTypeIds[$id] = $typeId;
|
Log::debug(sprintf('Collected recurrence id #%d', $id));
|
||||||
}
|
}
|
||||||
$this->ids = array_unique($this->ids);
|
$this->ids = array_unique($this->ids);
|
||||||
|
Log::debug('Final array:', $this->ids);
|
||||||
// collect transaction types.
|
|
||||||
// $transactionTypes = TransactionType::whereIn('id', array_unique($this->transactionTypeIds))->get();
|
|
||||||
// foreach ($transactionTypes as $transactionType) {
|
|
||||||
// $id = (int)$transactionType->id;
|
|
||||||
// $this->transactionTypes[$id] = TransactionTypeEnum::from($transactionType->type);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function collectNotes(): void
|
private function collectNotes(): void
|
||||||
@@ -306,10 +303,12 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
$notes = Note::query()->whereIn('noteable_id', $this->ids)
|
$notes = Note::query()->whereIn('noteable_id', $this->ids)
|
||||||
->whereNotNull('notes.text')
|
->whereNotNull('notes.text')
|
||||||
->where('notes.text', '!=', '')
|
->where('notes.text', '!=', '')
|
||||||
->where('noteable_type', Recurrence::class)->get(['notes.noteable_id', 'notes.text'])->toArray()
|
->where('noteable_type', Recurrence::class)->get(['notes.id', 'notes.noteable_id', 'notes.text'])->toArray()
|
||||||
;
|
;
|
||||||
foreach ($notes as $note) {
|
foreach ($notes as $note) {
|
||||||
$this->notes[(int)$note['noteable_id']] = (string)$note['text'];
|
$notableId = (int)$note['noteable_id'];
|
||||||
|
$this->notes[$notableId] = (string)$note['text'];
|
||||||
|
Log::debug(sprintf('Collected note #%d for recurrence #%d', $note['id'], $notableId));
|
||||||
}
|
}
|
||||||
Log::debug(sprintf('Enrich with %d note(s)', count($this->notes)));
|
Log::debug(sprintf('Enrich with %d note(s)', count($this->notes)));
|
||||||
}
|
}
|
||||||
@@ -341,22 +340,23 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
|
|
||||||
/** @var RecurrenceRepetition $repetition */
|
/** @var RecurrenceRepetition $repetition */
|
||||||
foreach ($set as $repetition) {
|
foreach ($set as $repetition) {
|
||||||
$recurrence = $this->collection->filter(fn (Recurrence $item): bool => (int)$item->id === (int)$repetition->recurrence_id)->first();
|
$recurrence = $this->collection->filter(fn (Recurrence $item): bool => (int)$item->id === (int)$repetition->recurrence_id)->first();
|
||||||
$fromDate = clone ($recurrence->latest_date ?? $recurrence->first_date);
|
$fromDate = clone ($recurrence->latest_date ?? $recurrence->first_date);
|
||||||
$id = (int)$repetition->recurrence_id;
|
$recurrenceId = (int)$repetition->recurrence_id;
|
||||||
$repId = (int)$repetition->id;
|
$repId = (int)$repetition->id;
|
||||||
$this->repetitions[$id] ??= [];
|
$this->repetitions[$recurrenceId] ??= [];
|
||||||
|
Log::debug(sprintf('Collected repetition #%d of recurrence #%d.', $repId, $recurrenceId));
|
||||||
|
|
||||||
// get the (future) occurrences for this specific type of repetition:
|
// get the (future) occurrences for this specific type of repetition:
|
||||||
$amount = 'daily' === $repetition->repetition_type ? 9 : 5;
|
$amount = 'daily' === $repetition->repetition_type ? 9 : 5;
|
||||||
$set = $repository->getXOccurrencesSince($repetition, $fromDate, now(config('app.timezone')), $amount);
|
$set = $repository->getXOccurrencesSince($repetition, $fromDate, now(config('app.timezone')), $amount);
|
||||||
$occurrences = [];
|
$occurrences = [];
|
||||||
|
|
||||||
/** @var Carbon $carbon */
|
/** @var Carbon $carbon */
|
||||||
foreach ($set as $carbon) {
|
foreach ($set as $carbon) {
|
||||||
$occurrences[] = $carbon->toAtomString();
|
$occurrences[] = $carbon->toAtomString();
|
||||||
}
|
}
|
||||||
$this->repetitions[$id][$repId] = [
|
$this->repetitions[$recurrenceId][$repId] = [
|
||||||
'id' => (string)$repId,
|
'id' => (string)$repId,
|
||||||
'created_at' => $repetition->created_at->toAtomString(),
|
'created_at' => $repetition->created_at->toAtomString(),
|
||||||
'updated_at' => $repetition->updated_at->toAtomString(),
|
'updated_at' => $repetition->updated_at->toAtomString(),
|
||||||
@@ -373,8 +373,11 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
|
|
||||||
private function collectTransactionMetaData(): void
|
private function collectTransactionMetaData(): void
|
||||||
{
|
{
|
||||||
$ids = array_keys($this->transactions);
|
$rtIds = [];
|
||||||
$meta = RecurrenceTransactionMeta::whereNull('deleted_at')->whereIn('rt_id', $ids)->get();
|
foreach ($this->ids as $recurrenceId) {
|
||||||
|
$rtIds = array_merge($rtIds, array_keys($this->transactions[$recurrenceId]));
|
||||||
|
}
|
||||||
|
$meta = RecurrenceTransactionMeta::whereNull('deleted_at')->whereIn('rt_id', $rtIds)->get();
|
||||||
// other meta-data to be collected:
|
// other meta-data to be collected:
|
||||||
$billIds = [];
|
$billIds = [];
|
||||||
$piggyBankIds = [];
|
$piggyBankIds = [];
|
||||||
@@ -386,10 +389,11 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
$transactionId = (int)$entry->rt_id;
|
$transactionId = (int)$entry->rt_id;
|
||||||
|
|
||||||
// this should refer to another array, were rtIds can be used to find the recurrence.
|
// this should refer to another array, were rtIds can be used to find the recurrence.
|
||||||
$recurrenceId = $this->recurrenceIds[$transactionId] ?? 0;
|
$recurrenceId = $this->recurrenceByTransaction[$transactionId] ?? 0;
|
||||||
|
Log::debug(sprintf('Collecting meta data entry #%d for recurrence transaction #%d, for recurrence #%d ', $id, $transactionId, $recurrenceId));
|
||||||
$name = (string)($entry->name ?? '');
|
$name = (string)($entry->name ?? '');
|
||||||
if (0 === $recurrenceId) {
|
if (0 === $recurrenceId) {
|
||||||
Log::error(sprintf('Could not find recurrence ID for recurrence transaction ID %d', $transactionId));
|
Log::error(sprintf('Could not find recurrence ID for recurrence transaction ID #%d', $transactionId));
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -487,16 +491,16 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
|
|
||||||
/** @var RecurrenceTransaction $transaction */
|
/** @var RecurrenceTransaction $transaction */
|
||||||
foreach ($set as $transaction) {
|
foreach ($set as $transaction) {
|
||||||
$id = (int)$transaction->recurrence_id;
|
$recurrenceId = (int)$transaction->recurrence_id;
|
||||||
$transactionId = (int)$transaction->id;
|
$transactionId = (int)$transaction->id;
|
||||||
$this->recurrenceIds[$transactionId] = $id;
|
$this->recurrenceByTransaction[$transactionId] = $recurrenceId;
|
||||||
$this->transactions[$id] ??= [];
|
$this->transactions[$recurrenceId] ??= [];
|
||||||
$amount = $transaction->amount;
|
$amount = $transaction->amount;
|
||||||
$foreignAmount = $transaction->foreign_amount;
|
$foreignAmount = $transaction->foreign_amount;
|
||||||
|
Log::debug(sprintf('Collected transaction #%d of recurrence #%d', $transactionId, $recurrenceId));
|
||||||
|
|
||||||
$this->transactions[$id][$transactionId] = [
|
$this->transactions[$recurrenceId][$transactionId] = [
|
||||||
'id' => (string)$transactionId,
|
'id' => (string)$transactionId,
|
||||||
// 'recurrence_id' => $id,
|
|
||||||
'transaction_currency_id' => (int)$transaction->transaction_currency_id,
|
'transaction_currency_id' => (int)$transaction->transaction_currency_id,
|
||||||
'foreign_currency_id' => null === $transaction->foreign_currency_id ? null : (int)$transaction->foreign_currency_id,
|
'foreign_currency_id' => null === $transaction->foreign_currency_id ? null : (int)$transaction->foreign_currency_id,
|
||||||
'source_id' => (int)$transaction->source_id,
|
'source_id' => (int)$transaction->source_id,
|
||||||
@@ -518,10 +522,10 @@ class RecurringEnrichment implements EnrichmentInterface
|
|||||||
'subscription_name' => null,
|
'subscription_name' => null,
|
||||||
|
|
||||||
];
|
];
|
||||||
// collect all kinds of meta data to be collected later.
|
// collect all kinds of meta-data to be collected later.
|
||||||
$this->currencyIds[$transactionId] = (int)$transaction->transaction_currency_id;
|
$this->currencyIds[$transactionId] = (int)$transaction->transaction_currency_id;
|
||||||
$this->sourceAccountIds[$transactionId] = (int)$transaction->source_id;
|
$this->sourceAccountIds[$transactionId] = (int)$transaction->source_id;
|
||||||
$this->destinationAccountIds[$transactionId] = (int)$transaction->destination_id;
|
$this->destinationAccountIds[$transactionId] = (int)$transaction->destination_id;
|
||||||
if (null !== $transaction->foreign_currency_id) {
|
if (null !== $transaction->foreign_currency_id) {
|
||||||
$this->foreignCurrencyIds[$transactionId] = (int)$transaction->foreign_currency_id;
|
$this->foreignCurrencyIds[$transactionId] = (int)$transaction->foreign_currency_id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## 6.4.9 - 2025-11-xx
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Discussion 11211](https://github.com/orgs/firefly-iii/discussions/11211) (question about Transaction journal ID) started by @zhiiwg
|
||||||
|
|
||||||
## 6.4.8 - 2025-11-14
|
## 6.4.8 - 2025-11-14
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
41
composer.lock
generated
41
composer.lock
generated
@@ -8,16 +8,16 @@
|
|||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "bacon/bacon-qr-code",
|
"name": "bacon/bacon-qr-code",
|
||||||
"version": "v3.0.1",
|
"version": "v3.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Bacon/BaconQrCode.git",
|
"url": "https://github.com/Bacon/BaconQrCode.git",
|
||||||
"reference": "f9cc1f52b5a463062251d666761178dbdb6b544f"
|
"reference": "fe259c55425b8178f77fb6d1f84ba2473e21ed55"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f9cc1f52b5a463062251d666761178dbdb6b544f",
|
"url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/fe259c55425b8178f77fb6d1f84ba2473e21ed55",
|
||||||
"reference": "f9cc1f52b5a463062251d666761178dbdb6b544f",
|
"reference": "fe259c55425b8178f77fb6d1f84ba2473e21ed55",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -27,8 +27,9 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phly/keep-a-changelog": "^2.12",
|
"phly/keep-a-changelog": "^2.12",
|
||||||
"phpunit/phpunit": "^10.5.11 || 11.0.4",
|
"phpunit/phpunit": "^10.5.11 || ^11.0.4",
|
||||||
"spatie/phpunit-snapshot-assertions": "^5.1.5",
|
"spatie/phpunit-snapshot-assertions": "^5.1.5",
|
||||||
|
"spatie/pixelmatch-php": "^1.2.0",
|
||||||
"squizlabs/php_codesniffer": "^3.9"
|
"squizlabs/php_codesniffer": "^3.9"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
@@ -56,9 +57,9 @@
|
|||||||
"homepage": "https://github.com/Bacon/BaconQrCode",
|
"homepage": "https://github.com/Bacon/BaconQrCode",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/Bacon/BaconQrCode/issues",
|
"issues": "https://github.com/Bacon/BaconQrCode/issues",
|
||||||
"source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.1"
|
"source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.2"
|
||||||
},
|
},
|
||||||
"time": "2024-10-01T13:55:55+00:00"
|
"time": "2025-11-16T22:59:48+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "beberlei/assert",
|
"name": "beberlei/assert",
|
||||||
@@ -12011,16 +12012,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "12.4.2",
|
"version": "12.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "a94ea4d26d865875803b23aaf78c3c2c670ea2ea"
|
"reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a94ea4d26d865875803b23aaf78c3c2c670ea2ea",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d8f644d8d9bb904867f7a0aeb1bd306e0d966949",
|
||||||
"reference": "a94ea4d26d865875803b23aaf78c3c2c670ea2ea",
|
"reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12088,7 +12089,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.2"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12112,7 +12113,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-10-30T08:41:39+00:00"
|
"time": "2025-11-13T07:20:26+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "rector/rector",
|
"name": "rector/rector",
|
||||||
@@ -13183,16 +13184,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "theseer/tokenizer",
|
"name": "theseer/tokenizer",
|
||||||
"version": "1.2.3",
|
"version": "1.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/theseer/tokenizer.git",
|
"url": "https://github.com/theseer/tokenizer.git",
|
||||||
"reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
|
"reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
|
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/d74205c497bfbca49f34d4bc4c19c17e22db4ebb",
|
||||||
"reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
|
"reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -13221,7 +13222,7 @@
|
|||||||
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/theseer/tokenizer/issues",
|
"issues": "https://github.com/theseer/tokenizer/issues",
|
||||||
"source": "https://github.com/theseer/tokenizer/tree/1.2.3"
|
"source": "https://github.com/theseer/tokenizer/tree/1.3.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -13229,7 +13230,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-03-03T12:36:25+00:00"
|
"time": "2025-11-13T13:44:09+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "webmozart/assert",
|
"name": "webmozart/assert",
|
||||||
@@ -13314,5 +13315,5 @@
|
|||||||
"ext-xmlwriter": "*"
|
"ext-xmlwriter": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": {},
|
"platform-dev": {},
|
||||||
"plugin-api-version": "2.6.0"
|
"plugin-api-version": "2.9.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,8 +78,8 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => '6.4.8',
|
'version' => 'develop/2025-11-17',
|
||||||
'build_time' => 1763008810,
|
'build_time' => 1763402780,
|
||||||
'api_version' => '2.1.0', // field is no longer used.
|
'api_version' => '2.1.0', // field is no longer used.
|
||||||
'db_version' => 28, // field is no longer used.
|
'db_version' => 28, // field is no longer used.
|
||||||
|
|
||||||
|
|||||||
38
package-lock.json
generated
38
package-lock.json
generated
@@ -3776,9 +3776,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/alpinejs": {
|
"node_modules/alpinejs": {
|
||||||
"version": "3.15.1",
|
"version": "3.15.2",
|
||||||
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.1.tgz",
|
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.2.tgz",
|
||||||
"integrity": "sha512-HLO1TtiE92VajFHtLLPK8BWaK1YepV/uj31UrfoGnQ00lyFOJZ+oVY3F0DghPAwvg8sLU79pmjGQSytERa2gEg==",
|
"integrity": "sha512-2kYF2aG+DTFkE6p0rHG5XmN4VEb6sO9b02aOdU4+i8QN6rL0DbRZQiypDE1gBcGO65yDcqMz5KKYUYgMUxgNkw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/reactivity": "~3.1.1"
|
"@vue/reactivity": "~3.1.1"
|
||||||
@@ -4075,9 +4075,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/baseline-browser-mapping": {
|
"node_modules/baseline-browser-mapping": {
|
||||||
"version": "2.8.27",
|
"version": "2.8.29",
|
||||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.27.tgz",
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz",
|
||||||
"integrity": "sha512-2CXFpkjVnY2FT+B6GrSYxzYf65BJWEqz5tIRHCvNsZZ2F3CmsCB37h8SpYgKG7y9C4YAeTipIPWG7EmFmhAeXA==",
|
"integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -4521,9 +4521,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001754",
|
"version": "1.0.30001755",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz",
|
||||||
"integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
|
"integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5365,9 +5365,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/csstype": {
|
"node_modules/csstype": {
|
||||||
"version": "3.1.3",
|
"version": "3.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
|
||||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -5736,9 +5736,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.250",
|
"version": "1.5.254",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.254.tgz",
|
||||||
"integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==",
|
"integrity": "sha512-DcUsWpVhv9svsKRxnSCZ86SjD+sp32SGidNB37KpqXJncp1mfUgKbHvBomE89WJDbfVKw1mdv5+ikrvd43r+Bg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -6443,9 +6443,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/form-data": {
|
"node_modules/form-data": {
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
|
||||||
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -12507,7 +12507,7 @@
|
|||||||
"@fortawesome/fontawesome-free": "^7",
|
"@fortawesome/fontawesome-free": "^7",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
"admin-lte": "^4.0.0-rc4",
|
"admin-lte": "^4.0.0-rc4",
|
||||||
"alpinejs": "^3.13.7",
|
"alpinejs": "^3.15.2",
|
||||||
"bootstrap": "^5",
|
"bootstrap": "^5",
|
||||||
"bootstrap5-autocomplete": "^1",
|
"bootstrap5-autocomplete": "^1",
|
||||||
"bootstrap5-tags": "^1",
|
"bootstrap5-tags": "^1",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"@fortawesome/fontawesome-free": "^7",
|
"@fortawesome/fontawesome-free": "^7",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
"admin-lte": "^4.0.0-rc4",
|
"admin-lte": "^4.0.0-rc4",
|
||||||
"alpinejs": "^3.13.7",
|
"alpinejs": "^3.15.2",
|
||||||
"bootstrap": "^5",
|
"bootstrap": "^5",
|
||||||
"bootstrap5-autocomplete": "^1",
|
"bootstrap5-autocomplete": "^1",
|
||||||
"bootstrap5-tags": "^1",
|
"bootstrap5-tags": "^1",
|
||||||
|
|||||||
@@ -62,6 +62,10 @@
|
|||||||
<div class="box-body no-padding">
|
<div class="box-body no-padding">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="width:40%;">{{ trans('list.id') }}</td>
|
||||||
|
<td>#{{ transactionGroup.id }}</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:40%;">{{ trans('list.type') }}</td>
|
<td style="width:40%;">{{ trans('list.type') }}</td>
|
||||||
<td>{{ first.transaction_type_type|_ }}</td>
|
<td>{{ first.transaction_type_type|_ }}</td>
|
||||||
|
|||||||
Reference in New Issue
Block a user