diff --git a/app/Export/Collector/UploadCollector.php b/app/Export/Collector/UploadCollector.php index 0b7cca980a..3841a52a9d 100644 --- a/app/Export/Collector/UploadCollector.php +++ b/app/Export/Collector/UploadCollector.php @@ -33,6 +33,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface private $uploadDisk; /** + * * AttachmentCollector constructor. * * @param ExportJob $job @@ -44,6 +45,8 @@ class UploadCollector extends BasicCollector implements CollectorInterface // make storage: $this->uploadDisk = Storage::disk('upload'); $this->exportDisk = Storage::disk('export'); + + // todo needs work for new importer (potentially collect other types as well) $this->expected = 'csv-upload-' . Auth::user()->id . '-'; } diff --git a/app/Helpers/Csv/Converter/AccountId.php b/app/Helpers/Csv/Converter/AccountId.php deleted file mode 100644 index 908cd132de..0000000000 --- a/app/Helpers/Csv/Converter/AccountId.php +++ /dev/null @@ -1,35 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $account = $crud->find($var); - - return $account; - } -} diff --git a/app/Helpers/Csv/Converter/Amount.php b/app/Helpers/Csv/Converter/Amount.php deleted file mode 100644 index 8e2cfc4d0e..0000000000 --- a/app/Helpers/Csv/Converter/Amount.php +++ /dev/null @@ -1,32 +0,0 @@ -value)) { - return strval($this->value); - } - - return '0'; - } -} diff --git a/app/Helpers/Csv/Converter/AmountComma.php b/app/Helpers/Csv/Converter/AmountComma.php deleted file mode 100644 index 8cddad6dc8..0000000000 --- a/app/Helpers/Csv/Converter/AmountComma.php +++ /dev/null @@ -1,36 +0,0 @@ -value)); - - if (is_numeric($value)) { - return strval($value); - } - - return '0'; - } -} diff --git a/app/Helpers/Csv/Converter/AssetAccountIban.php b/app/Helpers/Csv/Converter/AssetAccountIban.php deleted file mode 100644 index 4da3a73625..0000000000 --- a/app/Helpers/Csv/Converter/AssetAccountIban.php +++ /dev/null @@ -1,89 +0,0 @@ -mapped[$this->index][$this->value])) { - $account = $crud->find(intval($this->mapped[$this->index][$this->value])); - - return $account; - } - - - if (strlen($this->value) > 0) { - $account = $this->searchOrCreate($crud); - - return $account; - } - - return new Account; - } - - /** - * @param AccountCrudInterface $crud - * - * @return Account - */ - private function searchOrCreate(AccountCrudInterface $crud) - { - // find or create new account: - $set = $crud->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - /** @var Account $entry */ - foreach ($set as $entry) { - if ($entry->iban == $this->value) { - - return $entry; - } - } - - - // create it if doesn't exist. - $accountData = [ - 'name' => $this->value, - 'accountType' => 'asset', - 'virtualBalance' => 0, - 'virtualBalanceCurrency' => 1, // hard coded. - 'active' => true, - 'user' => Auth::user()->id, - 'iban' => $this->value, - 'accountNumber' => $this->value, - 'accountRole' => null, - 'openingBalance' => 0, - 'openingBalanceDate' => new Carbon, - 'openingBalanceCurrency' => 1, // hard coded. - ]; - - $account = $crud->store($accountData); - - return $account; - } -} diff --git a/app/Helpers/Csv/Converter/AssetAccountName.php b/app/Helpers/Csv/Converter/AssetAccountName.php deleted file mode 100644 index e56620415e..0000000000 --- a/app/Helpers/Csv/Converter/AssetAccountName.php +++ /dev/null @@ -1,65 +0,0 @@ -mapped[$this->index][$this->value])) { - $account = $crud->find(intval($this->mapped[$this->index][$this->value])); - - return $account; - } - - $set = $crud->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - /** @var Account $entry */ - foreach ($set as $entry) { - if ($entry->name == $this->value) { - return $entry; - } - } - $accountData = [ - 'name' => $this->value, - 'accountType' => 'asset', - 'virtualBalance' => 0, - 'virtualBalanceCurrency' => 1, // hard coded. - 'active' => true, - 'user' => Auth::user()->id, - 'iban' => null, - 'accountNumber' => $this->value, - 'accountRole' => null, - 'openingBalance' => 0, - 'openingBalanceDate' => new Carbon, - 'openingBalanceCurrency' => 1, // hard coded. - ]; - - $account = $crud->store($accountData); - - return $account; - } -} diff --git a/app/Helpers/Csv/Converter/AssetAccountNumber.php b/app/Helpers/Csv/Converter/AssetAccountNumber.php deleted file mode 100644 index 5b8efed50a..0000000000 --- a/app/Helpers/Csv/Converter/AssetAccountNumber.php +++ /dev/null @@ -1,77 +0,0 @@ -mapped[$this->index][$this->value])) { - $account = $crud->find(intval($this->mapped[$this->index][$this->value])); - - return $account; - } - // if not, search for it (or create it): - $value = $this->value ?? ''; - if (strlen($value) > 0) { - // find or create new account: - $set = $crud->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - /** @var Account $entry */ - foreach ($set as $entry) { - $accountNumber = $entry->getMeta('accountNumber'); - if ($accountNumber == $this->value) { - - return $entry; - } - } - - $accountData = [ - 'name' => $this->value, - 'accountType' => 'asset', - 'virtualBalance' => 0, - 'virtualBalanceCurrency' => 1, // hard coded. - 'active' => true, - 'user' => Auth::user()->id, - 'iban' => null, - 'accountNumber' => $this->value, - 'accountRole' => null, - 'openingBalance' => 0, - 'openingBalanceDate' => new Carbon, - 'openingBalanceCurrency' => 1, // hard coded. - - ]; - - $account = $crud->store($accountData); - - return $account; - } - - return null; // is this accepted? - } - -} diff --git a/app/Helpers/Csv/Converter/BasicConverter.php b/app/Helpers/Csv/Converter/BasicConverter.php deleted file mode 100644 index 63e5f8bb96..0000000000 --- a/app/Helpers/Csv/Converter/BasicConverter.php +++ /dev/null @@ -1,114 +0,0 @@ -data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @return string - */ - public function getField(): string - { - return $this->field; - } - - /** - * @param string $field - */ - public function setField(string $field) - { - $this->field = $field; - } - - /** - * @return int - */ - public function getIndex(): int - { - return $this->index; - } - - /** - * @param int $index - */ - public function setIndex(int $index) - { - $this->index = $index; - } - - /** - * @return array - */ - public function getMapped(): array - { - return $this->mapped; - } - - /** - * @param array $mapped - */ - public function setMapped(array $mapped) - { - $this->mapped = $mapped; - } - - /** - * @return string - */ - public function getValue(): string - { - return $this->value; - } - - /** - * @param string $value - */ - public function setValue(string $value) - { - $this->value = $value; - } - - -} diff --git a/app/Helpers/Csv/Converter/BillId.php b/app/Helpers/Csv/Converter/BillId.php deleted file mode 100644 index 3e9102ccec..0000000000 --- a/app/Helpers/Csv/Converter/BillId.php +++ /dev/null @@ -1,36 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $bill = $repository->find($value); - - return $bill; - } -} diff --git a/app/Helpers/Csv/Converter/BillName.php b/app/Helpers/Csv/Converter/BillName.php deleted file mode 100644 index a1328ef6c1..0000000000 --- a/app/Helpers/Csv/Converter/BillName.php +++ /dev/null @@ -1,47 +0,0 @@ -mapped[$this->index][$this->value])) { - return $repository->find($this->mapped[$this->index][$this->value]); - } - $bills = $repository->getBills(); - - /** @var Bill $bill */ - foreach ($bills as $bill) { - if ($bill->name == $this->value) { - return $bill; - } - } - - return new Bill; - } -} diff --git a/app/Helpers/Csv/Converter/BudgetId.php b/app/Helpers/Csv/Converter/BudgetId.php deleted file mode 100644 index d9302d7734..0000000000 --- a/app/Helpers/Csv/Converter/BudgetId.php +++ /dev/null @@ -1,36 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $budget = $repository->find($value); - - return $budget; - } -} diff --git a/app/Helpers/Csv/Converter/BudgetName.php b/app/Helpers/Csv/Converter/BudgetName.php deleted file mode 100644 index 84f777775b..0000000000 --- a/app/Helpers/Csv/Converter/BudgetName.php +++ /dev/null @@ -1,44 +0,0 @@ -mapped[$this->index][$this->value])) { - $budget = $repository->find($this->mapped[$this->index][$this->value]); - - return $budget; - } - $budget = $repository->store(['name' => $this->value, 'user' => Auth::user()->id]); - - - return $budget; - } -} diff --git a/app/Helpers/Csv/Converter/CategoryId.php b/app/Helpers/Csv/Converter/CategoryId.php deleted file mode 100644 index 8ffedd9ae1..0000000000 --- a/app/Helpers/Csv/Converter/CategoryId.php +++ /dev/null @@ -1,36 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $category = $repository->find($value); - - return $category; - } -} diff --git a/app/Helpers/Csv/Converter/CategoryName.php b/app/Helpers/Csv/Converter/CategoryName.php deleted file mode 100644 index d322f7b02f..0000000000 --- a/app/Helpers/Csv/Converter/CategoryName.php +++ /dev/null @@ -1,49 +0,0 @@ -mapped[$this->index][$this->value])) { - $category = $repository->find($this->mapped[$this->index][$this->value]); - - return $category; - } - - $data = [ - 'name' => $this->value, - 'user' => Auth::user()->id, - ]; - - $category = $repository->store($data); - - return $category; - } -} diff --git a/app/Helpers/Csv/Converter/ConverterInterface.php b/app/Helpers/Csv/Converter/ConverterInterface.php deleted file mode 100644 index c8fb526b83..0000000000 --- a/app/Helpers/Csv/Converter/ConverterInterface.php +++ /dev/null @@ -1,52 +0,0 @@ -mapped[$this->index][$this->value])) { - $currency = $repository->find(intval($this->mapped[$this->index][$this->value])); - - return $currency; - } - - $currency = $repository->findByCode($this->value); - - - return $currency; - } -} diff --git a/app/Helpers/Csv/Converter/CurrencyId.php b/app/Helpers/Csv/Converter/CurrencyId.php deleted file mode 100644 index a18082872a..0000000000 --- a/app/Helpers/Csv/Converter/CurrencyId.php +++ /dev/null @@ -1,36 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $currency = $repository->find($value); - - return $currency; - } -} diff --git a/app/Helpers/Csv/Converter/CurrencyName.php b/app/Helpers/Csv/Converter/CurrencyName.php deleted file mode 100644 index 62876fa9ba..0000000000 --- a/app/Helpers/Csv/Converter/CurrencyName.php +++ /dev/null @@ -1,42 +0,0 @@ -mapped[$this->index][$this->value])) { - $currency = $repository->find($this->mapped[$this->index][$this->value]); - - return $currency; - } - $currency = $repository->findByName($this->value); - - - return $currency; - } -} diff --git a/app/Helpers/Csv/Converter/CurrencySymbol.php b/app/Helpers/Csv/Converter/CurrencySymbol.php deleted file mode 100644 index 51037ece2e..0000000000 --- a/app/Helpers/Csv/Converter/CurrencySymbol.php +++ /dev/null @@ -1,43 +0,0 @@ -mapped[$this->index][$this->value])) { - $currency = $repository->find($this->mapped[$this->index][$this->value]); - - return $currency; - } - - $currency = $repository->findBySymbol($this->value); - - - return $currency; - } -} diff --git a/app/Helpers/Csv/Converter/Date.php b/app/Helpers/Csv/Converter/Date.php deleted file mode 100644 index b164e9df5f..0000000000 --- a/app/Helpers/Csv/Converter/Date.php +++ /dev/null @@ -1,46 +0,0 @@ -value); - } catch (InvalidArgumentException $e) { - Log::error('Date conversion error: ' . $e->getMessage() . '. Value was "' . $this->value . '", format was "' . $format . '".'); - - $message = trans('firefly.csv_date_parse_error', ['format' => $format, 'value' => $this->value]); - - throw new FireflyException($message); - } - - - return $date; - } -} diff --git a/app/Helpers/Csv/Converter/Description.php b/app/Helpers/Csv/Converter/Description.php deleted file mode 100644 index ea864a3e3e..0000000000 --- a/app/Helpers/Csv/Converter/Description.php +++ /dev/null @@ -1,31 +0,0 @@ -data['description'] ?? ''; - - return trim($description . ' ' . $this->value); - } -} diff --git a/app/Helpers/Csv/Converter/INGDebetCredit.php b/app/Helpers/Csv/Converter/INGDebetCredit.php deleted file mode 100644 index 59fd76248a..0000000000 --- a/app/Helpers/Csv/Converter/INGDebetCredit.php +++ /dev/null @@ -1,34 +0,0 @@ -value === 'Af') { - return -1; - } - - return 1; - } -} diff --git a/app/Helpers/Csv/Converter/Ignore.php b/app/Helpers/Csv/Converter/Ignore.php deleted file mode 100644 index c2da8c3033..0000000000 --- a/app/Helpers/Csv/Converter/Ignore.php +++ /dev/null @@ -1,28 +0,0 @@ -mapped[$this->index][$this->value])) { - $account = $crud->find($this->mapped[$this->index][$this->value]); - - return $account; - } - - return $this->findAccount($crud); - } - - /** - * @param AccountCrudInterface $crud - * - * @return Account|string - */ - private function findAccount(AccountCrudInterface $crud) - { - if (strlen($this->value) > 0) { - - $set = $crud->getAccountsByType([]); - /** @var Account $account */ - foreach ($set as $account) { - if ($account->iban == $this->value) { - - return $account; - } - } - } - - return $this->value; - } - -} diff --git a/app/Helpers/Csv/Converter/OpposingAccountId.php b/app/Helpers/Csv/Converter/OpposingAccountId.php deleted file mode 100644 index 17836907bf..0000000000 --- a/app/Helpers/Csv/Converter/OpposingAccountId.php +++ /dev/null @@ -1,35 +0,0 @@ -mapped[$this->index][$this->value]) ? $this->mapped[$this->index][$this->value] : $this->value; - $account = $crud->find($value); - - return $account; - } -} diff --git a/app/Helpers/Csv/Converter/OpposingAccountName.php b/app/Helpers/Csv/Converter/OpposingAccountName.php deleted file mode 100644 index 7c3d392985..0000000000 --- a/app/Helpers/Csv/Converter/OpposingAccountName.php +++ /dev/null @@ -1,41 +0,0 @@ -mapped[$this->index][$this->value])) { - $account = $crud->find($this->mapped[$this->index][$this->value]); - - return $account; - } - - return $this->value; - - } -} diff --git a/app/Helpers/Csv/Converter/RabobankDebetCredit.php b/app/Helpers/Csv/Converter/RabobankDebetCredit.php deleted file mode 100644 index 854f812d45..0000000000 --- a/app/Helpers/Csv/Converter/RabobankDebetCredit.php +++ /dev/null @@ -1,34 +0,0 @@ -value == 'D') { - return -1; - } - - return 1; - } -} diff --git a/app/Helpers/Csv/Converter/TagsComma.php b/app/Helpers/Csv/Converter/TagsComma.php deleted file mode 100644 index c9477e7ada..0000000000 --- a/app/Helpers/Csv/Converter/TagsComma.php +++ /dev/null @@ -1,53 +0,0 @@ -value); - foreach ($strings as $string) { - $data = [ - 'tag' => $string, - 'date' => null, - 'description' => null, - 'latitude' => null, - 'longitude' => null, - 'zoomLevel' => null, - 'tagMode' => 'nothing', - ]; - if (strlen($string) > 0) { - $tag = $repository->store($data); // should validate first? - $tags->push($tag); - } - } - $tags = $tags->merge($this->data['tags']); - - return $tags; - } -} diff --git a/app/Helpers/Csv/Converter/TagsSpace.php b/app/Helpers/Csv/Converter/TagsSpace.php deleted file mode 100644 index aa2694a330..0000000000 --- a/app/Helpers/Csv/Converter/TagsSpace.php +++ /dev/null @@ -1,54 +0,0 @@ -value); - foreach ($strings as $string) { - $data = [ - 'tag' => $string, - 'date' => null, - 'description' => null, - 'latitude' => null, - 'longitude' => null, - 'zoomLevel' => null, - 'tagMode' => 'nothing', - ]; - if (strlen($string) > 0) { - $tag = $repository->store($data); // should validate first? - $tags->push($tag); - } - } - $tags = $tags->merge($this->data['tags']); - - return $tags; - } -} diff --git a/app/Helpers/Csv/Data.php b/app/Helpers/Csv/Data.php deleted file mode 100644 index d56f790204..0000000000 --- a/app/Helpers/Csv/Data.php +++ /dev/null @@ -1,336 +0,0 @@ -sessionHasHeaders(); - $this->sessionDateFormat(); - $this->sessionCsvFileLocation(); - $this->sessionMap(); - $this->sessionRoles(); - $this->sessionMapped(); - $this->sessionSpecifix(); - $this->sessionImportAccount(); - $this->sessionDelimiter(); - } - - /** - * - * @return string - */ - public function getCsvFileContent(): string - { - return $this->csvFileContent ?? ''; - } - - /** - * - * @param string $csvFileContent - */ - public function setCsvFileContent(string $csvFileContent) - { - $this->csvFileContent = $csvFileContent; - } - - /** - * FIXxME may return null - * - * @return string - */ - public function getCsvFileLocation(): string - { - return $this->csvFileLocation; - } - - /** - * - * @param string $csvFileLocation - */ - public function setCsvFileLocation(string $csvFileLocation) - { - Session::put('csv-file', $csvFileLocation); - $this->csvFileLocation = $csvFileLocation; - } - - /** - * FIXxME may return null - * - * @return string - */ - public function getDateFormat(): string - { - return $this->dateFormat; - } - - /** - * - * @param string $dateFormat - */ - public function setDateFormat(string $dateFormat) - { - Session::put('csv-date-format', $dateFormat); - $this->dateFormat = $dateFormat; - } - - /** - * FIXxME may return null - * - * @return string - */ - public function getDelimiter(): string - { - return $this->delimiter; - } - - /** - * - * @param string $delimiter - */ - public function setDelimiter(string $delimiter) - { - Session::put('csv-delimiter', $delimiter); - $this->delimiter = $delimiter; - } - - /** - * - * @return array - */ - public function getMap(): array - { - return $this->map; - } - - /** - * - * @param array $map - */ - public function setMap(array $map) - { - Session::put('csv-map', $map); - $this->map = $map; - } - - /** - * - * @return array - */ - public function getMapped(): array - { - return $this->mapped; - } - - /** - * - * @param array $mapped - */ - public function setMapped(array $mapped) - { - Session::put('csv-mapped', $mapped); - $this->mapped = $mapped; - } - - /** - * - * @return Reader - */ - public function getReader(): Reader - { - if (!is_null($this->csvFileContent) && strlen($this->csvFileContent) === 0) { - $this->loadCsvFile(); - } - - if (is_null($this->reader)) { - $this->reader = Reader::createFromString($this->getCsvFileContent()); - $this->reader->setDelimiter($this->delimiter); - } - - return $this->reader; - } - - /** - * - * @return array - */ - public function getRoles(): array - { - return $this->roles; - } - - /** - * - * @param array $roles - */ - public function setRoles(array $roles) - { - Session::put('csv-roles', $roles); - $this->roles = $roles; - } - - /** - * - * @return array - */ - public function getSpecifix(): array - { - return is_array($this->specifix) ? $this->specifix : []; - } - - /** - * - * @param array $specifix - */ - public function setSpecifix(array $specifix) - { - Session::put('csv-specifix', $specifix); - $this->specifix = $specifix; - } - - /** - * - * @return bool - */ - public function hasHeaders(): bool - { - return $this->hasHeaders; - } - - /** - * - * @param bool $hasHeaders - */ - public function setHasHeaders(bool $hasHeaders) - { - Session::put('csv-has-headers', $hasHeaders); - $this->hasHeaders = $hasHeaders; - } - - /** - * - * @param int $importAccount - */ - public function setImportAccount(int $importAccount) - { - Session::put('csv-import-account', $importAccount); - $this->importAccount = $importAccount; - } - - protected function loadCsvFile() - { - $file = $this->getCsvFileLocation(); - $disk = Storage::disk('upload'); - $content = $disk->get($file); - $contentDecrypted = Crypt::decrypt($content); - $this->setCsvFileContent($contentDecrypted); - } - - protected function sessionCsvFileLocation() - { - if (Session::has('csv-file')) { - $this->csvFileLocation = (string)session('csv-file'); - } - } - - protected function sessionDateFormat() - { - if (Session::has('csv-date-format')) { - $this->dateFormat = (string)session('csv-date-format'); - } - } - - protected function sessionDelimiter() - { - if (Session::has('csv-delimiter')) { - $this->delimiter = session('csv-delimiter'); - } - } - - protected function sessionHasHeaders() - { - if (Session::has('csv-has-headers')) { - $this->hasHeaders = (bool)session('csv-has-headers'); - } - } - - protected function sessionImportAccount() - { - if (Session::has('csv-import-account')) { - $this->importAccount = intval(session('csv-import-account')); - } - } - - protected function sessionMap() - { - if (Session::has('csv-map')) { - $this->map = (array)session('csv-map'); - } - } - - protected function sessionMapped() - { - if (Session::has('csv-mapped')) { - $this->mapped = (array)session('csv-mapped'); - } - } - - protected function sessionRoles() - { - if (Session::has('csv-roles')) { - $this->roles = (array)session('csv-roles'); - } - } - - protected function sessionSpecifix() - { - if (Session::has('csv-specifix')) { - $this->specifix = (array)session('csv-specifix'); - } - } -} diff --git a/app/Helpers/Csv/Importer.php b/app/Helpers/Csv/Importer.php deleted file mode 100644 index 9e50f02a46..0000000000 --- a/app/Helpers/Csv/Importer.php +++ /dev/null @@ -1,384 +0,0 @@ -errors; - } - - /** - * Used by CsvController - * - * @return int - */ - public function getImported(): int - { - return $this->imported; - } - - /** - * @return Collection - */ - public function getJournals(): Collection - { - return $this->journals; - } - - /** - * Used by CsvController - * - * @return int - */ - public function getRows(): int - { - return $this->rows; - } - - /** - * @return array - */ - public function getSpecifix(): array - { - return is_array($this->specifix) ? $this->specifix : []; - } - - /** - * @throws FireflyException - */ - public function run() - { - set_time_limit(0); - - $this->journals = new Collection; - $this->map = $this->data->getMap(); - $this->roles = $this->data->getRoles(); - $this->mapped = $this->data->getMapped(); - $this->specifix = $this->data->getSpecifix(); - - foreach ($this->data->getReader() as $index => $row) { - if ($this->parseRow($index)) { - $this->rows++; - $result = $this->importRow($row); - if (!($result instanceof TransactionJournal)) { - Log::error('Caught error at row #' . $index . ': ' . $result); - $this->errors[$index] = $result; - } else { - $this->imported++; - $this->journals->push($result); - event(new TransactionJournalStored($result, 0)); - } - } - } - } - - /** - * @param Data $data - */ - public function setData(Data $data) - { - $this->data = $data; - } - - /** - * @return TransactionJournal|string - */ - protected function createTransactionJournal() - { - $date = $this->importData['date']; - if (is_null($this->importData['date'])) { - $date = $this->importData['date-rent']; - } - - - $transactionType = $this->getTransactionType(); // defaults to deposit - $errors = new MessageBag; - $journal = TransactionJournal::create( - [ - 'user_id' => Auth::user()->id, - 'transaction_type_id' => $transactionType->id, - 'transaction_currency_id' => $this->importData['currency']->id, - 'description' => $this->importData['description'], - 'completed' => 0, - 'date' => $date, - 'bill_id' => $this->importData['bill-id'], - ] - ); - if ($journal->getErrors()->count() == 0) { - // first transaction - $accountId = $this->importData['asset-account-object']->id; // create first transaction: - $amount = $this->importData['amount']; - $transaction = Transaction::create(['transaction_journal_id' => $journal->id, 'account_id' => $accountId, 'amount' => $amount]); - $errors = $transaction->getErrors(); - - // second transaction - $accountId = $this->importData['opposing-account-object']->id; // create second transaction: - $amount = bcmul($this->importData['amount'], '-1'); - $transaction = Transaction::create(['transaction_journal_id' => $journal->id, 'account_id' => $accountId, 'amount' => $amount]); - $errors = $transaction->getErrors()->merge($errors); - } - if ($errors->count() == 0) { - $journal->completed = 1; - $journal->save(); - } else { - $text = join(',', $errors->all()); - - return $text; - } - $this->saveBudget($journal); - $this->saveCategory($journal); - $this->saveTags($journal); - - // some debug info: - $journalId = $journal->id; - $type = $journal->transaction_type_type ?? $journal->transactionType->type; - /** @var Account $asset */ - $asset = $this->importData['asset-account-object']; - /** @var Account $opposing */ - $opposing = $this->importData['opposing-account-object']; - - Log::info('Created journal #' . $journalId . ' of type ' . $type . '!'); - Log::info('Asset account #' . $asset->id . ' lost/gained: ' . $this->importData['amount']); - Log::info($opposing->accountType->type . ' #' . $opposing->id . ' lost/gained: ' . bcmul($this->importData['amount'], '-1')); - - return $journal; - } - - /** - * @return TransactionType - */ - protected function getTransactionType() - { - $transactionType = TransactionType::where('type', TransactionType::DEPOSIT)->first(); - if ($this->importData['amount'] < 0) { - $transactionType = TransactionType::where('type', TransactionType::WITHDRAWAL)->first(); - } - - if (in_array($this->importData['opposing-account-object']->accountType->type, ['Asset account', 'Default account'])) { - $transactionType = TransactionType::where('type', TransactionType::TRANSFER)->first(); - } - - return $transactionType; - } - - /** - * @param array $row - * - * @throws FireflyException - * @return string|bool - */ - protected function importRow(array $row) - { - - $data = $this->getFiller(); // These fields are necessary to create a new transaction journal. Some are optional - foreach ($row as $index => $value) { - $role = $this->roles[$index] ?? '_ignore'; - $class = config('csv.roles.' . $role . '.converter'); - $field = config('csv.roles.' . $role . '.field'); - - - // here would be the place where preprocessors would fire. - - /** @var ConverterInterface $converter */ - $converter = app('FireflyIII\Helpers\Csv\Converter\\' . $class); - $converter->setData($data); // the complete array so far. - $converter->setField($field); - $converter->setIndex($index); - $converter->setMapped($this->mapped); - $converter->setValue($value); - $data[$field] = $converter->convert(); - } - // move to class vars. - $this->importData = $data; - $this->importRow = $row; - unset($data, $row); - // post processing and validating. - $this->postProcess(); - $result = $this->validateData(); - - if (!($result === true)) { - return $result; // return error. - } - $journal = $this->createTransactionJournal(); - - return $journal; - } - - /** - * @param int $index - * - * @return bool - */ - protected function parseRow(int $index) - { - return (($this->data->hasHeaders() && $index >= 1) || !$this->data->hasHeaders()); - } - - /** - * Row denotes the original data. - * - * @return void - */ - protected function postProcess() - { - // do bank specific fixes (must be enabled but now all of them. - - foreach ($this->getSpecifix() as $className) { - /** @var SpecifixInterface $specifix */ - $specifix = app('FireflyIII\Helpers\Csv\Specifix\\' . $className); - if ($specifix->getProcessorType() == SpecifixInterface::POST_PROCESSOR) { - $specifix->setData($this->importData); - $specifix->setRow($this->importRow); - $this->importData = $specifix->fix(); - } - } - - - $set = config('csv.post_processors'); - foreach ($set as $className) { - /** @var PostProcessorInterface $postProcessor */ - $postProcessor = app('FireflyIII\Helpers\Csv\PostProcessing\\' . $className); - $array = $this->importData ?? []; - $postProcessor->setData($array); - $this->importData = $postProcessor->process(); - } - - } - - /** - * @param TransactionJournal $journal - */ - protected function saveBudget(TransactionJournal $journal) - { - // add budget: - if (!is_null($this->importData['budget'])) { - $journal->budgets()->save($this->importData['budget']); - } - } - - /** - * @param TransactionJournal $journal - */ - protected function saveCategory(TransactionJournal $journal) - { - // add category: - if (!is_null($this->importData['category'])) { - $journal->categories()->save($this->importData['category']); - } - } - - /** - * @param TransactionJournal $journal - */ - protected function saveTags(TransactionJournal $journal) - { - if (!is_null($this->importData['tags'])) { - foreach ($this->importData['tags'] as $tag) { - $journal->tags()->save($tag); - } - } - } - - /** - * - * @return bool|string - */ - protected function validateData() - { - $date = $this->importData['date'] ?? null; - $rentDate = $this->importData['date-rent'] ?? null; - if (is_null($date) && is_null($rentDate)) { - return 'No date value for this row.'; - } - if (is_null($this->importData['opposing-account-object'])) { - return 'Opposing account is null'; - } - - if (!($this->importData['asset-account-object'] instanceof Account)) { - return 'No asset account to import into.'; - } - - return true; - } - - /** - * @return array - */ - private function getFiller() - { - $filler = []; - foreach (config('csv.roles') as $role) { - if (isset($role['field'])) { - $fieldName = $role['field']; - $filler[$fieldName] = null; - } - } - // some extra's: - $filler['bill-id'] = null; - $filler['opposing-account-object'] = null; - $filler['asset-account-object'] = null; - $filler['amount-modifier'] = '1'; - - return $filler; - - } - -} diff --git a/app/Helpers/Csv/Mapper/AnyAccount.php b/app/Helpers/Csv/Mapper/AnyAccount.php deleted file mode 100644 index 05c5bab9ea..0000000000 --- a/app/Helpers/Csv/Mapper/AnyAccount.php +++ /dev/null @@ -1,42 +0,0 @@ -accounts()->with('accountType')->orderBy('accounts.name', 'ASC')->get(['accounts.*']); - - $list = []; - /** @var Account $account */ - foreach ($result as $account) { - $list[$account->id] = $account->name . ' (' . $account->accountType->type . ')'; - } - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/AssetAccount.php b/app/Helpers/Csv/Mapper/AssetAccount.php deleted file mode 100644 index 8f32bbad57..0000000000 --- a/app/Helpers/Csv/Mapper/AssetAccount.php +++ /dev/null @@ -1,54 +0,0 @@ -accounts()->with( - ['accountmeta' => function (HasMany $query) { - $query->where('name', 'accountRole'); - }] - )->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC')->get(['accounts.*']); - - $list = []; - - /** @var Account $account */ - foreach ($result as $account) { - $name = $account->name; - $iban = $account->iban ?? ''; - if (strlen($iban) > 0) { - $name .= ' (' . $account->iban . ')'; - } - $list[$account->id] = $name; - } - - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/Bill.php b/app/Helpers/Csv/Mapper/Bill.php deleted file mode 100644 index 37946bf394..0000000000 --- a/app/Helpers/Csv/Mapper/Bill.php +++ /dev/null @@ -1,42 +0,0 @@ -bills()->get(['bills.*']); - $list = []; - - /** @var BillModel $bill */ - foreach ($result as $bill) { - $list[$bill->id] = $bill->name . ' [' . $bill->match . ']'; - } - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/Budget.php b/app/Helpers/Csv/Mapper/Budget.php deleted file mode 100644 index 7664cc3378..0000000000 --- a/app/Helpers/Csv/Mapper/Budget.php +++ /dev/null @@ -1,42 +0,0 @@ -budgets()->get(['budgets.*']); - $list = []; - - /** @var BudgetModel $budget */ - foreach ($result as $budget) { - $list[$budget->id] = $budget->name; - } - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/Category.php b/app/Helpers/Csv/Mapper/Category.php deleted file mode 100644 index d0a104523a..0000000000 --- a/app/Helpers/Csv/Mapper/Category.php +++ /dev/null @@ -1,42 +0,0 @@ -categories()->get(['categories.*']); - $list = []; - - /** @var CategoryModel $category */ - foreach ($result as $category) { - $list[$category->id] = $category->name; - } - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/MapperInterface.php b/app/Helpers/Csv/Mapper/MapperInterface.php deleted file mode 100644 index eb6286d4f2..0000000000 --- a/app/Helpers/Csv/Mapper/MapperInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -budgets()->get(['tags.*']); - $list = []; - - /** @var TagModel $tag */ - foreach ($result as $tag) { - $list[$tag->id] = $tag->tag; - } - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/Mapper/TransactionCurrency.php b/app/Helpers/Csv/Mapper/TransactionCurrency.php deleted file mode 100644 index f4257b1510..0000000000 --- a/app/Helpers/Csv/Mapper/TransactionCurrency.php +++ /dev/null @@ -1,40 +0,0 @@ -id] = $currency->name . ' (' . $currency->code . ')'; - } - - asort($list); - - $list = [0 => trans('firefly.csv_do_not_map')] + $list; - - return $list; - } -} diff --git a/app/Helpers/Csv/PostProcessing/Amount.php b/app/Helpers/Csv/PostProcessing/Amount.php deleted file mode 100644 index 504c887331..0000000000 --- a/app/Helpers/Csv/PostProcessing/Amount.php +++ /dev/null @@ -1,44 +0,0 @@ -data['amount'] ?? '0'; - $modifier = strval($this->data['amount-modifier']); - $this->data['amount'] = bcmul($amount, $modifier); - - return $this->data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } -} diff --git a/app/Helpers/Csv/PostProcessing/AssetAccount.php b/app/Helpers/Csv/PostProcessing/AssetAccount.php deleted file mode 100644 index e57e0f73f1..0000000000 --- a/app/Helpers/Csv/PostProcessing/AssetAccount.php +++ /dev/null @@ -1,274 +0,0 @@ -checkIdNameObject(); // has object in ID or Name? - if (!is_null($result)) { - return $result; - } - - // no object? maybe asset-account-iban is a string and we can find the matching account. - $result = $this->checkIbanString(); - if (!is_null($result)) { - return $result; - } - - // no object still? maybe we can find the account by name. - $result = $this->checkNameString(); - if (!is_null($result)) { - return $result; - } - // still nothing? Perhaps the account number can lead us to an account: - $result = $this->checkAccountNumberString(); - if (!is_null($result)) { - return $result; - } - - return null; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @return array|null - */ - protected function checkAccountNumberString() - { - $accountNumber = $this->data['asset-account-number'] ?? null; - if ($accountNumber instanceof Account) { // fourth: try to find account based on name, if any. - $this->data['asset-account-object'] = $accountNumber; - - return $this->data; - } - if (is_string($accountNumber)) { // it's an actual account number - $this->data['asset-account-object'] = $this->parseAccountNumberString(); - - return $this->data; - } - - return null; - } - - /** - * @return array|null - */ - protected function checkIbanString() - { - $iban = $this->data['asset-account-iban'] ?? ''; - $rules = ['iban' => 'iban']; - $check = ['iban' => $iban]; - $validator = Validator::make($check, $rules); - if (!$validator->fails()) { - $this->data['asset-account-object'] = $this->parseIbanString(); - - return $this->data; - } - - return null; - } - - /** - * @return array - */ - protected function checkIdNameObject() - { - $accountId = $this->data['asset-account-id'] ?? null; - $accountIban = $this->data['asset-account-iban'] ?? null; - $accountNumber = $this->data['asset-account-number'] ?? null; - if ($accountId instanceof Account) { // first priority. try to find the account based on ID, if any - $this->data['asset-account-object'] = $accountId; - - return $this->data; - } - if ($accountIban instanceof Account) { // second: try to find the account based on IBAN, if any. - $this->data['asset-account-object'] = $accountIban; - - return $this->data; - } - - if ($accountNumber instanceof Account) { // second: try to find the account based on account number, if any. - $this->data['asset-account-object'] = $accountNumber; - - return $this->data; - } - - - return null; - } - - /** - * @return array|null - */ - protected function checkNameString() - { - $accountName = $this->data['asset-account-name'] ?? null; - if ($accountName instanceof Account) { // third: try to find account based on name, if any. - $this->data['asset-account-object'] = $accountName; - - return $this->data; - } - if (is_string($accountName)) { - $this->data['asset-account-object'] = $this->parseNameString(); - - return $this->data; - } - - return null; - } - - /** - * @return Account|null - */ - protected function createAccount() - { - $accountType = $this->getAccountType(); - $name = $this->data['asset-account-name'] ?? ''; - $iban = $this->data['asset-account-iban'] ?? ''; - - // create if not exists: // See issue #180 - $name = strlen($name) > 0 ? $name : $iban; - $account = Account::firstOrCreateEncrypted( - [ - 'user_id' => Auth::user()->id, - 'account_type_id' => $accountType->id, - 'name' => $name, - 'iban' => $iban, - 'active' => true, - ] - ); - - return $account; - } - - /** - * - * @return AccountType - */ - protected function getAccountType() - { - return AccountType::where('type', 'Asset account')->first(); - } - - /** - * @return Account|null - */ - protected function parseIbanString() - { - // create by name and/or iban. - $iban = $this->data['asset-account-iban'] ?? ''; - $accounts = Auth::user()->accounts()->get(); - foreach ($accounts as $entry) { - if ($iban !== '' && $entry->iban === $iban) { - - return $entry; - } - } - $account = $this->createAccount(); - - return $account; - } - - /** - * @return Account|null - */ - protected function parseNameString() - { - $accountType = $this->getAccountType(); - $accounts = Auth::user()->accounts()->where('account_type_id', $accountType->id)->get(); - foreach ($accounts as $entry) { - if ($entry->name == $this->data['asset-account-name']) { - - return $entry; - } - } - // create if not exists: - // See issue #180 - $account = Account::firstOrCreateEncrypted( - [ - 'user_id' => Auth::user()->id, - 'account_type_id' => $accountType->id, - 'name' => $this->data['asset-account-name'], - 'iban' => '', - 'active' => true, - ] - ); - - return $account; - } - - /** - * @return Account|null - */ - private function parseAccountNumberString() - { - /** @var AccountCrudInterface $crud */ - $crud = app(AccountCrudInterface::class); - - $accountNumber = $this->data['asset-account-number'] ?? ''; - $accountType = $this->getAccountType(); - $accounts = Auth::user()->accounts()->with(['accountmeta'])->where('account_type_id', $accountType->id)->get(); - /** @var Account $entry */ - foreach ($accounts as $entry) { - $metaFieldValue = $entry->getMeta('accountNumber'); - if ($metaFieldValue === $accountNumber && $metaFieldValue !== '') { - - return $entry; - } - } - // create new if not exists and return that one: - $accountData = [ - 'name' => $accountNumber, - 'accountType' => 'asset', - 'virtualBalance' => 0, - 'virtualBalanceCurrency' => 1, // hard coded. - 'active' => true, - 'user' => Auth::user()->id, - 'iban' => null, - 'accountNumber' => $accountNumber, - 'accountRole' => null, - 'openingBalance' => 0, - 'openingBalanceDate' => new Carbon, - 'openingBalanceCurrency' => 1, // hard coded. - ]; - $account = $crud->store($accountData); - - return $account; - } -} diff --git a/app/Helpers/Csv/PostProcessing/Bill.php b/app/Helpers/Csv/PostProcessing/Bill.php deleted file mode 100644 index 60392b2446..0000000000 --- a/app/Helpers/Csv/PostProcessing/Bill.php +++ /dev/null @@ -1,45 +0,0 @@ -data['bill']) && !is_null($this->data['bill']->id)) { - $this->data['bill-id'] = $this->data['bill']->id; - } - - return $this->data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } -} diff --git a/app/Helpers/Csv/PostProcessing/Currency.php b/app/Helpers/Csv/PostProcessing/Currency.php deleted file mode 100644 index 2a6f46cfd5..0000000000 --- a/app/Helpers/Csv/PostProcessing/Currency.php +++ /dev/null @@ -1,49 +0,0 @@ -data['currency'])) { - $currencyPreference = Preferences::get('currencyPreference', env('DEFAULT_CURRENCY', 'EUR')); - $this->data['currency'] = TransactionCurrency::whereCode($currencyPreference->data)->first(); - } - - return $this->data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } -} diff --git a/app/Helpers/Csv/PostProcessing/Description.php b/app/Helpers/Csv/PostProcessing/Description.php deleted file mode 100644 index 8c4843a58b..0000000000 --- a/app/Helpers/Csv/PostProcessing/Description.php +++ /dev/null @@ -1,47 +0,0 @@ -data['description'] ?? ''; - $this->data['description'] = trim($description); - if (strlen($this->data['description']) == 0) { - $this->data['description'] = trans('firefly.csv_empty_description'); - } - - - return $this->data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - - $this->data = $data; - } -} diff --git a/app/Helpers/Csv/PostProcessing/OpposingAccount.php b/app/Helpers/Csv/PostProcessing/OpposingAccount.php deleted file mode 100644 index 279328b24e..0000000000 --- a/app/Helpers/Csv/PostProcessing/OpposingAccount.php +++ /dev/null @@ -1,210 +0,0 @@ -checkIdNameObject(); - if (!is_null($result)) { - return $result; - } - - $result = $this->checkIbanString(); - if (!is_null($result)) { - return $result; - } - - $result = $this->checkNameString(); - if (!is_null($result)) { - return $result; - } - - return null; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @return array|null - */ - protected function checkIbanString() - { - $rules = ['iban' => 'iban']; - $iban = $this->data['opposing-account-iban']; - $check = ['iban' => $iban]; - $validator = Validator::make($check, $rules); - if (is_string($iban) && strlen($iban) > 0 && !$validator->fails()) { - - $this->data['opposing-account-object'] = $this->parseIbanString(); - - return $this->data; - } - - return null; - } - - /** - * @return array - */ - protected function checkIdNameObject() - { - if ($this->data['opposing-account-id'] instanceof Account) { // first priority. try to find the account based on ID, if any - $this->data['opposing-account-object'] = $this->data['opposing-account-id']; - - return $this->data; - } - if ($this->data['opposing-account-iban'] instanceof Account) { // second: try to find the account based on IBAN, if any. - $this->data['opposing-account-object'] = $this->data['opposing-account-iban']; - - return $this->data; - } - - return null; - } - - /** - * @return array|null - */ - protected function checkNameString() - { - if ($this->data['opposing-account-name'] instanceof Account) { // third: try to find account based on name, if any. - $this->data['opposing-account-object'] = $this->data['opposing-account-name']; - - return $this->data; - } - if (is_string($this->data['opposing-account-name'])) { - - $this->data['opposing-account-object'] = $this->parseNameString(); - - return $this->data; - } - - return null; - } - - /** - * @return Account|null - */ - protected function createAccount() - { - $accountType = $this->getAccountType(); - - // create if not exists: - $name = is_string($this->data['opposing-account-name']) && strlen($this->data['opposing-account-name']) > 0 ? $this->data['opposing-account-name'] - : $this->data['opposing-account-iban']; - $account = Account::firstOrCreateEncrypted( // See issue #180 - [ - 'user_id' => Auth::user()->id, - 'account_type_id' => $accountType->id, - 'name' => $name, - 'iban' => $this->data['opposing-account-iban'], - 'active' => true, - ] - ); - - return $account; - } - - /** - * - * @return AccountType - */ - protected function getAccountType() - { - // opposing account type: - if ($this->data['amount'] < 0) { - // create expense account: - - return AccountType::where('type', 'Expense account')->first(); - } - - // create revenue account: - - return AccountType::where('type', 'Revenue account')->first(); - - - } - - /** - * @return Account|null - */ - protected function parseIbanString() - { - // create by name and/or iban. - $accounts = Auth::user()->accounts()->get(); - foreach ($accounts as $entry) { - if ($entry->iban == $this->data['opposing-account-iban']) { - - return $entry; - } - } - $account = $this->createAccount(); - - - return $account; - } - - /** - * @return Account|null - */ - protected function parseNameString() - { - $accountType = $this->getAccountType(); - $accounts = Auth::user()->accounts()->where('account_type_id', $accountType->id)->get(); - foreach ($accounts as $entry) { - if ($entry->name == $this->data['opposing-account-name']) { - - return $entry; - } - } - // create if not exists: - $account = Account::firstOrCreateEncrypted( // See issue #180 - [ - 'user_id' => Auth::user()->id, - 'account_type_id' => $accountType->id, - 'name' => $this->data['opposing-account-name'], - 'iban' => '', - 'active' => true, - ] - ); - - return $account; - } -} diff --git a/app/Helpers/Csv/PostProcessing/PostProcessorInterface.php b/app/Helpers/Csv/PostProcessing/PostProcessorInterface.php deleted file mode 100644 index 58f6ff09d0..0000000000 --- a/app/Helpers/Csv/PostProcessing/PostProcessorInterface.php +++ /dev/null @@ -1,31 +0,0 @@ -setProcessorType(self::POST_PROCESSOR); - } - - - /** - * @return array - */ - public function fix(): array - { - // Try to parse the description in known formats. - $parsed = $this->parseSepaDescription() || $this->parseTRTPDescription() || $this->parseGEABEADescription() || $this->parseABNAMRODescription(); - - // If the description could not be parsed, specify an unknown opposing - // account, as an opposing account is required - if (!$parsed) { - $this->data['opposing-account-name'] = trans('firefly.unknown'); - } - - return $this->data; - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @param array $row - */ - public function setRow(array $row) - { - $this->row = $row; - } - - /** - * Parses the current description with costs from ABN AMRO itself - * - * @return bool true if the description is GEA/BEA-format, false otherwise - */ - protected function parseABNAMRODescription() - { - // See if the current description is formatted in ABN AMRO format - if (preg_match('/ABN AMRO.{24} (.*)/', $this->data['description'], $matches)) { - - $this->data['opposing-account-name'] = 'ABN AMRO'; - $this->data['description'] = $matches[1]; - - return true; - } - - return false; - } - - /** - * Parses the current description in GEA/BEA format - * - * @return bool true if the description is GEA/BEAformat, false otherwise - */ - protected function parseGEABEADescription() - { - // See if the current description is formatted in GEA/BEA format - if (preg_match('/([BG]EA) +(NR:[a-zA-Z:0-9]+) +([0-9.\/]+) +([^,]*)/', $this->data['description'], $matches)) { - - // description and opposing account will be the same. - $this->data['opposing-account-name'] = $matches[4]; - $this->data['description'] = $matches[4]; - - if ($matches[1] == 'GEA') { - $this->data['description'] = 'GEA ' . $matches[4]; - } - - return true; - } - - return false; - } - - /** - * Parses the current description in SEPA format - * - * @return bool true if the description is SEPA format, false otherwise - */ - protected function parseSepaDescription() - { - // See if the current description is formatted as a SEPA plain description - if (preg_match('/^SEPA(.{28})/', $this->data['description'], $matches)) { - - $type = $matches[1]; - $reference = ''; - $name = ''; - $newDescription = ''; - - // SEPA plain descriptions contain several key-value pairs, split by a colon - preg_match_all('/([A-Za-z]+(?=:\s)):\s([A-Za-z 0-9._#-]+(?=\s|$))/', $this->data['description'], $matches, PREG_SET_ORDER); - - if (is_array($matches)) { - foreach ($matches as $match) { - $key = $match[1]; - $value = trim($match[2]); - switch (strtoupper($key)) { - case 'OMSCHRIJVING': - $newDescription = $value; - break; - case 'NAAM': - $this->data['opposing-account-name'] = $value; - $name = $value; - break; - case 'KENMERK': - $reference = $value; - break; - case 'IBAN': - $this->data['opposing-account-iban'] = $value; - break; - default: - // Ignore the rest - } - } - } - - // Set a new description for the current transaction. If none was given - // set the description to type, name and reference - $this->data['description'] = $newDescription; - if (strlen($newDescription) === 0) { - $this->data['description'] = sprintf('%s - %s (%s)', $type, $name, $reference); - } - - return true; - } - - return false; - } - - /** - * Parses the current description in TRTP format - * - * @return bool true if the description is TRTP format, false otherwise - */ - protected function parseTRTPDescription() - { - // See if the current description is formatted in TRTP format - if (preg_match_all('!\/([A-Z]{3,4})\/([^/]*)!', $this->data['description'], $matches, PREG_SET_ORDER)) { - - $type = ''; - $name = ''; - $reference = ''; - $newDescription = ''; - - // Search for properties specified in the TRTP format. If no description - // is provided, use the type, name and reference as new description - if (is_array($matches)) { - foreach ($matches as $match) { - $key = $match[1]; - $value = trim($match[2]); - - switch (strtoupper($key)) { - case 'NAME': - $this->data['opposing-account-name'] = $name = $value; - break; - case 'REMI': - $newDescription = $value; - break; - case 'IBAN': - $this->data['opposing-account-iban'] = $value; - break; - case 'EREF': - $reference = $value; - break; - case 'TRTP': - $type = $value; - break; - default: - // Ignore the rest - } - } - - // Set a new description for the current transaction. If none was given - // set the description to type, name and reference - $this->data['description'] = $newDescription; - if (strlen($newDescription) === 0) { - $this->data['description'] = sprintf('%s - %s (%s)', $type, $name, $reference); - } - } - - return true; - } - - return false; - } - -} diff --git a/app/Helpers/Csv/Specifix/Dummy.php b/app/Helpers/Csv/Specifix/Dummy.php deleted file mode 100644 index 447bafadd9..0000000000 --- a/app/Helpers/Csv/Specifix/Dummy.php +++ /dev/null @@ -1,60 +0,0 @@ -setProcessorType(self::POST_PROCESSOR); - } - - /** - * @return array - */ - public function fix(): array - { - return $this->data; - - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @param array $row - */ - public function setRow(array $row) - { - $this->row = $row; - } - - -} diff --git a/app/Helpers/Csv/Specifix/RabobankDescription.php b/app/Helpers/Csv/Specifix/RabobankDescription.php deleted file mode 100644 index 67dbdb6c49..0000000000 --- a/app/Helpers/Csv/Specifix/RabobankDescription.php +++ /dev/null @@ -1,76 +0,0 @@ -setProcessorType(self::POST_PROCESSOR); - } - - - /** - * @return array - */ - public function fix(): array - { - $this->rabobankFixEmptyOpposing(); - - return $this->data; - - } - - /** - * @param array $data - */ - public function setData(array $data) - { - $this->data = $data; - } - - /** - * @param array $row - */ - public function setRow(array $row) - { - $this->row = $row; - } - - /** - * Fixes Rabobank specific thing. - */ - protected function rabobankFixEmptyOpposing() - { - if (is_string($this->data['opposing-account-name']) && strlen($this->data['opposing-account-name']) == 0) { - $this->data['opposing-account-name'] = $this->row[10]; - - $this->data['description'] = trim(str_replace($this->row[10], '', $this->data['description'])); - } - - } - - -} diff --git a/app/Helpers/Csv/Specifix/Specifix.php b/app/Helpers/Csv/Specifix/Specifix.php deleted file mode 100644 index 8626d38dcb..0000000000 --- a/app/Helpers/Csv/Specifix/Specifix.php +++ /dev/null @@ -1,46 +0,0 @@ -processorType; - } - - /** - * @param int $processorType - * - * @return $this - */ - public function setProcessorType(int $processorType) - { - $this->processorType = $processorType; - - return $this; - } - - -} diff --git a/app/Helpers/Csv/Specifix/SpecifixInterface.php b/app/Helpers/Csv/Specifix/SpecifixInterface.php deleted file mode 100644 index e37d4d3ec4..0000000000 --- a/app/Helpers/Csv/Specifix/SpecifixInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - $row) { - if ($this->useRow($hasHeaders, $index)) { - // collect all map values - - foreach ($keys as $column) { - $values[$column][] = $row[$column]; - } - } - } - /* - * Make each one unique. - */ - $values = $this->uniqueRecursive($values); - - return $values; - } - - /** - * @param array $roles - * @param array $map - * - * @return array - */ - public function processSelectedMapping(array $roles, array $map): array - { - $configRoles = config('csv.roles'); - $maps = []; - $keys = array_keys($map); - foreach ($keys as $index) { - if (isset($roles[$index])) { - $name = $roles[$index]; - if ($configRoles[$name]['mappable']) { - $maps[$index] = $name; - } - } - } - - return $maps; - - } - - /** - * @param array $input - * - * @return array - */ - public function processSelectedRoles(array $input): array - { - $roles = []; - - - /* - * Store all rows for each column: - */ - if (is_array($input)) { - foreach ($input as $index => $role) { - if ($role != '_ignore') { - $roles[$index] = $role; - } - } - } - - return $roles; - } - - /** - * @param array $fields - * - * @return bool - */ - public function sessionHasValues(array $fields): bool - { - foreach ($fields as $field) { - if (!Session::has($field)) { - Log::error('Session is missing field: ' . $field); - - return false; - } - } - - return true; - } - - /** - * @param array $map - * - * @return array - * @throws FireflyException - */ - public function showOptions(array $map): array - { - $options = []; - foreach ($map as $index => $columnRole) { - - $mapper = config('csv.roles.' . $columnRole . '.mapper'); - if (is_null($mapper)) { - throw new FireflyException('Cannot map field of type "' . $columnRole . '".'); - } - $class = 'FireflyIII\Helpers\Csv\Mapper\\' . $mapper; - try { - /** @var MapperInterface $mapObject */ - $mapObject = app($class); - } catch (ReflectionException $e) { - throw new FireflyException('Column "' . $columnRole . '" cannot be mapped because mapper class ' . $mapper . ' does not exist.'); - } - $set = $mapObject->getMap(); - $options[$index] = $set; - } - - return $options; - } - - /** - * @param string $path - * - * @return string - */ - public function storeCsvFile(string $path): string - { - $time = str_replace(' ', '-', microtime()); - $fileName = 'csv-upload-' . Auth::user()->id . '-' . $time . '.csv.encrypted'; - $disk = Storage::disk('upload'); - $file = new SplFileObject($path, 'r'); - $content = $file->fread($file->getSize()); - $contentEncrypted = Crypt::encrypt($content); - $disk->put($fileName, $contentEncrypted); - - return $fileName; - - - } - - /** - * @param array $array - * - * @return array - */ - protected function uniqueRecursive(array $array) - { - foreach ($array as $column => $found) { - $array[$column] = array_unique($found); - } - - return $array; - } - - /** - * @param bool $hasHeaders - * @param int $index - * - * @return bool - */ - protected function useRow(bool $hasHeaders, int $index) - { - return ($hasHeaders && $index > 1) || !$hasHeaders; - } -} diff --git a/app/Helpers/Csv/WizardInterface.php b/app/Helpers/Csv/WizardInterface.php deleted file mode 100644 index cedcfbe5f6..0000000000 --- a/app/Helpers/Csv/WizardInterface.php +++ /dev/null @@ -1,68 +0,0 @@ -wizard = app(WizardInterface::class); - $this->data = app(Data::class); - - } - - /** - * Define column roles and mapping. - * - * STEP THREE - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View - */ - public function columnRoles() - { - - $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-import-account', 'csv-specifix', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Log::error('Could not recover upload.'); - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - - $subTitle = trans('firefly.csv_define_column_roles'); - $firstRow = $this->data->getReader()->fetchOne(); - $count = count($firstRow); - $headers = []; - $example = $this->data->getReader()->fetchOne(1); - $availableRoles = []; - $roles = $this->data->getRoles(); - $map = $this->data->getMap(); - - for ($i = 1; $i <= $count; $i++) { - $headers[] = trans('firefly.csv_column') . ' #' . $i; - } - if ($this->data->hasHeaders()) { - $headers = $firstRow; - } - $keys = array_keys(config('csv.roles')); - foreach ($keys as $name) { - $availableRoles[$name] = trans('firefly.csv_column_' . $name); - } - asort($availableRoles); - - return view('csv.column-roles', compact('availableRoles', 'map', 'roles', 'headers', 'example', 'subTitle')); - } - - /** - * Optional download of mapping. - * - * STEP FOUR THREE-A - * - * @return \Illuminate\Http\RedirectResponse|string - */ - public function downloadConfig() - { - $fields = ['csv-date-format', 'csv-has-headers', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - $data = [ - 'date-format' => session('csv-date-format'), - 'has-headers' => session('csv-has-headers'), - ]; - if (Session::has('csv-map')) { - $data['map'] = session('csv-map'); - } - if (Session::has('csv-roles')) { - $data['roles'] = session('csv-roles'); - } - if (Session::has('csv-mapped')) { - $data['mapped'] = session('csv-mapped'); - } - - if (Session::has('csv-specifix')) { - $data['specifix'] = session('csv-specifix'); - } - - $result = json_encode($data, JSON_PRETTY_PRINT); - $name = sprintf('"%s"', addcslashes('csv-configuration-' . date('Y-m-d') . '.json', '"\\')); - - return response($result, 200) - ->header('Content-disposition', 'attachment; filename=' . $name) - ->header('Content-Type', 'application/json') - ->header('Content-Description', 'File Transfer') - ->header('Connection', 'Keep-Alive') - ->header('Expires', '0') - ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') - ->header('Pragma', 'public') - ->header('Content-Length', strlen($result)); - } - - /** - * @return \Illuminate\View\View - */ - public function downloadConfigPage() - { - $fields = ['csv-date-format', 'csv-has-headers', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - - $subTitle = trans('firefly.csv_download_config_title'); - - return view('csv.download-config', compact('subTitle')); - } - - /** - * This method shows the initial upload form. - * - * STEP ONE - * - * @param AccountCrudInterface $crud - * - * @return \Illuminate\View\View - */ - public function index(AccountCrudInterface $crud) - { - $subTitle = trans('firefly.csv_import'); - - Session::forget('csv-date-format'); - Session::forget('csv-has-headers'); - Session::forget('csv-file'); - Session::forget('csv-import-account'); - Session::forget('csv-map'); - Session::forget('csv-roles'); - Session::forget('csv-mapped'); - Session::forget('csv-specifix'); - Session::forget('csv-delimiter'); - - // get list of supported specifix - $specifix = []; - foreach (config('csv.specifix') as $entry) { - $specifix[$entry] = trans('firefly.csv_specifix_' . $entry); - } - - // get a list of delimiters: - $delimiters = [ - ',' => trans('form.csv_comma'), - ';' => trans('form.csv_semicolon'), - 'tab' => trans('form.csv_tab'), - ]; - - // get a list of asset accounts: - $accounts = ExpandedForm::makeSelectList($crud->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])); - - // can actually upload? - $uploadPossible = is_writable(storage_path('upload')); - $path = storage_path('upload'); - - return view('csv.index', compact('subTitle', 'uploadPossible', 'path', 'specifix', 'accounts', 'delimiters')); - } - - /** - * Parse the file. - * - * STEP FOUR - * - * @return \Illuminate\Http\RedirectResponse - */ - public function initialParse() - { - $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - - // process given roles and mapping: - $inputMap = Input::get('map') ?? []; - $inputRoles = Input::get('role') ?? []; - $roles = $this->wizard->processSelectedRoles($inputRoles); - $maps = $this->wizard->processSelectedMapping($roles, $inputMap); - - Session::put('csv-map', $maps); - Session::put('csv-roles', $roles); - - // Go back when no roles defined: - if (count($roles) === 0) { - Session::flash('warning', strval(trans('firefly.must_select_roles'))); - - return redirect(route('csv.column-roles')); - } - - /* - * Continue with map specification when necessary. - */ - if (count($maps) > 0) { - return redirect(route('csv.map')); - } - - /* - * Or simply start processing. - */ - - // proceed to download config - return redirect(route('csv.download-config-page')); - - } - - /** - * - * Map first if necessary, - * - * STEP FIVE. - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View - * @throws FireflyException - */ - public function map() - { - - // Make sure all fields we need are accounted for. - $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - /* - * The "options" array contains all options the user has - * per column, where the key represents the column. - * - * For each key there is an array which in turn represents - * all the options available: grouped by ID. - * - * options[column index] = [ - * field id => field identifier. - * ] - */ - $options = $this->wizard->showOptions($this->data->getMap()); - - // After these values are prepped, read the actual CSV file - $reader = $this->data->getReader(); - $map = $this->data->getMap(); - $hasHeaders = $this->data->hasHeaders(); - $values = $this->wizard->getMappableValues($reader, $map, $hasHeaders); - $map = $this->data->getMap(); - $mapped = $this->data->getMapped(); - $subTitle = trans('firefly.csv_map_values'); - - return view('csv.map', compact('map', 'options', 'values', 'mapped', 'subTitle')); - } - - /** - * - * Finally actually process the CSV file. - * - * STEP SEVEN - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View - */ - public function process() - { - /* - * Make sure all fields we need are accounted for. - */ - $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles', 'csv-mapped', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - - /** @var Importer $importer */ - $importer = app(Importer::class); - $importer->setData($this->data); - $importer->run(); - - $rows = $importer->getRows(); - $errors = $importer->getErrors(); - $imported = $importer->getImported(); - $journals = $importer->getJournals(); - - Preferences::mark(); - - $subTitle = trans('firefly.csv_process_title'); - - return view('csv.process', compact('rows', 'errors', 'imported', 'subTitle', 'journals')); - - } - - /** - * Store the mapping the user has made. This is - * - * STEP SIX - * - * - * @return \Illuminate\Http\RedirectResponse - */ - public function saveMapping() - { - /* - * Make sure all fields we need are accounted for. - */ - $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles', 'csv-delimiter']; - if (!$this->wizard->sessionHasValues($fields)) { - Session::flash('warning', strval(trans('firefly.could_not_recover'))); - - return redirect(route('csv.index')); - } - - // save mapping to session. - $mapped = []; - if (!is_array(Input::get('mapping'))) { - Session::flash('warning', strval(trans('firefly.invalid_mapping'))); - - return redirect(route('csv.map')); - } - - foreach (Input::get('mapping') as $index => $data) { - $mapped[$index] = []; - foreach ($data as $value => $mapping) { - if (intval($mapping) !== 0) { - $mapped[$index][$value] = $mapping; - } - } - } - Session::put('csv-mapped', $mapped); - - // proceed to process. - return redirect(route('csv.download-config-page')); - - } - - /** - * - * This method processes the file, puts it away somewhere safe - * and sends you onwards. - * - * STEP TWO - * - * @param Request $request - * - * @return \Illuminate\Http\RedirectResponse - */ - public function upload(Request $request) - { - if (!$request->hasFile('csv')) { - Session::flash('warning', strval(trans('firefly.no_file_uploaded'))); - - return redirect(route('csv.index')); - } - - $path = $this->wizard->storeCsvFile($request->file('csv')->getRealPath()); - $settings = []; - $settings['date-format'] = Input::get('date_format'); - $settings['has-headers'] = intval(Input::get('has_headers')) === 1; - $settings['specifix'] = is_array(Input::get('specifix')) ? Input::get('specifix') : []; - $settings['import-account'] = intval(Input::get('csv_import_account')); - $settings['delimiter'] = Input::get('csv_delimiter', ','); - - // A tab character cannot be used itself as option value in HTML - // See http://stackoverflow.com/questions/6064135/valid-characters-in-option-value - if ($settings['delimiter'] == 'tab') { - $settings['delimiter'] = "\t"; - } - - $settings['map'] = []; - $settings['mapped'] = []; - $settings['roles'] = []; - - if ($request->hasFile('csv_config')) { // Process config file if present. - - $size = $request->file('csv_config')->getSize(); - $data = $request->file('csv_config')->openFile()->fread($size); - $json = json_decode($data, true); - if (is_array($json)) { - $settings = array_merge($settings, $json); - } - } - - $this->data->setCsvFileLocation($path); - $this->data->setDateFormat($settings['date-format']); - $this->data->setHasHeaders($settings['has-headers']); - $this->data->setMap($settings['map']); - $this->data->setMapped($settings['mapped']); - $this->data->setRoles($settings['roles']); - $this->data->setSpecifix($settings['specifix']); - $this->data->setImportAccount($settings['import-account']); - $this->data->setDelimiter($settings['delimiter']); - - return redirect(route('csv.column-roles')); - - } -} diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index cc42ebbe64..f1925bc906 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -269,44 +269,6 @@ Breadcrumbs::register( } ); -/** - * CSV CONTROLLER - */ -Breadcrumbs::register( - 'csv.index', function (BreadCrumbGenerator $breadcrumbs) { - $breadcrumbs->parent('home'); - $breadcrumbs->push(trans('firefly.csv_index_title'), route('csv.index')); -} -); - -Breadcrumbs::register( - 'csv.column-roles', function (BreadCrumbGenerator $breadcrumbs) { - $breadcrumbs->parent('csv.index'); - $breadcrumbs->push(trans('firefly.csv_define_column_roles'), route('csv.column-roles')); -} -); - -Breadcrumbs::register( - 'csv.map', function (BreadCrumbGenerator $breadcrumbs) { - $breadcrumbs->parent('csv.index'); - $breadcrumbs->push(trans('firefly.csv_map_values'), route('csv.map')); -} -); - -Breadcrumbs::register( - 'csv.download-config-page', function (BreadCrumbGenerator $breadcrumbs) { - $breadcrumbs->parent('csv.index'); - $breadcrumbs->push(trans('firefly.csv_download_config'), route('csv.download-config-page')); -} -); - -Breadcrumbs::register( - 'csv.process', function (BreadCrumbGenerator $breadcrumbs) { - $breadcrumbs->parent('csv.index'); - $breadcrumbs->push(trans('firefly.csv_process_title'), route('csv.process')); -} -); - /** * CURRENCIES */ diff --git a/app/Http/routes.php b/app/Http/routes.php index 977c3fb18c..f51ea854a8 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -157,21 +157,6 @@ Route::group( Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']); Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']); - - /** - * CSV controller - */ - Route::get('/csv', ['uses' => 'CsvController@index', 'as' => 'csv.index']); - Route::post('/csv/upload', ['uses' => 'CsvController@upload', 'as' => 'csv.upload']); - Route::get('/csv/column_roles', ['uses' => 'CsvController@columnRoles', 'as' => 'csv.column-roles']); - Route::post('/csv/initial_parse', ['uses' => 'CsvController@initialParse', 'as' => 'csv.initial_parse']); - Route::get('/csv/map', ['uses' => 'CsvController@map', 'as' => 'csv.map']); - Route::get('/csv/download-config', ['uses' => 'CsvController@downloadConfig', 'as' => 'csv.download-config']); - Route::get('/csv/download', ['uses' => 'CsvController@downloadConfigPage', 'as' => 'csv.download-config-page']); - Route::post('/csv/save_mapping', ['uses' => 'CsvController@saveMapping', 'as' => 'csv.save_mapping']); - - Route::get('/csv/process', ['uses' => 'CsvController@process', 'as' => 'csv.process']); - /** * Currency Controller */ diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 47ad19c301..6ea3d33f3e 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -87,7 +87,6 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind('FireflyIII\Repositories\Currency\CurrencyRepositoryInterface', 'FireflyIII\Repositories\Currency\CurrencyRepository'); $this->app->bind('FireflyIII\Support\Search\SearchInterface', 'FireflyIII\Support\Search\Search'); $this->app->bind('FireflyIII\Repositories\User\UserRepositoryInterface', 'FireflyIII\Repositories\User\UserRepository'); - $this->app->bind('FireflyIII\Helpers\Csv\WizardInterface', 'FireflyIII\Helpers\Csv\Wizard'); $this->app->bind('FireflyIII\Helpers\Attachments\AttachmentHelperInterface', 'FireflyIII\Helpers\Attachments\AttachmentHelper'); $this->app->bind( 'FireflyIII\Generator\Chart\Account\AccountChartGeneratorInterface', 'FireflyIII\Generator\Chart\Account\ChartJsAccountChartGenerator' diff --git a/config/firefly.php b/config/firefly.php index 4a045e1f6a..c3e5455c20 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -5,17 +5,23 @@ declare(strict_types = 1); return [ 'chart' => 'chartjs', 'version' => '3.9.0', - 'csv_import_enabled' => true, 'maxUploadSize' => 5242880, 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], 'resend_confirmation' => 3600, 'confirmation_age' => 14400, // four hours - 'export_formats' => [ + 'export_formats' => [ 'csv' => 'FireflyIII\Export\Exporter\CsvExporter', // mt940 FireflyIII Export Exporter MtExporter ], + 'import_formats' => [ + 'csv' => 'FireflyIII\Import\Importer\CsvImporter', + // mt940 FireflyIII Import Importer MtImporter + ], + + 'default_export_format' => 'csv', + 'default_import_format' => 'csv', 'bill_periods' => ['weekly', 'monthly', 'quarterly', 'half-year', 'yearly'], 'accountRoles' => [ @@ -103,7 +109,7 @@ return [ ], - 'bindables' => [ + 'bindables' => [ // models 'account' => 'FireflyIII\Models\Account', 'attachment' => 'FireflyIII\Models\Attachment', diff --git a/resources/views/csv/column-roles.twig b/resources/views/csv/column-roles.twig deleted file mode 100644 index f25a0a2ea7..0000000000 --- a/resources/views/csv/column-roles.twig +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "./layout/default.twig" %} - -{% block breadcrumbs %} - {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName) }} -{% endblock %} - -{% block content %} - - -
{{ 'csv_column_roles_text'|_ }}
-- {{ 'csv_download_config_text'|_ }} -
- -- {{ 'csv_do_download_config'|_ }} -
- -- {{ 'csv_more_information_text'|_ }} -
-{{ 'csv_index_beta_warning'|_ }}
- {% if unsupported|length > 0 %} -{{ 'csv_index_unsupported_warning'|_ }}
-- {{ 'csv_map_text'|_ }} -
-- - {{ trans('firefly.csv_process_text',{rows: rows}) }} -
- - {% if errors|length > 0 %} -{{ Lang.choice('firefly.csv_import_with_errors',errors|length,{errors: errors|length}) }}
-- {{ trans('firefly.csv_error_see_logs') }} -
- {% endif %} - -- - {{ trans('firefly.csv_process_new_entries',{imported: imported}) }} -
- - {% if journals|length > 0 %} -- {{ 'csv_start_over'|_ }} - {{ 'csv_to_index'|_ }} - {{ 'csv_do_download_config'|_ }} - -
-