diff --git a/app/Api/V1/Controllers/AccountController.php b/app/Api/V1/Controllers/AccountController.php index 264ff36062..b1b343d7e2 100644 --- a/app/Api/V1/Controllers/AccountController.php +++ b/app/Api/V1/Controllers/AccountController.php @@ -210,7 +210,7 @@ class AccountController extends Controller */ public function store(AccountStoreRequest $request): JsonResponse { - $data = $request->getAll(); + $data = $request->getAllAccountData(); $account = $this->repository->store($data); $manager = new Manager; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; @@ -302,7 +302,7 @@ class AccountController extends Controller */ public function update(AccountUpdateRequest $request, Account $account): JsonResponse { - $data = $request->getAll(); + $data = $request->getAllAccountData(); $data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); $this->repository->update($account, $data); $manager = new Manager; diff --git a/app/Api/V1/Controllers/RecurrenceController.php b/app/Api/V1/Controllers/RecurrenceController.php index e5fd4182ba..8cae59e5ea 100644 --- a/app/Api/V1/Controllers/RecurrenceController.php +++ b/app/Api/V1/Controllers/RecurrenceController.php @@ -165,7 +165,7 @@ class RecurrenceController extends Controller */ public function store(RecurrenceStoreRequest $request): JsonResponse { - $recurrence = $this->repository->store($request->getAll()); + $recurrence = $this->repository->store($request->getAllRecurrenceData()); $manager = new Manager(); $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $manager->setSerializer(new JsonApiSerializer($baseUrl)); @@ -273,7 +273,7 @@ class RecurrenceController extends Controller */ public function update(RecurrenceUpdateRequest $request, Recurrence $recurrence): JsonResponse { - $data = $request->getAll(); + $data = $request->getAllRecurrenceData(); $category = $this->repository->update($recurrence, $data); $manager = new Manager(); $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; diff --git a/app/Api/V1/Requests/AccountStoreRequest.php b/app/Api/V1/Requests/AccountStoreRequest.php index 17f614db9c..a21b510554 100644 --- a/app/Api/V1/Requests/AccountStoreRequest.php +++ b/app/Api/V1/Requests/AccountStoreRequest.php @@ -44,54 +44,6 @@ class AccountStoreRequest extends Request return auth()->check(); } - /** - * Get all data from the request. - * - * @return array - */ - public function getAll(): array - { - $active = true; - $includeNetWorth = true; - if (null !== $this->get('active')) { - $active = $this->boolean('active'); - } - if (null !== $this->get('include_net_worth')) { - $includeNetWorth = $this->boolean('include_net_worth'); - } - - $data = [ - 'name' => $this->string('name'), - 'active' => $active, - 'include_net_worth' => $includeNetWorth, - 'accountType' => $this->string('type'), - 'account_type_id' => null, - 'currency_id' => $this->integer('currency_id'), - 'currency_code' => $this->string('currency_code'), - 'virtualBalance' => $this->string('virtual_balance'), - 'iban' => $this->string('iban'), - 'BIC' => $this->string('bic'), - 'accountNumber' => $this->string('account_number'), - 'accountRole' => $this->string('account_role'), - 'openingBalance' => $this->string('opening_balance'), - 'openingBalanceDate' => $this->date('opening_balance_date'), - 'ccType' => $this->string('credit_card_type'), - 'ccMonthlyPaymentDate' => $this->string('monthly_payment_date'), - 'notes' => $this->string('notes'), - 'interest' => $this->string('interest'), - 'interest_period' => $this->string('interest_period'), - ]; - - if ('liability' === $data['accountType']) { - $data['openingBalance'] = bcmul($this->string('liability_amount'), '-1'); - $data['openingBalanceDate'] = $this->date('liability_start_date'); - $data['accountType'] = $this->string('liability_type'); - $data['account_type_id'] = null; - } - - return $data; - } - /** * The rules that the incoming request must be matched against. * diff --git a/app/Api/V1/Requests/AccountUpdateRequest.php b/app/Api/V1/Requests/AccountUpdateRequest.php index 3e3e727e24..d8b9d57149 100644 --- a/app/Api/V1/Requests/AccountUpdateRequest.php +++ b/app/Api/V1/Requests/AccountUpdateRequest.php @@ -44,54 +44,6 @@ class AccountUpdateRequest extends Request return auth()->check(); } - /** - * Get all data from the request. - * - * @return array - */ - public function getAll(): array - { - $active = true; - $includeNetWorth = true; - if (null !== $this->get('active')) { - $active = $this->boolean('active'); - } - if (null !== $this->get('include_net_worth')) { - $includeNetWorth = $this->boolean('include_net_worth'); - } - - $data = [ - 'name' => $this->string('name'), - 'active' => $active, - 'include_net_worth' => $includeNetWorth, - 'accountType' => $this->string('type'), - 'account_type_id' => null, - 'currency_id' => $this->integer('currency_id'), - 'currency_code' => $this->string('currency_code'), - 'virtualBalance' => $this->string('virtual_balance'), - 'iban' => $this->string('iban'), - 'BIC' => $this->string('bic'), - 'accountNumber' => $this->string('account_number'), - 'accountRole' => $this->string('account_role'), - 'openingBalance' => $this->string('opening_balance'), - 'openingBalanceDate' => $this->date('opening_balance_date'), - 'ccType' => $this->string('credit_card_type'), - 'ccMonthlyPaymentDate' => $this->string('monthly_payment_date'), - 'notes' => $this->string('notes'), - 'interest' => $this->string('interest'), - 'interest_period' => $this->string('interest_period'), - ]; - - if ('liability' === $data['accountType']) { - $data['openingBalance'] = bcmul($this->string('liability_amount'), '-1'); - $data['openingBalanceDate'] = $this->date('liability_start_date'); - $data['accountType'] = $this->string('liability_type'); - $data['account_type_id'] = null; - } - - return $data; - } - /** * The rules that the incoming request must be matched against. * diff --git a/app/Api/V1/Requests/RecurrenceStoreRequest.php b/app/Api/V1/Requests/RecurrenceStoreRequest.php index a25ae6b3c2..79ffd26a42 100644 --- a/app/Api/V1/Requests/RecurrenceStoreRequest.php +++ b/app/Api/V1/Requests/RecurrenceStoreRequest.php @@ -48,106 +48,6 @@ class RecurrenceStoreRequest extends Request return auth()->check(); } - /** - * Get all data from the request. - * - * @return array - */ - public function getAll(): array - { - $active = true; - $applyRules = true; - if (null !== $this->get('active')) { - $active = $this->boolean('active'); - } - if (null !== $this->get('apply_rules')) { - $applyRules = $this->boolean('apply_rules'); - } - $return = [ - 'recurrence' => [ - 'type' => $this->string('type'), - 'title' => $this->string('title'), - 'description' => $this->string('description'), - 'first_date' => $this->date('first_date'), - 'repeat_until' => $this->date('repeat_until'), - 'repetitions' => $this->integer('nr_of_repetitions'), - 'apply_rules' => $applyRules, - 'active' => $active, - ], - 'meta' => [ - 'piggy_bank_id' => $this->integer('piggy_bank_id'), - 'piggy_bank_name' => $this->string('piggy_bank_name'), - 'tags' => explode(',', $this->string('tags')), - ], - 'transactions' => $this->getTransactionData(), - 'repetitions' => $this->getRepetitionData(), - ]; - - return $return; - } - - /** - * Returns the transaction data as it is found in the submitted data. It's a complex method according to code - * standards but it just has a lot of ??-statements because of the fields that may or may not exist. - * - * @return array - * @SuppressWarnings(PHPMD.NPathComplexity) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function getTransactionData(): array - { - $return = []; - // transaction data: - /** @var array $transactions */ - $transactions = $this->get('transactions'); - /** @var array $transaction */ - foreach ($transactions as $transaction) { - $return[] = [ - 'amount' => $transaction['amount'], - 'currency_id' => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null, - 'currency_code' => $transaction['currency_code'] ?? null, - 'foreign_amount' => $transaction['foreign_amount'] ?? null, - 'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null, - 'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null, - 'budget_id' => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null, - 'budget_name' => $transaction['budget_name'] ?? null, - 'category_id' => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null, - 'category_name' => $transaction['category_name'] ?? null, - 'source_id' => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null, - 'source_name' => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null, - 'destination_id' => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null, - 'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null, - 'description' => $transaction['description'], - ]; - } - - return $return; - } - - /** - * Returns the repetition data as it is found in the submitted data. - * - * @return array - */ - private function getRepetitionData(): array - { - $return = []; - // repetition data: - /** @var array $repetitions */ - $repetitions = $this->get('repetitions'); - /** @var array $repetition */ - foreach ($repetitions as $repetition) { - $return[] = [ - 'type' => $repetition['type'], - 'moment' => $repetition['moment'], - 'skip' => (int)$repetition['skip'], - 'weekend' => (int)$repetition['weekend'], - ]; - } - - return $return; - } - /** * The rules that the incoming request must be matched against. * @@ -155,39 +55,7 @@ class RecurrenceStoreRequest extends Request */ public function rules(): array { - $today = Carbon::now()->addDay(); - - return [ - 'type' => 'required|in:withdrawal,transfer,deposit', - 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', - 'description' => 'between:1,65000', - 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), - 'apply_rules' => [new IsBoolean], - 'active' => [new IsBoolean], - 'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')), - 'nr_of_repetitions' => 'numeric|between:1,31', - 'tags' => 'between:1,64000', - 'piggy_bank_id' => 'numeric', - 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', - 'repetitions.*.moment' => 'between:0,10', - 'repetitions.*.skip' => 'required|numeric|between:0,31', - 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', - 'transactions.*.description' => 'required|between:1,255', - 'transactions.*.amount' => 'required|numeric|more:0', - 'transactions.*.foreign_amount' => 'numeric|more:0', - 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], - 'transactions.*.category_name' => 'between:1,255|nullable', - 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.source_name' => 'between:1,255|nullable', - 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.destination_name' => 'between:1,255|nullable', - - - ]; + return $this->rulesRecurrence(); } /** diff --git a/app/Api/V1/Requests/RecurrenceUpdateRequest.php b/app/Api/V1/Requests/RecurrenceUpdateRequest.php index ab5f52e466..000745c2a5 100644 --- a/app/Api/V1/Requests/RecurrenceUpdateRequest.php +++ b/app/Api/V1/Requests/RecurrenceUpdateRequest.php @@ -48,106 +48,6 @@ class RecurrenceUpdateRequest extends Request return auth()->check(); } - /** - * Get all data from the request. - * - * @return array - */ - public function getAll(): array - { - $active = true; - $applyRules = true; - if (null !== $this->get('active')) { - $active = $this->boolean('active'); - } - if (null !== $this->get('apply_rules')) { - $applyRules = $this->boolean('apply_rules'); - } - $return = [ - 'recurrence' => [ - 'type' => $this->string('type'), - 'title' => $this->string('title'), - 'description' => $this->string('description'), - 'first_date' => $this->date('first_date'), - 'repeat_until' => $this->date('repeat_until'), - 'repetitions' => $this->integer('nr_of_repetitions'), - 'apply_rules' => $applyRules, - 'active' => $active, - ], - 'meta' => [ - 'piggy_bank_id' => $this->integer('piggy_bank_id'), - 'piggy_bank_name' => $this->string('piggy_bank_name'), - 'tags' => explode(',', $this->string('tags')), - ], - 'transactions' => $this->getTransactionData(), - 'repetitions' => $this->getRepetitionData(), - ]; - - return $return; - } - - /** - * Returns the transaction data as it is found in the submitted data. It's a complex method according to code - * standards but it just has a lot of ??-statements because of the fields that may or may not exist. - * - * @return array - * @SuppressWarnings(PHPMD.NPathComplexity) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function getTransactionData(): array - { - $return = []; - // transaction data: - /** @var array $transactions */ - $transactions = $this->get('transactions'); - /** @var array $transaction */ - foreach ($transactions as $transaction) { - $return[] = [ - 'amount' => $transaction['amount'], - 'currency_id' => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null, - 'currency_code' => $transaction['currency_code'] ?? null, - 'foreign_amount' => $transaction['foreign_amount'] ?? null, - 'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null, - 'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null, - 'budget_id' => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null, - 'budget_name' => $transaction['budget_name'] ?? null, - 'category_id' => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null, - 'category_name' => $transaction['category_name'] ?? null, - 'source_id' => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null, - 'source_name' => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null, - 'destination_id' => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null, - 'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null, - 'description' => $transaction['description'], - ]; - } - - return $return; - } - - /** - * Returns the repetition data as it is found in the submitted data. - * - * @return array - */ - private function getRepetitionData(): array - { - $return = []; - // repetition data: - /** @var array $repetitions */ - $repetitions = $this->get('repetitions'); - /** @var array $repetition */ - foreach ($repetitions as $repetition) { - $return[] = [ - 'type' => $repetition['type'], - 'moment' => $repetition['moment'], - 'skip' => (int)$repetition['skip'], - 'weekend' => (int)$repetition['weekend'], - ]; - } - - return $return; - } - /** * The rules that the incoming request must be matched against. * @@ -155,39 +55,7 @@ class RecurrenceUpdateRequest extends Request */ public function rules(): array { - $today = Carbon::now()->addDay(); - - return [ - 'type' => 'required|in:withdrawal,transfer,deposit', - 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', - 'description' => 'between:1,65000', - 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), - 'apply_rules' => [new IsBoolean], - 'active' => [new IsBoolean], - 'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')), - 'nr_of_repetitions' => 'numeric|between:1,31', - 'tags' => 'between:1,64000', - 'piggy_bank_id' => 'numeric', - 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', - 'repetitions.*.moment' => 'between:0,10', - 'repetitions.*.skip' => 'required|numeric|between:0,31', - 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', - 'transactions.*.description' => 'required|between:1,255', - 'transactions.*.amount' => 'required|numeric|more:0', - 'transactions.*.foreign_amount' => 'numeric|more:0', - 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], - 'transactions.*.category_name' => 'between:1,255|nullable', - 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.source_name' => 'between:1,255|nullable', - 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.destination_name' => 'between:1,255|nullable', - - - ]; + return $this->rulesRecurrence(); } /** diff --git a/app/Api/V1/Requests/Request.php b/app/Api/V1/Requests/Request.php index 927465d0bc..b1d3bb5d65 100644 --- a/app/Api/V1/Requests/Request.php +++ b/app/Api/V1/Requests/Request.php @@ -24,17 +24,203 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; +use Carbon\Carbon; use FireflyIII\Http\Requests\Request as FireflyIIIRequest; +use FireflyIII\Rules\BelongsUser; +use FireflyIII\Rules\IsBoolean; /** * Class Request. * * Technically speaking this class does not have to be extended like this but who knows what the future brings. * - * @SuppressWarnings(PHPMD.NumberOfChildren) * @codeCoverageIgnore */ class Request extends FireflyIIIRequest { + /** + * @return array + */ + public function getAllAccountData(): array { + $active = true; + $includeNetWorth = true; + if (null !== $this->get('active')) { + $active = $this->boolean('active'); + } + if (null !== $this->get('include_net_worth')) { + $includeNetWorth = $this->boolean('include_net_worth'); + } + + $data = [ + 'name' => $this->string('name'), + 'active' => $active, + 'include_net_worth' => $includeNetWorth, + 'accountType' => $this->string('type'), + 'account_type_id' => null, + 'currency_id' => $this->integer('currency_id'), + 'currency_code' => $this->string('currency_code'), + 'virtualBalance' => $this->string('virtual_balance'), + 'iban' => $this->string('iban'), + 'BIC' => $this->string('bic'), + 'accountNumber' => $this->string('account_number'), + 'accountRole' => $this->string('account_role'), + 'openingBalance' => $this->string('opening_balance'), + 'openingBalanceDate' => $this->date('opening_balance_date'), + 'ccType' => $this->string('credit_card_type'), + 'ccMonthlyPaymentDate' => $this->string('monthly_payment_date'), + 'notes' => $this->string('notes'), + 'interest' => $this->string('interest'), + 'interest_period' => $this->string('interest_period'), + ]; + + if ('liability' === $data['accountType']) { + $data['openingBalance'] = bcmul($this->string('liability_amount'), '-1'); + $data['openingBalanceDate'] = $this->date('liability_start_date'); + $data['accountType'] = $this->string('liability_type'); + $data['account_type_id'] = null; + } + + return $data; + } + + /** + * Get all data from the request. + * + * @return array + */ + public function getAllRecurrenceData(): array + { + $active = true; + $applyRules = true; + if (null !== $this->get('active')) { + $active = $this->boolean('active'); + } + if (null !== $this->get('apply_rules')) { + $applyRules = $this->boolean('apply_rules'); + } + $return = [ + 'recurrence' => [ + 'type' => $this->string('type'), + 'title' => $this->string('title'), + 'description' => $this->string('description'), + 'first_date' => $this->date('first_date'), + 'repeat_until' => $this->date('repeat_until'), + 'repetitions' => $this->integer('nr_of_repetitions'), + 'apply_rules' => $applyRules, + 'active' => $active, + ], + 'meta' => [ + 'piggy_bank_id' => $this->integer('piggy_bank_id'), + 'piggy_bank_name' => $this->string('piggy_bank_name'), + 'tags' => explode(',', $this->string('tags')), + ], + 'transactions' => $this->getRecurrenceTransactionData(), + 'repetitions' => $this->getRecurrenceRepetitionData(), + ]; + + return $return; + } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + protected function rulesRecurrence(): array + { + $today = Carbon::now()->addDay(); + + return [ + 'type' => 'required|in:withdrawal,transfer,deposit', + 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', + 'description' => 'between:1,65000', + 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), + 'apply_rules' => [new IsBoolean], + 'active' => [new IsBoolean], + 'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')), + 'nr_of_repetitions' => 'numeric|between:1,31', + 'tags' => 'between:1,64000', + 'piggy_bank_id' => 'numeric', + 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', + 'repetitions.*.moment' => 'between:0,10', + 'repetitions.*.skip' => 'required|numeric|between:0,31', + 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', + 'transactions.*.description' => 'required|between:1,255', + 'transactions.*.amount' => 'required|numeric|more:0', + 'transactions.*.foreign_amount' => 'numeric|more:0', + 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], + 'transactions.*.category_name' => 'between:1,255|nullable', + 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.source_name' => 'between:1,255|nullable', + 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.destination_name' => 'between:1,255|nullable', + + + ]; + } + + /** + * Returns the repetition data as it is found in the submitted data. + * + * @return array + */ + protected function getRecurrenceRepetitionData(): array + { + $return = []; + // repetition data: + /** @var array $repetitions */ + $repetitions = $this->get('repetitions'); + /** @var array $repetition */ + foreach ($repetitions as $repetition) { + $return[] = [ + 'type' => $repetition['type'], + 'moment' => $repetition['moment'], + 'skip' => (int)$repetition['skip'], + 'weekend' => (int)$repetition['weekend'], + ]; + } + + return $return; + } + + + /** + * Returns the transaction data as it is found in the submitted data. It's a complex method according to code + * standards but it just has a lot of ??-statements because of the fields that may or may not exist. + * + * @return array + */ + protected function getRecurrenceTransactionData(): array { + $return = []; + // transaction data: + /** @var array $transactions */ + $transactions = $this->get('transactions'); + /** @var array $transaction */ + foreach ($transactions as $transaction) { + $return[] = [ + 'amount' => $transaction['amount'], + 'currency_id' => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null, + 'currency_code' => $transaction['currency_code'] ?? null, + 'foreign_amount' => $transaction['foreign_amount'] ?? null, + 'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null, + 'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null, + 'budget_id' => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null, + 'budget_name' => $transaction['budget_name'] ?? null, + 'category_id' => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null, + 'category_name' => $transaction['category_name'] ?? null, + 'source_id' => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null, + 'source_name' => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null, + 'destination_id' => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null, + 'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null, + 'description' => $transaction['description'], + ]; + } + + return $return; + } }