transformTransaction($transaction); } return $data; } public function transformTransaction($transaction) { if (!array_key_exists('transactionId', $transaction) || !array_key_exists('transactionAmount', $transaction)) throw new \Exception('invalid dataset'); // description could be in varios places $description = ''; if (array_key_exists('remittanceInformationStructured', $transaction)) $description = $transaction["remittanceInformationStructured"]; else if (array_key_exists('remittanceInformationStructuredArray', $transaction)) $description = implode('\n', $transaction["remittanceInformationStructuredArray"]); else if (array_key_exists('remittanceInformationUnstructured', $transaction)) $description = $transaction["remittanceInformationUnstructured"]; else if (array_key_exists('remittanceInformationUnstructuredArray', $transaction)) $description = implode('\n', $transaction["remittanceInformationUnstructuredArray"]); else Log::warning("Missing description for the following transaction: " . json_encode($transaction)); // participant $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' => $transaction["transactionId"], 'amount' => abs((int) $transaction["transactionAmount"]["amount"]), 'currency_id' => $this->convertCurrency($transaction["transactionAmount"]["currency"]), 'category_id' => null, // nordigen has no categories 'category_type' => array_key_exists('additionalInformation', $transaction) ? $transaction["additionalInformation"] : null, // TODO: institution specific keys like: GUTSCHRIFT, ABSCHLUSS, MONATSABSCHLUSS etc '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; } }