transformTransaction($transaction); } return $data; } public function transformTransaction($transaction) { // depending on institution, the result can be different, so we load the first available unique id $transactionId = ''; if (array_key_exists('transactionId', $transaction)) { $transactionId = $transaction["transactionId"]; } elseif (array_key_exists('internalTransactionId', $transaction)) { $transactionId = $transaction["internalTransactionId"]; } else { nlog(`Invalid Input for nordigen transaction transformer: ` . $transaction); throw new \Exception('invalid dataset: missing transactionId - Please report this error to the developer'); } $amount = (float) $transaction["transactionAmount"]["amount"]; // description could be in varios places $description = ''; if (array_key_exists('remittanceInformationStructured', $transaction)) { $description = $transaction["remittanceInformationStructured"]; } elseif (array_key_exists('remittanceInformationStructuredArray', $transaction)) { $description = implode('\n', $transaction["remittanceInformationStructuredArray"]); } elseif (array_key_exists('remittanceInformationUnstructured', $transaction)) { $description = $transaction["remittanceInformationUnstructured"]; } elseif (array_key_exists('remittanceInformationUnstructuredArray', $transaction)) { $description = implode('\n', $transaction["remittanceInformationUnstructuredArray"]); } else { Log::warning("Missing description for the following transaction: " . json_encode($transaction)); } // enrich description with currencyExchange informations if (array_key_exists('currencyExchange', $transaction)) { foreach ($transaction["currencyExchange"] as $exchangeRate) { $targetAmount = round($amount * (float) ($exchangeRate["exchangeRate"] ?? 1) , 2); $description .= '\nexchangeRate: ' . $amount . " " . ($exchangeRate["sourceCurrency"] ?? '?') . " = " . $targetAmount . " " . ($exchangeRate["targetCurrency"] ?? '?') . " (" . ($exchangeRate["quotationDate"] ?? '?') . ")"; } } // participant data $participant = array_key_exists('debtorAccount', $transaction) && array_key_exists('iban', $transaction["debtorAccount"]) ? $transaction['debtorAccount']['iban'] : (array_key_exists('creditorAccount', $transaction) && array_key_exists('iban', $transaction["creditorAccount"]) ? $transaction['creditorAccount']['iban'] : null); $participant_name = array_key_exists('debtorName', $transaction) ? $transaction['debtorName'] : (array_key_exists('creditorName', $transaction) ? $transaction['creditorName'] : null); return [ 'transaction_id' => 0, 'nordigen_transaction_id' => $transactionId, 'amount' => $amount, 'currency_id' => $this->convertCurrency($transaction["transactionAmount"]["currency"]), 'category_id' => null, 'category_type' => array_key_exists('additionalInformation', $transaction) ? $transaction["additionalInformation"] : '', 'date' => $transaction["bookingDate"], 'description' => $description, 'participant' => $participant, 'participant_name' => $participant_name, 'base_type' => (int) $transaction["transactionAmount"]["amount"] <= 0 ? 'DEBIT' : 'CREDIT', ]; } private function convertCurrency(string $code) { $currencies = Cache::get('currencies'); if (!$currencies) { $this->buildCache(true); } $currency = $currencies->filter(function ($item) use ($code) { return $item->code == $code; })->first(); if ($currency) { return $currency->id; } return 1; } }