From 03904ffcde755806e144a792a480d439b0c92e34 Mon Sep 17 00:00:00 2001 From: JC5 Date: Thu, 31 Jul 2025 06:39:56 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20release=20?= =?UTF-8?q?'develop'=20on=202025-07-31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/Bill/ShowController.php | 2 +- .../Enrichments/SubscriptionEnrichment.php | 63 +++++++------ app/Transformers/BillTransformer.php | 91 +++++++++---------- config/firefly.php | 4 +- 4 files changed, 81 insertions(+), 79 deletions(-) diff --git a/app/Api/V1/Controllers/Models/Bill/ShowController.php b/app/Api/V1/Controllers/Models/Bill/ShowController.php index 48b5e15199..03e230a911 100644 --- a/app/Api/V1/Controllers/Models/Bill/ShowController.php +++ b/app/Api/V1/Controllers/Models/Bill/ShowController.php @@ -85,7 +85,7 @@ class ShowController extends Controller $enrichment->setUser($admin); $enrichment->setConvertToNative($this->convertToNative); $enrichment->setNative($this->nativeCurrency); - $bills = $enrichment->enrich($bills); + $bills = $enrichment->enrich($bills); /** @var BillTransformer $transformer */ $transformer = app(BillTransformer::class); diff --git a/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php b/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php index f8ff54f2ee..a28e5dd24a 100644 --- a/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php +++ b/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php @@ -1,8 +1,9 @@ collectNotes(); $this->collectObjectGroups(); - $notes = $this->notes; - $objectGroups = $this->objectGroups; + $notes = $this->notes; + $objectGroups = $this->objectGroups; $this->collection = $this->collection->map(function (Bill $item) use ($notes, $objectGroups) { - $id = (int) $item->id; - $currency = $item->transactionCurrency; - $meta = [ - 'notes' => null, - 'object_group_id' => null, + $id = (int) $item->id; + $currency = $item->transactionCurrency; + $meta = [ + 'notes' => null, + 'object_group_id' => null, 'object_group_title' => null, 'object_group_order' => null, ]; - $amounts = [ + $amounts = [ 'amount_min' => Steam::bcround($item->amount_min, $currency->decimal_places), 'amount_max' => Steam::bcround($item->amount_max, $currency->decimal_places), 'average' => Steam::bcround(bcdiv(bcadd($item->amount_min, $item->amount_max), '2'), $currency->decimal_places), @@ -54,7 +55,7 @@ class SubscriptionEnrichment implements EnrichmentInterface // add object group if available if (array_key_exists($id, $this->mappedObjects)) { - $key = $this->mappedObjects[$id]; + $key = $this->mappedObjects[$id]; $meta['object_group_id'] = $objectGroups[$key]['id']; $meta['object_group_title'] = $objectGroups[$key]['title']; $meta['object_group_order'] = $objectGroups[$key]['order']; @@ -72,17 +73,18 @@ class SubscriptionEnrichment implements EnrichmentInterface 'amount_min' => Steam::bcround($converter->convert($item->transactionCurrency, $this->nativeCurrency, today(), $item->amount_min), $this->nativeCurrency->decimal_places), 'amount_max' => Steam::bcround($converter->convert($item->transactionCurrency, $this->nativeCurrency, today(), $item->amount_max), $this->nativeCurrency->decimal_places), ]; - $amounts['average'] =Steam::bcround(bcdiv(bcadd($amounts['amount_min'], $amounts['amount_max']), '2'), $this->nativeCurrency->decimal_places); + $amounts['average'] = Steam::bcround(bcdiv(bcadd($amounts['amount_min'], $amounts['amount_max']), '2'), $this->nativeCurrency->decimal_places); } $item->amounts = $amounts; $item->meta = $meta; + return $item; }); return $collection; } - public function enrichSingle(Model|array $model): array|Model + public function enrichSingle(array|Model $model): array|Model { Log::debug(__METHOD__); $collection = new Collection([$model]); @@ -94,9 +96,9 @@ class SubscriptionEnrichment implements EnrichmentInterface private function collectNotes(): void { $notes = Note::query()->whereIn('noteable_id', $this->subscriptionIds) - ->whereNotNull('notes.text') - ->where('notes.text', '!=', '') - ->where('noteable_type', Bill::class)->get(['notes.noteable_id', 'notes.text'])->toArray() + ->whereNotNull('notes.text') + ->where('notes.text', '!=', '') + ->where('noteable_type', Bill::class)->get(['notes.noteable_id', 'notes.text'])->toArray() ; foreach ($notes as $note) { $this->notes[(int) $note['noteable_id']] = (string) $note['text']; @@ -124,34 +126,35 @@ class SubscriptionEnrichment implements EnrichmentInterface { $this->nativeCurrency = $nativeCurrency; } + private function collectSubscriptionIds(): void { /** @var Bill $bill */ foreach ($this->collection as $bill) { - $this->subscriptionIds[] = (int) $bill->id; + $this->subscriptionIds[] = (int) $bill->id; } - $this->subscriptionIds = array_unique($this->subscriptionIds); + $this->subscriptionIds = array_unique($this->subscriptionIds); } private function collectObjectGroups(): void { - $set = DB::table('object_groupables') + $set = DB::table('object_groupables') ->whereIn('object_groupable_id', $this->subscriptionIds) ->where('object_groupable_type', Bill::class) - ->get(['object_groupable_id','object_group_id']); + ->get(['object_groupable_id', 'object_group_id']) + ; - $ids = array_unique($set->pluck('object_group_id')->toArray()); + $ids = array_unique($set->pluck('object_group_id')->toArray()); - foreach($set as $entry) { + foreach ($set as $entry) { $this->mappedObjects[(int)$entry->object_groupable_id] = (int)$entry->object_group_id; } - $groups = ObjectGroup::whereIn('id', $ids)->get(['id', 'title','order'])->toArray(); - foreach($groups as $group) { - $group['id'] = (int) $group['id']; - $group['order'] = (int) $group['order']; + $groups = ObjectGroup::whereIn('id', $ids)->get(['id', 'title', 'order'])->toArray(); + foreach ($groups as $group) { + $group['id'] = (int) $group['id']; + $group['order'] = (int) $group['order']; $this->objectGroups[(int)$group['id']] = $group; } } - } diff --git a/app/Transformers/BillTransformer.php b/app/Transformers/BillTransformer.php index 346b1be254..a25e1034a1 100644 --- a/app/Transformers/BillTransformer.php +++ b/app/Transformers/BillTransformer.php @@ -27,7 +27,6 @@ namespace FireflyIII\Transformers; use Carbon\Carbon; use Carbon\CarbonInterface; use FireflyIII\Models\Bill; -use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Bill\BillRepositoryInterface; @@ -66,19 +65,19 @@ class BillTransformer extends AbstractTransformer */ public function transform(Bill $bill): array { - $paidData = $this->paidData($bill); - $lastPaidDate = $this->getLastPaidDate($paidData); - $start = $this->parameters->get('start') ?? today()->subYears(10); - $end = $this->parameters->get('end') ?? today()->addYears(10); - $payDates = $this->calculator->getPayDates($start, $end, $bill->date, $bill->repeat_freq, $bill->skip, $lastPaidDate); - $currency = $bill->transactionCurrency; + $paidData = $this->paidData($bill); + $lastPaidDate = $this->getLastPaidDate($paidData); + $start = $this->parameters->get('start') ?? today()->subYears(10); + $end = $this->parameters->get('end') ?? today()->addYears(10); + $payDates = $this->calculator->getPayDates($start, $end, $bill->date, $bill->repeat_freq, $bill->skip, $lastPaidDate); + $currency = $bill->transactionCurrency; $this->repository->setUser($bill->user); $paidDataFormatted = []; $payDatesFormatted = []; foreach ($paidData as $object) { - $date = Carbon::createFromFormat('!Y-m-d', $object['date'], config('app.timezone')); + $date = Carbon::createFromFormat('!Y-m-d', $object['date'], config('app.timezone')); if (!$date instanceof Carbon) { $date = today(config('app.timezone')); } @@ -87,24 +86,24 @@ class BillTransformer extends AbstractTransformer } foreach ($payDates as $string) { - $date = Carbon::createFromFormat('!Y-m-d', $string, config('app.timezone')); + $date = Carbon::createFromFormat('!Y-m-d', $string, config('app.timezone')); if (!$date instanceof Carbon) { $date = today(config('app.timezone')); } $payDatesFormatted[] = $date->toAtomString(); } // next expected match - $nem = null; - $nemDate = null; - $nemDiff = trans('firefly.not_expected_period'); - $firstPayDate = $payDates[0] ?? null; + $nem = null; + $nemDate = null; + $nemDiff = trans('firefly.not_expected_period'); + $firstPayDate = $payDates[0] ?? null; if (null !== $firstPayDate) { $nemDate = Carbon::createFromFormat('!Y-m-d', $firstPayDate, config('app.timezone')); if (!$nemDate instanceof Carbon) { $nemDate = today(config('app.timezone')); } - $nem = $nemDate->toAtomString(); + $nem = $nemDate->toAtomString(); // nullify again when it's outside the current view range. if ( @@ -125,7 +124,7 @@ class BillTransformer extends AbstractTransformer $current = $payDatesFormatted[0] ?? null; if (null !== $current && !$nemDate->isToday()) { - $temp2 = Carbon::createFromFormat('Y-m-d\TH:i:sP', $current); + $temp2 = Carbon::createFromFormat('Y-m-d\TH:i:sP', $current); if (!$temp2 instanceof Carbon) { $temp2 = today(config('app.timezone')); } @@ -135,44 +134,44 @@ class BillTransformer extends AbstractTransformer } return [ - 'id' => $bill->id, - 'created_at' => $bill->created_at->toAtomString(), - 'updated_at' => $bill->updated_at->toAtomString(), - 'currency_id' => (string)$bill->transaction_currency_id, - 'currency_code' => $currency->code, - 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => $currency->decimal_places, + 'id' => $bill->id, + 'created_at' => $bill->created_at->toAtomString(), + 'updated_at' => $bill->updated_at->toAtomString(), + 'currency_id' => (string)$bill->transaction_currency_id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, 'native_currency_id' => (string)$this->native->id, 'native_currency_code' => $this->native->code, 'native_currency_symbol' => $this->native->symbol, 'native_currency_decimal_places' => $this->native->decimal_places, - 'name' => $bill->name, - 'amount_min' => $bill->amounts['amount_min'], - 'amount_max' => $bill->amounts['amount_max'], - 'amount_avg' => $bill->amounts['average'], - 'date' => $bill->date->toAtomString(), - 'end_date' => $bill->end_date?->toAtomString(), - 'extension_date' => $bill->extension_date?->toAtomString(), - 'repeat_freq' => $bill->repeat_freq, - 'skip' => $bill->skip, - 'active' => $bill->active, - 'order' => $bill->order, - 'notes' => $bill->meta['notes'], - 'object_group_id' => $bill->meta['object_group_id'], - 'object_group_order' => $bill->meta['object_group_order'], - 'object_group_title' => $bill->meta['object_group_title'], + 'name' => $bill->name, + 'amount_min' => $bill->amounts['amount_min'], + 'amount_max' => $bill->amounts['amount_max'], + 'amount_avg' => $bill->amounts['average'], + 'date' => $bill->date->toAtomString(), + 'end_date' => $bill->end_date?->toAtomString(), + 'extension_date' => $bill->extension_date?->toAtomString(), + 'repeat_freq' => $bill->repeat_freq, + 'skip' => $bill->skip, + 'active' => $bill->active, + 'order' => $bill->order, + 'notes' => $bill->meta['notes'], + 'object_group_id' => $bill->meta['object_group_id'], + 'object_group_order' => $bill->meta['object_group_order'], + 'object_group_title' => $bill->meta['object_group_title'], // these fields need work: // 'next_expected_match' => $nem, // 'next_expected_match_diff' => $nemDiff, // 'pay_dates' => $payDatesFormatted, // 'paid_dates' => $paidDataFormatted, - 'links' => [ + 'links' => [ [ 'rel' => 'self', - 'uri' => '/bills/' . $bill->id, + 'uri' => '/bills/'.$bill->id, ], ], ]; @@ -194,13 +193,13 @@ class BillTransformer extends AbstractTransformer // 2023-07-18 this particular date is used to search for the last paid date. // 2023-07-18 the cloned $searchDate is used to grab the correct transactions. /** @var Carbon $start */ - $start = clone $this->parameters->get('start'); - $searchStart = clone $start; + $start = clone $this->parameters->get('start'); + $searchStart = clone $start; $start->subDay(); /** @var Carbon $end */ - $end = clone $this->parameters->get('end'); - $searchEnd = clone $end; + $end = clone $this->parameters->get('end'); + $searchEnd = clone $end; // move the search dates to the start of the day. $searchStart->startOfDay(); @@ -210,7 +209,7 @@ class BillTransformer extends AbstractTransformer Log::debug(sprintf('Search parameters are: start: %s', $searchStart->format('Y-m-d'))); // Get from database when bill was paid. - $set = $this->repository->getPaidDatesInRange($bill, $searchStart, $searchEnd); + $set = $this->repository->getPaidDatesInRange($bill, $searchStart, $searchEnd); Log::debug(sprintf('Count %d entries in getPaidDatesInRange()', $set->count())); // Grab from array the most recent payment. If none exist, fall back to the start date and pretend *that* was the last paid date. @@ -219,9 +218,9 @@ class BillTransformer extends AbstractTransformer Log::debug(sprintf('Result of lastPaidDate is %s', $lastPaidDate->format('Y-m-d'))); // At this point the "next match" is exactly after the last time the bill was paid. - $result = []; + $result = []; foreach ($set as $entry) { - $array = [ + $array = [ 'transaction_group_id' => (string)$entry->transaction_group_id, 'transaction_journal_id' => (string)$entry->id, 'date' => $entry->date->format('Y-m-d'), diff --git a/config/firefly.php b/config/firefly.php index 0c0ef9d451..b28ffd6e60 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -78,8 +78,8 @@ return [ 'running_balance_column' => env('USE_RUNNING_BALANCE', false), // see cer.php for exchange rates feature flag. ], - 'version' => 'develop/2025-07-30', - 'build_time' => 1753878970, + 'version' => 'develop/2025-07-31', + 'build_time' => 1753936691, 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 26,