Update API to match new end points.

This commit is contained in:
James Cole
2018-12-03 15:57:15 +01:00
parent c13d0da9fa
commit c0d6d0e28e
11 changed files with 123 additions and 159 deletions

View File

@@ -129,7 +129,7 @@ class TransactionController extends Controller
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams()); $paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters, $this->repository), 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -141,21 +141,15 @@ class TransactionController extends Controller
* *
* @param Request $request * @param Request $request
* @param Transaction $transaction * @param Transaction $transaction
* @param string $include
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function show(Request $request, Transaction $transaction, string $include = null): JsonResponse public function show(Request $request, Transaction $transaction): JsonResponse
{ {
$manager = new Manager(); $manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $include ?? '';
$include = $request->get('include') ?? $include;
$manager->parseIncludes($include);
// collect transactions using the journal collector // collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class); $collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user()); $collector->setUser(auth()->user());
@@ -173,7 +167,7 @@ class TransactionController extends Controller
} }
$transactions = $collector->getTransactions(); $transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters, $this->repository), 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
} }
@@ -200,10 +194,6 @@ class TransactionController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// collect transactions using the journal collector // collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class); $collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user()); $collector->setUser(auth()->user());
@@ -221,7 +211,7 @@ class TransactionController extends Controller
} }
$transactions = $collector->getTransactions(); $transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters, $this->repository), 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
} }
@@ -247,10 +237,6 @@ class TransactionController extends Controller
event(new UpdatedTransactionJournal($journal)); event(new UpdatedTransactionJournal($journal));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// needs a lot of extra data to match the journal collector. Or just expand that one. // needs a lot of extra data to match the journal collector. Or just expand that one.
// collect transactions using the journal collector // collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class); $collector = app(TransactionCollectorInterface::class);
@@ -269,7 +255,7 @@ class TransactionController extends Controller
} }
$transactions = $collector->getTransactions(); $transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters, $this->repository), 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -134,10 +134,6 @@ class UserController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// make resource // make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users'); $resource = new Item($user, new UserTransformer($this->parameters), 'users');
@@ -161,10 +157,6 @@ class UserController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// make resource // make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users'); $resource = new Item($user, new UserTransformer($this->parameters), 'users');
@@ -189,10 +181,6 @@ class UserController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// make resource // make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users'); $resource = new Item($user, new UserTransformer($this->parameters), 'users');

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests; namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\BelongsUser; use FireflyIII\Rules\BelongsUser;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
@@ -73,8 +74,21 @@ class TransactionRequest extends Request
'invoice_date' => $this->date('invoice_date'), 'invoice_date' => $this->date('invoice_date'),
'internal_reference' => $this->string('internal_reference'), 'internal_reference' => $this->string('internal_reference'),
'notes' => $this->string('notes'), 'notes' => $this->string('notes'),
'original-source' => sprintf('api-v%s', config('firefly.api_version')), 'original-source' => sprintf('ff3-v%s|api-v%s', config('firefly.version'),config('firefly.api_version')),
'transactions' => $this->getTransactionData(), 'transactions' => $this->getTransactionData(),
// SEPA fields:
'sepa-cc' => $this->string('sepa_cc'),
'sepa-ct-op' => $this->string('sepa_ct_op'),
'sepa-db' => $this->string('sepa_db'),
'sepa-country' => $this->string('sepa_country'),
'sepa-ep' => $this->string('sepa_ep'),
'sepa-ci' => $this->string('sepa_ci'),
'sepa-batch-id' => $this->string('sepa_batch_id'),
// others:
'bunq_payment_id' => $this->string('bunq_payment_id'),
'external_id' => $this->string('external_id'),
]; ];
return $data; return $data;
@@ -109,11 +123,20 @@ class TransactionRequest extends Request
'internal_reference' => 'min:1,max:255|nullable', 'internal_reference' => 'min:1,max:255|nullable',
'notes' => 'min:1,max:50000|nullable', 'notes' => 'min:1,max:50000|nullable',
// SEPA fields:
'sepa_cc' => 'min:1,max:255|nullable',
'sepa_ct_op' => 'min:1,max:255|nullable',
'sepa_db' => 'min:1,max:255|nullable',
'sepa_country' => 'min:1,max:255|nullable',
'sepa_ep' => 'min:1,max:255|nullable',
'sepa_ci' => 'min:1,max:255|nullable',
'sepa_batch_id' => 'min:1,max:255|nullable',
// transaction rules (in array for splits): // transaction rules (in array for splits):
'transactions.*.description' => 'nullable|between:1,255', 'transactions.*.description' => 'nullable|between:1,255',
'transactions.*.amount' => 'required|numeric|more:0', 'transactions.*.amount' => 'required|numeric|more:0',
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|required_without:transactions.*.currency_code', 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id',
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:transactions.*.currency_id', 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'transactions.*.foreign_amount' => 'numeric|more:0', 'transactions.*.foreign_amount' => 'numeric|more:0',
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
@@ -121,7 +144,7 @@ class TransactionRequest extends Request
'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser], 'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser],
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser], 'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser],
'transactions.*.category_name' => 'between:1,255|nullable', 'transactions.*.category_name' => 'between:1,255|nullable',
'transactions.*.reconciled' => 'boolean|nullable', 'transactions.*.reconciled' => [new IsBoolean],
// basic rules will be expanded later. // basic rules will be expanded later.
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser],
'transactions.*.source_name' => 'between:1,255|nullable', 'transactions.*.source_name' => 'between:1,255|nullable',

View File

@@ -40,6 +40,11 @@ use Log;
*/ */
class TransactionFactory class TransactionFactory
{ {
/** @var User */
private $user;
use TransactionServiceTrait;
/** /**
* Constructor. * Constructor.
*/ */
@@ -50,11 +55,6 @@ class TransactionFactory
} }
} }
use TransactionServiceTrait;
/** @var User */
private $user;
/** /**
* @param array $data * @param array $data
* *
@@ -109,8 +109,9 @@ class TransactionFactory
Log::debug('Start of TransactionFactory::createPair()', $data); Log::debug('Start of TransactionFactory::createPair()', $data);
// all this data is the same for both transactions: // all this data is the same for both transactions:
Log::debug('Searching for currency info.'); Log::debug('Searching for currency info.');
$defaultCurrency = app('amount')->getDefaultCurrencyByUser($this->user);
$currency = $this->findCurrency($data['currency_id'], $data['currency_code']); $currency = $this->findCurrency($data['currency_id'], $data['currency_code']);
//$description = $data['description']; $currency = $currency ?? $defaultCurrency;
// type of source account and destination account depends on journal type: // type of source account and destination account depends on journal type:
$sourceType = $this->accountType($journal, 'source'); $sourceType = $this->accountType($journal, 'source');

View File

@@ -142,7 +142,7 @@ class MassController extends Controller
$this->rememberPreviousUri('transactions.mass-edit.uri'); $this->rememberPreviousUri('transactions.mass-edit.uri');
$transformer = new TransactionTransformer(new ParameterBag); $transformer = new TransactionTransformer(new ParameterBag, $this->repository);
/** @var TransactionCollectorInterface $collector */ /** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class); $collector = app(TransactionCollectorInterface::class);
$collector->setUser($user); $collector->setUser($user);

View File

@@ -253,7 +253,7 @@ class TransactionController extends Controller
$collector->setJournals(new Collection([$journal])); $collector->setJournals(new Collection([$journal]));
$set = $collector->getTransactions(); $set = $collector->getTransactions();
$transactions = []; $transactions = [];
$transformer = new TransactionTransformer(new ParameterBag); $transformer = new TransactionTransformer(new ParameterBag, $this->repository);
/** @var Transaction $transaction */ /** @var Transaction $transaction */
foreach ($set as $transaction) { foreach ($set as $transaction) {
$transactions[] = $transformer->transform($transaction); $transactions[] = $transformer->transform($transaction);

View File

@@ -474,6 +474,24 @@ class JournalRepository implements JournalRepositoryInterface
return $value; return $value;
} }
/**
* Return string value of a meta date (or NULL).
*
* @param TransactionJournal $journal
* @param string $field
*
* @return null|string
*/
public function getMetaDateString(TransactionJournal $journal, string $field): ?string
{
$date = $this->getMetaDate($journal, $field);
if (null === $date) {
return null;
}
return $date->format('Y-m-d');
}
/** /**
* Return value of a meta field (or NULL) as a string. * Return value of a meta field (or NULL) as a string.
* *

View File

@@ -38,17 +38,6 @@ use Illuminate\Support\MessageBag;
*/ */
interface JournalRepositoryInterface interface JournalRepositoryInterface
{ {
/**
* Return all attachments for journal.
*
* @param TransactionJournal $journal
*
* @return Collection
*/
public function getAttachments(TransactionJournal $journal): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/** /**
* @param TransactionJournal $journal * @param TransactionJournal $journal
* @param TransactionType $type * @param TransactionType $type
@@ -59,6 +48,9 @@ interface JournalRepositoryInterface
*/ */
public function convert(TransactionJournal $journal, TransactionType $type, Account $source, Account $destination): MessageBag; public function convert(TransactionJournal $journal, TransactionType $type, Account $source, Account $destination): MessageBag;
/** @noinspection MoreThanThreeArgumentsInspection */
/** /**
* @param TransactionJournal $journal * @param TransactionJournal $journal
* *
@@ -121,6 +113,15 @@ interface JournalRepositoryInterface
*/ */
public function getAssetTransaction(TransactionJournal $journal): ?Transaction; public function getAssetTransaction(TransactionJournal $journal): ?Transaction;
/**
* Return all attachments for journal.
*
* @param TransactionJournal $journal
*
* @return Collection
*/
public function getAttachments(TransactionJournal $journal): Collection;
/** /**
* Returns the first positive transaction for the journal. Useful when editing journals. * Returns the first positive transaction for the journal. Useful when editing journals.
* *
@@ -196,6 +197,16 @@ interface JournalRepositoryInterface
*/ */
public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon; public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon;
/**
* Return string value of a meta date (or NULL).
*
* @param TransactionJournal $journal
* @param string $field
*
* @return null|string
*/
public function getMetaDateString(TransactionJournal $journal, string $field): ?string;
/** /**
* Return value of a meta field (or NULL). * Return value of a meta field (or NULL).
* *

View File

@@ -33,6 +33,7 @@ use FireflyIII\Http\Requests\TestRuleFormRequest;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Binder\AccountList; use FireflyIII\Support\Binder\AccountList;
use FireflyIII\Transformers\TransactionTransformer; use FireflyIII\Transformers\TransactionTransformer;
use FireflyIII\User; use FireflyIII\User;
@@ -221,6 +222,7 @@ trait RequestInformation
*/ */
protected function getTransactionDataFromJournal(TransactionJournal $journal): array // convert object protected function getTransactionDataFromJournal(TransactionJournal $journal): array // convert object
{ {
$repository = app(JournalRepositoryInterface::class);
// use collector to collect transactions. // use collector to collect transactions.
$collector = app(TransactionCollectorInterface::class); $collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user()); $collector->setUser(auth()->user());
@@ -229,7 +231,7 @@ trait RequestInformation
$collector->setJournals(new Collection([$journal])); $collector->setJournals(new Collection([$journal]));
$set = $collector->getTransactions(); $set = $collector->getTransactions();
$transactions = []; $transactions = [];
$transformer = new TransactionTransformer(new ParameterBag); $transformer = new TransactionTransformer(new ParameterBag, $repository);
/** @var Transaction $transaction */ /** @var Transaction $transaction */
foreach ($set as $transaction) { foreach ($set as $transaction) {
$res = []; $res = [];

View File

@@ -30,6 +30,7 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
@@ -118,7 +119,9 @@ class AccountTransformer extends TransformerAbstract
$collector->setLimit($pageSize)->setPage($this->parameters->get('page')); $collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
$transactions = $collector->getTransactions(); $transactions = $collector->getTransactions();
return $this->collection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $journalRepos = app(JournalRepositoryInterface::class);
return $this->collection($transactions, new TransactionTransformer($this->parameters, $journalRepos), 'transactions');
} }
/** /**

View File

@@ -25,11 +25,9 @@ namespace FireflyIII\Transformers;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Note;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use League\Fractal\Resource\Collection as FractalCollection; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract; use League\Fractal\TransformerAbstract;
use Log; use Log;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
@@ -39,111 +37,26 @@ use Symfony\Component\HttpFoundation\ParameterBag;
*/ */
class TransactionTransformer extends TransformerAbstract class TransactionTransformer extends TransformerAbstract
{ {
/**
* List of resources possible to include
*
* @var array
*/
protected $availableIncludes = ['attachments', 'user', 'tags', 'journal_meta', 'piggy_bank_events'];
/**
* List of resources to automatically include
*
* @var array
*/
protected $defaultIncludes = [];
/** @var ParameterBag */ /** @var ParameterBag */
protected $parameters; protected $parameters;
/** @var JournalRepositoryInterface */
protected $repository;
/** /**
* TransactionTransformer constructor. * TransactionTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
* *
* @param ParameterBag $parameters * @param ParameterBag $parameters
* @param JournalRepositoryInterface $repository
*/ */
public function __construct(ParameterBag $parameters) public function __construct(ParameterBag $parameters, JournalRepositoryInterface $repository)
{ {
$this->parameters = $parameters; $this->parameters = $parameters;
$this->repository = $repository;
} }
/**
* Include attachments.
*
* @codeCoverageIgnore
*
* @param Transaction $transaction
*
* @return FractalCollection
*/
public function includeAttachments(Transaction $transaction): FractalCollection
{
return $this->collection($transaction->transactionJournal->attachments, new AttachmentTransformer($this->parameters), 'attachments');
}
/**
* Include meta data
*
* @codeCoverageIgnore
*
* @param Transaction $transaction
*
* @return FractalCollection
*/
public function includeJournalMeta(Transaction $transaction): FractalCollection
{
$meta = $transaction->transactionJournal->transactionJournalMeta()->get();
return $this->collection($meta, new JournalMetaTransformer($this->parameters), 'journal_meta');
}
/**
* Include piggy bank events
*
* @codeCoverageIgnore
*
* @param Transaction $transaction
*
* @return FractalCollection
*/
public function includePiggyBankEvents(Transaction $transaction): FractalCollection
{
$events = $transaction->transactionJournal->piggyBankEvents()->get();
return $this->collection($events, new PiggyBankEventTransformer($this->parameters), 'piggy_bank_events');
}
/**
* Include tags
*
* @codeCoverageIgnore
*
* @param Transaction $transaction
*
* @return FractalCollection
*/
public function includeTags(Transaction $transaction): FractalCollection
{
$set = $transaction->transactionJournal->tags;
return $this->collection($set, new TagTransformer($this->parameters), 'tags');
}
/**
* Include the user.
*
* @codeCoverageIgnore
*
* @param Transaction $transaction
*
* @return \League\Fractal\Resource\Item
*/
public function includeUser(Transaction $transaction): Item
{
return $this->item($transaction->transactionJournal->user, new UserTransformer($this->parameters), 'users');
}
/** /**
* Transform the journal. * Transform the journal.
* *
@@ -160,17 +73,15 @@ class TransactionTransformer extends TransformerAbstract
$budgetName = null; $budgetName = null;
$categoryId = $transaction->transaction_category_id ?? $transaction->transaction_journal_category_id; $categoryId = $transaction->transaction_category_id ?? $transaction->transaction_journal_category_id;
$categoryName = $transaction->transaction_category_name ?? $transaction->transaction_journal_category_name; $categoryName = $transaction->transaction_category_name ?? $transaction->transaction_journal_category_name;
$journal = $transaction->transactionJournal;
$notes = $this->repository->getNoteText($journal);
if ($transaction->transaction_type_type === TransactionType::WITHDRAWAL) { if ($transaction->transaction_type_type === TransactionType::WITHDRAWAL) {
$budgetId = $transaction->transaction_budget_id ?? $transaction->transaction_journal_budget_id; $budgetId = $transaction->transaction_budget_id ?? $transaction->transaction_journal_budget_id;
$budgetName = $transaction->transaction_budget_name ?? $transaction->transaction_journal_budget_name; $budgetName = $transaction->transaction_budget_name ?? $transaction->transaction_journal_budget_name;
} }
/** @var Note $dbNote */ // get tags:
$dbNote = $transaction->transactionJournal->notes()->first(); $tags = implode(',', $journal->tags->pluck('tag')->toArray());
$notes = null;
if (null !== $dbNote) {
$notes = $dbNote->text;
}
$data = [ $data = [
'id' => (int)$transaction->id, 'id' => (int)$transaction->id,
@@ -200,6 +111,27 @@ class TransactionTransformer extends TransformerAbstract
'budget_id' => $budgetId, 'budget_id' => $budgetId,
'budget_name' => $budgetName, 'budget_name' => $budgetName,
'notes' => $notes, 'notes' => $notes,
'sepa_cc' => $this->repository->getMetaField($journal, 'sepa-cc'),
'sepa_ct_op' => $this->repository->getMetaField($journal, 'sepa-ct-op'),
'sepa_ct_id' => $this->repository->getMetaField($journal, 'sepa-ct-ud'),
'sepa_db' => $this->repository->getMetaField($journal, 'sepa-db'),
'sepa_country' => $this->repository->getMetaField($journal, 'sepa-country'),
'sepa_ep' => $this->repository->getMetaField($journal, 'sepa-ep'),
'sepa_ci' => $this->repository->getMetaField($journal, 'sepa-ci'),
'sepa_batch_id' => $this->repository->getMetaField($journal, 'sepa-batch-id'),
'interest_date' => $this->repository->getMetaDateString($journal, 'interest_date'),
'book_date' => $this->repository->getMetaDateString($journal, 'book_date'),
'process_date' => $this->repository->getMetaDateString($journal, 'process_date'),
'due_date' => $this->repository->getMetaDateString($journal, 'due_date'),
'payment_date' => $this->repository->getMetaDateString($journal, 'payment_date'),
'invoice_date' => $this->repository->getMetaDateString($journal, 'invoice_date'),
'internal_reference' => $this->repository->getMetaField($journal, 'internal_reference'),
'bunq_payment_id' => $this->repository->getMetaField($journal, 'bunq_payment_id'),
'importHashV2' => $this->repository->getMetaField($journal, 'importHashV2'),
'recurrence_id' => (int)$this->repository->getMetaField($journal, 'recurrence_id'),
'external_id' => $this->repository->getMetaField($journal, 'external_id'),
'original_source' => $this->repository->getMetaField($journal, 'original-source'),
'tags' => '' === $tags ? null : $tags,
'links' => [ 'links' => [
[ [
'rel' => 'self', 'rel' => 'self',