Match fields for 6.3.0

This commit is contained in:
James Cole
2025-08-02 14:21:22 +02:00
parent 47d697c7dc
commit f35e361915
2 changed files with 153 additions and 152 deletions

View File

@@ -35,6 +35,7 @@ use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\NullArrayObject; use FireflyIII\Support\NullArrayObject;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -93,7 +94,7 @@ class TransactionGroupTransformer extends AbstractTransformer
'links' => [ 'links' => [
[ [
'rel' => 'self', 'rel' => 'self',
'uri' => '/transactions/'.$first['transaction_group_id'], 'uri' => '/transactions/' . $first['transaction_group_id'],
], ],
], ],
]; ];
@@ -116,10 +117,10 @@ class TransactionGroupTransformer extends AbstractTransformer
private function transformTransaction(array $transaction): array private function transformTransaction(array $transaction): array
{ {
// amount: // amount:
$amount = app('steam')->positive((string) ($transaction['amount'] ?? '0')); $amount = Steam::positive((string) ($transaction['amount'] ?? '0'));
$foreignAmount = null; $foreignAmount = null;
if (null !== $transaction['foreign_amount'] && '' !== $transaction['foreign_amount'] && 0 !== bccomp('0', (string) $transaction['foreign_amount'])) { if (null !== $transaction['foreign_amount'] && '' !== $transaction['foreign_amount'] && 0 !== bccomp('0', (string) $transaction['foreign_amount'])) {
$foreignAmount = app('steam')->positive($transaction['foreign_amount']); $foreignAmount = Steam::positive($transaction['foreign_amount']);
} }
// set primary amount to the normal amount if the currency matches. // set primary amount to the normal amount if the currency matches.
@@ -128,9 +129,9 @@ class TransactionGroupTransformer extends AbstractTransformer
} }
if (array_key_exists('pc_amount', $transaction) && null !== $transaction['pc_amount']) { if (array_key_exists('pc_amount', $transaction) && null !== $transaction['pc_amount']) {
$transaction['pc_amount'] = app('steam')->positive($transaction['pc_amount']); $transaction['pc_amount'] = Steam::positive($transaction['pc_amount']);
} }
$type = $this->stringFromArray($transaction, 'transaction_type_type', TransactionTypeEnum::WITHDRAWAL->value); $type = $this->stringFromArray($transaction, 'transaction_type_type', TransactionTypeEnum::WITHDRAWAL->value);
// must be 0 (int) or NULL // must be 0 (int) or NULL
$recurrenceTotal = $transaction['meta']['recurrence_total'] ?? null; $recurrenceTotal = $transaction['meta']['recurrence_total'] ?? null;
@@ -139,107 +140,107 @@ class TransactionGroupTransformer extends AbstractTransformer
$recurrenceCount = null !== $recurrenceCount ? (int) $recurrenceCount : null; $recurrenceCount = null !== $recurrenceCount ? (int) $recurrenceCount : null;
return [ return [
'user' => (string) $transaction['user_id'], 'user' => (string) $transaction['user_id'],
'transaction_journal_id' => (string) $transaction['transaction_journal_id'], 'transaction_journal_id' => (string) $transaction['transaction_journal_id'],
'type' => strtolower((string) $type), 'type' => strtolower((string) $type),
'date' => $transaction['date']->toAtomString(), 'date' => $transaction['date']->toAtomString(),
'order' => $transaction['order'], 'order' => $transaction['order'],
'currency_id' => (string) $transaction['currency_id'], // currency information, structured for 6.3.0.
'currency_code' => $transaction['currency_code'], 'object_has_currency_setting' => true,
'currency_name' => $transaction['currency_name'],
'currency_symbol' => $transaction['currency_symbol'],
'currency_decimal_places' => (int) $transaction['currency_decimal_places'],
'foreign_currency_id' => $this->stringFromArray($transaction, 'foreign_currency_id', null), 'currency_id' => (string) $transaction['currency_id'],
'foreign_currency_code' => $transaction['foreign_currency_code'], 'currency_code' => $transaction['currency_code'],
'foreign_currency_name' => $transaction['foreign_currency_name'], 'currency_name' => $transaction['currency_name'],
'foreign_currency_symbol' => $transaction['foreign_currency_symbol'], 'currency_symbol' => $transaction['currency_symbol'],
'foreign_currency_decimal_places' => $transaction['foreign_currency_decimal_places'], 'currency_decimal_places' => (int) $transaction['currency_decimal_places'],
'amount' => $amount, 'foreign_currency_id' => $this->stringFromArray($transaction, 'foreign_currency_id', null),
'foreign_amount' => $foreignAmount, 'foreign_currency_code' => $transaction['foreign_currency_code'],
'foreign_currency_name' => $transaction['foreign_currency_name'],
'foreign_currency_symbol' => $transaction['foreign_currency_symbol'],
'foreign_currency_decimal_places' => $transaction['foreign_currency_decimal_places'],
// primary currency amount, defaults to NULL when convertToPrimary is false. 'primary_currency_id' => $transaction['primary_currency']['id'] ?? null,
'pc_amount' => $transaction['pc_amount'] ?? null, 'primary_currency_code' => $transaction['primary_currency']['code'] ?? null,
'primary_currency_name' => $transaction['primary_currency']['name'] ?? null,
'primary_currency_symbol' => $transaction['primary_currency']['symbol'] ?? null,
'primary_currency_decimal_places' => $transaction['primary_currency']['decimal_places'] ?? null,
// primary currency, always present. // amounts, structured for 6.3.0.
'primary_currency_id' => $transaction['primary_currency']['id'] ?? null, 'amount' => $amount,
'primary_currency_code' => $transaction['primary_currency']['code'] ?? null, 'pc_amount' => $transaction['pc_amount'] ?? null,
'primary_currency_name' => $transaction['primary_currency']['name'] ?? null,
'primary_currency_symbol' => $transaction['primary_currency']['symbol'] ?? null,
'primary_currency_decimal_places' => $transaction['primary_currency']['decimal_places'] ?? null,
// source balance after 'foreign_amount' => $foreignAmount,
'source_balance_after' => $transaction['source_balance_after'] ?? null, 'pc_foreign_amount' => null,
'source_balance_dirty' => $transaction['source_balance_dirty'],
'source_balance_after' => $transaction['source_balance_after'] ?? null,
'pc_source_balance_after' => null,
// destination balance after // destination balance after
'destination_balance_after' => $transaction['destination_balance_after'] ?? null, 'destination_balance_after' => $transaction['destination_balance_after'] ?? null,
'destination_balance_dirty' => $transaction['destination_balance_dirty'], 'pc_destination_balance_after' => null,
// balance before and after, if not dirty. 'source_balance_dirty' => $transaction['source_balance_dirty'],
// 'running_balance_dirty' => $transaction['balance_dirty'] ?? false, 'destination_balance_dirty' => $transaction['destination_balance_dirty'],
// 'running_balance_before' => $transaction['balance_before'] ?? null,
// 'running_balance_after' => $transaction['balance_after'] ?? null,
'description' => $transaction['description'],
'source_id' => (string) $transaction['source_account_id'],
'source_name' => $transaction['source_account_name'],
'source_iban' => $transaction['source_account_iban'],
'source_type' => $transaction['source_account_type'],
'description' => $transaction['description'], 'destination_id' => (string) $transaction['destination_account_id'],
'destination_name' => $transaction['destination_account_name'],
'destination_iban' => $transaction['destination_account_iban'],
'destination_type' => $transaction['destination_account_type'],
'source_id' => (string) $transaction['source_account_id'], 'budget_id' => $this->stringFromArray($transaction, 'budget_id', null),
'source_name' => $transaction['source_account_name'], 'budget_name' => $transaction['budget_name'],
'source_iban' => $transaction['source_account_iban'],
'source_type' => $transaction['source_account_type'],
'destination_id' => (string) $transaction['destination_account_id'], 'category_id' => $this->stringFromArray($transaction, 'category_id', null),
'destination_name' => $transaction['destination_account_name'], 'category_name' => $transaction['category_name'],
'destination_iban' => $transaction['destination_account_iban'],
'destination_type' => $transaction['destination_account_type'],
'budget_id' => $this->stringFromArray($transaction, 'budget_id', null), 'bill_id' => $this->stringFromArray($transaction, 'bill_id', null),
'budget_name' => $transaction['budget_name'], 'bill_name' => $transaction['bill_name'],
'subscription_id' => $this->stringFromArray($transaction, 'bill_id', null),
'subscription_name' => $transaction['bill_name'],
'category_id' => $this->stringFromArray($transaction, 'category_id', null), 'reconciled' => $transaction['reconciled'],
'category_name' => $transaction['category_name'], 'notes' => $transaction['notes'],
'tags' => $transaction['tags'],
'bill_id' => $this->stringFromArray($transaction, 'bill_id', null), 'internal_reference' => $transaction['meta']['internal_reference'] ?? null,
'bill_name' => $transaction['bill_name'], 'external_id' => $transaction['meta']['external_id'] ?? null,
'original_source' => $transaction['meta']['original_source'] ?? null,
'recurrence_id' => $transaction['meta']['recurrence_id'] ?? null,
'recurrence_total' => $recurrenceTotal,
'recurrence_count' => $recurrenceCount,
'external_url' => $transaction['meta']['external_url'] ?? null,
'import_hash_v2' => $transaction['meta']['import_hash_v2'] ?? null,
'reconciled' => $transaction['reconciled'], 'sepa_cc' => $transaction['meta']['sepa_cc'] ?? null,
'notes' => $transaction['notes'], 'sepa_ct_op' => $transaction['meta']['sepa_ct_op'] ?? null,
'tags' => $transaction['tags'], 'sepa_ct_id' => $transaction['meta']['sepa_ct_id'] ?? null,
'sepa_db' => $transaction['meta']['sepa_db'] ?? null,
'sepa_country' => $transaction['meta']['sepa_country'] ?? null,
'sepa_ep' => $transaction['meta']['sepa_ep'] ?? null,
'sepa_ci' => $transaction['meta']['sepa_ci'] ?? null,
'sepa_batch_id' => $transaction['meta']['sepa_batch_id'] ?? null,
'internal_reference' => $transaction['meta']['internal_reference'] ?? null, 'interest_date' => array_key_exists('interest_date', $transaction['meta_date']) ? $transaction['meta_date']['interest_date']->toW3CString() : null,
'external_id' => $transaction['meta']['external_id'] ?? null, 'book_date' => array_key_exists('book_date', $transaction['meta_date']) ? $transaction['meta_date']['book_date']->toW3CString() : null,
'original_source' => $transaction['meta']['original_source'] ?? null, 'process_date' => array_key_exists('process_date', $transaction['meta_date']) ? $transaction['meta_date']['process_date']->toW3CString() : null,
'recurrence_id' => $transaction['meta']['recurrence_id'] ?? null, 'due_date' => array_key_exists('due_date', $transaction['meta_date']) ? $transaction['meta_date']['due_date']->toW3CString() : null,
'recurrence_total' => $recurrenceTotal, 'payment_date' => array_key_exists('payment_date', $transaction['meta_date']) ? $transaction['meta_date']['payment_date']->toW3CString() : null,
'recurrence_count' => $recurrenceCount, 'invoice_date' => array_key_exists('invoice_date', $transaction['meta_date']) ? $transaction['meta_date']['invoice_date']->toW3CString() : null,
'bunq_payment_id' => $transaction['meta']['bunq_payment_id'] ?? null,
'external_url' => $transaction['meta']['external_url'] ?? null,
'import_hash_v2' => $transaction['meta']['import_hash_v2'] ?? null,
'sepa_cc' => $transaction['meta']['sepa_cc'] ?? null,
'sepa_ct_op' => $transaction['meta']['sepa_ct_op'] ?? null,
'sepa_ct_id' => $transaction['meta']['sepa_ct_id'] ?? null,
'sepa_db' => $transaction['meta']['sepa_db'] ?? null,
'sepa_country' => $transaction['meta']['sepa_country'] ?? null,
'sepa_ep' => $transaction['meta']['sepa_ep'] ?? null,
'sepa_ci' => $transaction['meta']['sepa_ci'] ?? null,
'sepa_batch_id' => $transaction['meta']['sepa_batch_id'] ?? null,
'interest_date' => array_key_exists('interest_date', $transaction['meta_date']) ? $transaction['meta_date']['interest_date']->toW3CString() : null,
'book_date' => array_key_exists('book_date', $transaction['meta_date']) ? $transaction['meta_date']['book_date']->toW3CString() : null,
'process_date' => array_key_exists('process_date', $transaction['meta_date']) ? $transaction['meta_date']['process_date']->toW3CString() : null,
'due_date' => array_key_exists('due_date', $transaction['meta_date']) ? $transaction['meta_date']['due_date']->toW3CString() : null,
'payment_date' => array_key_exists('payment_date', $transaction['meta_date']) ? $transaction['meta_date']['payment_date']->toW3CString() : null,
'invoice_date' => array_key_exists('invoice_date', $transaction['meta_date']) ? $transaction['meta_date']['invoice_date']->toW3CString() : null,
// location data // location data
'longitude' => $transaction['location']['longitude'], 'longitude' => $transaction['location']['longitude'],
'latitude' => $transaction['location']['latitude'], 'latitude' => $transaction['location']['latitude'],
'zoom_level' => $transaction['location']['zoom_level'], 'zoom_level' => $transaction['location']['zoom_level'],
'has_attachments' => $transaction['attachment_count'] > 0, 'has_attachments' => $transaction['attachment_count'] > 0,
]; ];
} }
@@ -282,7 +283,7 @@ class TransactionGroupTransformer extends AbstractTransformer
'links' => [ 'links' => [
[ [
'rel' => 'self', 'rel' => 'self',
'uri' => '/transactions/'.$group->id, 'uri' => '/transactions/' . $group->id,
], ],
], ],
]; ];
@@ -324,7 +325,7 @@ class TransactionGroupTransformer extends AbstractTransformer
$destination = $this->getDestinationTransaction($journal); $destination = $this->getDestinationTransaction($journal);
$type = $journal->transactionType->type; $type = $journal->transactionType->type;
$currency = $source->transactionCurrency; $currency = $source->transactionCurrency;
$amount = app('steam')->bcround($this->getAmount($source->amount), $currency->decimal_places ?? 0); $amount = Steam::bcround($this->getAmount($source->amount), $currency->decimal_places ?? 0);
$foreignAmount = $this->getForeignAmount($source->foreign_amount ?? null); $foreignAmount = $this->getForeignAmount($source->foreign_amount ?? null);
$metaFieldData = $this->groupRepos->getMetaFields($journal->id, $this->metaFields); $metaFieldData = $this->groupRepos->getMetaFields($journal->id, $this->metaFields);
$metaDates = $this->getDates($this->groupRepos->getMetaDateFields($journal->id, $this->metaDateFields)); $metaDates = $this->getDates($this->groupRepos->getMetaDateFields($journal->id, $this->metaDateFields));
@@ -334,13 +335,13 @@ class TransactionGroupTransformer extends AbstractTransformer
$bill = $this->getBill($journal->bill); $bill = $this->getBill($journal->bill);
if (null !== $foreignAmount && null !== $source->foreignCurrency) { if (null !== $foreignAmount && null !== $source->foreignCurrency) {
$foreignAmount = app('steam')->bcround($foreignAmount, $foreignCurrency['decimal_places'] ?? 0); $foreignAmount = Steam::bcround($foreignAmount, $foreignCurrency['decimal_places'] ?? 0);
} }
$longitude = null; $longitude = null;
$latitude = null; $latitude = null;
$zoomLevel = null; $zoomLevel = null;
$location = $this->getLocation($journal); $location = $this->getLocation($journal);
if ($location instanceof Location) { if ($location instanceof Location) {
$longitude = $location->longitude; $longitude = $location->longitude;
$latitude = $location->latitude; $latitude = $location->latitude;
@@ -348,77 +349,77 @@ class TransactionGroupTransformer extends AbstractTransformer
} }
return [ return [
'user' => $journal->user_id, 'user' => $journal->user_id,
'transaction_journal_id' => (string) $journal->id, 'transaction_journal_id' => (string) $journal->id,
'type' => strtolower((string) $type), 'type' => strtolower((string) $type),
'date' => $journal->date->toAtomString(), 'date' => $journal->date->toAtomString(),
'order' => $journal->order, 'order' => $journal->order,
'currency_id' => (string) $currency->id, 'currency_id' => (string) $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places, 'currency_decimal_places' => $currency->decimal_places,
'foreign_currency_id' => (string) $foreignCurrency['id'], 'foreign_currency_id' => (string) $foreignCurrency['id'],
'foreign_currency_code' => $foreignCurrency['code'], 'foreign_currency_code' => $foreignCurrency['code'],
'foreign_currency_symbol' => $foreignCurrency['symbol'], 'foreign_currency_symbol' => $foreignCurrency['symbol'],
'foreign_currency_decimal_places' => $foreignCurrency['decimal_places'], 'foreign_currency_decimal_places' => $foreignCurrency['decimal_places'],
'amount' => app('steam')->bcround($amount, $currency->decimal_places), 'amount' => Steam::bcround($amount, $currency->decimal_places),
'foreign_amount' => $foreignAmount, 'foreign_amount' => $foreignAmount,
'description' => $journal->description, 'description' => $journal->description,
'source_id' => (string) $source->account_id, 'source_id' => (string) $source->account_id,
'source_name' => $source->account->name, 'source_name' => $source->account->name,
'source_iban' => $source->account->iban, 'source_iban' => $source->account->iban,
'source_type' => $source->account->accountType->type, 'source_type' => $source->account->accountType->type,
'destination_id' => (string) $destination->account_id, 'destination_id' => (string) $destination->account_id,
'destination_name' => $destination->account->name, 'destination_name' => $destination->account->name,
'destination_iban' => $destination->account->iban, 'destination_iban' => $destination->account->iban,
'destination_type' => $destination->account->accountType->type, 'destination_type' => $destination->account->accountType->type,
'budget_id' => (string) $budget['id'], 'budget_id' => (string) $budget['id'],
'budget_name' => $budget['name'], 'budget_name' => $budget['name'],
'category_id' => (string) $category['id'], 'category_id' => (string) $category['id'],
'category_name' => $category['name'], 'category_name' => $category['name'],
'bill_id' => (string) $bill['id'], 'bill_id' => (string) $bill['id'],
'bill_name' => $bill['name'], 'bill_name' => $bill['name'],
'reconciled' => $source->reconciled, 'reconciled' => $source->reconciled,
'notes' => $this->groupRepos->getNoteText($journal->id), 'notes' => $this->groupRepos->getNoteText($journal->id),
'tags' => $this->groupRepos->getTags($journal->id), 'tags' => $this->groupRepos->getTags($journal->id),
'internal_reference' => $metaFieldData['internal_reference'], 'internal_reference' => $metaFieldData['internal_reference'],
'external_id' => $metaFieldData['external_id'], 'external_id' => $metaFieldData['external_id'],
'original_source' => $metaFieldData['original_source'], 'original_source' => $metaFieldData['original_source'],
'recurrence_id' => $metaFieldData['recurrence_id'], 'recurrence_id' => $metaFieldData['recurrence_id'],
'bunq_payment_id' => $metaFieldData['bunq_payment_id'], 'bunq_payment_id' => $metaFieldData['bunq_payment_id'],
'import_hash_v2' => $metaFieldData['import_hash_v2'], 'import_hash_v2' => $metaFieldData['import_hash_v2'],
'sepa_cc' => $metaFieldData['sepa_cc'], 'sepa_cc' => $metaFieldData['sepa_cc'],
'sepa_ct_op' => $metaFieldData['sepa_ct_op'], 'sepa_ct_op' => $metaFieldData['sepa_ct_op'],
'sepa_ct_id' => $metaFieldData['sepa_ct_id'], 'sepa_ct_id' => $metaFieldData['sepa_ct_id'],
'sepa_db' => $metaFieldData['sepa_db'], 'sepa_db' => $metaFieldData['sepa_db'],
'sepa_country' => $metaFieldData['sepa_country'], 'sepa_country' => $metaFieldData['sepa_country'],
'sepa_ep' => $metaFieldData['sepa_ep'], 'sepa_ep' => $metaFieldData['sepa_ep'],
'sepa_ci' => $metaFieldData['sepa_ci'], 'sepa_ci' => $metaFieldData['sepa_ci'],
'sepa_batch_id' => $metaFieldData['sepa_batch_id'], 'sepa_batch_id' => $metaFieldData['sepa_batch_id'],
'interest_date' => $metaDates['interest_date'], 'interest_date' => $metaDates['interest_date'],
'book_date' => $metaDates['book_date'], 'book_date' => $metaDates['book_date'],
'process_date' => $metaDates['process_date'], 'process_date' => $metaDates['process_date'],
'due_date' => $metaDates['due_date'], 'due_date' => $metaDates['due_date'],
'payment_date' => $metaDates['payment_date'], 'payment_date' => $metaDates['payment_date'],
'invoice_date' => $metaDates['invoice_date'], 'invoice_date' => $metaDates['invoice_date'],
// location data // location data
'longitude' => $longitude, 'longitude' => $longitude,
'latitude' => $latitude, 'latitude' => $latitude,
'zoom_level' => $zoomLevel, 'zoom_level' => $zoomLevel,
]; ];
} }
@@ -458,13 +459,13 @@ class TransactionGroupTransformer extends AbstractTransformer
private function getAmount(string $amount): string private function getAmount(string $amount): string
{ {
return app('steam')->positive($amount); return Steam::positive($amount);
} }
private function getForeignAmount(?string $foreignAmount): ?string private function getForeignAmount(?string $foreignAmount): ?string
{ {
if (null !== $foreignAmount && '' !== $foreignAmount && 0 !== bccomp('0', $foreignAmount)) { if (null !== $foreignAmount && '' !== $foreignAmount && 0 !== bccomp('0', $foreignAmount)) {
return app('steam')->positive($foreignAmount); return Steam::positive($foreignAmount);
} }
return null; return null;
@@ -493,7 +494,7 @@ class TransactionGroupTransformer extends AbstractTransformer
private function getForeignCurrency(?TransactionCurrency $currency): array private function getForeignCurrency(?TransactionCurrency $currency): array
{ {
$array = [ $array = [
'id' => null, 'id' => null,
'code' => null, 'code' => null,
'symbol' => null, 'symbol' => null,
@@ -512,7 +513,7 @@ class TransactionGroupTransformer extends AbstractTransformer
private function getBudget(?Budget $budget): array private function getBudget(?Budget $budget): array
{ {
$array = [ $array = [
'id' => null, 'id' => null,
'name' => null, 'name' => null,
]; ];
@@ -527,7 +528,7 @@ class TransactionGroupTransformer extends AbstractTransformer
private function getCategory(?Category $category): array private function getCategory(?Category $category): array
{ {
$array = [ $array = [
'id' => null, 'id' => null,
'name' => null, 'name' => null,
]; ];
@@ -542,7 +543,7 @@ class TransactionGroupTransformer extends AbstractTransformer
private function getBill(?Bill $bill): array private function getBill(?Bill $bill): array
{ {
$array = [ $array = [
'id' => null, 'id' => null,
'name' => null, 'name' => null,
]; ];

View File

@@ -89,7 +89,7 @@ class UserGroupTransformer extends AbstractTransformer
foreach ($members as $member) { foreach ($members as $member) {
$mail = $member['user_email']; $mail = $member['user_email'];
$new[$groupId][$mail] ??= [ $new[$groupId][$mail] ??= [
'user_id' => $member['user_id'], 'user_id' => (string) $member['user_id'],
'user_email' => $member['user_email'], 'user_email' => $member['user_email'],
'you' => $member['you'], 'you' => $member['you'],
'roles' => [], 'roles' => [],