diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index e3180d9368..8bf70ba9dd 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -88,6 +88,7 @@ class Amount implements ConverterInterface Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $oldValue, $value)); } - return strval(round(floatval($value), 12)); + $number = strval(number_format(round(floatval($value), 12), 12)); + return $number; } } diff --git a/app/Import/Converter/AmountCredit.php b/app/Import/Converter/AmountCredit.php new file mode 100644 index 0000000000..2e37f42706 --- /dev/null +++ b/app/Import/Converter/AmountCredit.php @@ -0,0 +1,44 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Import\Converter; + +/** + * Class AmountCredit + */ +class AmountCredit implements ConverterInterface +{ + /** + * @param $value + * + * @return string + */ + public function convert($value): string + { + /** @var ConverterInterface $converter */ + $converter = app(Amount::class); + $result = $converter->convert($value); + $result = app('steam')->positive($result); + + return $result; + } +} diff --git a/app/Import/Converter/AmountDebet.php b/app/Import/Converter/AmountDebet.php new file mode 100644 index 0000000000..a890ae3209 --- /dev/null +++ b/app/Import/Converter/AmountDebet.php @@ -0,0 +1,45 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Import\Converter; + +/** + * Class AmountDebet + */ +class AmountDebet implements ConverterInterface +{ + /** + * @param $value + * + * @return string + */ + public function convert($value): string + { + /** @var ConverterInterface $converter */ + $converter = app(Amount::class); + $result = $converter->convert($value); + $result = app('steam')->positive($result); + $result = bcmul($result, '-1'); + + return $result; + } +} diff --git a/app/Import/Object/ImportJournal.php b/app/Import/Object/ImportJournal.php index b78fe908e8..3f27e1ab49 100644 --- a/app/Import/Object/ImportJournal.php +++ b/app/Import/Object/ImportJournal.php @@ -59,8 +59,12 @@ class ImportJournal public $opposing; /** @var array */ public $tags = []; - /** @var string */ + /** @var array */ private $amount; + /** @var array */ + private $amountCredit; + /** @var array */ + private $amountDebet; /** @var string */ private $convertedAmount = null; /** @var string */ @@ -101,11 +105,40 @@ class ImportJournal public function getAmount(): string { Log::debug('Now in getAmount()'); + Log::debug(sprintf('amount is %s', var_export($this->amount, true))); + Log::debug(sprintf('debet amount is %s', var_export($this->amountDebet, true))); + Log::debug(sprintf('credit amount is %s', var_export($this->amountCredit, true))); + if (null === $this->convertedAmount) { + // first check if the amount is set: Log::debug('convertedAmount is NULL'); + + $info = []; + $converterClass = ''; + + if (!is_null($this->amount)) { + Log::debug('Amount value is not NULL, assume this is the correct value.'); + $converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amount['role']))); + $info = $this->amount; + } + if (!is_null($this->amountDebet)) { + Log::debug('Amount DEBET value is not NULL, assume this is the correct value (overrules Amount).'); + $converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountDebet['role']))); + $info = $this->amountDebet; + } + if (!is_null($this->amountCredit)) { + Log::debug('Amount CREDIT value is not NULL, assume this is the correct value (overrules Amount and AmountDebet).'); + $converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountCredit['role']))); + $info = $this->amountCredit; + } + if (count($info) === 0) { + throw new FireflyException('No amount information for this row.'); + } + + Log::debug(sprintf('Converter class is %s', $converterClass)); /** @var ConverterInterface $amountConverter */ - $amountConverter = app(Amount::class); - $this->convertedAmount = $amountConverter->convert($this->amount); + $amountConverter = app($converterClass); + $this->convertedAmount = $amountConverter->convert($info['value']); Log::debug(sprintf('First attempt to convert gives "%s"', $this->convertedAmount)); // modify foreach ($this->modifiers as $modifier) { @@ -196,7 +229,13 @@ class ImportJournal $this->asset->setAccountId($array); break; case 'amount': - $this->amount = $array['value']; + $this->amount = $array; + break; + case 'amount_debet': + $this->amountDebet = $array; + break; + case 'amount_credit': + $this->amountCredit = $array; break; case 'account-iban': $this->asset->setAccountIban($array); diff --git a/app/Repositories/Currency/CurrencyRepository.php b/app/Repositories/Currency/CurrencyRepository.php index 0edb00f25a..7862a2fdba 100644 --- a/app/Repositories/Currency/CurrencyRepository.php +++ b/app/Repositories/Currency/CurrencyRepository.php @@ -168,7 +168,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface */ public function get(): Collection { - return TransactionCurrency::get(); + return TransactionCurrency::orderBy('code', 'ASC')->get(); } /** @@ -178,7 +178,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface */ public function getByIds(array $ids): Collection { - return TransactionCurrency::whereIn('id', $ids)->get(); + return TransactionCurrency::orderBy('code', 'ASC')->whereIn('id', $ids)->get(); } /** diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index 981ee5ba21..05f4807096 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -351,7 +351,7 @@ class TagRepository implements TagRepositoryInterface $tagsWithAmounts[$tag->id] = strval($tag->amount_sum); } - $tags = $query->orderBy('tags.id', 'desc')->get(['tags.id', 'tags.tag']); + $tags = $allTags->orderBy('tags.id', 'desc')->get(['tags.id', 'tags.tag']); $temporary = []; /** @var Tag $tag */ foreach ($tags as $tag) { @@ -364,13 +364,17 @@ class TagRepository implements TagRepositoryInterface $temporary[] = [ 'amount' => $amount, - 'tag' => $tag, + 'tag' => [ + 'id' => $tag->id, + 'tag' => $tag->tag, + ], ]; } + /** @var array $entry */ foreach ($temporary as $entry) { $scale = $this->cloudScale([12, 20], floatval($entry['amount']), floatval($min), floatval($max)); - $tagId = $entry['tag']->id; + $tagId = $entry['tag']['id']; $return[$tagId] = [ 'scale' => $scale, 'tag' => $entry['tag'], diff --git a/app/Support/Import/Configuration/Csv/Roles.php b/app/Support/Import/Configuration/Csv/Roles.php index 2f03e3f1a5..e15b2cf898 100644 --- a/app/Support/Import/Configuration/Csv/Roles.php +++ b/app/Support/Import/Configuration/Csv/Roles.php @@ -258,7 +258,7 @@ class Roles implements ConfigurationInterface if ('_ignore' !== $role) { ++$assigned; } - if ('amount' === $role) { + if (in_array($role, ['amount','amount_credit','amount_debet'])) { $hasAmount = true; } } diff --git a/config/csv.php b/config/csv.php index edba7b4714..fa296fe055 100644 --- a/config/csv.php +++ b/config/csv.php @@ -280,6 +280,18 @@ return [ 'converter' => 'Amount', 'field' => 'amount', ], + 'amount_debet' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'AmountDebet', + 'field' => 'amount_debet', + ], + 'amount_credit' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'AmountCredit', + 'field' => 'amount_credit', + ], 'sepa-ct-id' => [ 'mappable' => false, 'pre-process-map' => false, diff --git a/resources/lang/en_US/csv.php b/resources/lang/en_US/csv.php index eb7fe230b1..094df1e9a2 100644 --- a/resources/lang/en_US/csv.php +++ b/resources/lang/en_US/csv.php @@ -51,6 +51,8 @@ return [ 'column_account-id' => 'Asset account ID (matching Firefly)', 'column_account-name' => 'Asset account (name)', 'column_amount' => 'Amount', + 'column_amount_debet' => 'Amount (debet column)', + 'column_amount_credit' => 'Amount (credit column)', 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', 'column_bill-id' => 'Bill ID (matching Firefly)', 'column_bill-name' => 'Bill name',