Add new bank specific fixes.

This commit is contained in:
James Cole
2015-07-06 20:21:55 +02:00
parent af13d1943f
commit c555e28988
13 changed files with 471 additions and 336 deletions

View File

@@ -33,6 +33,9 @@ class Data
/** @var array */ /** @var array */
protected $roles; protected $roles;
/** @var array */
protected $specifix;
/** /**
* *
*/ */
@@ -44,6 +47,7 @@ class Data
$this->sessionMap(); $this->sessionMap();
$this->sessionRoles(); $this->sessionRoles();
$this->sessionMapped(); $this->sessionMapped();
$this->sessionSpecifix();
} }
protected function sessionHasHeaders() protected function sessionHasHeaders()
@@ -88,6 +92,13 @@ class Data
} }
} }
protected function sessionSpecifix()
{
if (Session::has('csv-specifix')) {
$this->specifix = (array)Session::get('csv-specifix');
}
}
/** /**
* @return string * @return string
*/ */
@@ -231,5 +242,22 @@ class Data
$this->roles = $roles; $this->roles = $roles;
} }
/**
* @return array
*/
public function getSpecifix()
{
return $this->specifix;
}
/**
* @param array $specifix
*/
public function setSpecifix($specifix)
{
Session::put('csv-specifix', $specifix);
$this->specifix = $specifix;
}
} }

View File

@@ -37,6 +37,8 @@ class Importer
protected $roles; protected $roles;
/** @var int */ /** @var int */
protected $rows = 0; protected $rows = 0;
/** @var array */
protected $specifix;
/** /**
* @return array * @return array
@@ -69,9 +71,10 @@ class Importer
{ {
set_time_limit(0); set_time_limit(0);
$this->map = $this->data->getMap(); $this->map = $this->data->getMap();
$this->roles = $this->data->getRoles(); $this->roles = $this->data->getRoles();
$this->mapped = $this->data->getMapped(); $this->mapped = $this->data->getMapped();
$this->specifix = $this->data->getSpecifix();
foreach ($this->data->getReader() as $index => $row) { foreach ($this->data->getReader() as $index => $row) {
if ($this->parseRow($index)) { if ($this->parseRow($index)) {
@@ -174,8 +177,7 @@ class Importer
{ {
// do bank specific fixes (must be enabled but now all of them. // do bank specific fixes (must be enabled but now all of them.
$set = Config::get('csv.specifix'); foreach ($this->getSpecifix() as $className) {
foreach ($set as $className) {
/** @var SpecifixInterface $specifix */ /** @var SpecifixInterface $specifix */
$specifix = App::make('FireflyIII\Helpers\Csv\Specifix\\' . $className); $specifix = App::make('FireflyIII\Helpers\Csv\Specifix\\' . $className);
$specifix->setData($data); $specifix->setData($data);
@@ -195,6 +197,14 @@ class Importer
return $data; return $data;
} }
/**
* @return array
*/
public function getSpecifix()
{
return $this->specifix;
}
/** /**
* @param $data * @param $data
* *
@@ -304,4 +314,5 @@ class Importer
{ {
$this->data = $data; $this->data = $data;
} }
} }

View File

@@ -0,0 +1,45 @@
<?php
namespace FireflyIII\Helpers\Csv\Specifix;
/**
* Class Dummy
*
* @package FireflyIII\Helpers\Csv\Specifix
*/
class Dummy
{
/** @var array */
protected $data;
/** @var array */
protected $row;
/**
* @return array
*/
public function fix()
{
return $this->data;
}
/**
* @param array $data
*/
public function setData($data)
{
$this->data = $data;
}
/**
* @param array $row
*/
public function setRow($row)
{
$this->row = $row;
}
}

View File

@@ -155,14 +155,17 @@ class CsvController extends Controller
Session::forget('csv-mapped'); Session::forget('csv-mapped');
Session::forget('csv-specifix'); Session::forget('csv-specifix');
// get values which are yet unsaveable or unmappable: // get list of supported specifix
$unsupported = []; $specifix = [];
foreach (Config::get('csv.specifix') as $entry) {
$specifix[$entry] = trans('firefly.csv_specifix_' . $entry);
}
// can actually upload? // can actually upload?
$uploadPossible = is_writable(storage_path('upload')); $uploadPossible = is_writable(storage_path('upload'));
$path = storage_path('upload'); $path = storage_path('upload');
return view('csv.index', compact('subTitle', 'uploadPossible', 'path', 'unsupported')); return view('csv.index', compact('subTitle', 'uploadPossible', 'path', 'specifix'));
} }
/** /**
@@ -378,6 +381,7 @@ class CsvController extends Controller
$settings = []; $settings = [];
$settings['date-format'] = Input::get('date_format'); $settings['date-format'] = Input::get('date_format');
$settings['has-headers'] = intval(Input::get('has_headers')) === 1; $settings['has-headers'] = intval(Input::get('has_headers')) === 1;
$settings['specifix'] = Input::get('specifix');
$settings['map'] = []; $settings['map'] = [];
$settings['mapped'] = []; $settings['mapped'] = [];
$settings['roles'] = []; $settings['roles'] = [];
@@ -399,6 +403,7 @@ class CsvController extends Controller
$this->data->setMap($settings['map']); $this->data->setMap($settings['map']);
$this->data->setMapped($settings['mapped']); $this->data->setMapped($settings['mapped']);
$this->data->setRoles($settings['roles']); $this->data->setRoles($settings['roles']);
$this->data->setSpecifix($settings['specifix']);
return redirect(route('csv.column-roles')); return redirect(route('csv.column-roles'));

View File

@@ -262,6 +262,27 @@ class ExpandedForm
return $selectList; return $selectList;
} }
/**
* @param $name
* @param array $list
* @param null $selected
* @param array $options
*
* @return string
*/
public function multiCheckbox($name, array $list = [], $selected = null, array $options = [])
{
$label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options);
$classes = $this->getHolderClasses($name);
$selected = $this->fillFieldValue($name, $selected);
unset($options['class']);
$html = View::make('form.multiCheckbox', compact('classes', 'name', 'label', 'selected', 'options', 'list'))->render();
return $html;
}
/** /**
* @param $name * @param $name
* @param array $list * @param array $list

View File

@@ -1,7 +1,8 @@
<?php <?php
return [ return [
'specifix' => [ 'specifix' => [
'RabobankDescription' 'RabobankDescription',
'Dummy'
], ],
'post_processors' => [ 'post_processors' => [
'Description', 'Description',

View File

@@ -145,7 +145,7 @@ return [
'ExpandedForm' => [ 'ExpandedForm' => [
'is_safe' => [ 'is_safe' => [
'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location', 'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location',
'multiRadio','file' 'multiRadio','file','multiCheckbox'
] ]
], ],
'Form' => [ 'Form' => [

View File

@@ -2,378 +2,381 @@
return [ return [
// general stuff: // general stuff:
'test' => 'You have selected English.', 'test' => 'You have selected English.',
'close' => 'Close', 'close' => 'Close',
'pleaseHold' => 'Please hold...', 'pleaseHold' => 'Please hold...',
'actions' => 'Actions', 'actions' => 'Actions',
'edit' => 'Edit', 'edit' => 'Edit',
'delete' => 'Delete', 'delete' => 'Delete',
'welcomeBack' => 'What\'s playing?', 'welcomeBack' => 'What\'s playing?',
'everything' => 'Everything', 'everything' => 'Everything',
'customRange' => 'Custom range', 'customRange' => 'Custom range',
'apply' => 'Apply', 'apply' => 'Apply',
'cancel' => 'Cancel', 'cancel' => 'Cancel',
'from' => 'From', 'from' => 'From',
'to' => 'To', 'to' => 'To',
'showEverything' => 'Show everything', 'showEverything' => 'Show everything',
'never' => 'Never', 'never' => 'Never',
'search_results_for' => 'Search results for ":query"', 'search_results_for' => 'Search results for ":query"',
// csv import: // csv import:
'csv_import' => 'Import CSV file', 'csv_import' => 'Import CSV file',
'csv' => 'CSV', 'csv' => 'CSV',
'csv_index_title' => 'Upload and import a CSV file', 'csv_index_title' => 'Upload and import a CSV file',
'csv_define_column_roles' => 'Define column roles', 'csv_define_column_roles' => 'Define column roles',
'csv_map_values' => 'Map found values to existing values', 'csv_map_values' => 'Map found values to existing values',
'csv_download_config' => 'Download CSV configuration file.', 'csv_download_config' => 'Download CSV configuration file.',
'csv_index_text' => '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' . '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 <a href="https://www.atlassian.com/">Atlassian</a>. Simply upload your CSV file and follow the instructions.' . ' the folks at <a href="https://www.atlassian.com/">Atlassian</a>. Simply upload your CSV file and follow the instructions.' .
' If you would like to learn more, please click on the <i class="fa fa-question-circle"></i> button at the top of this page.', ' If you would like to learn more, please click on the <i class="fa fa-question-circle"></i> button at the top of this page.',
'csv_index_beta_warning' => 'This tool is very much in beta. Please proceed with caution', '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_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 <a href="https://secure.' . 'csv_date_help' => 'Date time format in your CSV. Follow the format like <a href="https://secure.' .
'php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters">this' . 'php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters">this' .
' page</a> indicates. The default value will parse dates that look like this: ' . date('Ymd'), ' page</a> indicates. The default value will parse dates that look like this: ' . date('Ymd'),
'csv_csv_file_help' => 'Select the CSV file here. You can only upload one file at a time', '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_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_upload_button' => 'Start importing CSV',
'csv_column_roles_title' => 'Define column roles', '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 ' 'csv_column_roles_text' =>
. 'data if you\'re not sure yourself. Click on the question mark (top right of the page) to learn what' 'Firefly does not know what each column means. You need to indicate what every column is. Please check out the example '
. ' each column means. If you want to map imported data onto existing data in Firefly, use the checkbox. ' . 'data if you\'re not sure yourself. Click on the question mark (top right of the page) to learn what'
. 'The next step will show you what this button does.', . ' each column means. If you want to map imported data onto existing data in Firefly, use the checkbox. '
'csv_column_roles_table' => 'Column roles', . 'The next step will show you what this button does.',
'csv_column' => 'CSV column', 'csv_column_roles_table' => 'Column roles',
'cvs_column_name' => 'CSV column name', 'csv_column' => 'CSV column',
'cvs_column_example' => 'Column example data', 'cvs_column_name' => 'CSV column name',
'cvs_column_role' => 'Column contains?', 'cvs_column_example' => 'Column example data',
'csv_do_map_value' => 'Map value?', 'cvs_column_role' => 'Column contains?',
'csv_continue' => 'Continue to the next step', 'csv_do_map_value' => 'Map value?',
'csv_go_back' => 'Go back to the previous step', 'csv_continue' => 'Continue to the next step',
'csv_map_title' => 'Map found values to existing values', 'csv_go_back' => 'Go back to the previous step',
'csv_map_text' => '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' '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.', . ' things won\'t be created twice.',
'cvs_field_value' => 'Field value from CSV', 'cvs_field_value' => 'Field value from CSV',
'csv_field_mapped_to' => 'Must be mapped to...', 'csv_field_mapped_to' => 'Must be mapped to...',
'csv_download_config_title' => 'Download CSV configuration', '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_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.' '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.', . ' But, if the import succeeds, it will be easier to upload similar CSV files.',
'csv_do_download_config' => 'Download configuration file.', 'csv_do_download_config' => 'Download configuration file.',
'csv_empty_description' => '(empty description)', 'csv_empty_description' => '(empty description)',
'csv_upload_form' => 'CSV upload form', 'csv_upload_form' => 'CSV upload form',
'csv_index_unsupported_warning' => 'The CSV importer is yet incapable of doing the following:', '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_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_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_cannot_store_value' => 'The importer has not reserved space for columns marked ":columnRole" and will be incapable of processing them.',
'csv_process_title' => 'CVS import finished!', 'csv_process_title' => 'CVS import finished!',
'csv_process_text' => 'The CVS importer has finished and has processed :rows rows', 'csv_process_text' => 'The CVS importer has finished and has processed :rows rows',
'csv_row' => 'Row', 'csv_row' => 'Row',
'csv_import_with_errors' => 'There was one error.|There were :errors errors.', 'csv_import_with_errors' => 'There was one error.|There were :errors errors.',
'csv_error_see_logs' => 'Check the log files to see details.', 'csv_error_see_logs' => 'Check the log files to see details.',
'csv_process_new_entries' => 'Firefly has created :imported new transaction(s).', 'csv_process_new_entries' => 'Firefly has created :imported new transaction(s).',
'csv_start_over' => 'Import again', 'csv_start_over' => 'Import again',
'csv_to_index' => 'Back home', 'csv_to_index' => 'Back home',
'csv_do_not_map' => 'Do not map this value', 'csv_do_not_map' => 'Do not map this value',
'csv_upload_not_writeable' => 'Cannot write to the path mentioned here. Cannot upload', 'csv_upload_not_writeable' => 'Cannot write to the path mentioned here. Cannot upload',
'csv_column__ignore' => '(ignore this column)', 'csv_column__ignore' => '(ignore this column)',
'csv_column_account-iban' => 'Asset account (IBAN)', 'csv_column_account-iban' => 'Asset account (IBAN)',
'csv_column_account-id' => 'Asset account ID (matching Firefly)', 'csv_column_account-id' => 'Asset account ID (matching Firefly)',
'csv_column_account-name' => 'Asset account (name)', 'csv_column_account-name' => 'Asset account (name)',
'csv_column_amount' => 'Amount', 'csv_column_amount' => 'Amount',
'csv_column_bill-id' => 'Bill ID (matching Firefly)', 'csv_column_bill-id' => 'Bill ID (matching Firefly)',
'csv_column_bill-name' => 'Bill name', 'csv_column_bill-name' => 'Bill name',
'csv_column_budget-id' => 'Budget ID (matching Firefly)', 'csv_column_budget-id' => 'Budget ID (matching Firefly)',
'csv_column_budget-name' => 'Budget name', 'csv_column_budget-name' => 'Budget name',
'csv_column_category-id' => 'Category ID (matching Firefly)', 'csv_column_category-id' => 'Category ID (matching Firefly)',
'csv_column_category-name' => 'Category name', 'csv_column_category-name' => 'Category name',
'csv_column_currency-code' => 'Currency code (ISO 4217)', 'csv_column_currency-code' => 'Currency code (ISO 4217)',
'csv_column_currency-id' => 'Currency ID (matching Firefly)', 'csv_column_currency-id' => 'Currency ID (matching Firefly)',
'csv_column_currency-name' => 'Currency name (matching Firefly)', 'csv_column_currency-name' => 'Currency name (matching Firefly)',
'csv_column_currency-symbol' => 'Currency symbol (matching Firefly)', 'csv_column_currency-symbol' => 'Currency symbol (matching Firefly)',
'csv_column_date-rent' => 'Rent calculation date', 'csv_column_date-rent' => 'Rent calculation date',
'csv_column_date-transaction' => 'Date', 'csv_column_date-transaction' => 'Date',
'csv_column_description' => 'Description', 'csv_column_description' => 'Description',
'csv_column_opposing-iban' => 'Opposing account (IBAN)', 'csv_column_opposing-iban' => 'Opposing account (IBAN)',
'csv_column_opposing-id' => 'Opposing account ID (matching Firefly)', 'csv_column_opposing-id' => 'Opposing account ID (matching Firefly)',
'csv_column_opposing-name' => 'Opposing account (name)', 'csv_column_opposing-name' => 'Opposing account (name)',
'csv_column_rabo-debet-credit' => 'Rabobank specific debet/credit indicator', 'csv_column_rabo-debet-credit' => 'Rabobank specific debet/credit indicator',
'csv_column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', '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-ct-op' => 'SEPA Credit Transfer opposing account',
'csv_column_sepa-db' => 'SEPA Direct Debet', 'csv_column_sepa-db' => 'SEPA Direct Debet',
'csv_column_tags-comma' => 'Tags (comma separated)', 'csv_column_tags-comma' => 'Tags (comma separated)',
'csv_column_tags-space' => 'Tags (space separated)', 'csv_column_tags-space' => 'Tags (space separated)',
'csv_specifix_RabobankDescription' => 'Select this when you\'re importing Rabobank CSV export files.',
'csv_specifix_Dummy' => 'Checking this has no effect whatsoever.',
// create new stuff: // create new stuff:
'create_new_withdrawal' => 'Create new withdrawal', 'create_new_withdrawal' => 'Create new withdrawal',
'create_new_deposit' => 'Create new deposit', 'create_new_deposit' => 'Create new deposit',
'create_new_transfer' => 'Create new transfer', 'create_new_transfer' => 'Create new transfer',
'create_new_asset' => 'Create new asset account', 'create_new_asset' => 'Create new asset account',
'create_new_expense' => 'Create new expense account', 'create_new_expense' => 'Create new expense account',
'create_new_revenue' => 'Create new revenue account', 'create_new_revenue' => 'Create new revenue account',
'create_new_piggy_bank' => 'Create new piggy bank', 'create_new_piggy_bank' => 'Create new piggy bank',
'create_new_bill' => 'Create new bill', 'create_new_bill' => 'Create new bill',
// currencies: // currencies:
'create_currency' => 'Create a new currency', 'create_currency' => 'Create a new currency',
'edit_currency' => 'Edit currency ":name"', 'edit_currency' => 'Edit currency ":name"',
// new user: // new user:
'submit' => 'Submit', 'submit' => 'Submit',
'getting_started' => 'Getting started', 'getting_started' => 'Getting started',
'to_get_started' => 'To get started with Firefly, please enter your current bank\'s name, and the balance of your checking account:', 'to_get_started' => 'To get started with Firefly, please enter your current bank\'s name, and the balance of your checking account:',
'savings_balance_text' => 'If you have a savings account, please enter the current balance of your savings account:', 'savings_balance_text' => 'If you have a savings account, please enter the current balance of your savings account:',
'cc_balance_text' => 'If you have a credit card, please enter your credit card\'s limit.', 'cc_balance_text' => 'If you have a credit card, please enter your credit card\'s limit.',
// forms: // forms:
'mandatoryFields' => 'Mandatory fields', 'mandatoryFields' => 'Mandatory fields',
'optionalFields' => 'Optional fields', 'optionalFields' => 'Optional fields',
'options' => 'Options', 'options' => 'Options',
'something' => 'Something!', 'something' => 'Something!',
// budgets: // budgets:
'create_new_budget' => 'Create a new budget', 'create_new_budget' => 'Create a new budget',
'store_new_budget' => ' Store new budget', 'store_new_budget' => ' Store new budget',
'availableIn' => 'Available in :date', 'availableIn' => 'Available in :date',
'transactionsWithoutBudget' => 'Expenses without budget', 'transactionsWithoutBudget' => 'Expenses without budget',
'transactionsWithoutBudgetDate' => 'Expenses without budget in :date', 'transactionsWithoutBudgetDate' => 'Expenses without budget in :date',
'createBudget' => 'New budget', 'createBudget' => 'New budget',
'inactiveBudgets' => 'Inactive budgets', 'inactiveBudgets' => 'Inactive budgets',
'without_budget_between' => 'Transactions without a budget between :start and :end', 'without_budget_between' => 'Transactions without a budget between :start and :end',
'budget_in_month' => ':name in :month', 'budget_in_month' => ':name in :month',
'delete_budget' => 'Delete budget ":name"', 'delete_budget' => 'Delete budget ":name"',
'edit_budget' => 'Edit budget ":name"', 'edit_budget' => 'Edit budget ":name"',
'update_amount' => 'Update amount', 'update_amount' => 'Update amount',
// bills: // bills:
'delete_bill' => 'Delete bill ":name"', 'delete_bill' => 'Delete bill ":name"',
'edit_bill' => 'Edit bill ":name"', 'edit_bill' => 'Edit bill ":name"',
// accounts: // accounts:
'details_for_asset' => 'Details for asset account ":name"', 'details_for_asset' => 'Details for asset account ":name"',
'details_for_expense' => 'Details for expense account ":name"', 'details_for_expense' => 'Details for expense account ":name"',
'details_for_revenue' => 'Details for revenue account ":name"', 'details_for_revenue' => 'Details for revenue account ":name"',
'details_for_cash' => 'Details for cash account ":name"', 'details_for_cash' => 'Details for cash account ":name"',
'store_new_asset_account' => 'Store new asset account', 'store_new_asset_account' => 'Store new asset account',
'store_new_expense_account' => 'Store new expense account', 'store_new_expense_account' => 'Store new expense account',
'store_new_revenue_account' => 'Store new revenue account', 'store_new_revenue_account' => 'Store new revenue account',
'edit_asset_account' => 'Edit asset account ":name"', 'edit_asset_account' => 'Edit asset account ":name"',
'edit_expense_account' => 'Edit expense account ":name"', 'edit_expense_account' => 'Edit expense account ":name"',
'edit_revenue_account' => 'Edit revenue account ":name"', 'edit_revenue_account' => 'Edit revenue account ":name"',
'delete_asset_account' => 'Delete asset account ":name"', 'delete_asset_account' => 'Delete asset account ":name"',
'delete_expense_account' => 'Delete expense account ":name"', 'delete_expense_account' => 'Delete expense account ":name"',
'delete_revenue_account' => 'Delete revenue account ":name"', 'delete_revenue_account' => 'Delete revenue account ":name"',
'asset_deleted' => 'Successfully deleted asset account ":name"', 'asset_deleted' => 'Successfully deleted asset account ":name"',
'expense_deleted' => 'Successfully deleted expense account ":name"', 'expense_deleted' => 'Successfully deleted expense account ":name"',
'revenue_deleted' => 'Successfully deleted revenue account ":name"', 'revenue_deleted' => 'Successfully deleted revenue account ":name"',
'update_asset_account' => 'Update asset account', 'update_asset_account' => 'Update asset account',
'update_expense_account' => 'Update expense account', 'update_expense_account' => 'Update expense account',
'update_revenue_account' => 'Update revenue account', 'update_revenue_account' => 'Update revenue account',
'make_new_asset_account' => 'Create a new asset account', 'make_new_asset_account' => 'Create a new asset account',
'make_new_expense_account' => 'Create a new expense account', 'make_new_expense_account' => 'Create a new expense account',
'make_new_revenue_account' => 'Create a new revenue account', 'make_new_revenue_account' => 'Create a new revenue account',
'asset_accounts' => 'Asset accounts', 'asset_accounts' => 'Asset accounts',
'expense_accounts' => 'Expense accounts', 'expense_accounts' => 'Expense accounts',
'revenue_accounts' => 'Revenue accounts', 'revenue_accounts' => 'Revenue accounts',
'accountExtraHelp_asset' => '', 'accountExtraHelp_asset' => '',
'accountExtraHelp_expense' => '', 'accountExtraHelp_expense' => '',
'accountExtraHelp_revenue' => '', 'accountExtraHelp_revenue' => '',
'account_type' => 'Account type', 'account_type' => 'Account type',
// categories: // categories:
'new_category' => 'New category', 'new_category' => 'New category',
'create_new_category' => 'Create a new category', 'create_new_category' => 'Create a new category',
'without_category' => 'Without a category', 'without_category' => 'Without a category',
'update_category' => 'Wijzig categorie', 'update_category' => 'Wijzig categorie',
'categories' => 'Categories', 'categories' => 'Categories',
'edit_category' => 'Edit category ":name"', 'edit_category' => 'Edit category ":name"',
'no_category' => '(no category)', 'no_category' => '(no category)',
'category' => 'Category', 'category' => 'Category',
'delete_category' => 'Delete category ":name"', 'delete_category' => 'Delete category ":name"',
// transactions: // transactions:
'update_withdrawal' => 'Update withdrawal', 'update_withdrawal' => 'Update withdrawal',
'update_deposit' => 'Update deposit', 'update_deposit' => 'Update deposit',
'update_transfer' => 'Update transfer', 'update_transfer' => 'Update transfer',
'delete_withdrawal' => 'Delete withdrawal ":description"', 'delete_withdrawal' => 'Delete withdrawal ":description"',
'delete_deposit' => 'Delete deposit ":description"', 'delete_deposit' => 'Delete deposit ":description"',
'delete_transfer' => 'Delete transfer ":description"', 'delete_transfer' => 'Delete transfer ":description"',
// new user: // new user:
'welcome' => 'Welcome to Firefly!', 'welcome' => 'Welcome to Firefly!',
'createNewAsset' => 'Create a new asset account to get started. ' . 'createNewAsset' => 'Create a new asset account to get started. ' .
'This will allow you to create transactions and start your financial management', 'This will allow you to create transactions and start your financial management',
'createNewAssetButton' => 'Create new asset account', 'createNewAssetButton' => 'Create new asset account',
// home page: // home page:
'yourAccounts' => 'Your accounts', 'yourAccounts' => 'Your accounts',
'budgetsAndSpending' => 'Budgets and spending', 'budgetsAndSpending' => 'Budgets and spending',
'savings' => 'Savings', 'savings' => 'Savings',
'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel',
'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'createPiggyToContinue' => 'Create piggy banks to fill this panel.',
'newWithdrawal' => 'New expense', 'newWithdrawal' => 'New expense',
'newDeposit' => 'New deposit', 'newDeposit' => 'New deposit',
'newTransfer' => 'New transfer', 'newTransfer' => 'New transfer',
'moneyIn' => 'Money in', 'moneyIn' => 'Money in',
'moneyOut' => 'Money out', 'moneyOut' => 'Money out',
'billsToPay' => 'Bills to pay', 'billsToPay' => 'Bills to pay',
'billsPaid' => 'Bills paid', 'billsPaid' => 'Bills paid',
'viewDetails' => 'View details', 'viewDetails' => 'View details',
'divided' => 'divided', 'divided' => 'divided',
'toDivide' => 'left to divide', 'toDivide' => 'left to divide',
// menu and titles, should be recycled as often as possible: // menu and titles, should be recycled as often as possible:
'toggleNavigation' => 'Toggle navigation', 'toggleNavigation' => 'Toggle navigation',
'currency' => 'Currency', 'currency' => 'Currency',
'preferences' => 'Preferences', 'preferences' => 'Preferences',
'logout' => 'Logout', 'logout' => 'Logout',
'searchPlaceholder' => 'Search...', 'searchPlaceholder' => 'Search...',
'dashboard' => 'Dashboard', 'dashboard' => 'Dashboard',
'currencies' => 'Currencies', 'currencies' => 'Currencies',
'accounts' => 'Accounts', 'accounts' => 'Accounts',
'Asset account' => 'Asset account', 'Asset account' => 'Asset account',
'Default account' => 'Asset account', 'Default account' => 'Asset account',
'Expense account' => 'Expense account', 'Expense account' => 'Expense account',
'Revenue account' => 'Revenue account', 'Revenue account' => 'Revenue account',
'budgets' => 'Budgets', 'budgets' => 'Budgets',
'tags' => 'Tags', 'tags' => 'Tags',
'reports' => 'Reports', 'reports' => 'Reports',
'transactions' => 'Transactions', 'transactions' => 'Transactions',
'expenses' => 'Expenses', 'expenses' => 'Expenses',
'income' => 'Revenue / income', 'income' => 'Revenue / income',
'transfers' => 'Transfers', 'transfers' => 'Transfers',
'moneyManagement' => 'Money management', 'moneyManagement' => 'Money management',
'piggyBanks' => 'Piggy banks', 'piggyBanks' => 'Piggy banks',
'bills' => 'Bills', 'bills' => 'Bills',
'createNew' => 'Create new', 'createNew' => 'Create new',
'withdrawal' => 'Withdrawal', 'withdrawal' => 'Withdrawal',
'deposit' => 'Deposit', 'deposit' => 'Deposit',
'account' => 'Account', 'account' => 'Account',
'transfer' => 'Transfer', 'transfer' => 'Transfer',
'Withdrawal' => 'Withdrawal', 'Withdrawal' => 'Withdrawal',
'Deposit' => 'Deposit', 'Deposit' => 'Deposit',
'Transfer' => 'Transfer', 'Transfer' => 'Transfer',
'bill' => 'Bill', 'bill' => 'Bill',
'yes' => 'Yes', 'yes' => 'Yes',
'no' => 'No', 'no' => 'No',
'amount' => 'Amount', 'amount' => 'Amount',
'newBalance' => 'New balance', 'newBalance' => 'New balance',
'overview' => 'Overview', 'overview' => 'Overview',
'saveOnAccount' => 'Save on account', 'saveOnAccount' => 'Save on account',
'unknown' => 'Unknown', 'unknown' => 'Unknown',
'daily' => 'Daily', 'daily' => 'Daily',
'weekly' => 'Weekly', 'weekly' => 'Weekly',
'monthly' => 'Monthly', 'monthly' => 'Monthly',
'quarterly' => 'Quarterly', 'quarterly' => 'Quarterly',
'half-year' => 'Every six months', 'half-year' => 'Every six months',
'yearly' => 'Yearly', 'yearly' => 'Yearly',
// reports: // reports:
'reportForYear' => 'Yearly report for :year', 'reportForYear' => 'Yearly report for :year',
'reportForYearShared' => 'Yearly report for :year (including shared accounts)', 'reportForYearShared' => 'Yearly report for :year (including shared accounts)',
'reportForMonth' => 'Montly report for :month', 'reportForMonth' => 'Montly report for :month',
'reportForMonthShared' => 'Montly report for :month (including shared accounts)', 'reportForMonthShared' => 'Montly report for :month (including shared accounts)',
'incomeVsExpenses' => 'Income vs. expenses', 'incomeVsExpenses' => 'Income vs. expenses',
'accountBalances' => 'Account balances', 'accountBalances' => 'Account balances',
'balanceStartOfYear' => 'Balance at start of year', 'balanceStartOfYear' => 'Balance at start of year',
'balanceEndOfYear' => 'Balance at end of year', 'balanceEndOfYear' => 'Balance at end of year',
'balanceStartOfMonth' => 'Balance at start of month', 'balanceStartOfMonth' => 'Balance at start of month',
'balanceEndOfMonth' => 'Balance at end of month', 'balanceEndOfMonth' => 'Balance at end of month',
'balanceStart' => 'Balance at start of period', 'balanceStart' => 'Balance at start of period',
'balanceEnd' => 'Balance at end of period', 'balanceEnd' => 'Balance at end of period',
'reportsOwnAccounts' => 'Reports for your own accounts', 'reportsOwnAccounts' => 'Reports for your own accounts',
'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts',
'splitByAccount' => 'Split by account', 'splitByAccount' => 'Split by account',
'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'balancedByTransfersAndTags' => 'Balanced by transfers and tags',
'coveredWithTags' => 'Covered with tags', 'coveredWithTags' => 'Covered with tags',
'leftUnbalanced' => 'Left unbalanced', 'leftUnbalanced' => 'Left unbalanced',
'expectedBalance' => 'Expected balance', 'expectedBalance' => 'Expected balance',
'outsideOfBudgets' => 'Outside of budgets', 'outsideOfBudgets' => 'Outside of budgets',
'leftInBudget' => 'Left in budget', 'leftInBudget' => 'Left in budget',
'sumOfSums' => 'Sum of sums', 'sumOfSums' => 'Sum of sums',
'notCharged' => 'Not charged (yet)', 'notCharged' => 'Not charged (yet)',
'inactive' => 'Inactive', 'inactive' => 'Inactive',
'difference' => 'Difference', 'difference' => 'Difference',
'in' => 'In', 'in' => 'In',
'out' => 'Out', 'out' => 'Out',
'topX' => 'top :number', 'topX' => 'top :number',
'showTheRest' => 'Show everything', 'showTheRest' => 'Show everything',
'hideTheRest' => 'Show only the top :number', 'hideTheRest' => 'Show only the top :number',
// charts: // charts:
'dayOfMonth' => 'Day of the month', 'dayOfMonth' => 'Day of the month',
'month' => 'Month', 'month' => 'Month',
'budget' => 'Budget', 'budget' => 'Budget',
'spent' => 'Spent', 'spent' => 'Spent',
'overspent' => 'Overspent', 'overspent' => 'Overspent',
'left' => 'Left', 'left' => 'Left',
'noBudget' => '(no budget)', 'noBudget' => '(no budget)',
'maxAmount' => 'Maximum amount', 'maxAmount' => 'Maximum amount',
'minAmount' => 'Minumum amount', 'minAmount' => 'Minumum amount',
'billEntry' => 'Current bill entry', 'billEntry' => 'Current bill entry',
'name' => 'Name', 'name' => 'Name',
'date' => 'Date', 'date' => 'Date',
'paid' => 'Paid', 'paid' => 'Paid',
'unpaid' => 'Unpaid', 'unpaid' => 'Unpaid',
'day' => 'Day', 'day' => 'Day',
'budgeted' => 'Budgeted', 'budgeted' => 'Budgeted',
'period' => 'Period', 'period' => 'Period',
'balance' => 'Balance', 'balance' => 'Balance',
'summary' => 'Summary', 'summary' => 'Summary',
'sum' => 'Sum', 'sum' => 'Sum',
'average' => 'Average', 'average' => 'Average',
'balanceFor' => 'Balance for :name', 'balanceFor' => 'Balance for :name',
// piggy banks: // piggy banks:
'piggy_bank' => 'Piggy bank', 'piggy_bank' => 'Piggy bank',
'new_piggy_bank' => 'Create new piggy bank', 'new_piggy_bank' => 'Create new piggy bank',
'create_new_piggybank' => 'Create new piggy bank', 'create_new_piggybank' => 'Create new piggy bank',
'account_status' => 'Account status', 'account_status' => 'Account status',
'left_for_piggy_banks' => 'Left for piggy banks', 'left_for_piggy_banks' => 'Left for piggy banks',
'sum_of_piggy_banks' => 'Sum of piggy banks', 'sum_of_piggy_banks' => 'Sum of piggy banks',
'saved_so_far' => 'Saved so far', 'saved_so_far' => 'Saved so far',
'left_to_save' => 'Left to save', 'left_to_save' => 'Left to save',
'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"',
'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
'add' => 'Add', 'add' => 'Add',
'remove' => 'Remove', 'remove' => 'Remove',
'max_amount_add' => 'The maximum amount you can add is', 'max_amount_add' => 'The maximum amount you can add is',
'max_amount_remove' => 'The maximum amount you can remove is', 'max_amount_remove' => 'The maximum amount you can remove is',
'update_piggy_button' => 'Update piggy bank', 'update_piggy_button' => 'Update piggy bank',
'update_piggy_title' => 'Update piggy bank ":name"', 'update_piggy_title' => 'Update piggy bank ":name"',
'details' => 'Details', 'details' => 'Details',
'events' => 'Events', 'events' => 'Events',
'target_amount' => 'Target amount', 'target_amount' => 'Target amount',
'start_date' => 'Start date', 'start_date' => 'Start date',
'target_date' => 'Target date', 'target_date' => 'Target date',
'no_target_date' => 'No target date', 'no_target_date' => 'No target date',
'todo' => 'to do', 'todo' => 'to do',
'table' => 'Table', 'table' => 'Table',
'piggy_bank_not_exists' => 'Piggy bank no longer exists.', 'piggy_bank_not_exists' => 'Piggy bank no longer exists.',
'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.',
'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date',
'delete_piggy_bank' => 'Delete piggy bank ":name"', 'delete_piggy_bank' => 'Delete piggy bank ":name"',
// tags // tags
'delete_tag' => 'Delete tag ":name"', 'delete_tag' => 'Delete tag ":name"',
'new_tag' => 'Make new tag', 'new_tag' => 'Make new tag',
'edit_tag' => 'Edit tag ":tag"', 'edit_tag' => 'Edit tag ":tag"',
'no_year' => 'No year set', 'no_year' => 'No year set',
'no_month' => 'No month set', 'no_month' => 'No month set',
'tag_title_nothing' => 'Default tags', 'tag_title_nothing' => 'Default tags',
'tag_title_balancingAct' => 'Balancing act tags', 'tag_title_balancingAct' => 'Balancing act tags',
'tag_title_advancePayment' => 'Advance payment tags', 'tag_title_advancePayment' => 'Advance payment tags',
]; ];

View File

@@ -45,11 +45,12 @@ return [
'under' => 'Under', 'under' => 'Under',
'symbol' => 'Symbol', 'symbol' => 'Symbol',
'code' => 'Code', 'code' => 'Code',
'iban' => 'IBAN', 'iban' => 'IBAN',
'csv' => 'CSV file', 'csv' => 'CSV file',
'has_headers' => 'Headers', 'has_headers' => 'Headers',
'date_format' => 'Date format', 'date_format' => 'Date format',
'csv_config' => 'CSV import configuration', 'csv_config' => 'CSV import configuration',
'specifix' => 'Bank- or file specific fixes',
'store_new_withdrawal' => 'Store new withdrawal', 'store_new_withdrawal' => 'Store new withdrawal',
'store_new_deposit' => 'Store new deposit', 'store_new_deposit' => 'Store new deposit',

View File

@@ -100,6 +100,8 @@ return [
'csv_process_text' => ':rows rijen zijn verwerkt.', 'csv_process_text' => ':rows rijen zijn verwerkt.',
'csv_import_with_errors' => 'Er was één fout. Deze foutmelding is mogelijk in het Engels.|Er zijn :errors fouten opgetreden. De foutmeldingen' 'csv_import_with_errors' => 'Er was één fout. Deze foutmelding is mogelijk in het Engels.|Er zijn :errors fouten opgetreden. De foutmeldingen'
. ' zijn mogelijk in het Engels.', . ' zijn mogelijk in het Engels.',
'csv_specifix_RabobankDescription' => 'Vink dit aan als je Rabobank bestanden importeert.',
'csv_specifix_Dummy' => 'Dit vinkje doet niks (dummy).',
// create new stuff: // create new stuff:
'create_new_withdrawal' => 'Nieuwe uitgave', 'create_new_withdrawal' => 'Nieuwe uitgave',
'create_new_deposit' => 'Nieuwe inkomsten', 'create_new_deposit' => 'Nieuwe inkomsten',

View File

@@ -50,6 +50,7 @@ return [
'has_headers' => 'Kolomnamen op de eerste rij?', 'has_headers' => 'Kolomnamen op de eerste rij?',
'date_format' => 'Datumformaat', 'date_format' => 'Datumformaat',
'csv_config' => 'Configuratiebestand', 'csv_config' => 'Configuratiebestand',
'specifix' => 'Bank- or of bestandsspecifieke opties',
'store_new_withdrawal' => 'Nieuwe uitgave opslaan', 'store_new_withdrawal' => 'Nieuwe uitgave opslaan',
'store_new_deposit' => 'Nieuwe inkomsten opslaan', 'store_new_deposit' => 'Nieuwe inkomsten opslaan',

View File

@@ -61,7 +61,7 @@
{{ ExpandedForm.file('csv_config',{helpText: 'csv_csv_config_file_help'|_}) }} {{ ExpandedForm.file('csv_config',{helpText: 'csv_csv_config_file_help'|_}) }}
<!-- ExpandedForm.multiCheckbox('specifix',Config.get('csv.specifix')) --> {{ ExpandedForm.multiCheckbox('specifix', specifix) }}
{% if not uploadPossible %} {% if not uploadPossible %}
<div class="form-group" id="csv_holder"> <div class="form-group" id="csv_holder">

View File

@@ -0,0 +1,17 @@
<div class="{{ classes }}" id="{{ name }}_holder">
<label for="{{ options.id }}" class="col-sm-4 control-label">{{ label }}</label>
<div class="col-sm-8">
{% for value,description in list %}
<div class="checkbox">
<label>
{{ Form.checkbox(name~'[]', value, (selected == value), options) }}
{{ description }}
</label>
</div>
{% endfor %}
{% include 'form/help.twig' %}
{% include 'form/feedback.twig' %}
</div>
</div>