2016-10-19 8 views
0

HBCIを介して銀行取引を引き続きインポートしたい。 問題は、ユニークなキーも正確なタイムスタンプもないことです(タイムスタンプは日中のみ、すなわち常に12AMになります)。銀行取引の一意のキーを生成

これは、誰かが同じ目的のテキストと同じ日に同じ値を転送した場合、私はAPIからのすべてのフィールドの上にハッシュを生成

enter image description here

を取得したデータは、(偽陽性につながるですなど)

重複するインポートを避けて一意のキーを生成するにはどうすればよいですか?

+0

明白な解決策は、自動インクリメントキーです。しかし、hbci経由でインポートされたデータフィールドを持つ独自のキーを作成し、同一のローカルとリモートアカウント間で同じ日付の同じ値を持つ複数のトランザクションの場合に重複を生成することを理解しています。ご確認ください。 –

+0

私は自動インクリメントを追加することができますが、私はすでに転送されたトランザクションを識別する必要があります。 – Alex

+1

ここで同じ問題が発生しました。私は単純に同じ日の声明の数を数えることを考えています。結局のところ:2つのステートメントが完全に同じであれば、それを2回保存しない限り最初に保存するステートメントは重要ではありません。 – Juergen

答えて

0
/** 
* Generate a unique ID per transaction 
* We assume, that all transactions of a day are always present in the fetched transactions 
* (after a while, very old transactions might not appear) 
* So we generate a continues key per day, combine it with the date and have a globally unique key 
* 
* @return Transaction[] 
*/ 
public static function getKeyedTransactions() 
{ 
    $transactions = self::getTransactions(); 
    $result = []; 
    $dateCounters = array(); 
    foreach($transactions as $transaction) { 
     $date = $transaction->getDate()->format('Ymd'); 
     if (!isset($dateCounters[$date])) { 
      $dateCounters[$date] = 0; 
     } 
     $dateCounters[$date]++; 
     $uniqId = $date . sprintf('%05d', $dateCounters[$date]); 
     $result[$uniqId] = $transaction; 
    } 
    return $result; 
} 
+1

私は思う:$ date = $ transaction-> getBookingDate() - > format( 'Ymd');より良い仕事をします。 – Juergen

関連する問題