From beda6ec3a9f3d38673ce1ebfb6e4a2059c3d0f6e Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 10 Jun 2016 15:25:24 +0200 Subject: [PATCH 1/3] Removed old CSV stuff. --- app/Helpers/Csv/Converter/AccountId.php | 35 -- app/Helpers/Csv/Converter/Amount.php | 32 -- app/Helpers/Csv/Converter/AmountComma.php | 36 -- .../Csv/Converter/AssetAccountIban.php | 89 ---- .../Csv/Converter/AssetAccountName.php | 65 --- .../Csv/Converter/AssetAccountNumber.php | 77 --- app/Helpers/Csv/Converter/BasicConverter.php | 114 ----- app/Helpers/Csv/Converter/BillId.php | 36 -- app/Helpers/Csv/Converter/BillName.php | 47 -- app/Helpers/Csv/Converter/BudgetId.php | 36 -- app/Helpers/Csv/Converter/BudgetName.php | 44 -- app/Helpers/Csv/Converter/CategoryId.php | 36 -- app/Helpers/Csv/Converter/CategoryName.php | 49 -- .../Csv/Converter/ConverterInterface.php | 52 -- app/Helpers/Csv/Converter/CurrencyCode.php | 43 -- app/Helpers/Csv/Converter/CurrencyId.php | 36 -- app/Helpers/Csv/Converter/CurrencyName.php | 42 -- app/Helpers/Csv/Converter/CurrencySymbol.php | 43 -- app/Helpers/Csv/Converter/Date.php | 46 -- app/Helpers/Csv/Converter/Description.php | 31 -- app/Helpers/Csv/Converter/INGDebetCredit.php | 34 -- app/Helpers/Csv/Converter/Ignore.php | 28 -- .../Csv/Converter/OpposingAccountIban.php | 64 --- .../Csv/Converter/OpposingAccountId.php | 35 -- .../Csv/Converter/OpposingAccountName.php | 41 -- .../Csv/Converter/RabobankDebetCredit.php | 34 -- app/Helpers/Csv/Converter/TagsComma.php | 53 --- app/Helpers/Csv/Converter/TagsSpace.php | 54 --- app/Helpers/Csv/Data.php | 336 ------------- app/Helpers/Csv/Importer.php | 384 --------------- app/Helpers/Csv/Mapper/AnyAccount.php | 42 -- app/Helpers/Csv/Mapper/AssetAccount.php | 54 --- app/Helpers/Csv/Mapper/Bill.php | 42 -- app/Helpers/Csv/Mapper/Budget.php | 42 -- app/Helpers/Csv/Mapper/Category.php | 42 -- app/Helpers/Csv/Mapper/MapperInterface.php | 24 - app/Helpers/Csv/Mapper/Tag.php | 42 -- .../Csv/Mapper/TransactionCurrency.php | 40 -- app/Helpers/Csv/PostProcessing/Amount.php | 44 -- .../Csv/PostProcessing/AssetAccount.php | 274 ----------- app/Helpers/Csv/PostProcessing/Bill.php | 45 -- app/Helpers/Csv/PostProcessing/Currency.php | 49 -- .../Csv/PostProcessing/Description.php | 47 -- .../Csv/PostProcessing/OpposingAccount.php | 210 --------- .../PostProcessing/PostProcessorInterface.php | 31 -- .../Csv/Specifix/AbnAmroDescription.php | 226 --------- app/Helpers/Csv/Specifix/Dummy.php | 60 --- .../Csv/Specifix/RabobankDescription.php | 76 --- app/Helpers/Csv/Specifix/Specifix.php | 46 -- .../Csv/Specifix/SpecifixInterface.php | 49 -- app/Helpers/Csv/Wizard.php | 202 -------- app/Helpers/Csv/WizardInterface.php | 68 --- app/Http/Controllers/CsvController.php | 444 ------------------ app/Http/breadcrumbs.php | 38 -- app/Http/routes.php | 15 - app/Providers/FireflyServiceProvider.php | 1 - 56 files changed, 4305 deletions(-) delete mode 100644 app/Helpers/Csv/Converter/AccountId.php delete mode 100644 app/Helpers/Csv/Converter/Amount.php delete mode 100644 app/Helpers/Csv/Converter/AmountComma.php delete mode 100644 app/Helpers/Csv/Converter/AssetAccountIban.php delete mode 100644 app/Helpers/Csv/Converter/AssetAccountName.php delete mode 100644 app/Helpers/Csv/Converter/AssetAccountNumber.php delete mode 100644 app/Helpers/Csv/Converter/BasicConverter.php delete mode 100644 app/Helpers/Csv/Converter/BillId.php delete mode 100644 app/Helpers/Csv/Converter/BillName.php delete mode 100644 app/Helpers/Csv/Converter/BudgetId.php delete mode 100644 app/Helpers/Csv/Converter/BudgetName.php delete mode 100644 app/Helpers/Csv/Converter/CategoryId.php delete mode 100644 app/Helpers/Csv/Converter/CategoryName.php delete mode 100644 app/Helpers/Csv/Converter/ConverterInterface.php delete mode 100644 app/Helpers/Csv/Converter/CurrencyCode.php delete mode 100644 app/Helpers/Csv/Converter/CurrencyId.php delete mode 100644 app/Helpers/Csv/Converter/CurrencyName.php delete mode 100644 app/Helpers/Csv/Converter/CurrencySymbol.php delete mode 100644 app/Helpers/Csv/Converter/Date.php delete mode 100644 app/Helpers/Csv/Converter/Description.php delete mode 100644 app/Helpers/Csv/Converter/INGDebetCredit.php delete mode 100644 app/Helpers/Csv/Converter/Ignore.php delete mode 100644 app/Helpers/Csv/Converter/OpposingAccountIban.php delete mode 100644 app/Helpers/Csv/Converter/OpposingAccountId.php delete mode 100644 app/Helpers/Csv/Converter/OpposingAccountName.php delete mode 100644 app/Helpers/Csv/Converter/RabobankDebetCredit.php delete mode 100644 app/Helpers/Csv/Converter/TagsComma.php delete mode 100644 app/Helpers/Csv/Converter/TagsSpace.php delete mode 100644 app/Helpers/Csv/Data.php delete mode 100644 app/Helpers/Csv/Importer.php delete mode 100644 app/Helpers/Csv/Mapper/AnyAccount.php delete mode 100644 app/Helpers/Csv/Mapper/AssetAccount.php delete mode 100644 app/Helpers/Csv/Mapper/Bill.php delete mode 100644 app/Helpers/Csv/Mapper/Budget.php delete mode 100644 app/Helpers/Csv/Mapper/Category.php delete mode 100644 app/Helpers/Csv/Mapper/MapperInterface.php delete mode 100644 app/Helpers/Csv/Mapper/Tag.php delete mode 100644 app/Helpers/Csv/Mapper/TransactionCurrency.php delete mode 100644 app/Helpers/Csv/PostProcessing/Amount.php delete mode 100644 app/Helpers/Csv/PostProcessing/AssetAccount.php delete mode 100644 app/Helpers/Csv/PostProcessing/Bill.php delete mode 100644 app/Helpers/Csv/PostProcessing/Currency.php delete mode 100644 app/Helpers/Csv/PostProcessing/Description.php delete mode 100644 app/Helpers/Csv/PostProcessing/OpposingAccount.php delete mode 100644 app/Helpers/Csv/PostProcessing/PostProcessorInterface.php delete mode 100644 app/Helpers/Csv/Specifix/AbnAmroDescription.php delete mode 100644 app/Helpers/Csv/Specifix/Dummy.php delete mode 100644 app/Helpers/Csv/Specifix/RabobankDescription.php delete mode 100644 app/Helpers/Csv/Specifix/Specifix.php delete mode 100644 app/Helpers/Csv/Specifix/SpecifixInterface.php delete mode 100644 app/Helpers/Csv/Wizard.php delete mode 100644 app/Helpers/Csv/WizardInterface.php delete mode 100644 app/Http/Controllers/CsvController.php 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 159931d398..43b7577f3f 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' From 5a79bc0a990bd1b95573d19b5d8fff49e889970a Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 10 Jun 2016 21:00:00 +0200 Subject: [PATCH 2/3] Initial code base for new CSV import. --- app/Http/Controllers/ImportController.php | 50 ++++++++++ app/Http/Requests/ImportUploadRequest.php | 46 +++++++++ app/Http/routes.php | 5 +- app/Import/Importer/CsvImporter.php | 81 ++++++++++++++++ app/Import/Importer/ImporterInterface.php | 52 ++++++++++ app/Import/Role/Map.php | 18 ++++ app/Import/Role/Role.php | 18 ++++ app/Models/ImportJob.php | 75 ++++++++++++++ app/Providers/ExportJobServiceProvider.php | 42 ++++++-- .../ImportJob/ImportJobRepository.php | 81 ++++++++++++++++ .../ImportJobRepositoryInterface.php | 36 +++++++ app/User.php | 9 ++ config/app.php | 4 +- config/firefly.php | 1 + .../2016_05_23_173524_changes_for_v391.php | 44 +++++++++ resources/lang/en_US/firefly.php | 97 ++----------------- resources/lang/en_US/form.php | 7 -- resources/lang/en_US/help.php | 5 - resources/views/import/csv/configure.twig | 84 ++++++++++++++++ resources/views/import/index.twig | 2 +- resources/views/partials/menu-sidebar.twig | 12 +-- 21 files changed, 646 insertions(+), 123 deletions(-) create mode 100644 app/Http/Requests/ImportUploadRequest.php create mode 100644 app/Import/Importer/CsvImporter.php create mode 100644 app/Import/Importer/ImporterInterface.php create mode 100644 app/Import/Role/Map.php create mode 100644 app/Import/Role/Role.php create mode 100644 app/Models/ImportJob.php create mode 100644 app/Repositories/ImportJob/ImportJobRepository.php create mode 100644 app/Repositories/ImportJob/ImportJobRepositoryInterface.php create mode 100644 database/migrations/2016_05_23_173524_changes_for_v391.php create mode 100644 resources/views/import/csv/configure.twig diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 0319bdb87f..45524c1714 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -2,7 +2,14 @@ namespace FireflyIII\Http\Controllers; +use Crypt; use FireflyIII\Http\Requests; +use FireflyIII\Http\Requests\ImportUploadRequest; +use FireflyIII\Import\Importer\ImporterInterface; +use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use SplFileObject; +use Storage; use View; /** @@ -22,6 +29,26 @@ class ImportController extends Controller View::share('title', trans('firefly.import_data')); } + /** + * @param ImportJob $job + * + * @return View + */ + public function configure(ImportJob $job) + { + // create proper importer (depends on job) + $type = $job->file_type; + /** @var ImporterInterface $importer */ + $importer = app('FireflyIII\Import\Importer\\' . ucfirst($type) . 'Importer'); + $importer->setJob($job); + $importer->configure(); + $data = $importer->getConfigurationData(); + + return view('import.' . $type . '.configure', compact('data', 'job')); + + + } + /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ @@ -38,4 +65,27 @@ class ImportController extends Controller return view('import.index', compact('subTitle', 'subTitleIcon', 'importFileTypes', 'defaultImportType')); } + + /** + * @param ImportUploadRequest $request + * @param ImportJobRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function upload(ImportUploadRequest $request, ImportJobRepositoryInterface $repository) + { + // create import job: + $type = $request->get('import_file_type'); + $job = $repository->create($type); + $upload = $request->files->get('import_file'); + $newName = $job->key . '.upload'; + $uploaded = new SplFileObject($upload->getRealPath()); + $content = $uploaded->fread($uploaded->getSize()); + $contentEncrypted = Crypt::encrypt($content); + $disk = Storage::disk('upload'); + $disk->put($newName, $contentEncrypted); + + return redirect(route('import.configure', [$job->key])); + + } } diff --git a/app/Http/Requests/ImportUploadRequest.php b/app/Http/Requests/ImportUploadRequest.php new file mode 100644 index 0000000000..0f1e39155b --- /dev/null +++ b/app/Http/Requests/ImportUploadRequest.php @@ -0,0 +1,46 @@ + 'required|file', + 'import_file_type' => 'required|in:' . join(',', $types), + ]; + + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index 43b7577f3f..abf3bbcd17 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -223,8 +223,9 @@ Route::group( /** * IMPORT CONTROLLER */ - Route::get('/import', ['uses' => 'ImportController@index', 'as' => 'import.index']); - Route::post('/import/upload', ['uses' => 'ImportController@upload', 'as' => 'import.upload']); + Route::get('/import', ['uses' => 'ImportController@index','as' => 'import.index']); + Route::post('/import/upload', ['uses' => 'ImportController@upload','as' => 'import.upload']); + Route::get('/import/configure/{importJob}', ['uses' => 'ImportController@configure','as' => 'import.configure']); /** * Help Controller diff --git a/app/Import/Importer/CsvImporter.php b/app/Import/Importer/CsvImporter.php new file mode 100644 index 0000000000..801c61f0ee --- /dev/null +++ b/app/Import/Importer/CsvImporter.php @@ -0,0 +1,81 @@ +getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $delimiters = [ + ',' => trans('form.csv_comma'), + ';' => trans('form.csv_semicolon'), + 'tab' => trans('form.csv_tab'), + ]; + + $data = [ + 'accounts' => ExpandedForm::makeSelectList($accounts), + 'specifix' => [], + 'delimiters' => $delimiters, + ]; + + return $data; + } + + /** + * @param ImportJob $job + */ + public function setJob(ImportJob $job) + { + $this->job = $job; + } + + /** + * Returns a Map thing used to allow the user to + * define roles for each entry. + * + * @return Map + */ + public function prepareRoles(): Map + { + return 'do not work'; + exit; + } +} \ No newline at end of file diff --git a/app/Import/Importer/ImporterInterface.php b/app/Import/Importer/ImporterInterface.php new file mode 100644 index 0000000000..4df74f85ba --- /dev/null +++ b/app/Import/Importer/ImporterInterface.php @@ -0,0 +1,52 @@ +where('user_id', Auth::user()->id)->first(); + if (!is_null($model)) { + return $model; + } + } + throw new NotFoundHttpException; + } + + /** + * @param $status + */ + public function change($status) + { + $this->status = $status; + $this->save(); + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function user() + { + return $this->belongsTo('FireflyIII\User'); + } +} diff --git a/app/Providers/ExportJobServiceProvider.php b/app/Providers/ExportJobServiceProvider.php index 380b14a2e9..f39e24cd1e 100644 --- a/app/Providers/ExportJobServiceProvider.php +++ b/app/Providers/ExportJobServiceProvider.php @@ -31,6 +31,27 @@ class ExportJobServiceProvider extends ServiceProvider */ public function boot() { + $this->exportJob(); + $this->importJob(); + + } + + /** + * Register the application services. + * + * @return void + */ + public function register() + { + // + } + + /** + * + */ + private function exportJob() + { + $this->app->bind( 'FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface', function (Application $app, array $arguments) { @@ -46,13 +67,20 @@ class ExportJobServiceProvider extends ServiceProvider ); } - /** - * Register the application services. - * - * @return void - */ - public function register() + private function importJob() { - // + $this->app->bind( + 'FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface', + function (Application $app, array $arguments) { + if (!isset($arguments[0]) && $app->auth->check()) { + return app('FireflyIII\Repositories\ImportJob\ImportJobRepository', [$app->auth->user()]); + } + if (!isset($arguments[0]) && !$app->auth->check()) { + throw new FireflyException('There is no user present.'); + } + + return app('FireflyIII\Repositories\ImportJob\ImportJobRepository', $arguments); + } + ); } } diff --git a/app/Repositories/ImportJob/ImportJobRepository.php b/app/Repositories/ImportJob/ImportJobRepository.php new file mode 100644 index 0000000000..4e281d83c6 --- /dev/null +++ b/app/Repositories/ImportJob/ImportJobRepository.php @@ -0,0 +1,81 @@ +user = $user; + } + + /** + * @param string $fileType + * + * @return ImportJob + */ + public function create(string $fileType): ImportJob + { + $count = 0; + while ($count < 30) { + $key = Str::random(12); + $existing = $this->findByKey($key); + if (is_null($existing->id)) { + $importJob = new ImportJob; + $importJob->user()->associate($this->user); + $importJob->file_type = $fileType; + $importJob->key = Str::random(12); + $importJob->status = 'import_status_never_started'; + $importJob->save(); + + // breaks the loop: + return $importJob; + } + $count++; + + } + + return new ImportJob; + } + + /** + * @param string $key + * + * @return ImportJob + */ + public function findByKey(string $key): ImportJob + { + $result = $this->user->importJobs()->where('key', $key)->first(); + if (is_null($result)) { + return new ImportJob; + } + + return $result; + } +} \ No newline at end of file diff --git a/app/Repositories/ImportJob/ImportJobRepositoryInterface.php b/app/Repositories/ImportJob/ImportJobRepositoryInterface.php new file mode 100644 index 0000000000..24cdd2aca9 --- /dev/null +++ b/app/Repositories/ImportJob/ImportJobRepositoryInterface.php @@ -0,0 +1,36 @@ +hasMany('FireflyIII\Models\ExportJob'); } + /** + * @return HasMany + */ + public function importjobs(): HasMany + { + return $this->hasMany('FireflyIII\Models\ImportJob'); + } + /** * Checks if the user has a role by its name. * diff --git a/config/app.php b/config/app.php index 79a9e67ed6..731400f5b1 100644 --- a/config/app.php +++ b/config/app.php @@ -180,8 +180,8 @@ return [ // own stuff: -// Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, -// Barryvdh\Debugbar\ServiceProvider::class, + Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, + Barryvdh\Debugbar\ServiceProvider::class, 'DaveJamesMiller\Breadcrumbs\ServiceProvider', 'TwigBridge\ServiceProvider', 'PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider', diff --git a/config/firefly.php b/config/firefly.php index 78a1b62634..e19fd5d75b 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -126,6 +126,7 @@ return [ 'rule' => 'FireflyIII\Models\Rule', 'ruleGroup' => 'FireflyIII\Models\RuleGroup', 'jobKey' => 'FireflyIII\Models\ExportJob', + 'importJob' => 'FireflyIII\Models\ImportJob', // lists 'accountList' => 'FireflyIII\Support\Binder\AccountList', 'budgetList' => 'FireflyIII\Support\Binder\BudgetList', diff --git a/database/migrations/2016_05_23_173524_changes_for_v391.php b/database/migrations/2016_05_23_173524_changes_for_v391.php new file mode 100644 index 0000000000..b8efd50b4d --- /dev/null +++ b/database/migrations/2016_05_23_173524_changes_for_v391.php @@ -0,0 +1,44 @@ +increments('id'); + $table->timestamps(); + $table->integer('user_id')->unsigned(); + $table->string('key', 12)->unique(); + $table->string('file_type', 12); + $table->string('status', 45); + + // connect rule groups to users + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + } + ); + } +} diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 6d3f31f8b0..61ed2cd803 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -326,97 +326,12 @@ return [ 'title_transfer' => 'Transfers', 'title_transfers' => 'Transfers', - - // csv import: - 'csv_import' => 'Import CSV file', - 'csv' => 'CSV', - 'csv_index_title' => 'Upload and import a CSV file', - 'csv_define_column_roles' => 'Define column roles', - 'csv_map_values' => 'Map found values to existing values', - 'csv_download_config' => 'Download CSV configuration file.', - 'csv_index_text' => 'This form allows you to import a CSV file with transactions into Firefly. It is based on the excellent CSV importer made by the folks at Atlassian. Simply upload your CSV file and follow the instructions. If you would like to learn more, please click on the button at the top of this page.', - 'csv_index_beta_warning' => 'This tool is very much in beta. Please proceed with caution', - 'csv_header_help' => 'Check this box when your CSV file\'s first row consists of column names, not actual data', - 'csv_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', - 'csv_csv_file_help' => 'Select the CSV file here. You can only upload one file at a time', - 'csv_csv_config_file_help' => 'Select your CSV import configuration here. If you do not know what this is, ignore it. It will be explained later.', - 'csv_upload_button' => 'Start importing CSV', - 'csv_column_roles_title' => 'Define column roles', - 'csv_column_roles_text' => 'Firefly does not know what each column means. You need to indicate what every column is. Please check out the example data if you\'re not sure yourself. Click on the question mark (top right of the page) to learn what each column means. If you want to map imported data onto existing data in Firefly, use the checkbox. The next step will show you what this button does.', - 'csv_column_roles_table' => 'Column roles', - 'csv_column' => 'CSV column', - 'csv_column_name' => 'CSV column name', - 'csv_column_example' => 'Column example data', - 'csv_column_role' => 'Column contains?', - 'csv_do_map_value' => 'Map value?', - 'csv_continue' => 'Continue to the next step', - 'csv_go_back' => 'Go back to the previous step', - 'csv_map_title' => 'Map found values to existing values', - 'csv_map_text' => 'This page allows you to map the values from the CSV file to existing entries in your database. This ensures that accounts and other things won\'t be created twice.', - 'csv_field_value' => 'Field value from CSV', - 'csv_field_mapped_to' => 'Must be mapped to...', - 'csv_do_not_map' => 'Do not map this value', - 'csv_download_config_title' => 'Download CSV configuration', - 'csv_download_config_text' => 'Everything you\'ve just set up can be downloaded as a configuration file. Click the button to do so.', - 'csv_more_information_text' => 'If the import fails, you can use this configuration file so you don\'t have to start all over again. But, if the import succeeds, it will be easier to upload similar CSV files.', - 'csv_do_download_config' => 'Download configuration file.', - 'csv_empty_description' => '(empty description)', - 'csv_upload_form' => 'CSV upload form', - 'csv_index_unsupported_warning' => 'The CSV importer is yet incapable of doing the following:', - 'csv_unsupported_map' => 'The importer cannot map the column ":columnRole" to existing values in the database.', - 'csv_unsupported_value' => 'The importer does not know how to handle values in columns marked as ":columnRole".', - 'csv_cannot_store_value' => 'The importer has not reserved space for columns marked ":columnRole" and will be incapable of processing them.', - 'csv_process_title' => 'CSV import finished!', - 'csv_process_text' => 'The CSV importer has finished and has processed :rows rows', - 'csv_row' => 'Row', - 'csv_import_with_errors' => 'There was one error.|There were :errors errors.', - 'csv_error_see_logs' => 'Check the log files to see details.', - 'csv_process_new_entries' => 'Firefly has created :imported new transaction(s).', - 'csv_start_over' => 'Import again', - 'csv_to_index' => 'Back home', - 'csv_upload_not_writeable' => 'Cannot write to the path mentioned here. Cannot upload', - 'csv_column__ignore' => '(ignore this column)', - 'csv_column_account-iban' => 'Asset account (IBAN)', - 'csv_column_account-id' => 'Asset account ID (matching Firefly)', - 'csv_column_account-name' => 'Asset account (name)', - 'csv_column_amount' => 'Amount', - 'csv_column_amount-comma-separated' => 'Amount (comma as decimal separator)', - 'csv_column_bill-id' => 'Bill ID (matching Firefly)', - 'csv_column_bill-name' => 'Bill name', - 'csv_column_budget-id' => 'Budget ID (matching Firefly)', - 'csv_column_budget-name' => 'Budget name', - 'csv_column_category-id' => 'Category ID (matching Firefly)', - 'csv_column_category-name' => 'Category name', - 'csv_column_currency-code' => 'Currency code (ISO 4217)', - 'csv_column_currency-id' => 'Currency ID (matching Firefly)', - 'csv_column_currency-name' => 'Currency name (matching Firefly)', - 'csv_column_currency-symbol' => 'Currency symbol (matching Firefly)', - 'csv_column_date-rent' => 'Rent calculation date', - 'csv_column_date-transaction' => 'Date', - 'csv_column_description' => 'Description', - 'csv_column_opposing-iban' => 'Opposing account (IBAN)', - 'csv_column_opposing-id' => 'Opposing account ID (matching Firefly)', - 'csv_column_opposing-name' => 'Opposing account (name)', - 'csv_column_rabo-debet-credit' => 'Rabobank specific debet/credit indicator', - 'csv_column_ing-debet-credit' => 'ING specific debet/credit indicator', - 'csv_column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', - 'csv_column_sepa-ct-op' => 'SEPA Credit Transfer opposing account', - 'csv_column_sepa-db' => 'SEPA Direct Debet', - 'csv_column_tags-comma' => 'Tags (comma separated)', - 'csv_column_tags-space' => 'Tags (space separated)', - 'csv_column_account-number' => 'Asset account (account number)', - 'csv_column_opposing-number' => 'Opposing account (account number)', - 'csv_specifix_RabobankDescription' => 'Select this when you\'re importing Rabobank CSV export files.', - 'csv_specifix_AbnAmroDescription' => 'Select this when you\'re importing ABN AMRO CSV export files.', - 'csv_specifix_Dummy' => 'Checking this has no effect whatsoever.', - 'csv_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', - 'csv_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', - 'csv_date_parse_error' => 'Could not parse a valid date from ":value", using the format ":format". Are you sure your CSV is correct?', - 'could_not_recover' => 'Could not continue from the previous step. Your progress has been lost :(. The log files will tell you what happened.', - 'must_select_roles' => 'You must select some roles for your file content, or the process cannot continue.', - 'invalid_mapping' => 'You have submitted an invalid mapping. The process cannot continue.', - 'no_file_uploaded' => 'It seems you did not upload a file.', - + // import routine + 'import_data' => 'Import data', + 'import' => 'Import', + 'import_intro_text' => 'Some intro here', + 'import_file_help' => 'Select your file', + // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index b60433f727..d261d04399 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -71,13 +71,9 @@ return [ 'code' => 'Code', 'iban' => 'IBAN', 'accountNumber' => 'Account number', - 'csv' => 'CSV file', 'has_headers' => 'Headers', 'date_format' => 'Date format', - 'csv_config' => 'CSV import configuration', 'specifix' => 'Bank- or file specific fixes', - 'csv_import_account' => 'Default import account', - 'csv_delimiter' => 'CSV field delimiter', 'attachments[]' => 'Attachments', 'store_new_withdrawal' => 'Store new withdrawal', 'store_new_deposit' => 'Store new deposit', @@ -102,9 +98,6 @@ return [ 'include_config' => 'Include configuration file', 'include_old_uploads' => 'Include imported data', 'accounts' => 'Export transactions from these accounts', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', 'delete_account' => 'Delete account ":name"', 'delete_bill' => 'Delete bill ":name"', 'delete_budget' => 'Delete budget ":name"', diff --git a/resources/lang/en_US/help.php b/resources/lang/en_US/help.php index bf2fff9e38..d1fa572177 100644 --- a/resources/lang/en_US/help.php +++ b/resources/lang/en_US/help.php @@ -55,11 +55,6 @@ return [ 'categories-show' => 'categories.show', 'categories-show-date' => 'categories.show.date', 'categories-noCategory' => 'categories.noCategory', - 'csv-index' => 'csv.index', - 'csv-column-roles' => 'csv.column-roles', - 'csv-map' => 'csv.map', - 'csv-download-config-page' => 'csv.download-config-page', - 'csv-process' => 'csv.process', 'currency-index' => 'currency.index', 'currency-create' => 'currency.create', 'currency-edit' => 'currency.edit', diff --git a/resources/views/import/csv/configure.twig b/resources/views/import/csv/configure.twig new file mode 100644 index 0000000000..1a4e95f42b --- /dev/null +++ b/resources/views/import/csv/configure.twig @@ -0,0 +1,84 @@ +{% extends "./layout/default.twig" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, job) }} +{% endblock %} + +{% block content %} + +
+
+
+
+

{{ 'import_csv_configure_title'|_ }}

+
+
+

+ {{ 'import_csv_configure_intro' }} +

+
+
+ +
+
+ +
+ + +
+
+
+
+

{{ 'import_csv_configure_form'|_ }}

+
+
+ + {{ ExpandedForm.checkbox('has_headers',1,null,{helpText: 'csv_header_help'|_}) }} + {{ ExpandedForm.text('date_format','Ymd',{helpText: trans('firefly.csv_date_help', {dateExample: phpdate('Ymd')}) }) }} + {{ ExpandedForm.select('csv_delimiter', data.delimiters, 0, {helpText: 'csv_delimiter_help'|_} ) }} + + {{ ExpandedForm.file('csv_config',{helpText: 'csv_csv_config_file_help'|_}) }} + + {{ ExpandedForm.select('csv_import_account', data.accounts, 0, {helpText: 'csv_import_account_help'|_} ) }} + + {{ ExpandedForm.multiCheckbox('specifix', data.specifix) }} + + + + {% if not uploadPossible %} +
+
+   +
+ +
+
{{ path }}
+

+ {{ 'csv_upload_not_writeable'|_ }} +

+
+
+ {% endif %} + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + +{% endblock %} diff --git a/resources/views/import/index.twig b/resources/views/import/index.twig index 16ea17886e..8449e5a93f 100644 --- a/resources/views/import/index.twig +++ b/resources/views/import/index.twig @@ -25,7 +25,7 @@
- {{ ExpandedForm.file('import_file',{helpText: 'import_file_help'|_}) }} + {{ ExpandedForm.file('import_file', {helpText: 'import_file_help'|_}) }} {{ ExpandedForm.select('import_file_type', importFileTypes, defaultImportType, {'helpText' : 'import_file_type_help'|_}) }} diff --git a/resources/views/partials/menu-sidebar.twig b/resources/views/partials/menu-sidebar.twig index 54de5a7a93..4920233f04 100644 --- a/resources/views/partials/menu-sidebar.twig +++ b/resources/views/partials/menu-sidebar.twig @@ -110,8 +110,7 @@ -
  • - +
  • @@ -120,12 +119,9 @@
      - {% if Config.get('firefly.csv_import_enabled') %} -
    • - {{ 'csv_import'|_ }} -
    • - {% endif %} - +
    • + {{ 'import_data'|_ }} +
    • {{ 'export_data'|_ }}
    • From 13b92c47d9967a93da3e45d173e439945e4aa3f5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 11 Jun 2016 06:31:40 +0200 Subject: [PATCH 3/3] Translations and fixes. --- app/Import/Importer/CsvImporter.php | 24 +++++---- resources/lang/en_US/firefly.php | 64 +++++++++++++---------- resources/lang/en_US/form.php | 13 +++++ resources/views/import/csv/configure.twig | 9 ++-- 4 files changed, 68 insertions(+), 42 deletions(-) diff --git a/app/Import/Importer/CsvImporter.php b/app/Import/Importer/CsvImporter.php index 801c61f0ee..abd18cb913 100644 --- a/app/Import/Importer/CsvImporter.php +++ b/app/Import/Importer/CsvImporter.php @@ -51,22 +51,16 @@ class CsvImporter implements ImporterInterface ]; $data = [ - 'accounts' => ExpandedForm::makeSelectList($accounts), - 'specifix' => [], - 'delimiters' => $delimiters, + 'accounts' => ExpandedForm::makeSelectList($accounts), + 'specifix' => [], + 'delimiters' => $delimiters, + 'upload_path' => storage_path('upload'), + 'is_upload_possible' => is_writable(storage_path('upload')), ]; return $data; } - /** - * @param ImportJob $job - */ - public function setJob(ImportJob $job) - { - $this->job = $job; - } - /** * Returns a Map thing used to allow the user to * define roles for each entry. @@ -78,4 +72,12 @@ class CsvImporter implements ImporterInterface return 'do not work'; exit; } + + /** + * @param ImportJob $job + */ + public function setJob(ImportJob $job) + { + $this->job = $job; + } } \ No newline at end of file diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 61ed2cd803..e2a0bfac5a 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -327,11 +327,11 @@ return [ 'title_transfers' => 'Transfers', // import routine - 'import_data' => 'Import data', - 'import' => 'Import', - 'import_intro_text' => 'Some intro here', - 'import_file_help' => 'Select your file', - + 'import_data' => 'Import data', + 'import' => 'Import', + 'import_intro_text' => 'Some intro here', + 'import_file_help' => 'Select your file', + // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', @@ -727,29 +727,39 @@ return [ 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', 'store_splitted_withdrawal' => 'Store splitted withdrawal', 'update_splitted_withdrawal' => 'Update splitted withdrawal', + 'split_title_deposit' => 'Split your new deposit', + 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', + 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', + 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', + 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', + 'store_splitted_deposit' => 'Store splitted deposit', + 'split_title_transfer' => 'Split your new transfer', + 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', + 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', + 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', + 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', + 'store_splitted_transfer' => 'Store splitted transfer', + 'add_another_split' => 'Add another split', + 'split-transactions' => 'Split transactions', + 'split-new-transaction' => 'Split a new transaction', + 'do_split' => 'Do a split', + 'split_this_withdrawal' => 'Split this withdrawal', + 'split_this_deposit' => 'Split this deposit', + 'split_this_transfer' => 'Split this transfer', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', - - 'add_another_split' => 'Add another split', - 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', - - 'do_split' => 'Do a split', - 'split_this_withdrawal' => 'Split this withdrawal', - 'split_this_deposit' => 'Split this deposit', - 'split_this_transfer' => 'Split this transfer', + // import + 'import_file_type_csv' => 'CSV (comma separated values)', + 'import_file_type_help' => 'Select the type of file you will upload', + 'import_start' => 'Start the import', + 'import_csv_configure_title' => 'Configure your import', + 'import_csv_configure_intro' => 'There are some options for your CSV import.', + 'import_csv_configure_form' => 'Form', + 'csv_header_help' => 'Check this if the first row of your CSV file are the column titles', + 'csv_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', + 'csv_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', + 'csv_csv_config_file_help' => 'Select your CSV import configuration here. If you do not know what this is, ignore it. It will be explained later.', + 'csv_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', + 'csv_upload_not_writeable' => 'The grey box contains a file path. It should be writeable. Please make sure it is.', ]; diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index d261d04399..c2bf0cb5e9 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -130,4 +130,17 @@ return [ 'budget_keep_transactions' => 'The only transaction connected to this budget will not be deleted.|All :count transactions connected to this budget will spared deletion.', 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', + + // import + 'import_file' => 'Import file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', + + + ]; diff --git a/resources/views/import/csv/configure.twig b/resources/views/import/csv/configure.twig index 1a4e95f42b..d9645cd7d1 100644 --- a/resources/views/import/csv/configure.twig +++ b/resources/views/import/csv/configure.twig @@ -14,7 +14,7 @@
  • - {{ 'import_csv_configure_intro' }} + {{ 'import_csv_configure_intro'|_ }}

    @@ -45,14 +45,14 @@ - {% if not uploadPossible %} + {% if not data.is_upload_possible %}
     
    -
    {{ path }}
    +
    {{ data.upload_path }}

    {{ 'csv_upload_not_writeable'|_ }}

    @@ -64,7 +64,7 @@
    - + {% if data.is_upload_possible %}
    @@ -76,6 +76,7 @@
    + {% endif %}