diff --git a/app/Support/FinTS/MetadataParser.php b/app/Support/FinTS/MetadataParser.php new file mode 100644 index 0000000000..37d8debc22 --- /dev/null +++ b/app/Support/FinTS/MetadataParser.php @@ -0,0 +1,37 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Support\FinTS; +use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; + +class MetadataParser +{ + function getDescription(FinTSTransaction $transaction) + { + //Given a description like 'EREF+AbcCRED+DE123SVWZ+DefABWA+Ghi' or 'EREF+AbcCRED+DE123SVWZ+Def' return 'Def' + $finTSDescription = $transaction->getDescription1(); + if (preg_match('/SVWZ\+([^\+]*)([A-Z]{4}\+|$)/', $finTSDescription, $matches) === 1) { + return $matches[1]; + } + return $finTSDescription; + } +} \ No newline at end of file diff --git a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php index 1a5c1a911e..16bb14fafb 100644 --- a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php +++ b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php @@ -34,6 +34,7 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Support\FinTS\FinTS; +use FireflyIII\Support\FinTS\MetadataParser; use FireflyIII\Support\Import\Routine\File\OpposingAccountMapper; use Illuminate\Support\Facades\Log; @@ -141,11 +142,14 @@ class StageImportDataHandler Log::debug('Both are assets, will make transfer.'); } + $metadataParser = new MetadataParser(); + $description = $metadataParser->getDescription($transaction); + $storeData = [ 'user' => $this->importJob->user_id, 'type' => $type, 'date' => $transaction->getValutaDate()->format('Y-m-d'), - 'description' => $transaction->getDescription1(), + 'description' => $description, 'piggy_bank_id' => null, 'piggy_bank_name' => null, 'bill_id' => null, diff --git a/tests/Unit/Support/FinTS/MetadataParserTest.php b/tests/Unit/Support/FinTS/MetadataParserTest.php new file mode 100644 index 0000000000..d986b724e4 --- /dev/null +++ b/tests/Unit/Support/FinTS/MetadataParserTest.php @@ -0,0 +1,71 @@ +. + */ +declare(strict_types=1); + +namespace Tests\Unit\Support\FinTS; + +use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; + +use FireflyIII\Support\FinTS\MetadataParser; +use Illuminate\Support\Facades\Log; +use Tests\TestCase; + +class MetadataParserTest extends TestCase +{ + + /** @var MetadataParser */ + private $metadataParser; + + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Log::info(sprintf('Now in %s.', \get_class($this))); + $this->metadataParser = new MetadataParser(); + } + + public function testDescriptionIsCorrectlyExtractedFromBeginning() + { + $transaction = $this->createTransactionWithDescription1('SVWZ+DescriptionABWA+xxx'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + public function testDescriptionIsCorrectlyExtractedFromMiddle() + { + $transaction = $this->createTransactionWithDescription1('EREF+AbcCRED+DE123SVWZ+DescriptionABWA+Ghi'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + public function testDescriptionIsCorrectlyExtractedFromEnd() + { + $transaction = $this->createTransactionWithDescription1('EREF+AbcCRED+DE123SVWZ+Description'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + private function createTransactionWithDescription1(string $description1) + { + $transaction = $this->mock(FinTSTransaction::class); + $transaction->shouldReceive('getDescription1')->atLeast()->once()->andReturn($description1); + return $transaction; + } +}