From 61188623d4447c57fbaa595de9b3e2cca7233fda Mon Sep 17 00:00:00 2001 From: ridgarou Date: Fri, 22 Jan 2016 00:56:48 +0100 Subject: [PATCH 01/99] Update texts.php Se cambia "'tax' => 'IVA'," por "'tax' => 'Impuesto'," ya que este literal se usa para mas impuestos aparte del IVA --- resources/lang/es_ES/texts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/es_ES/texts.php b/resources/lang/es_ES/texts.php index 38892866d6b8..7918688a5f44 100644 --- a/resources/lang/es_ES/texts.php +++ b/resources/lang/es_ES/texts.php @@ -38,7 +38,7 @@ return array( 'frequency_id' => 'Frecuencia', 'discount' => 'Descuento', 'taxes' => 'Impuestos', - 'tax' => 'IVA', + 'tax' => 'Impuesto', 'item' => 'Concepto', 'description' => 'Descripción', 'unit_cost' => 'Coste unitario', From a5e08b3ab43f19e096adde4f3e6e7720409901e0 Mon Sep 17 00:00:00 2001 From: ridgarou Date: Fri, 22 Jan 2016 01:07:24 +0100 Subject: [PATCH 02/99] Update knockout.blade.php Contabilizar correctamente Impuestos Negativos en el total de la Factura --- resources/views/invoices/knockout.blade.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/resources/views/invoices/knockout.blade.php b/resources/views/invoices/knockout.blade.php index 24138c1af378..d9aec7fea5be 100644 --- a/resources/views/invoices/knockout.blade.php +++ b/resources/views/invoices/knockout.blade.php @@ -388,12 +388,14 @@ function InvoiceModel(data) { } var taxRate = parseFloat(self.tax_rate()); - if (taxRate > 0) { - var tax = roundToTwo(total * (taxRate/100)); - return self.formatMoney(tax); - } else { - return self.formatMoney(0); - } + //if (taxRate > 0) { + // var tax = roundToTwo(total * (taxRate/100)); + // return self.formatMoney(tax); + //} else { + // return self.formatMoney(0); + //} + var tax = roundToTwo(total * (taxRate/100)); + return self.formatMoney(tax); }); self.totals.itemTaxes = ko.computed(function() { @@ -482,9 +484,10 @@ function InvoiceModel(data) { } var taxRate = parseFloat(self.tax_rate()); - if (taxRate > 0) { - total = NINJA.parseFloat(total) + roundToTwo((total * (taxRate/100))); - } + //if (taxRate > 0) { + // total = NINJA.parseFloat(total) + roundToTwo((total * (taxRate/100))); + //} + total = NINJA.parseFloat(total) + roundToTwo((total * (taxRate/100))); var taxes = self.totals.itemTaxes(); for (var key in taxes) { From 0d2025c834665bfba2f23ba857a0c32878ea5601 Mon Sep 17 00:00:00 2001 From: Laurynas Sakalauskas Date: Fri, 22 Jan 2016 10:33:38 +0000 Subject: [PATCH 03/99] Fixed ping route & added a way to find client by email address or if not exist - create a new --- app/Http/Controllers/ClientApiController.php | 17 +++++++++++++++-- app/Http/routes.php | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index bbe0f9fde298..816ce9b9eaa7 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -82,8 +82,21 @@ class ClientApiController extends BaseAPIController */ public function store(CreateClientRequest $request) { - $client = $this->clientRepo->save($request->input()); - + if ($request->has('filter_by_email')) { + + $email = $request->get('filter_by_email'); + $client = Client::whereHas('contacts', function ($query) use ($email) { + $query->where('email', $email); + })->with('contacts')->first(); + + if (is_null($client)) { + $client = $this->clientRepo->save($request->input()); + } + + } else { + $client = $this->clientRepo->save($request->input()); + } + $client = Client::scope($client->public_id) ->with('country', 'contacts', 'industry', 'size', 'currency') ->first(); diff --git a/app/Http/routes.php b/app/Http/routes.php index e0ded5dd46e3..4bd84629f0c6 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -209,7 +209,7 @@ Route::group(['middleware' => 'auth'], function() { // Route groups for API Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() { - Route::resource('ping', 'ClientApiController@ping'); + Route::get('ping', 'ClientApiController@ping'); Route::post('login', 'AccountApiController@login'); Route::get('static', 'AccountApiController@getStaticData'); Route::get('accounts', 'AccountApiController@show'); From c7b8f39e9fa0df580d6aa709133fca1ab7f70206 Mon Sep 17 00:00:00 2001 From: Hanne Nijhuis Date: Sat, 23 Jan 2016 12:20:50 +0100 Subject: [PATCH 04/99] Fixed typo in migration vendors table --- database/migrations/2016_01_04_175228_create_vendors_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2016_01_04_175228_create_vendors_table.php b/database/migrations/2016_01_04_175228_create_vendors_table.php index 8bc26c59efd4..252463266214 100644 --- a/database/migrations/2016_01_04_175228_create_vendors_table.php +++ b/database/migrations/2016_01_04_175228_create_vendors_table.php @@ -112,7 +112,7 @@ class CreateVendorsTable extends Migration $i = 1; foreach ($paymentTerms as $pTerm) { $data = ['public_id' => $i++]; - DB::table('paymet_terms')->where('id', $pTerm->id)->update($data); + DB::table('payment_terms')->where('id', $pTerm->id)->update($data); } Schema::table('invoices', function (Blueprint $table) { From 91187eb06d14df91e5a09c015b0025e0a8d6e51f Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sat, 23 Jan 2016 20:36:11 +0200 Subject: [PATCH 05/99] Bug fixes --- app/Models/Account.php | 2 +- app/Services/ExpenseService.php | 1 + .../migrations/2016_01_04_175228_create_vendors_table.php | 5 ++--- database/seeds/PaymentLibrariesSeeder.php | 1 + resources/lang/en/texts.php | 2 +- resources/views/expenses/edit.blade.php | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Models/Account.php b/app/Models/Account.php index 08c10017c0a0..9af3350dd094 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -26,7 +26,7 @@ class Account extends Eloquent ACCOUNT_USER_DETAILS, ACCOUNT_LOCALIZATION, ACCOUNT_PAYMENTS, - ACCOUNT_BANKS, + //ACCOUNT_BANKS, ACCOUNT_TAX_RATES, ACCOUNT_PRODUCTS, ACCOUNT_NOTIFICATIONS, diff --git a/app/Services/ExpenseService.php b/app/Services/ExpenseService.php index 92a2a048c14f..4680bfc0fedd 100644 --- a/app/Services/ExpenseService.php +++ b/app/Services/ExpenseService.php @@ -69,6 +69,7 @@ class ExpenseService extends BaseService [ 'amount', function ($model) { + // show both the amount and the converted amount $str = Utils::formatMoney($model->amount, $model->account_currency_id, $model->account_country_id, true); if ($model->exchange_rate != 1) { $str .= ' | ' . Utils::formatMoney(round($model->amount * $model->exchange_rate,2), $model->currency_id, $model->client_country_id, true); diff --git a/database/migrations/2016_01_04_175228_create_vendors_table.php b/database/migrations/2016_01_04_175228_create_vendors_table.php index 252463266214..b1e3f7b4e8c4 100644 --- a/database/migrations/2016_01_04_175228_create_vendors_table.php +++ b/database/migrations/2016_01_04_175228_create_vendors_table.php @@ -96,12 +96,11 @@ class CreateVendorsTable extends Migration $table->softDeletes(); $table->unsignedInteger('user_id'); $table->unsignedInteger('account_id'); + $table->unsignedInteger('public_id')->index(); //$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade'); //$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - - $table->unsignedInteger('public_id')->index(); - $table->unique(array('account_id', 'public_id')); + //$table->unique(array('account_id', 'public_id')); }); // Update public id diff --git a/database/seeds/PaymentLibrariesSeeder.php b/database/seeds/PaymentLibrariesSeeder.php index b34d7182492e..7fd66881ba05 100644 --- a/database/seeds/PaymentLibrariesSeeder.php +++ b/database/seeds/PaymentLibrariesSeeder.php @@ -125,6 +125,7 @@ class PaymentLibrariesSeeder extends Seeder ['name' => 'Ghanaian Cedi', 'code' => 'GHS', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['name' => 'Bulgarian Lev', 'code' => 'BGN', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'], ['name' => 'Aruban Florin', 'code' => 'AWG', 'symbol' => 'Afl. ', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'], + ['name' => 'Turkish Lira', 'code' => 'TRY', 'symbol' => 'TL ', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','], ]; foreach ($currencies as $currency) { diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index b2d035a0c4d2..be6ce2cc9d4b 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1037,7 +1037,7 @@ return array( 'expense_date' => 'Expense Date', 'expense_should_be_invoiced' => 'Should this expense be invoiced?', 'public_notes' => 'Public Notes', - 'converted_amount' => 'Converted Amount', + 'invoice_amount' => 'Invoice Amount', 'exchange_rate' => 'Exchange Rate', 'yes' => 'Yes', 'no' => 'No', diff --git a/resources/views/expenses/edit.blade.php b/resources/views/expenses/edit.blade.php index 8071c0b44ef6..949e9b73ebe4 100644 --- a/resources/views/expenses/edit.blade.php +++ b/resources/views/expenses/edit.blade.php @@ -68,7 +68,7 @@ {!! Former::text('exchange_rate') ->data_bind("value: exchange_rate, enable: enableExchangeRate, valueUpdate: 'afterkeydown'") !!} - {!! Former::text('converted_amount') + {!! Former::text('invoice_amount') ->addGroupClass('converted-amount') ->data_bind("value: convertedAmount, enable: enableExchangeRate") ->append('') !!} From ccbdb68bb14ea6692627b3aadc52b00720057103 Mon Sep 17 00:00:00 2001 From: Hanne Nijhuis Date: Sat, 23 Jan 2016 22:05:43 +0100 Subject: [PATCH 06/99] Fixed the vendors migration error dealing with unique values --- .../migrations/2016_01_04_175228_create_vendors_table.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/migrations/2016_01_04_175228_create_vendors_table.php b/database/migrations/2016_01_04_175228_create_vendors_table.php index b1e3f7b4e8c4..1295748b0801 100644 --- a/database/migrations/2016_01_04_175228_create_vendors_table.php +++ b/database/migrations/2016_01_04_175228_create_vendors_table.php @@ -117,6 +117,10 @@ class CreateVendorsTable extends Migration Schema::table('invoices', function (Blueprint $table) { $table->boolean('has_expenses')->default(false); }); + + Schema::table('payment_terms', function (Blueprint $table) { + $table->unique(array('account_id', 'public_id')); + }); } /** From 74a3dcf9d25eaaca336c7edd1812d0e1084b1015 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sat, 23 Jan 2016 23:36:31 +0200 Subject: [PATCH 07/99] Working on expenses --- app/Http/Controllers/ExpenseController.php | 1 + app/Ninja/Repositories/ExpenseRepository.php | 24 +++++++++++++++++--- app/Ninja/Repositories/TaskRepository.php | 18 ++++++++++++++- app/Services/ExpenseService.php | 21 +++++++++++++---- resources/lang/en/texts.php | 2 +- resources/views/list.blade.php | 6 +++-- 6 files changed, 60 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index 25f78be2d361..c3dc77b23ec2 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -48,6 +48,7 @@ class ExpenseController extends BaseController 'columns' => Utils::trans([ 'checkbox', 'vendor', + 'client', 'expense_date', 'amount', 'public_notes', diff --git a/app/Ninja/Repositories/ExpenseRepository.php b/app/Ninja/Repositories/ExpenseRepository.php index 8b47a48e5aff..3c65f1c2520b 100644 --- a/app/Ninja/Repositories/ExpenseRepository.php +++ b/app/Ninja/Repositories/ExpenseRepository.php @@ -51,10 +51,19 @@ class ExpenseRepository extends BaseRepository $query = DB::table('expenses') ->join('accounts', 'accounts.id', '=', 'expenses.account_id') ->leftjoin('clients', 'clients.id', '=', 'expenses.client_id') + ->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id') ->leftjoin('vendors', 'vendors.id', '=', 'expenses.vendor_id') ->leftJoin('invoices', 'invoices.id', '=', 'expenses.invoice_id') ->where('expenses.account_id', '=', $accountid) - ->select('expenses.account_id', + ->where('contacts.deleted_at', '=', null) + ->where('vendors.deleted_at', '=', null) + ->where('clients.deleted_at', '=', null) + ->where(function ($query) { + $query->where('contacts.is_primary', '=', true) + ->orWhere('contacts.is_primary', '=', null); + }) + ->select( + 'expenses.account_id', 'expenses.amount', 'expenses.currency_id', 'expenses.deleted_at', @@ -69,10 +78,15 @@ class ExpenseRepository extends BaseRepository 'expenses.should_be_invoiced', 'expenses.vendor_id', 'invoices.public_id as invoice_public_id', - 'vendors.name as vendor_name', - 'vendors.public_id as vendor_public_id', 'accounts.country_id as account_country_id', 'accounts.currency_id as account_currency_id', + 'vendors.name as vendor_name', + 'vendors.public_id as vendor_public_id', + 'clients.name as client_name', + 'clients.public_id as client_public_id', + 'contacts.first_name', + 'contacts.email', + 'contacts.last_name', 'clients.country_id as client_country_id' ); @@ -109,6 +123,10 @@ class ExpenseRepository extends BaseRepository $expense->public_notes = trim($input['public_notes']); $expense->should_be_invoiced = isset($input['should_be_invoiced']) || $expense->client_id ? true : false; + if (! $expense->currency_id) { + $expense->currency_id = \Auth::user()->account->getCurrencyId(); + } + $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1; $expense->exchange_rate = round($rate, 4); $expense->amount = round(Utils::parseFloat($input['amount']), 2); diff --git a/app/Ninja/Repositories/TaskRepository.php b/app/Ninja/Repositories/TaskRepository.php index f6a13c527000..47a052378ff1 100644 --- a/app/Ninja/Repositories/TaskRepository.php +++ b/app/Ninja/Repositories/TaskRepository.php @@ -23,7 +23,23 @@ class TaskRepository }) ->where('contacts.deleted_at', '=', null) ->where('clients.deleted_at', '=', null) - ->select('tasks.public_id', 'clients.name as client_name', 'clients.public_id as client_public_id', 'contacts.first_name', 'contacts.email', 'contacts.last_name', 'invoices.invoice_status_id', 'tasks.description', 'tasks.is_deleted', 'tasks.deleted_at', 'invoices.invoice_number', 'invoices.public_id as invoice_public_id', 'tasks.is_running', 'tasks.time_log', 'tasks.created_at'); + ->select( + 'tasks.public_id', + 'clients.name as client_name', + 'clients.public_id as client_public_id', + 'contacts.first_name', + 'contacts.email', + 'contacts.last_name', + 'invoices.invoice_status_id', + 'tasks.description', + 'tasks.is_deleted', + 'tasks.deleted_at', + 'invoices.invoice_number', + 'invoices.public_id as invoice_public_id', + 'tasks.is_running', + 'tasks.time_log', + 'tasks.created_at' + ); if ($clientPublicId) { $query->where('clients.public_id', '=', $clientPublicId); diff --git a/app/Services/ExpenseService.php b/app/Services/ExpenseService.php index 4680bfc0fedd..7df356931470 100644 --- a/app/Services/ExpenseService.php +++ b/app/Services/ExpenseService.php @@ -53,26 +53,37 @@ class ExpenseService extends BaseService 'vendor_name', function ($model) { - if($model->vendor_public_id) { + if ($model->vendor_public_id) { return link_to("vendors/{$model->vendor_public_id}", $model->vendor_name); } else { - return 'No vendor' ; + return ''; + } + } + ], + [ + 'client_name', + function ($model) + { + if ($model->client_public_id) { + return link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model)); + } else { + return ''; } } ], [ 'expense_date', function ($model) { - return Utils::fromSqlDate($model->expense_date); + return link_to("expenses/{$model->public_id}/edit", Utils::fromSqlDate($model->expense_date)); } ], [ 'amount', function ($model) { // show both the amount and the converted amount - $str = Utils::formatMoney($model->amount, $model->account_currency_id, $model->account_country_id, true); + $str = Utils::formatMoney($model->amount, $model->account_currency_id, $model->account_country_id); if ($model->exchange_rate != 1) { - $str .= ' | ' . Utils::formatMoney(round($model->amount * $model->exchange_rate,2), $model->currency_id, $model->client_country_id, true); + $str .= ' | ' . Utils::formatMoney(round($model->amount * $model->exchange_rate,2), $model->currency_id, $model->client_country_id); } return $str; } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index be6ce2cc9d4b..067edccbeac2 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1054,7 +1054,7 @@ return array( 'restore_expense' => 'Restore Expense', 'invoice_expense' => 'Invoice Expense', 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', - 'expense_error_invoiced' => 'Expense have already been invoiced', + 'expense_error_invoiced' => 'Expense has already been invoiced', 'convert_currency' => 'Convert currency', // Payment terms diff --git a/resources/views/list.blade.php b/resources/views/list.blade.php index 222090ab1a79..d7b298957cc3 100644 --- a/resources/views/list.blade.php +++ b/resources/views/list.blade.php @@ -29,10 +29,12 @@
- @if (Auth::user()->isPro() && $entityType == ENTITY_INVOICE) + @if (Auth::user()->isPro() && $entityType == ENTITY_INVOICE) {!! Button::normal(trans('texts.quotes'))->asLinkTo(URL::to('/quotes'))->appendIcon(Icon::create('list')) !!} {!! Button::normal(trans('texts.recurring'))->asLinkTo(URL::to('/recurring_invoices'))->appendIcon(Icon::create('list')) !!} - @elseif ($entityType == ENTITY_CLIENT) + @elseif ($entityType == ENTITY_EXPENSE) + {!! Button::normal(trans('texts.vendors'))->asLinkTo(URL::to('/vendors'))->appendIcon(Icon::create('list')) !!} + @elseif ($entityType == ENTITY_CLIENT) {!! Button::normal(trans('texts.credits'))->asLinkTo(URL::to('/credits'))->appendIcon(Icon::create('list')) !!} @endif From c96c91ec8818c00c8bee01aa0e9fb05fa93ad4f3 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 24 Jan 2016 09:21:20 +0200 Subject: [PATCH 08/99] Fix for #647 --- .../2016_01_17_155725_add_quote_to_invoice_option.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/database/migrations/2016_01_17_155725_add_quote_to_invoice_option.php b/database/migrations/2016_01_17_155725_add_quote_to_invoice_option.php index f3183ad8f2b5..2a9b420f6aa3 100644 --- a/database/migrations/2016_01_17_155725_add_quote_to_invoice_option.php +++ b/database/migrations/2016_01_17_155725_add_quote_to_invoice_option.php @@ -18,10 +18,12 @@ class AddQuoteToInvoiceOption extends Migration }); // we need to create the last status to resolve a foreign key constraint - DB::table('invoice_statuses')->insert([ - 'id' => 6, - 'name' => 'Paid' - ]); + if (DB::table('invoice_statuses')->count() == 5) { + DB::table('invoice_statuses')->insert([ + 'id' => 6, + 'name' => 'Paid' + ]); + } DB::table('invoices') ->whereIn('invoice_status_id', [4, 5]) From 68665d2972582978bdea6880f8493656f468514b Mon Sep 17 00:00:00 2001 From: Laurynas Sakalauskas Date: Sun, 24 Jan 2016 16:59:01 +0000 Subject: [PATCH 09/99] Added filtering by email --- app/Http/Controllers/ClientApiController.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index 816ce9b9eaa7..95445be61b9e 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -48,8 +48,19 @@ class ClientApiController extends BaseAPIController { $clients = Client::scope() ->with($this->getIncluded()) - ->orderBy('created_at', 'desc') - ->paginate(); + ->orderBy('created_at', 'desc'); + + // Filter by email + if (Input::has('email')) { + + $email = Input::get('email'); + $clients = $clients->whereHas('contacts', function ($query) use ($email) { + $query->where('email', $email); + }); + + } + + $clients = $clients->paginate(); $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); $paginator = Client::scope()->paginate(); From 2478ec59a4471865b0e2f7c898fa79a792125c7b Mon Sep 17 00:00:00 2001 From: Laurynas Sakalauskas Date: Sun, 24 Jan 2016 17:06:34 +0000 Subject: [PATCH 10/99] Revert store() method --- app/Http/Controllers/ClientApiController.php | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index 95445be61b9e..b94b7479b106 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -93,20 +93,7 @@ class ClientApiController extends BaseAPIController */ public function store(CreateClientRequest $request) { - if ($request->has('filter_by_email')) { - - $email = $request->get('filter_by_email'); - $client = Client::whereHas('contacts', function ($query) use ($email) { - $query->where('email', $email); - })->with('contacts')->first(); - - if (is_null($client)) { - $client = $this->clientRepo->save($request->input()); - } - - } else { - $client = $this->clientRepo->save($request->input()); - } + $client = $this->clientRepo->save($request->input()); $client = Client::scope($client->public_id) ->with('country', 'contacts', 'industry', 'size', 'currency') From 91d44dd301b47cbef447243ec44bc5232fa19d9a Mon Sep 17 00:00:00 2001 From: Laurynas Sakalauskas Date: Sun, 24 Jan 2016 18:37:24 +0000 Subject: [PATCH 11/99] Add ability to include invoice invitations via API --- app/Ninja/Transformers/InvoiceTransformer.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/Ninja/Transformers/InvoiceTransformer.php b/app/Ninja/Transformers/InvoiceTransformer.php index 8108115b2f01..f13b08126070 100644 --- a/app/Ninja/Transformers/InvoiceTransformer.php +++ b/app/Ninja/Transformers/InvoiceTransformer.php @@ -25,12 +25,22 @@ class InvoiceTransformer extends EntityTransformer 'payments' ]; + protected $availableIncludes = [ + 'invitations', + ]; + public function includeInvoiceItems(Invoice $invoice) { $transformer = new InvoiceItemTransformer($this->account, $this->serializer); return $this->includeCollection($invoice->invoice_items, $transformer, ENTITY_INVOICE_ITEMS); } + public function includeInvitations(Invoice $invoice) + { + $transformer = new InvoiceItemTransformer($this->account, $this->serializer); + return $this->includeCollection($invoice->invitations, $transformer, ENTITY_INVITATION); + } + public function includePayments(Invoice $invoice) { $transformer = new PaymentTransformer($this->account, $this->serializer); From cfe183677020da964c0de58bdb01babd532a9f89 Mon Sep 17 00:00:00 2001 From: Laurynas Sakalauskas Date: Sun, 24 Jan 2016 18:55:36 +0000 Subject: [PATCH 12/99] Added invitation transformer --- .../Transformers/InvitationTransformer.php | 21 +++++++++++++++++++ app/Ninja/Transformers/InvoiceTransformer.php | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 app/Ninja/Transformers/InvitationTransformer.php diff --git a/app/Ninja/Transformers/InvitationTransformer.php b/app/Ninja/Transformers/InvitationTransformer.php new file mode 100644 index 000000000000..3fa15eb776c0 --- /dev/null +++ b/app/Ninja/Transformers/InvitationTransformer.php @@ -0,0 +1,21 @@ + (int) $invitation->public_id, + 'key' => $invitation->getName(), + 'status' => $invitation->getStatus(), + 'link' => $invitation->getLink(), + 'sent_date' => $invitation->sent_date, + 'viewed_date' => $invitation->sent_date, + ]; + } +} \ No newline at end of file diff --git a/app/Ninja/Transformers/InvoiceTransformer.php b/app/Ninja/Transformers/InvoiceTransformer.php index f13b08126070..432e65a2876e 100644 --- a/app/Ninja/Transformers/InvoiceTransformer.php +++ b/app/Ninja/Transformers/InvoiceTransformer.php @@ -37,7 +37,7 @@ class InvoiceTransformer extends EntityTransformer public function includeInvitations(Invoice $invoice) { - $transformer = new InvoiceItemTransformer($this->account, $this->serializer); + $transformer = new InvitationTransformer($this->account, $this->serializer); return $this->includeCollection($invoice->invitations, $transformer, ENTITY_INVITATION); } From 7278905bb2858bf13be5251d24c1a49b5388db7a Mon Sep 17 00:00:00 2001 From: trigras Date: Sun, 24 Jan 2016 23:08:27 +0200 Subject: [PATCH 13/99] date picker format fixed --- database/seeds/PaymentLibrariesSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/seeds/PaymentLibrariesSeeder.php b/database/seeds/PaymentLibrariesSeeder.php index 7fd66881ba05..7dd5d126436c 100644 --- a/database/seeds/PaymentLibrariesSeeder.php +++ b/database/seeds/PaymentLibrariesSeeder.php @@ -152,7 +152,7 @@ class PaymentLibrariesSeeder extends Seeder ['format' => 'M j, Y', 'picker_format' => 'M d, yyyy', 'label' => 'Mar 10, 2013'], ['format' => 'F j, Y', 'picker_format' => 'MM d, yyyy', 'label' => 'March 10, 2013'], ['format' => 'D M j, Y', 'picker_format' => 'D MM d, yyyy', 'label' => 'Mon March 10, 2013'], - ['format' => 'Y-M-d', 'picker_format' => 'yyyy-M-dd', 'label' => '2013-03-10'], + ['format' => 'Y-M-d', 'picker_format' => 'yyyy-mm-dd', 'label' => '2013-03-10'], ['format' => 'd-m-Y', 'picker_format' => 'dd-mm-yyyy', 'label' => '20-03-2013'], ['format' => 'm/d/Y', 'picker_format' => 'mm/dd/yyyy', 'label' => '03/20/2013'] ]; From a4df265d09386b4df722d61bcc9c22174a05d390 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 26 Jan 2016 22:36:00 +1100 Subject: [PATCH 14/99] Update client via API --- app/Http/Controllers/ClientApiController.php | 42 +++++++++++++++++++- app/Http/Middleware/VerifyCsrfToken.php | 1 + 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index b94b7479b106..e9f5daf4e07a 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -9,16 +9,20 @@ use App\Ninja\Repositories\ClientRepository; use App\Http\Requests\CreateClientRequest; use App\Http\Controllers\BaseAPIController; use App\Ninja\Transformers\ClientTransformer; +use App\Services\ClientService; +use App\Http\Requests\UpdateClientRequest; class ClientApiController extends BaseAPIController { protected $clientRepo; + protected $clientService; - public function __construct(ClientRepository $clientRepo) + public function __construct(ClientRepository $clientRepo, ClientService $clientService) { parent::__construct(); $this->clientRepo = $clientRepo; + $this->clientService = $clientService; } public function ping() @@ -104,4 +108,40 @@ class ClientApiController extends BaseAPIController return $this->response($data); } + + /** + * @SWG\Putt( + * path="/clients/{client_id}", + * tags={"client"}, + * summary="Update a client", + * @SWG\Parameter( + * in="body", + * name="body", + * @SWG\Schema(ref="#/definitions/Client") + * ), + * @SWG\Response( + * response=200, + * description="Update client", + * @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Client")) + * ), + * @SWG\Response( + * response="default", + * description="an ""unexpected"" error" + * ) + * ) + */ + + public function update(UpdateClientRequest $request) + { + $client = $this->clientService->save($request->input()); + + $client = Client::scope($client->public_id) + ->with('country', 'contacts', 'industry', 'size', 'currency') + ->first(); + + $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($client, $transformer, ENTITY_CLIENT); + + return $this->response($data); + } } diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index e1cd17f5dd37..8c159e39ea74 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -8,6 +8,7 @@ class VerifyCsrfToken extends BaseVerifier { private $openRoutes = [ 'signup/register', 'api/v1/login', + 'api/v1/clients/*', 'api/v1/clients', 'api/v1/invoices/*', 'api/v1/invoices', From e57f8f3c2e6a9ff9807f4ccaa03578df73ce50fb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 26 Jan 2016 22:37:16 +1100 Subject: [PATCH 15/99] Swagger Typo fix --- app/Http/Controllers/ClientApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index e9f5daf4e07a..cf93c68c9915 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -110,7 +110,7 @@ class ClientApiController extends BaseAPIController } /** - * @SWG\Putt( + * @SWG\Put( * path="/clients/{client_id}", * tags={"client"}, * summary="Update a client", From f80e73888247aa2852da444e5c9399aff4d93d02 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 26 Jan 2016 22:47:19 +1100 Subject: [PATCH 16/99] Bug Fix in taxrate transformer --- app/Ninja/Transformers/TaxRateTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Ninja/Transformers/TaxRateTransformer.php b/app/Ninja/Transformers/TaxRateTransformer.php index 8f4a375c7a72..f7d307bf7bb4 100644 --- a/app/Ninja/Transformers/TaxRateTransformer.php +++ b/app/Ninja/Transformers/TaxRateTransformer.php @@ -13,7 +13,7 @@ class TaxRateTransformer extends EntityTransformer /** * @SWG\Property(property="id", type="integer", example=1, readOnly=true) * @SWG\Property(property="name", type="string", example="GST") - * @SWG\Property(property="account_key", type="string", example="34erfdf33fdff" readOnly=true) + * @SWG\Property(property="account_key", type="string", example="asimplestring", readOnly=true) * @SWG\Property(property="rate", type="float", example=17.5) * @SWG\Property(property="updated_at", type="date-time", example="2016-01-01 12:10:00") * @SWG\Property(property="archived_at", type="date-time", example="2016-01-01 12:10:00") From efc9ab4f9e68217b7c249d4e086a881beea4f705 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 26 Jan 2016 22:22:33 +0200 Subject: [PATCH 17/99] Working on OFX support --- app/Console/Commands/TestOFX.php | 6 +- app/Http/Controllers/AppController.php | 1 + .../Controllers/BankAccountController.php | 93 ++-- app/Http/Controllers/InvoiceController.php | 2 +- app/Http/Controllers/VendorController.php | 3 +- .../Requests/CreateBankAccountRequest.php | 32 ++ app/Http/routes.php | 17 +- app/Libraries/OFX.php | 3 +- app/Models/Account.php | 2 +- app/Models/BankAccount.php | 4 + app/Models/BankSubaccount.php | 23 + app/Models/Expense.php | 2 + app/Models/Vendor.php | 1 + .../Repositories/BankAccountRepository.php | 32 +- app/Ninja/Repositories/ExpenseRepository.php | 8 +- app/Ninja/Repositories/VendorRepository.php | 5 +- app/Services/BankAccountService.php | 164 +++++- app/Services/VendorService.php | 10 +- composer.json | 10 +- composer.lock | 388 ++++++++----- ...2016_01_24_112646_add_bank_subaccounts.php | 69 +++ database/seeds/BanksSeeder.php | 41 +- public/css/built.css | 5 + resources/lang/da/pagination.php | 4 +- resources/lang/da/texts.php | 123 ++++- resources/lang/da/validation.php | 10 +- resources/lang/de/pagination.php | 2 +- resources/lang/de/texts.php | 133 ++++- resources/lang/de/validation.php | 10 +- resources/lang/en/pagination.php | 2 +- resources/lang/en/texts.php | 21 +- resources/lang/en/validation.php | 2 +- resources/lang/es/texts.php | 155 +++++- resources/lang/es/validation.php | 2 +- resources/lang/es_ES/texts.php | 124 ++++- resources/lang/fr/pagination.php | 4 +- resources/lang/fr/reminders.php | 2 +- resources/lang/fr/texts.php | 137 ++++- resources/lang/fr/validation.php | 10 +- resources/lang/fr_CA/pagination.php | 2 +- resources/lang/fr_CA/texts.php | 136 ++++- resources/lang/fr_CA/validation.php | 10 +- resources/lang/it/pagination.php | 4 +- resources/lang/it/texts.php | 124 ++++- resources/lang/it/validation.php | 10 +- resources/lang/lt/texts.php | 123 ++++- resources/lang/nb_NO/pagination.php | 28 +- resources/lang/nb_NO/reminders.php | 30 +- resources/lang/nb_NO/texts.php | 124 ++++- resources/lang/nb_NO/validation.php | 184 +++---- resources/lang/nl/pagination.php | 4 +- resources/lang/nl/texts.php | 173 +++++- resources/lang/nl/validation.php | 10 +- resources/lang/pt_BR/texts.php | 126 ++++- resources/lang/sv/reminders.php | 30 +- resources/lang/sv/texts.php | 121 +++++ resources/lang/sv/validation.php | 2 +- .../views/accounts/bank_account.blade.php | 513 ++++++++++++++---- tests/acceptance/InvoiceDesignCest.php | 2 - tests/functional/SettingsCest.php | 15 - 60 files changed, 2774 insertions(+), 659 deletions(-) create mode 100644 app/Http/Requests/CreateBankAccountRequest.php create mode 100644 app/Models/BankSubaccount.php create mode 100644 database/migrations/2016_01_24_112646_add_bank_subaccounts.php diff --git a/app/Console/Commands/TestOFX.php b/app/Console/Commands/TestOFX.php index 637451fbba68..243e30744831 100644 --- a/app/Console/Commands/TestOFX.php +++ b/app/Console/Commands/TestOFX.php @@ -18,13 +18,15 @@ class TestOFX extends Command public function fire() { $this->info(date('Y-m-d').' Running TestOFX...'); - + + /* $bankId = env('TEST_BANK_ID'); $username = env('TEST_BANK_USERNAME'); $password = env('TEST_BANK_PASSWORD'); $data = $this->bankAccountService->loadBankAccounts($bankId, $username, $password, false); - print "
".print_r($data, 1)."
"; + echo json_encode($data); + */ } } \ No newline at end of file diff --git a/app/Http/Controllers/AppController.php b/app/Http/Controllers/AppController.php index 35f1f9b0a5be..27ecaa59f4cf 100644 --- a/app/Http/Controllers/AppController.php +++ b/app/Http/Controllers/AppController.php @@ -247,6 +247,7 @@ class AppController extends BaseController Artisan::call('migrate', array('--force' => true)); Artisan::call('db:seed', array('--force' => true, '--class' => 'PaymentLibrariesSeeder')); Artisan::call('db:seed', array('--force' => true, '--class' => 'FontsSeeder')); + Artisan::call('db:seed', array('--force' => true, '--class' => 'BanksSeeder')); Event::fire(new UserSettingsChanged()); Session::flash('message', trans('texts.processed_updates')); } catch (Exception $e) { diff --git a/app/Http/Controllers/BankAccountController.php b/app/Http/Controllers/BankAccountController.php index 3b0f190ef1ec..9222a4cab1e3 100644 --- a/app/Http/Controllers/BankAccountController.php +++ b/app/Http/Controllers/BankAccountController.php @@ -1,6 +1,5 @@ bankAccountService = $bankAccountService; + $this->bankAccountRepo = $bankAccountRepo; } public function index() @@ -43,11 +46,8 @@ class BankAccountController extends BaseController public function edit($publicId) { $bankAccount = BankAccount::scope($publicId)->firstOrFail(); - $bankAccount->username = str_repeat('*', 16); $data = [ - 'url' => 'bank_accounts/' . $publicId, - 'method' => 'PUT', 'title' => trans('texts.edit_bank_account'), 'banks' => Cache::get('banks'), 'bankAccount' => $bankAccount, @@ -61,11 +61,6 @@ class BankAccountController extends BaseController return $this->save($publicId); } - public function store() - { - return $this->save(); - } - /** * Displays the form for account creation * @@ -73,9 +68,6 @@ class BankAccountController extends BaseController public function create() { $data = [ - 'url' => 'bank_accounts', - 'method' => 'POST', - 'title' => trans('texts.add_bank_account'), 'banks' => Cache::get('banks'), 'bankAccount' => null, ]; @@ -94,59 +86,40 @@ class BankAccountController extends BaseController return Redirect::to('settings/' . ACCOUNT_BANKS); } - /** - * Stores new account - * - */ - public function save($bankAccountPublicId = false) + public function validateAccount() { - $account = Auth::user()->account; - $bankId = Input::get('bank_id'); - $username = Input::get('bank_username'); - - $rules = [ - 'bank_id' => $bankAccountPublicId ? '' : 'required', - 'bank_username' => 'required', - ]; - - $validator = Validator::make(Input::all(), $rules); - - if ($validator->fails()) { - return Redirect::to('bank_accounts/create') - ->withErrors($validator) - ->withInput(); + $publicId = Input::get('public_id'); + $username = trim(Input::get('bank_username')); + $password = trim(Input::get('bank_password')); + + if ($publicId) { + $bankAccount = BankAccount::scope($publicId)->firstOrFail(); + if ($username != $bankAccount->username) { + // TODO update username + } + $username = Crypt::decrypt($username); + $bankId = $bankAccount->bank_id; } else { - if ($bankAccountPublicId) { - $bankAccount = BankAccount::scope($bankAccountPublicId)->firstOrFail(); - } else { - $bankAccount = BankAccount::createNew(); - $bankAccount->bank_id = $bankId; - } - - if ($username != str_repeat('*', strlen($username))) { - $bankAccount->username = Crypt::encrypt(trim($username)); - } - - if ($bankAccountPublicId) { - $bankAccount->save(); - $message = trans('texts.updated_bank_account'); - } else { - $account->bank_accounts()->save($bankAccount); - $message = trans('texts.created_bank_account'); - } - - Session::flash('message', $message); - return Redirect::to("bank_accounts/{$bankAccount->public_id}/edit"); + $bankId = Input::get('bank_id'); } + + return json_encode($this->bankAccountService->loadBankAccounts($bankId, $username, $password, $publicId)); } - public function test() + public function store(CreateBankAccountRequest $request) { - $bankId = Input::get('bank_id'); - $username = Input::get('bank_username'); - $password = Input::get('bank_password'); + $bankAccount = $this->bankAccountRepo->save(Input::all()); - return json_encode($this->bankAccountService->loadBankAccounts($bankId, $username, $password, false)); + $bankId = Input::get('bank_id'); + $username = trim(Input::get('bank_username')); + $password = trim(Input::get('bank_password')); + + return json_encode($this->bankAccountService->loadBankAccounts($bankId, $username, $password, true)); + } + + public function importExpenses($bankId) + { + return $this->bankAccountService->importExpenses($bankId, Input::all()); } } diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index a17453be8a1e..51fb264a07e9 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -333,7 +333,7 @@ class InvoiceController extends BaseController { $action = Input::get('action'); $entityType = Input::get('entityType'); - + $invoice = $this->invoiceService->save($request->input()); $entityType = $invoice->getEntityType(); $message = trans("texts.created_{$entityType}"); diff --git a/app/Http/Controllers/VendorController.php b/app/Http/Controllers/VendorController.php index bbd69ed23300..6a9bae5049dc 100644 --- a/app/Http/Controllers/VendorController.php +++ b/app/Http/Controllers/VendorController.php @@ -55,7 +55,8 @@ class VendorController extends BaseController 'columns' => Utils::trans([ 'checkbox', 'vendor', - 'contact', + 'city', + 'phone', 'email', 'date_created', '' diff --git a/app/Http/Requests/CreateBankAccountRequest.php b/app/Http/Requests/CreateBankAccountRequest.php new file mode 100644 index 000000000000..6c2fea62ec47 --- /dev/null +++ b/app/Http/Requests/CreateBankAccountRequest.php @@ -0,0 +1,32 @@ + 'required', + 'bank_username' => 'required', + 'bank_password' => 'required', + ]; + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index e0ded5dd46e3..44a968acab65 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -1,5 +1,6 @@ 'auth'], function() { Route::resource('bank_accounts', 'BankAccountController'); Route::get('api/bank_accounts', array('as'=>'api.bank_accounts', 'uses'=>'BankAccountController@getDatatable')); Route::post('bank_accounts/bulk', 'BankAccountController@bulk'); - Route::post('bank_accounts/test', 'BankAccountController@test'); + Route::post('bank_accounts/validate', 'BankAccountController@validateAccount'); + Route::post('bank_accounts/import_expenses/{bank_id}', 'BankAccountController@importExpenses'); Route::resource('clients', 'ClientController'); Route::get('api/clients', array('as'=>'api.clients', 'uses'=>'ClientController@getDatatable')); @@ -283,17 +285,18 @@ if (!defined('CONTACT_EMAIL')) { define('ENTITY_QUOTE', 'quote'); define('ENTITY_TASK', 'task'); define('ENTITY_ACCOUNT_GATEWAY', 'account_gateway'); - define('ENTITY_BANK_ACCOUNT', 'bank_account'); define('ENTITY_USER', 'user'); define('ENTITY_TOKEN', 'token'); define('ENTITY_TAX_RATE', 'tax_rate'); define('ENTITY_PRODUCT', 'product'); define('ENTITY_ACTIVITY', 'activity'); - define('ENTITY_VENDOR','vendor'); - define('ENTITY_VENDOR_ACTIVITY','vendor_activity'); + define('ENTITY_VENDOR', 'vendor'); + define('ENTITY_VENDOR_ACTIVITY', 'vendor_activity'); define('ENTITY_EXPENSE', 'expense'); - define('ENTITY_PAYMENT_TERM','payment_term'); - define('ENTITY_EXPENSE_ACTIVITY','expense_activity'); + define('ENTITY_PAYMENT_TERM', 'payment_term'); + define('ENTITY_EXPENSE_ACTIVITY', 'expense_activity'); + define('ENTITY_BANK_ACCOUNT', 'bank_account'); + define('ENTITY_BANK_SUBACCOUNT', 'bank_subaccount'); define('PERSON_CONTACT', 'contact'); define('PERSON_USER', 'user'); @@ -309,6 +312,7 @@ if (!defined('CONTACT_EMAIL')) { define('ACCOUNT_IMPORT_EXPORT', 'import_export'); define('ACCOUNT_PAYMENTS', 'online_payments'); define('ACCOUNT_BANKS', 'bank_accounts'); + define('ACCOUNT_IMPORT_EXPENSES', 'import_expenses'); define('ACCOUNT_MAP', 'import_map'); define('ACCOUNT_EXPORT', 'export'); define('ACCOUNT_TAX_RATES', 'tax_rates'); @@ -512,6 +516,7 @@ if (!defined('CONTACT_EMAIL')) { define('PHP_DATE_FORMATS', 'http://php.net/manual/en/function.date.php'); define('REFERRAL_PROGRAM_URL', 'https://www.invoiceninja.com/referral-program/'); define('EMAIL_MARKUP_URL', 'https://developers.google.com/gmail/markup'); + define('OFX_HOME_URL', 'http://www.ofxhome.com/index.php/home/directory/all'); define('COUNT_FREE_DESIGNS', 4); define('COUNT_FREE_DESIGNS_SELF_HOST', 5); // include the custom design diff --git a/app/Libraries/OFX.php b/app/Libraries/OFX.php index 734a27be30b5..a696aeee4cd9 100644 --- a/app/Libraries/OFX.php +++ b/app/Libraries/OFX.php @@ -24,8 +24,9 @@ class OFX curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-Type: application/x-ofx')); curl_setopt($c, CURLOPT_POSTFIELDS, $this->request); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); - //curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); $this->response = curl_exec($c); + //print_r($this->response); + //\Log::info(print_r($this->response, true)); curl_close($c); $tmp = explode('', $this->response); $this->responseHeader = $tmp[0]; diff --git a/app/Models/Account.php b/app/Models/Account.php index 9af3350dd094..08c10017c0a0 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -26,7 +26,7 @@ class Account extends Eloquent ACCOUNT_USER_DETAILS, ACCOUNT_LOCALIZATION, ACCOUNT_PAYMENTS, - //ACCOUNT_BANKS, + ACCOUNT_BANKS, ACCOUNT_TAX_RATES, ACCOUNT_PRODUCTS, ACCOUNT_NOTIFICATIONS, diff --git a/app/Models/BankAccount.php b/app/Models/BankAccount.php index 01ae612dc839..6bb0a5437038 100644 --- a/app/Models/BankAccount.php +++ b/app/Models/BankAccount.php @@ -19,5 +19,9 @@ class BankAccount extends EntityModel return $this->belongsTo('App\Models\Bank'); } + public function bank_subaccounts() + { + return $this->hasMany('App\Models\BankSubaccount'); + } } diff --git a/app/Models/BankSubaccount.php b/app/Models/BankSubaccount.php new file mode 100644 index 000000000000..0cd33568e0ab --- /dev/null +++ b/app/Models/BankSubaccount.php @@ -0,0 +1,23 @@ +belongsTo('App\Models\BankAccount'); + } + +} + diff --git a/app/Models/Expense.php b/app/Models/Expense.php index ce1241b11b2a..4251a857689e 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -24,6 +24,8 @@ class Expense extends EntityModel 'exchange_rate', 'private_notes', 'public_notes', + 'bank_id', + 'transaction_id', ]; public function account() { diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index bc34fbd2b1dc..a93fc6e5d7b4 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -29,6 +29,7 @@ class Vendor extends EntityModel 'private_notes', 'currency_id', 'website', + 'transaction_name', ]; public static $fieldName = 'name'; diff --git a/app/Ninja/Repositories/BankAccountRepository.php b/app/Ninja/Repositories/BankAccountRepository.php index 5ab3148e381b..f36499b8a529 100644 --- a/app/Ninja/Repositories/BankAccountRepository.php +++ b/app/Ninja/Repositories/BankAccountRepository.php @@ -1,9 +1,11 @@ join('banks', 'banks.id', '=', 'bank_accounts.bank_id') ->where('bank_accounts.deleted_at', '=', null) ->where('bank_accounts.account_id', '=', $accountId) - ->select('bank_accounts.public_id', 'banks.name as bank_name', 'bank_accounts.deleted_at', 'banks.bank_library_id'); + ->select( + 'bank_accounts.public_id', + 'banks.name as bank_name', + 'bank_accounts.deleted_at', + 'banks.bank_library_id' + ); + } + + public function save($input) + { + $bankAccount = BankAccount::createNew(); + $bankAccount->bank_id = $input['bank_id']; + $bankAccount->username = Crypt::encrypt(trim($input['bank_username'])); + + $account = \Auth::user()->account; + $account->bank_accounts()->save($bankAccount); + + foreach ($input['bank_accounts'] as $data) { + if ( ! isset($data['include']) || ! filter_var($data['include'], FILTER_VALIDATE_BOOLEAN)) { + continue; + } + + $subaccount = BankSubaccount::createNew(); + $subaccount->account_name = trim($data['account_name']); + $subaccount->account_number = trim($data['hashed_account_number']); + $bankAccount->bank_subaccounts()->save($subaccount); + } + + return $bankAccount; } } diff --git a/app/Ninja/Repositories/ExpenseRepository.php b/app/Ninja/Repositories/ExpenseRepository.php index 3c65f1c2520b..7d14669e6896 100644 --- a/app/Ninja/Repositories/ExpenseRepository.php +++ b/app/Ninja/Repositories/ExpenseRepository.php @@ -26,11 +26,12 @@ class ExpenseRepository extends BaseRepository public function findVendor($vendorPublicId) { + $vendorId = Vendor::getPrivateId($vendorPublicId); $accountid = \Auth::user()->account_id; $query = DB::table('expenses') ->join('accounts', 'accounts.id', '=', 'expenses.account_id') ->where('expenses.account_id', '=', $accountid) - ->where('expenses.vendor_id', '=', $vendorPublicId) + ->where('expenses.vendor_id', '=', $vendorId) ->select( 'expenses.id', 'expenses.expense_date', @@ -119,7 +120,10 @@ class ExpenseRepository extends BaseRepository $expense->fill($input); $expense->expense_date = Utils::toSqlDate($input['expense_date']); - $expense->private_notes = trim($input['private_notes']); + + if (isset($input['private_notes'])) { + $expense->private_notes = trim($input['private_notes']); + } $expense->public_notes = trim($input['public_notes']); $expense->should_be_invoiced = isset($input['should_be_invoiced']) || $expense->client_id ? true : false; diff --git a/app/Ninja/Repositories/VendorRepository.php b/app/Ninja/Repositories/VendorRepository.php index c7fc5bb90b5f..81fc8fc7f47b 100644 --- a/app/Ninja/Repositories/VendorRepository.php +++ b/app/Ninja/Repositories/VendorRepository.php @@ -39,6 +39,7 @@ class VendorRepository extends BaseRepository 'vendor_contacts.last_name', 'vendors.created_at', 'vendors.work_phone', + 'vendors.city', 'vendor_contacts.email', 'vendors.deleted_at', 'vendors.is_deleted' @@ -73,10 +74,6 @@ class VendorRepository extends BaseRepository $vendor->fill($data); $vendor->save(); - if ( ! isset($data['vendorcontact']) && ! isset($data['vendorcontacts'])) { - return $vendor; - } - $first = true; $vendorcontacts = isset($data['vendorcontact']) ? [$data['vendorcontact']] : $data['vendorcontacts']; diff --git a/app/Services/BankAccountService.php b/app/Services/BankAccountService.php index 6145f6391128..622c759c8216 100644 --- a/app/Services/BankAccountService.php +++ b/app/Services/BankAccountService.php @@ -3,21 +3,30 @@ use stdClass; use Utils; use URL; +use Hash; use App\Models\Gateway; +use App\Models\BankSubaccount; +use App\Models\Vendor; +use App\Models\Expense; use App\Services\BaseService; use App\Ninja\Repositories\BankAccountRepository; - +use App\Ninja\Repositories\ExpenseRepository; +use App\Ninja\Repositories\VendorRepository; use App\Libraries\Finance; use App\Libraries\Login; class BankAccountService extends BaseService { protected $bankAccountRepo; + protected $expenseRepo; + protected $vendorRepo; protected $datatableService; - public function __construct(BankAccountRepository $bankAccountRepo, DatatableService $datatableService) + public function __construct(BankAccountRepository $bankAccountRepo, ExpenseRepository $expenseRepo, VendorRepository $vendorRepo, DatatableService $datatableService) { $this->bankAccountRepo = $bankAccountRepo; + $this->vendorRepo = $vendorRepo; + $this->expenseRepo = $expenseRepo; $this->datatableService = $datatableService; } @@ -26,22 +35,31 @@ class BankAccountService extends BaseService return $this->bankAccountRepo; } - /* - public function save() - { - return null; - } - */ - public function loadBankAccounts($bankId, $username, $password, $includeTransactions = true) { if ( ! $bankId || ! $username || ! $password) { return false; } + $expenses = Expense::scope() + ->whereBankId($bankId) + ->where('transaction_id', '!=', '') + ->withTrashed() + ->get(['transaction_id']) + ->toArray(); + $expenses = array_flip(array_map(function($val) { + return $val['transaction_id']; + }, $expenses)); + + $bankAccounts = BankSubaccount::scope() + ->whereHas('bank_account', function($query) use ($bankId) { + $query->where('bank_id', '=', $bankId); + }) + ->get(); $bank = Utils::getFromCache($bankId, 'banks'); $data = []; + // load OFX trnansactions try { $finance = new Finance(); $finance->banks[$bankId] = $bank->getOFXBank($finance); @@ -52,21 +70,137 @@ class BankAccountService extends BaseService $login->setup(); foreach ($login->accounts as $account) { $account->setup($includeTransactions); - $obj = new stdClass; - $obj->account_number = Utils::maskAccountNumber($account->id); - $obj->type = $account->type; - $obj->balance = Utils::formatMoney($account->ledgerBalance, CURRENCY_DOLLAR); - $data[] = $obj; + if ($account = $this->parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions)) { + $data[] = $account; + } } } } - + return $data; } catch (\Exception $e) { return false; } } + private function parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions) + { + $obj = new stdClass; + $obj->account_name = ''; + + // look up bank account name + foreach ($bankAccounts as $bankAccount) { + if (Hash::check($account->id, $bankAccount->account_number)) { + $obj->account_name = $bankAccount->account_name; + } + } + + // if we can't find a match skip the account + if (count($bankAccounts) && ! $obj->account_name) { + return false; + } + + $obj->masked_account_number = Utils::maskAccountNumber($account->id); + $obj->hashed_account_number = bcrypt($account->id); + $obj->type = $account->type; + $obj->balance = Utils::formatMoney($account->ledgerBalance, CURRENCY_DOLLAR); + + if ($includeTransactions) { + $ofxParser = new \OfxParser\Parser; + $ofx = $ofxParser->loadFromString($account->response); + + $obj->start_date = $ofx->BankAccount->Statement->startDate; + $obj->end_date = $ofx->BankAccount->Statement->endDate; + $obj->transactions = []; + + foreach ($ofx->BankAccount->Statement->transactions as $transaction) { + // ensure transactions aren't imported as expenses twice + if (isset($expenses[$transaction->uniqueId])) { + continue; + } + if ($transaction->amount >= 0) { + continue; + } + $transaction->vendor = $this->prepareValue(substr($transaction->name, 0, 20)); + $transaction->info = $this->prepareValue(substr($transaction->name, 20)); + $transaction->memo = $this->prepareValue($transaction->memo); + $transaction->date = \Auth::user()->account->formatDate($transaction->date); + $transaction->amount *= -1; + $obj->transactions[] = $transaction; + } + } + + return $obj; + } + + private function prepareValue($value) { + return ucwords(strtolower(trim($value))); + } + + public function importExpenses($bankId, $input) { + $countVendors = 0; + $countExpenses = 0; + + // create a vendor map + $vendorMap = []; + $vendors = Vendor::scope() + ->withTrashed() + ->get(['id', 'name', 'transaction_name']); + foreach ($vendors as $vendor) { + $vendorMap[strtolower($vendor->name)] = $vendor; + $vendorMap[strtolower($vendor->transaction_name)] = $vendor; + } + + foreach ($input as $transaction) { + $vendorName = $transaction['vendor']; + $key = strtolower($vendorName); + $info = $transaction['info']; + + // find vendor otherwise create it + if (isset($vendorMap[$key])) { + $vendor = $vendorMap[$key]; + } else { + $field = $this->determineInfoField($info); + $vendor = $this->vendorRepo->save([ + $field => $info, + 'name' => $vendorName, + 'transaction_name' => $transaction['vendor_orig'], + 'vendorcontact' => [] + ]); + $vendorMap[$key] = $vendor; + $vendorMap[$transaction['vendor_orig']] = $vendor; + $countVendors++; + } + + // create the expense record + $this->expenseRepo->save([ + 'vendor_id' => $vendor->id, + 'amount' => $transaction['amount'], + 'public_notes' => $transaction['memo'], + 'expense_date' => $transaction['date'], + 'transaction_id' => $transaction['id'], + 'bank_id' => $bankId, + 'should_be_invoiced' => true, + ]); + $countExpenses++; + } + + return trans('texts.imported_expenses', [ + 'count_vendors' => $countVendors, + 'count_expenses' => $countExpenses + ]); + } + + private function determineInfoField($value) { + if (preg_match("/^[0-9\-\(\)\.]+$/", $value)) { + return 'work_phone'; + } elseif (strpos($value, '.') !== false) { + return 'private_notes'; + } else { + return 'city'; + } + } + public function getDatatable($accountId) { $query = $this->bankAccountRepo->find($accountId); diff --git a/app/Services/VendorService.php b/app/Services/VendorService.php index fccd9c83c0a7..155443c8e089 100644 --- a/app/Services/VendorService.php +++ b/app/Services/VendorService.php @@ -50,9 +50,15 @@ class VendorService extends BaseService } ], [ - 'first_name', + 'city', function ($model) { - return link_to("vendors/{$model->public_id}", $model->first_name.' '.$model->last_name); + return $model->city; + } + ], + [ + 'work_phone', + function ($model) { + return $model->work_phone; } ], [ diff --git a/composer.json b/composer.json index cac5f1780f21..a338165ea034 100644 --- a/composer.json +++ b/composer.json @@ -7,16 +7,13 @@ { "name": "Hillel Coren", "email": "hillelcoren@gmail.com" - }, - { - "name": "Jeramy Simpson", - "email": "jeramy.n.simpson@gmail.com" } ], "require": { "omnipay/mollie": "dev-master#22956c1a62a9662afa5f5d119723b413770ac525", "omnipay/2checkout": "dev-master#e9c079c2dde0d7ba461903b3b7bd5caf6dee1248", "omnipay/gocardless": "dev-master", + "omnipay/stripe": "2.3.0", "laravel/framework": "5.0.*", "patricktalmadge/bootstrapper": "5.5.x", "anahkiasen/former": "4.0.*@dev", @@ -25,7 +22,7 @@ "omnipay/omnipay": "~2.3.0", "intervention/image": "dev-master", "webpatser/laravel-countries": "dev-master", - "barryvdh/laravel-ide-helper": "^2.1", + "barryvdh/laravel-ide-helper": "dev-master", "doctrine/dbal": "2.5.x", "jsanc623/phpbenchtime": "2.x", "lokielse/omnipay-alipay": "dev-master", @@ -66,7 +63,8 @@ "jlapp/swaggervel": "master-dev", "maatwebsite/excel": "~2.0", "ezyang/htmlpurifier": "~v4.7", - "cerdic/css-tidy": "~v1.5" + "cerdic/css-tidy": "~v1.5", + "asgrim/ofxparser": "^1.1" }, "require-dev": { "phpunit/phpunit": "~4.0", diff --git a/composer.lock b/composer.lock index cb674180854c..28ae475dee18 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "9ed916108c17ac2634ffc4b9676098d1", - "content-hash": "e5177cc53f079158f3180a7e4ef0ded6", + "hash": "6e219bb4f5ffaf8423177bd6fccc89f8", + "content-hash": "4778ab164bfb93c4af1bb51c4320ea4c", "packages": [ { "name": "agmscode/omnipay-agms", @@ -123,12 +123,12 @@ "source": { "type": "git", "url": "https://github.com/alfaproject/omnipay-skrill.git", - "reference": "2fa2ba8083fd5289366660f8de1b46b5f49ac052" + "reference": "41a7a03c5b90d496720e288bebc157d898837ccd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/alfaproject/omnipay-skrill/zipball/41a7a03c5b90d496720e288bebc157d898837ccd", - "reference": "2fa2ba8083fd5289366660f8de1b46b5f49ac052", + "reference": "41a7a03c5b90d496720e288bebc157d898837ccd", "shasum": "" }, "require": { @@ -169,7 +169,7 @@ "payment", "skrill" ], - "time": "2014-02-25 13:40:07" + "time": "2016-01-13 16:33:07" }, { "name": "anahkiasen/former", @@ -323,6 +323,58 @@ ], "time": "2015-03-19 21:32:19" }, + { + "name": "asgrim/ofxparser", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/asgrim/ofxparser.git", + "reference": "7652efea77a1c5dda007f9764d8061f870248ea1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/asgrim/ofxparser/zipball/7652efea77a1c5dda007f9764d8061f870248ea1", + "reference": "7652efea77a1c5dda007f9764d8061f870248ea1", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "OfxParser": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guillaume Bailleul", + "email": "contact@guillaume-bailleul.fr", + "homepage": "http://www.guillaume-bailleul.fr" + }, + { + "name": "James Titcumb", + "email": "hello@jamestitcumb.com", + "homepage": "http://www.jamestitcumb.com/" + }, + { + "name": "Oliver Lowe", + "email": "mrtriangle@gmail.com" + } + ], + "description": "Simple OFX file parser", + "keywords": [ + "finance", + "ofx", + "open financial exchange", + "parser" + ], + "time": "2015-12-11 11:08:57" + }, { "name": "barryvdh/laravel-debugbar", "version": "v2.0.6", @@ -379,25 +431,25 @@ }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.0.6", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "037386153630a7515a1542f29410d8c267651689" + "reference": "aa8f772a46c35ecdcb7119f38772ac2ec952a941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/037386153630a7515a1542f29410d8c267651689", - "reference": "037386153630a7515a1542f29410d8c267651689", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/aa8f772a46c35ecdcb7119f38772ac2ec952a941", + "reference": "aa8f772a46c35ecdcb7119f38772ac2ec952a941", "shasum": "" }, "require": { - "illuminate/console": "5.0.x|5.1.x", - "illuminate/filesystem": "5.0.x|5.1.x", - "illuminate/support": "5.0.x|5.1.x", + "illuminate/console": "5.0.x|5.1.x|5.2.x", + "illuminate/filesystem": "5.0.x|5.1.x|5.2.x", + "illuminate/support": "5.0.x|5.1.x|5.2.x", "php": ">=5.4.0", "phpdocumentor/reflection-docblock": "2.0.4", - "symfony/class-loader": "~2.3" + "symfony/class-loader": "~2.3|~3.0" }, "require-dev": { "doctrine/dbal": "~2.3" @@ -408,7 +460,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -438,7 +490,7 @@ "phpstorm", "sublime" ], - "time": "2015-06-25 08:58:59" + "time": "2016-01-22 13:33:15" }, { "name": "cardgate/omnipay-cardgate", @@ -1272,33 +1324,33 @@ }, { "name": "doctrine/cache", - "version": "v1.5.4", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136" + "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/47cdc76ceb95cc591d9c79a36dc3794975b5d136", - "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136", + "url": "https://api.github.com/repos/doctrine/cache/zipball/f8af318d14bdb0eff0336795b428b547bd39ccb6", + "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "~5.5|~7.0" }, "conflict": { "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "phpunit/phpunit": ">=3.7", + "phpunit/phpunit": "~4.8|~5.0", "predis/predis": "~1.0", "satooshi/php-coveralls": "~0.6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -1338,7 +1390,7 @@ "cache", "caching" ], - "time": "2015-12-19 05:03:47" + "time": "2015-12-31 16:37:02" }, { "name": "doctrine/collections", @@ -1481,16 +1533,16 @@ }, { "name": "doctrine/dbal", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "2fbcea96eae34a53183377cdbb0b9bec33974648" + "reference": "abbdfd1cff43a7b99d027af3be709bc8fc7d4769" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/2fbcea96eae34a53183377cdbb0b9bec33974648", - "reference": "2fbcea96eae34a53183377cdbb0b9bec33974648", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/abbdfd1cff43a7b99d027af3be709bc8fc7d4769", + "reference": "abbdfd1cff43a7b99d027af3be709bc8fc7d4769", "shasum": "" }, "require": { @@ -1548,7 +1600,7 @@ "persistence", "queryobject" ], - "time": "2015-12-25 16:28:24" + "time": "2016-01-05 22:11:12" }, { "name": "doctrine/inflector", @@ -2091,16 +2143,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982" + "reference": "f5d04bdd2881ac89abde1fb78cc234bce24327bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5d04bdd2881ac89abde1fb78cc234bce24327bb", + "reference": "f5d04bdd2881ac89abde1fb78cc234bce24327bb", "shasum": "" }, "require": { @@ -2145,7 +2197,7 @@ "stream", "uri" ], - "time": "2015-11-03 01:34:55" + "time": "2016-01-23 01:23:02" }, { "name": "illuminate/html", @@ -2254,12 +2306,12 @@ "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "e6acb1609ce89f2c1ec7864fbbda0a20a3eeca70" + "reference": "86dfe2f2a95aa9eed58faf1cc1dae6534a6ce931" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Intervention/image/zipball/86dfe2f2a95aa9eed58faf1cc1dae6534a6ce931", - "reference": "e6acb1609ce89f2c1ec7864fbbda0a20a3eeca70", + "reference": "86dfe2f2a95aa9eed58faf1cc1dae6534a6ce931", "shasum": "" }, "require": { @@ -2308,7 +2360,7 @@ "thumbnail", "watermark" ], - "time": "2015-12-04 17:09:36" + "time": "2016-01-10 11:20:02" }, { "name": "ircmaxell/password-compat", @@ -3232,12 +3284,12 @@ "source": { "type": "git", "url": "https://github.com/lokielse/omnipay-alipay.git", - "reference": "cbfbee089e0a84a58c73e9d3794894b81a6a82d6" + "reference": "f39ce21a5cbfe5c7cd4108d264b398dbd42be05b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lokielse/omnipay-alipay/zipball/cbfbee089e0a84a58c73e9d3794894b81a6a82d6", - "reference": "cbfbee089e0a84a58c73e9d3794894b81a6a82d6", + "url": "https://api.github.com/repos/lokielse/omnipay-alipay/zipball/f39ce21a5cbfe5c7cd4108d264b398dbd42be05b", + "reference": "f39ce21a5cbfe5c7cd4108d264b398dbd42be05b", "shasum": "" }, "require": { @@ -3273,7 +3325,7 @@ "payment", "purchase" ], - "time": "2015-10-07 09:33:48" + "time": "2016-01-19 15:08:12" }, { "name": "maatwebsite/excel", @@ -3463,12 +3515,12 @@ "source": { "type": "git", "url": "https://github.com/meebio/omnipay-secure-trading.git", - "reference": "42f97ee5ad1d28605550d816fc1893919e19e502" + "reference": "992224a3c8dd834ee18f6f253a77ecb4c87c1c1a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/meebio/omnipay-secure-trading/zipball/992224a3c8dd834ee18f6f253a77ecb4c87c1c1a", - "reference": "42f97ee5ad1d28605550d816fc1893919e19e502", + "reference": "992224a3c8dd834ee18f6f253a77ecb4c87c1c1a", "shasum": "" }, "require": { @@ -3513,7 +3565,7 @@ "secure trading", "securetrading" ], - "time": "2015-12-01 10:03:20" + "time": "2016-01-05 09:26:36" }, { "name": "mfauveau/omnipay-pacnet", @@ -4363,16 +4415,16 @@ }, { "name": "omnipay/firstdata", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/thephpleague/omnipay-firstdata.git", - "reference": "0853bba0ee313f5557eb1c696d3ce5538dbd4aca" + "reference": "e33826821db88d90886cad6c81a29452d3cf91a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/omnipay-firstdata/zipball/0853bba0ee313f5557eb1c696d3ce5538dbd4aca", - "reference": "0853bba0ee313f5557eb1c696d3ce5538dbd4aca", + "url": "https://api.github.com/repos/thephpleague/omnipay-firstdata/zipball/e33826821db88d90886cad6c81a29452d3cf91a2", + "reference": "e33826821db88d90886cad6c81a29452d3cf91a2", "shasum": "" }, "require": { @@ -4417,7 +4469,7 @@ "pay", "payment" ], - "time": "2015-07-28 17:50:44" + "time": "2016-01-14 06:24:28" }, { "name": "omnipay/gocardless", @@ -5112,16 +5164,16 @@ }, { "name": "omnipay/paypal", - "version": "2.5.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/thephpleague/omnipay-paypal.git", - "reference": "67efe5a927dec13fc7520e29bc44f15fd3a728e9" + "reference": "b546d24241725061d44e60516f0fbce202336963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/67efe5a927dec13fc7520e29bc44f15fd3a728e9", - "reference": "67efe5a927dec13fc7520e29bc44f15fd3a728e9", + "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/b546d24241725061d44e60516f0fbce202336963", + "reference": "b546d24241725061d44e60516f0fbce202336963", "shasum": "" }, "require": { @@ -5166,20 +5218,20 @@ "paypal", "purchase" ], - "time": "2015-11-11 21:48:00" + "time": "2016-01-13 07:03:27" }, { "name": "omnipay/pin", - "version": "v2.1.0", + "version": "v2.2.1", "source": { "type": "git", - "url": "https://github.com/omnipay/pin.git", - "reference": "04e778e9689882d4c40419263014068b69b93168" + "url": "https://github.com/thephpleague/omnipay-pin.git", + "reference": "c2252e41f3674267b2bbe79eaeec73b6b1e4ee58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/omnipay/pin/zipball/04e778e9689882d4c40419263014068b69b93168", - "reference": "04e778e9689882d4c40419263014068b69b93168", + "url": "https://api.github.com/repos/thephpleague/omnipay-pin/zipball/c2252e41f3674267b2bbe79eaeec73b6b1e4ee58", + "reference": "c2252e41f3674267b2bbe79eaeec73b6b1e4ee58", "shasum": "" }, "require": { @@ -5210,11 +5262,11 @@ }, { "name": "Omnipay Contributors", - "homepage": "https://github.com/omnipay/pin/contributors" + "homepage": "https://github.com/thephpleague/omnipay-pin/contributors" } ], "description": "Pin Payments driver for the Omnipay payment processing library", - "homepage": "https://github.com/omnipay/pin", + "homepage": "https://github.com/thephpleague/omnipay-pin", "keywords": [ "gateway", "merchant", @@ -5223,20 +5275,20 @@ "payment", "pin" ], - "time": "2014-04-14 11:26:15" + "time": "2016-01-13 07:00:17" }, { "name": "omnipay/sagepay", - "version": "v2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/thephpleague/omnipay-sagepay.git", - "reference": "899507095428fa54276ba5ca89f11fd7f8fd78ab" + "reference": "4208d23b33b2f8a59176e44ad22d304c461ecb62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/omnipay-sagepay/zipball/899507095428fa54276ba5ca89f11fd7f8fd78ab", - "reference": "899507095428fa54276ba5ca89f11fd7f8fd78ab", + "url": "https://api.github.com/repos/thephpleague/omnipay-sagepay/zipball/4208d23b33b2f8a59176e44ad22d304c461ecb62", + "reference": "4208d23b33b2f8a59176e44ad22d304c461ecb62", "shasum": "" }, "require": { @@ -5282,7 +5334,7 @@ "sage pay", "sagepay" ], - "time": "2015-04-02 17:46:20" + "time": "2016-01-12 12:43:31" }, { "name": "omnipay/securepay", @@ -5512,6 +5564,54 @@ ], "time": "2014-09-17 00:37:18" }, + { + "name": "paragonie/random_compat", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/dd8998b7c846f6909f4e7a5f67fabebfc412a4f7", + "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2016-01-06 13:31:20" + }, { "name": "patricktalmadge/bootstrapper", "version": "5.5.3", @@ -6058,28 +6158,28 @@ }, { "name": "symfony/class-loader", - "version": "v2.8.1", + "version": "v3.0.1", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "ec74b0a279cf3a9bd36172b3e3061591d380ce6c" + "reference": "6294f616bb9888ba2e13c8bfdcc4d306c1c95da7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/ec74b0a279cf3a9bd36172b3e3061591d380ce6c", - "reference": "ec74b0a279cf3a9bd36172b3e3061591d380ce6c", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/6294f616bb9888ba2e13c8bfdcc4d306c1c95da7", + "reference": "6294f616bb9888ba2e13c8bfdcc4d306c1c95da7", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.5.9" }, "require-dev": { - "symfony/finder": "~2.0,>=2.0.5|~3.0.0" + "symfony/finder": "~2.8|~3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6106,11 +6206,11 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-12-05 17:37:59" + "time": "2015-12-05 17:45:07" }, { "name": "symfony/console", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Console", "source": { "type": "git", @@ -6168,16 +6268,16 @@ }, { "name": "symfony/css-selector", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "eaa3320e32f09a01dc432c6efbe8051aee59cfef" + "reference": "ac06d8173bd80790536c0a4a634a7d705b91f54f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/eaa3320e32f09a01dc432c6efbe8051aee59cfef", - "reference": "eaa3320e32f09a01dc432c6efbe8051aee59cfef", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ac06d8173bd80790536c0a4a634a7d705b91f54f", + "reference": "ac06d8173bd80790536c0a4a634a7d705b91f54f", "shasum": "" }, "require": { @@ -6217,11 +6317,11 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2015-12-05 17:37:59" + "time": "2016-01-03 15:33:41" }, { "name": "symfony/debug", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Debug", "source": { "type": "git", @@ -6282,16 +6382,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc" + "reference": "ee278f7c851533e58ca307f66305ccb9188aceda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a5eb815363c0388e83247e7e9853e5dbc14999cc", - "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ee278f7c851533e58ca307f66305ccb9188aceda", + "reference": "ee278f7c851533e58ca307f66305ccb9188aceda", "shasum": "" }, "require": { @@ -6338,20 +6438,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-10-30 20:15:42" + "time": "2016-01-13 10:28:07" }, { "name": "symfony/filesystem", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "a7ad724530a764d70c168d321ac226ba3d2f10fc" + "reference": "637b64d0ee10f44ae98dbad651b1ecdf35a11e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/a7ad724530a764d70c168d321ac226ba3d2f10fc", - "reference": "a7ad724530a764d70c168d321ac226ba3d2f10fc", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/637b64d0ee10f44ae98dbad651b1ecdf35a11e8c", + "reference": "637b64d0ee10f44ae98dbad651b1ecdf35a11e8c", "shasum": "" }, "require": { @@ -6387,11 +6487,11 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2015-12-22 10:25:57" + "time": "2016-01-13 10:28:07" }, { "name": "symfony/finder", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", @@ -6441,7 +6541,7 @@ }, { "name": "symfony/http-foundation", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", @@ -6495,17 +6595,17 @@ }, { "name": "symfony/http-kernel", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "498866a8ca0bcbcd3f3824b1520fa568ff7ca3b6" + "reference": "cdd991d304fed833514dc44d6aafcf19397c26cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/498866a8ca0bcbcd3f3824b1520fa568ff7ca3b6", - "reference": "498866a8ca0bcbcd3f3824b1520fa568ff7ca3b6", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cdd991d304fed833514dc44d6aafcf19397c26cb", + "reference": "cdd991d304fed833514dc44d6aafcf19397c26cb", "shasum": "" }, "require": { @@ -6569,7 +6669,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-11-23 11:37:53" + "time": "2016-01-14 10:11:16" }, { "name": "symfony/polyfill-php56", @@ -6681,7 +6781,7 @@ }, { "name": "symfony/process", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Process", "source": { "type": "git", @@ -6731,7 +6831,7 @@ }, { "name": "symfony/routing", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", @@ -6800,20 +6900,21 @@ }, { "name": "symfony/security-core", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Security/Core", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "05f58bb3814e8a853332dc448e3b7addaa87679c" + "reference": "813cf2aaacccbbe1a4705aef8d4ac0d79d993a76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/05f58bb3814e8a853332dc448e3b7addaa87679c", - "reference": "05f58bb3814e8a853332dc448e3b7addaa87679c", + "url": "https://api.github.com/repos/symfony/security-core/zipball/813cf2aaacccbbe1a4705aef8d4ac0d79d993a76", + "reference": "813cf2aaacccbbe1a4705aef8d4ac0d79d993a76", "shasum": "" }, "require": { + "paragonie/random_compat": "~1.0", "php": ">=5.3.3" }, "require-dev": { @@ -6860,11 +6961,11 @@ ], "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", - "time": "2015-07-22 10:08:40" + "time": "2016-01-14 09:04:34" }, { "name": "symfony/translation", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/Translation", "source": { "type": "git", @@ -6923,7 +7024,7 @@ }, { "name": "symfony/var-dumper", - "version": "v2.6.12", + "version": "v2.6.13", "target-dir": "Symfony/Component/VarDumper", "source": { "type": "git", @@ -7030,16 +7131,16 @@ }, { "name": "true/punycode", - "version": "v2.0.1", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/true/php-punycode.git", - "reference": "b672918d992b84f8016bbe353a42516928393c63" + "reference": "74fa01d4de396c40e239794123b3874cb594a30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/true/php-punycode/zipball/b672918d992b84f8016bbe353a42516928393c63", - "reference": "b672918d992b84f8016bbe353a42516928393c63", + "url": "https://api.github.com/repos/true/php-punycode/zipball/74fa01d4de396c40e239794123b3874cb594a30c", + "reference": "74fa01d4de396c40e239794123b3874cb594a30c", "shasum": "" }, "require": { @@ -7072,7 +7173,7 @@ "idna", "punycode" ], - "time": "2015-09-01 14:53:31" + "time": "2016-01-07 17:12:58" }, { "name": "twbs/bootstrap", @@ -7347,16 +7448,16 @@ }, { "name": "zircote/swagger-php", - "version": "2.0.4", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "be5d96e56c23cbe52c5bc5e267851323d95c57cd" + "reference": "c19af4edcc13c00e82fabeee926335b1fe1d92e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/be5d96e56c23cbe52c5bc5e267851323d95c57cd", - "reference": "be5d96e56c23cbe52c5bc5e267851323d95c57cd", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/c19af4edcc13c00e82fabeee926335b1fe1d92e9", + "reference": "c19af4edcc13c00e82fabeee926335b1fe1d92e9", "shasum": "" }, "require": { @@ -7403,7 +7504,7 @@ "rest", "service discovery" ], - "time": "2015-11-13 13:50:11" + "time": "2016-01-15 09:39:28" } ], "packages-dev": [ @@ -7593,16 +7694,16 @@ }, { "name": "facebook/webdriver", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/facebook/php-webdriver.git", - "reference": "518a9e0635e69777f07e41619cdf5d82fae284b6" + "reference": "1c98108ba3eb435b681655764de11502a0653705" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/518a9e0635e69777f07e41619cdf5d82fae284b6", - "reference": "518a9e0635e69777f07e41619cdf5d82fae284b6", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/1c98108ba3eb435b681655764de11502a0653705", + "reference": "1c98108ba3eb435b681655764de11502a0653705", "shasum": "" }, "require": { @@ -7632,7 +7733,7 @@ "selenium", "webdriver" ], - "time": "2015-12-08 17:04:30" + "time": "2015-12-31 15:58:49" }, { "name": "fzaninotto/faker", @@ -7722,16 +7823,16 @@ }, { "name": "phpspec/phpspec", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/phpspec/phpspec.git", - "reference": "1d3938e6d9ffb1bd4805ea8ddac62ea48767f358" + "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/1d3938e6d9ffb1bd4805ea8ddac62ea48767f358", - "reference": "1d3938e6d9ffb1bd4805ea8ddac62ea48767f358", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/5528ce1e93a1efa090c9404aba3395c329b4e6ed", + "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed", "shasum": "" }, "require": { @@ -7796,7 +7897,7 @@ "testing", "tests" ], - "time": "2015-11-29 02:03:49" + "time": "2016-01-01 10:17:54" }, { "name": "phpspec/prophecy", @@ -8599,16 +8700,16 @@ }, { "name": "symfony/browser-kit", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "dd2cfb20fabd4efca14cf3b2345d40b3dd5e9aca" + "reference": "a93dffaf763182acad12a4c42c7efc372899891e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/dd2cfb20fabd4efca14cf3b2345d40b3dd5e9aca", - "reference": "dd2cfb20fabd4efca14cf3b2345d40b3dd5e9aca", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a93dffaf763182acad12a4c42c7efc372899891e", + "reference": "a93dffaf763182acad12a4c42c7efc372899891e", "shasum": "" }, "require": { @@ -8652,20 +8753,20 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2015-12-26 13:37:56" + "time": "2016-01-12 17:46:01" }, { "name": "symfony/dom-crawler", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "a2712aff8b250d9601ad6bd23a2ff82a12730e8e" + "reference": "650d37aacb1fa0dcc24cced483169852b3a0594e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/a2712aff8b250d9601ad6bd23a2ff82a12730e8e", - "reference": "a2712aff8b250d9601ad6bd23a2ff82a12730e8e", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/650d37aacb1fa0dcc24cced483169852b3a0594e", + "reference": "650d37aacb1fa0dcc24cced483169852b3a0594e", "shasum": "" }, "require": { @@ -8708,7 +8809,7 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2015-12-23 17:16:29" + "time": "2016-01-03 15:33:41" }, { "name": "symfony/polyfill-mbstring", @@ -8771,16 +8872,16 @@ }, { "name": "symfony/yaml", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966" + "reference": "34c8a4b51e751e7ea869b8262f883d008a2b81b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966", - "reference": "ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966", + "url": "https://api.github.com/repos/symfony/yaml/zipball/34c8a4b51e751e7ea869b8262f883d008a2b81b8", + "reference": "34c8a4b51e751e7ea869b8262f883d008a2b81b8", "shasum": "" }, "require": { @@ -8816,7 +8917,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-12-26 13:37:56" + "time": "2016-01-13 10:28:07" } ], "aliases": [], @@ -8829,6 +8930,7 @@ "chumper/datatable": 20, "intervention/image": 20, "webpatser/laravel-countries": 20, + "barryvdh/laravel-ide-helper": 20, "lokielse/omnipay-alipay": 20, "alfaproject/omnipay-neteller": 20, "alfaproject/omnipay-skrill": 20, @@ -8851,4 +8953,4 @@ "prefer-lowest": false, "platform": [], "platform-dev": [] -} \ No newline at end of file +} diff --git a/database/migrations/2016_01_24_112646_add_bank_subaccounts.php b/database/migrations/2016_01_24_112646_add_bank_subaccounts.php new file mode 100644 index 000000000000..92b283a52662 --- /dev/null +++ b/database/migrations/2016_01_24_112646_add_bank_subaccounts.php @@ -0,0 +1,69 @@ +increments('id'); + $table->unsignedInteger('account_id'); + $table->unsignedInteger('user_id'); + $table->unsignedInteger('bank_account_id'); + + $table->string('account_name'); + $table->string('account_number'); + + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade'); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('bank_account_id')->references('id')->on('bank_accounts')->onDelete('cascade'); + + $table->unsignedInteger('public_id')->index(); + $table->unique(['account_id', 'public_id']); + }); + + Schema::table('expenses', function($table) + { + $table->string('transaction_id'); + $table->unsignedInteger('bank_id'); + }); + + Schema::table('vendors', function($table) + { + $table->string('transaction_name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('bank_subaccounts'); + + Schema::table('expenses', function($table) + { + $table->dropColumn('transaction_id'); + $table->dropColumn('bank_id'); + }); + + Schema::table('vendors', function($table) + { + $table->dropColumn('transaction_name'); + }); + } + +} diff --git a/database/seeds/BanksSeeder.php b/database/seeds/BanksSeeder.php index 28fa6d300a6d..3f2a0cf4ce41 100644 --- a/database/seeds/BanksSeeder.php +++ b/database/seeds/BanksSeeder.php @@ -14,30 +14,27 @@ class BanksSeeder extends Seeder // Source: http://www.ofxhome.com/ private function createBanks() { - $banks = [ - [ - 'remote_id' => 425, - 'name' => 'American Express Card', - 'config' => json_encode([ - 'fid' => 3101, - 'org' => 'AMEX', - 'url' => 'https://online.americanexpress.com/myca/ofxdl/desktop/desktopDownload.do?request_type=nl_ofxdownload', - ]) - ], - [ - 'remote_id' => 497, - 'name' => 'AIM Investments', - 'config' => json_encode([ - 'fid' => '', - 'org' => '', - 'url' => 'https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=3000812', - ]) - ], - ]; + // http://www.ofxhome.com/api.php?dump=yes + // http://www.utilities-online.info/xmltojson + // http://www.httputility.net/json-minifier.aspx + $banks = '[{"id":"421","name":"ING DIRECT (Canada)","fid":"061400152","org":"INGDirectCanada","url":"https://ofx.ingdirect.ca","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-10-26 22:57:57","lastsslvalidation":"2014-12-03 23:01:03","profile":{"-addr1":"3389 Steeles Avenue East","-city":"Toronto","-state":"ON","-postalcode":"M2H 3S8","-country":"CAN","-csphone":"800-464-3473","-tsphone":"800-464-3473","-url":"http://www.tangerine.ca","-email":"clientservices@ingdirect.ca","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"422","name":"Safe Credit Union - OFX Beta","fid":"321173742","org":"DI","url":"https://ofxcert.diginsite.com/cmr/cmr.ofx","ofxfail":"3","sslfail":"0","lastofxvalidation":"2010-03-18 16:25:00","lastsslvalidation":"2015-07-02 23:46:44"},{"id":"423","name":"Ascentra Credit Union","fid":"273973456","org":"Alcoa Employees&Community CU","url":"https://alc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-10-01 22:03:55","lastsslvalidation":"2013-10-01 22:03:55","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"424","name":"American Express Card","fid":"3101","org":"AMEX","url":"https://online.americanexpress.com/myca/ofxdl/desktop/desktopDownload.do?request_type=nl_ofxdownload","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-23 09:54:17","lastsslvalidation":"2015-06-22 22:09:26","profile":{"-addr1":"777 American Expressway","-city":"Fort Lauderdale","-state":"Fla.","-postalcode":"33337-0001","-country":"USA","-csphone":"1-800-AXP-7500 (1-800-297-7500)","-url":"https://online.americanexpress.com/myca/ofxdl/desktop/desktopDownload.do?request_type=nl_ofxdownload","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"425","name":"TD Ameritrade","fid":"5024","org":"ameritrade.com","brokerid":"ameritrade.com","url":"https://ofxs.ameritrade.com/cgi-bin/apps/OFX","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-09 23:43:48","lastsslvalidation":"2016-01-18 10:26:26","profile":{"-addr1":"4211 So. 102nd Street","-city":"Omaha","-state":"NE","-postalcode":"68127","-country":"USA","-csphone":"1-212-723-2898","-tsphone":"1-212-723-2898","-url":"https://ofxs.ameritrade.com/cgi-bin/apps/OFX","-email":"alex_shnir@smb.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true","-notes":"Username is case sensitive Automatically imports 2 years of transactions Older transactions may be imported from the Ameritrade website. See documentation for more details. mported stock split transactions may have incorrect data"}},{"id":"426","name":"Truliant FCU","fid":"253177832","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:02:33","lastsslvalidation":"2015-07-03 00:02:32","profile":{"-addr1":"3200 Truliant Way","-city":"Winston-Salem","-state":"NC","-postalcode":"27103","-country":"USA","-csphone":"800-822-0382","-tsphone":"800-822-038","-url":"www.truliantfcu.org","-email":"2","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"427","name":"AT&T Universal Card","fid":"24909","org":"Citigroup","url":"https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-03-06 22:04:25","lastsslvalidation":"2013-06-11 22:03:53","profile":{"-addr1":"8787 Baypine Road","-city":"Jacksonville","-state":"FL","-postalcode":"32256","-country":"USA","-csphone":"1-800-950-5114","-tsphone":"1-800-347-4934","-url":"http://www.citicards.com","-signonmsgset":"true","-creditcardmsgset":"true"}},{"id":"428","name":"Bank One","fid":"5811","org":"B1","url":"https://onlineofx.chase.com/chase.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-11-15 01:32:59","lastsslvalidation":"2009-12-25 01:33:13"},{"id":"429","name":"Bank of Stockton","fid":"3901","org":"BOS","url":"https://internetbanking.bankofstockton.com/scripts/serverext.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2011-06-16 22:03:30","lastsslvalidation":"2016-01-21 23:33:41"},{"id":"430","name":"Bank of the Cascades","fid":"4751","org":"JackHenry","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 16:10:03","lastsslvalidation":"2015-07-02 22:22:53","profile":{"-addr1":"PO Box 369","-addr2":"Bend, OR 97709","-city":"BEND","-state":"OR","-postalcode":"977010000","-country":"USA","-csphone":"(877) 617-3400","-tsphone":"1-877-617-3400","-url":"https://www.botc.com","-email":"Cust_Srv_Speclst@botc.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"431","name":"Centra Credit Union","fid":"274972883","org":"Centra CU","url":"https://centralink.org/scripts/isaofx.dll","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-22 13:04:46","lastsslvalidation":"2009-12-23 01:42:12","profile":{"-addr1":"1430 National Road","-city":"Columbus","-state":"IN","-postalcode":"47201","-country":"USA","-csphone":"800-232-3642","-tsphone":"800-232-3642","-url":"http://www.centra.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"432","name":"Centura Bank","fid":"1901","org":"Centura Bank","url":"https://www.oasis.cfree.com/1901.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:40","lastsslvalidation":"2015-07-02 22:28:39"},{"id":"433","name":"Charles Schwab&Co., INC","fid":"5104","org":"ISC","brokerid":"SCHWAB.COM","url":"https://ofx.schwab.com/cgi_dev/ofx_server","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 23:31:23","lastsslvalidation":"2016-01-21 23:33:44","profile":{"-addr1":"101 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-csphone":"1-212-723-2898","-tsphone":"1-212-723-2898","-url":"WWW.SCHWAB.COM","-email":"alex_shnir@smb.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"434","name":"JPMorgan Chase Bank (Texas)","fid":"5301","org":"Chase Bank of Texas","url":"https://www.oasis.cfree.com/5301.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-06 05:50:49","lastsslvalidation":"2016-01-06 06:21:14"},{"id":"435","name":"JPMorgan Chase Bank","fid":"1601","org":"Chase Bank","url":"https://www.oasis.cfree.com/1601.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-06 05:50:57","lastsslvalidation":"2016-01-06 06:21:21"},{"id":"436","name":"Colonial Bank","fid":"1046","org":"Colonial Banc Group","url":"https://www.oasis.cfree.com/1046.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:57","lastsslvalidation":"2015-07-02 22:33:57"},{"id":"437","name":"Comerica Bank","fid":"5601","org":"Comerica","url":"https://www.oasis.cfree.com/5601.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:35:33","lastsslvalidation":"2015-07-02 22:35:33"},{"id":"438","name":"Commerce Bank NJ, PA, NY&DE","fid":"1001","org":"CommerceBank","url":"https://www.commerceonlinebanking.com/scripts/serverext.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2009-09-24 01:33:33","lastsslvalidation":"2011-10-19 22:06:01","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"439","name":"Commerce Bank, NA","fid":"4001","org":"Commerce Bank NA","url":"https://www.oasis.cfree.com/4001.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:35:36","lastsslvalidation":"2015-07-02 22:35:36"},{"id":"440","name":"Commercial Federal Bank","fid":"4801","org":"CommercialFederalBank","url":"https://www.oasis.cfree.com/4801.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:35:37","lastsslvalidation":"2015-07-02 22:35:37"},{"id":"441","name":"COMSTAR FCU","fid":"255074988","org":"Comstar Federal Credit Union","url":"https://pcu.comstarfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-04-10 22:16:52","lastsslvalidation":"2014-11-18 22:25:19","profile":{"-addr1":"22601-A Gateway Center Drive","-city":"Clarksburg","-state":"MD","-postalcode":"20871","-country":"USA","-csphone":"855-436-4100","-tsphone":"855-436-4100","-url":"http://www.comstarfcu.org/","-email":"mail@comstarfcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"442","name":"SunTrust","fid":"2801","org":"SunTrust PC Banking","url":"https://www.oasis.cfree.com/2801.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 17:26:05","lastsslvalidation":"2015-11-13 03:34:23"},{"id":"443","name":"Denali Alaskan FCU","fid":"1","org":"Denali Alaskan FCU","url":"https://remotebanking.denalifcu.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-11-19 22:11:59","lastsslvalidation":"2014-05-06 22:20:31","profile":{"-addr1":"P.O. BOX 2351","-city":"Sacramento","-state":"CA","-postalcode":"95812","-country":"USA","-csphone":"916 444 6070","-url":"https://homebank.sactocu.org","-email":"info@sactocu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"444","name":"Discover Card","fid":"7101","org":"Discover Financial Services","url":"https://ofx.discovercard.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 05:58:34","lastsslvalidation":"2016-01-22 21:54:39","profile":{"-addr1":"2500 Lake Cook Road","-city":"Riverwoods","-state":"IL","-postalcode":"60015","-country":"USA","-csphone":"1-800-DISCOVER","-tsphone":"1-800-DISCOVER","-url":"https://www.discover.com","-email":"websupport@service.discovercard.com","-signonmsgset":"true","-creditcardmsgset":"true"}},{"id":"445","name":"Dreyfus","org":"DST","brokerid":"www.dreyfus.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=703170424052018","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 03:21:42","lastsslvalidation":"2016-01-22 21:54:40","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"446","name":"E*TRADE","fid":"fldProv_mProvBankId","org":"fldProv_mId","brokerid":"etrade.com","url":"https://ofx.etrade.com/cgi-ofx/etradeofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-26 08:06:15","lastsslvalidation":"2015-11-23 04:34:34","profile":{"-addr1":"4500 Bohannon Drive","-city":"Menlo Park","-state":"CA","-postalcode":"94025","-country":"USA","-csphone":"1-800-786-2575","-tsphone":"1-800-786-2575","-url":"http://www.etrade.com","-email":"service@etrade.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"447","name":"Eastern Bank","fid":"6201","org":"Eastern Bank","url":"https://www.oasis.cfree.com/6201.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:49:39","lastsslvalidation":"2015-07-02 22:49:38"},{"id":"448","name":"EDS Credit Union","fid":"311079474","org":"EDS CU","url":"https://eds.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:47:08","lastsslvalidation":"2009-12-23 01:47:07"},{"id":"449","name":"Fidelity Investments","fid":"7776","org":"fidelity.com","brokerid":"fidelity.com","url":"https://ofx.fidelity.com/ftgw/OFX/clients/download","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:54:46","lastsslvalidation":"2015-07-02 22:54:45","profile":{"-addr1":"Fidelity Brokerage Services, Inc","-addr2":"82 Devonshire Street","-city":"Boston","-state":"MA","-postalcode":"2109","-country":"USA","-csphone":"1-800-544-7931","-url":"http://www.fidelity.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true","-notes":"Set username to your fidelity Customer ID Automatically imports 3 months of transactions"}},{"id":"450","name":"Fifth Third Bancorp","fid":"5829","org":"Fifth Third Bank","url":"https://banking.53.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-20 09:56:15","lastsslvalidation":"2016-01-05 16:20:43","profile":{"-addr1":"Madisonville Operations Center","-addr2":"MD 1MOC3A","-city":"Cincinnati","-state":"OH","-postalcode":"45263","-country":"USA","-csphone":"800-972-3030","-url":"http://www.53.com/","-email":"53_GeneralInquiries@53.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"451","name":"First Tech Credit Union","fid":"2243","org":"First Tech Credit Union","url":"https://ofx.firsttechcu.com","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-07-10 22:09:25","lastsslvalidation":"2011-07-10 22:09:24"},{"id":"452","name":"zWachovia","fid":"4301","org":"Wachovia","url":"https://www.oasis.cfree.com/4301.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 15:16:07","lastsslvalidation":"2016-01-18 07:16:02"},{"id":"453","name":"KeyBank","fid":"5901","org":"KeyBank","url":"https://www.oasis.cfree.com/fip/genesis/prod/05901.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-06 05:52:02","lastsslvalidation":"2016-01-06 06:22:22","profile":{"-addr1":"333 North Summit Street","-addr2":"11th Floor","-city":"Toledo","-state":"OH","-postalcode":"43604","-country":"USA","-url":"http://www.keybank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"454","name":"Mellon Bank","fid":"1226","org":"Mellon Bank","url":"https://www.oasis.cfree.com/1226.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-09 18:45:11","lastsslvalidation":"2016-01-17 18:55:14"},{"id":"455","name":"LaSalle Bank Midwest","fid":"1101","org":"LaSalleBankMidwest","url":"https://www.oasis.cfree.com/1101.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-12 00:21:16","lastsslvalidation":"2016-01-15 10:20:33"},{"id":"456","name":"Nantucket Bank","fid":"466","org":"Nantucket","url":"https://ofx.onlinencr.com/scripts/serverext.dll","ofxfail":"2","sslfail":"0","lastofxvalidation":"2014-03-08 22:45:11","lastsslvalidation":"2015-07-02 23:26:36","profile":{"-addr1":"104 Pleasant Street","-city":"Nantucket","-state":"MA","-postalcode":"02554","-country":"USA","-csphone":"1-800-533-9313","-tsphone":"1-800-533-9313","-url":"http://www.nantucketbank.com/","-email":"callcenter@nantucketbank.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"457","name":"National Penn Bank","fid":"6301","org":"National Penn Bank","url":"https://www.oasis.cfree.com/6301.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-23 22:19:27","lastsslvalidation":"2016-01-18 16:15:24"},{"id":"458","name":"Nevada State Bank - New","fid":"1121","org":"295-3","url":"https://quicken.metavante.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:28:22","lastsslvalidation":"2015-07-02 23:28:22","profile":{"-addr1":"PO Box 990","-city":"Las Vegas","-state":"NV","-postalcode":"89125-0990","-country":"USA","-csphone":"1-888-835-0551","-tsphone":"1-888-835-0551","-url":"http://nsbank.com/contact/index.jsp","-email":"nsbankpfm@nsbank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-interxfermsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"459","name":"UBS Financial Services Inc.","fid":"7772","org":"Intuit","brokerid":"ubs.com","url":"https://ofx1.ubs.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 00:43:02","lastsslvalidation":"2015-12-26 20:28:02","profile":{"-addr1":"1285 Avenue of the Americas","-city":"New York","-state":"NY","-postalcode":"10011","-country":"USA","-csphone":"1-888-279-3343","-tsphone":"1-888-279-3343","-url":"http://financialservicesinc.ubs.com","-email":"OnlineService@ubs.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"460","name":"Patelco CU","fid":"2000","org":"Patelco Credit Union","url":"https://ofx.patelco.org","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:33:47","lastsslvalidation":"2015-07-02 23:33:45","profile":{"-addr1":"156 Second Street","-city":"San Francisco","-state":"CA","-postalcode":"94105","-country":"USA","-csphone":"415-442-6200","-tsphone":"800-358-8228","-url":"http://www.patelco.org","-email":"patelco@patelco.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"461","name":"Mercantile Brokerage Services","fid":"011","org":"Mercantile Brokerage","brokerid":"mercbrokerage.com","url":"https://ofx.netxclient.com/cgi/OFXNetx","ofxfail":"3","sslfail":"0","lastofxvalidation":"2014-03-18 22:41:57","lastsslvalidation":"2015-07-02 23:21:28","profile":{"-addr1":"620 Liberty Avenue","-city":"Pittsburgh","-state":"PA","-postalcode":"15222","-country":"USA","-csphone":"1-800-762-6111","-tsphone":"-","-url":"http://www.pnc.com","-email":"Michael.ley@pnc.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"462","name":"Regions Bank","fid":"243","org":"regions.com","brokerid":"regions.com","url":"https://ofx.morgankeegan.com/begasp/directtocore.asp","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-03-21 22:53:29","lastsslvalidation":"2014-07-16 22:38:01"},{"id":"463","name":"Spectrum Connect/Reich&Tang","fid":"6510","org":"SpectrumConnect","url":"https://www.oasis.cfree.com/6510.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-17 14:16:29","lastsslvalidation":"2016-01-09 17:21:13"},{"id":"464","name":"Smith Barney - Transactions","fid":"3201","org":"SmithBarney","url":"https://www.oasis.cfree.com/3201.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-27 14:23:03","lastsslvalidation":"2015-12-18 20:37:25"},{"id":"465","name":"Southwest Airlines FCU","fid":"311090673","org":"Southwest Airlines EFCU","url":"https://www.swacuflashbp.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 02:05:45","lastsslvalidation":"2009-12-23 02:05:44"},{"id":"466","name":"T. Rowe Price","org":"T. Rowe Price","brokerid":"troweprice.com","url":"https://www3.troweprice.com/ffs/ffsweb/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-11 07:15:01","lastsslvalidation":"2015-11-02 02:19:28","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"467","name":"Technology Credit Union - CA","fid":"11257","org":"Tech CU","url":"https://webbranchofx.techcu.com/TekPortalOFX/servlet/TP_OFX_Controller","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-10-06 23:37:39","lastsslvalidation":"2014-10-06 23:37:38","profile":{"-addr1":"2010 North First Street","-addr2":"PO Box 1409","-city":"San Jose","-state":"CA","-postalcode":"95109-1409","-country":"USA","-csphone":"800-553-0880","-tsphone":"800-553-0880","-url":"http://www.techcu.com/","-email":"support@tekbank.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"468","name":"UMB Bank","fid":"0","org":"UMB","url":"https://pcbanking.umb.com/hs_ofx/hsofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2008-10-08 01:35:42","lastsslvalidation":"2008-10-08 01:35:41"},{"id":"469","name":"Union Bank of California","fid":"2901","org":"Union Bank of California","url":"https://www.oasis.cfree.com/2901.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-12 16:02:13","lastsslvalidation":"2015-12-20 10:16:13"},{"id":"470","name":"United Teletech Financial","fid":"221276011","org":"DI","url":"https://ofxcore.digitalinsight.com:443/servlet/OFXCoreServlet","ofxfail":"1","sslfail":"5","lastofxvalidation":"2008-12-16 01:50:18","lastsslvalidation":"2008-12-16 01:50:17"},{"id":"471","name":"US Bank","fid":"1401","org":"US Bank","url":"https://www.oasis.cfree.com/1401.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-16 08:58:47","lastsslvalidation":"2015-11-05 15:17:49"},{"id":"472","name":"Bank of America (All except CA, WA,&ID)","fid":"6812","org":"HAN","url":"https://ofx.bankofamerica.com/cgi-forte/fortecgi?servicename=ofx_2-3&pagename=ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-03 22:15:29","lastsslvalidation":"2015-05-03 22:15:29","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"(800) 933-6262","-tsphone":"(800) 933-6262","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"473","name":"Wells Fargo","fid":"3000","org":"WF","url":"https://ofxdc.wellsfargo.com/ofx/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:50:51","lastsslvalidation":"2016-01-22 21:54:43","profile":{"-addr1":"P.O. Box 6808","-city":"Concord","-state":"CA","-postalcode":"94524","-country":"USA","-csphone":"1-800-956-4442","-tsphone":"1-800-956-4442","-url":"https://online.wellsfargo.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"474","name":"LaSalle Bank NA","fid":"6501","org":"LaSalle Bank NA","url":"https://www.oasis.cfree.com/6501.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 23:34:46","lastsslvalidation":"2015-07-02 23:19:34"},{"id":"475","name":"BB&T","fid":"BB&T","org":"BB&T","url":"https://eftx.bbt.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-24 12:00:31","lastsslvalidation":"2015-07-02 22:26:12"},{"id":"476","name":"Los Alamos National Bank","fid":"107001012","org":"LANB","url":"https://ofx.lanb.com/ofx/ofxrelay.dll","ofxfail":"0","sslfail":"4","lastofxvalidation":"2015-12-27 16:33:26","lastsslvalidation":"2014-02-13 22:39:37","profile":{"-addr1":"1200 Trinity Drive","-city":"Los Alamos","-state":"NM","-postalcode":"87544","-country":"USA","-csphone":"5056625171","-tsphone":"5056620239","-url":"WWW.LANB.COM","-email":"lanb@lanb.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"477","name":"Citadel FCU","fid":"citadel","org":"CitadelFCU","url":"https://pcu.citadelfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-09-12 22:05:43","lastsslvalidation":"2014-10-23 22:21:26","profile":{"-addr1":"3030 Zinn Road","-city":"Thorndale","-state":"PA","-postalcode":"19372","-country":"USA","-csphone":"610-380-6000","-tsphone":"610-380-6000","-url":"https://www.citadelfcu.org","-email":"info@citadelfcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"478","name":"Clearview Federal Credit Union","fid":"243083237","org":"Clearview Federal Credit Union","url":"https://www.pcu.clearviewfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:42:29","lastsslvalidation":"2009-12-23 01:42:28"},{"id":"479","name":"Vanguard Group, The","fid":"1358","org":"The Vanguard Group","brokerid":"vanguard.com","url":"https://vesnc.vanguard.com/us/OfxDirectConnectServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 00:09:30","lastsslvalidation":"2015-10-25 04:03:04","profile":{"-addr1":"P.O. Box 1110","-city":"Valley Forge","-state":"PA","-postalcode":"19482-1110","-country":"USA","-csphone":"1-212-723-2898","-tsphone":"1-212-723-2898","-url":"https://vesnc.vanguard.com/us/OfxDirectConnectServlet","-email":"alex_shnir@smb.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-emailmsgset":"true","-seclistmsgset":"true"}},{"id":"480","name":"First Citizens Bank - NC, VA, WV","fid":"5013","org":"First Citizens Bank NC, VA, WV","url":"https://www.oasis.cfree.com/5013.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:58:01","lastsslvalidation":"2015-07-02 22:58:01"},{"id":"481","name":"Northern Trust - Banking","fid":"5804","org":"ORG","url":"https://www3883.ntrs.com/nta/ofxservlet","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-03-14 22:33:34","lastsslvalidation":"2015-03-26 23:22:06","profile":{"-addr1":"50 South LaSalle Street","-city":"Chicago","-state":"IL","-postalcode":"60675","-country":"USA","-csphone":"888-635-5350","-tsphone":"888-635-5350","-url":"https://web-xp1-ofx.ntrs.com/ofx/ofxservlet","-email":"www.northerntrust.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"482","name":"The Mechanics Bank","fid":"121102036","org":"TMB","url":"https://ofx.mechbank.com/OFXServer/ofxsrvr.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-04-25 22:21:40","lastsslvalidation":"2011-04-25 22:21:40"},{"id":"483","name":"USAA Federal Savings Bank","fid":"24591","org":"USAA","url":"https://service2.usaa.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-06 23:02:04","lastsslvalidation":"2016-01-06 23:05:03","profile":{"-addr1":"10750 McDermott Freeway","-city":"San Antonio","-state":"TX","-postalcode":"78288","-country":"USA","-csphone":"877-820-8320","-tsphone":"877-820-8320","-url":"www.usaa.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"484","name":"Florida Telco CU","fid":"FTCU","org":"FloridaTelcoCU","url":"https://ppc.floridatelco.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-09-06 22:15:02","lastsslvalidation":"2009-12-23 01:47:48","profile":{"-addr1":"9700 Touchton Rd","-city":"Jacksonville","-state":"FL","-postalcode":"32246","-country":"USA","-csphone":"904-723-6300","-tsphone":"904-723-6300","-url":"https://121fcu.org","-email":"webmaster@121fcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"485","name":"DuPont Community Credit Union","fid":"251483311","org":"DuPont Community Credit Union","url":"https://pcu.mydccu.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-11-17 01:42:26","lastsslvalidation":"2009-12-23 01:46:53"},{"id":"486","name":"Central Florida Educators FCU","fid":"590678236","org":"CentralFloridaEduc","url":"https://www.mattweb.cfefcu.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-02-18 22:08:38","lastsslvalidation":"2012-03-19 22:05:30","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"487","name":"California Bank&Trust","fid":"5006","org":"401","url":"https://pfm.metavante.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 00:31:08","lastsslvalidation":"2015-07-02 22:28:05","profile":{"-addr1":"9775 Claremont Mesa Blvd","-city":"San Diego","-state":"CA","-postalcode":"92124","-country":"USA","-csphone":"888-217-1265","-tsphone":"888-217-1265","-url":"www.calbanktrust.com","-email":"cbtquestions@calbt.com","-signonmsgset":"true","-bankmsgset":"true","-interxfermsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"488","name":"First Commonwealth FCU","fid":"231379199","org":"FirstCommonwealthFCU","url":"https://pcu.firstcomcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-05-31 22:27:02","lastsslvalidation":"2013-10-07 22:14:50","profile":{"-addr1":"P.O. Box 20450","-city":"Lehigh Valley","-state":"PA","-postalcode":"18002","-country":"USA","-csphone":"610-821-2403","-tsphone":"610-821-2403","-url":"https://www.firstcomcu.org","-email":"memserv@firstcomcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"489","name":"Ameriprise Financial Services, Inc.","fid":"3102","org":"AMPF","brokerid":"ameriprise.com","url":"https://www25.ameriprise.com/AMPFWeb/ofxdl/us/download?request_type=nl_desktopdownload","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:16:05","lastsslvalidation":"2016-01-21 08:00:06","profile":{"-addr1":"70400 Ameriprise Financial Ctr.","-city":"Minneapolis","-state":"MN","-postalcode":"55474","-country":"USA","-csphone":"1-800-297-8800","-tsphone":"1-800-297-SERV","-url":"http://www.ameriprise.com","-email":"broker@ampf.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"490","name":"AltaOne Federal Credit Union","fid":"322274462","org":"AltaOneFCU","url":"https://pcu.altaone.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-09-10 01:32:25","lastsslvalidation":"2009-12-25 01:32:52","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"491","name":"A. G. Edwards and Sons, Inc.","fid":"43-0895447","org":"A.G. Edwards","brokerid":"agedwards.com","url":"https://ofx.agedwards.com","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-05-01 01:30:10","lastsslvalidation":"2009-05-01 01:30:10"},{"id":"492","name":"Educational Employees CU Fresno","fid":"321172594","org":"Educational Employees C U","url":"https://www.eecuonline.org/scripts/isaofx.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2011-08-21 01:18:02","lastsslvalidation":"2015-11-20 21:23:53","profile":{"-addr1":"2222 West Shaw","-city":"Fresno","-state":"CA","-postalcode":"93711","-country":"USA","-csphone":"1-800-538-3328","-tsphone":"1-800-538-3328","-url":"http://www.eecufresno.org","-email":"onlineaccesss@eecufresno.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"493","name":"Hawthorne Credit Union","fid":"271979193","org":"Hawthorne Credit Union","url":"https://hwt.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-08-15 22:22:55","lastsslvalidation":"2013-08-15 22:22:55","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"494","name":"Firstar","fid":"1255","org":"Firstar","url":"https://www.oasis.cfree.com/1255.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:05:30","lastsslvalidation":"2015-07-02 23:05:30"},{"id":"495","name":"myStreetscape","fid":"7784","org":"Fidelity","brokerid":"1234","url":"https://ofx.ibgstreetscape.com:443","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:26:35","lastsslvalidation":"2016-01-12 13:35:24","profile":{"-addr1":"XXXXXXXXXX","-city":"XXXXXXXXXX","-state":"XX","-postalcode":"XXXXX","-country":"USA","-csphone":"Contact your broker/dealer.","-tsphone":"Contact your broker/dealer.","-url":"https://ofx.ibgstreetscape.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"496","name":"Collegedale Credit Union","fid":"35GFA","org":"CollegedaleCU","url":"https://www.netit.financial-net.com/ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:56","lastsslvalidation":"2015-07-02 22:33:55","profile":{"-addr1":"5046 FLEMING PLAZA","-city":"COLLEGEDALE","-state":"TN","-postalcode":"37315","-country":"US","-url":"https://www.netit.financial-net.com/collegedale","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"497","name":"AIM Investments","brokerid":"dstsystems.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=3000812","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:04:20","lastsslvalidation":"2016-01-24 17:44:16","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"498","name":"GCS Federal Credit Union","fid":"281076853","org":"Granite City Steel cu","url":"https://pcu.mygcscu.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-04-10 22:15:02","lastsslvalidation":"2012-04-10 22:15:02","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"499","name":"Vantage Credit Union","fid":"281081479","org":"EECU-St. Louis","url":"https://secure2.eecu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"5","lastofxvalidation":"2015-07-03 00:09:38","lastsslvalidation":"2014-10-20 23:50:11","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"500","name":"Morgan Stanley ClientServ","fid":"1235","org":"msdw.com","brokerid":"msdw.com","url":"https://ofx.morganstanleyclientserv.com/ofx/ProfileMSMoney.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-13 04:13:42","lastsslvalidation":"2015-07-02 23:23:18","profile":{"-addr1":"1 New York Plaza","-addr2":"11th Floor","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-csphone":"(800) 531-1596","-tsphone":"(800) 531-1596","-url":"www.morganstanleyclientserv.com","-email":"clientservfeedback@morganstanley","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"501","name":"Kennedy Space Center FCU","fid":"263179532","org":"Kennedy Space Center FCU","url":"https://www.pcu.kscfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-12-19 22:35:41","lastsslvalidation":"2013-12-19 22:35:40","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"502","name":"Sierra Central Credit Union","fid":"321174770","org":"Sierra Central Credit Union","url":"https://www.sierracpu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-18 19:40:37","lastsslvalidation":"2009-03-16 01:36:11","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"503","name":"Virginia Educators Credit Union","fid":"251481355","org":"Virginia Educators CU","url":"https://www.vecumoneylink.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-09-29 22:30:05","lastsslvalidation":"2011-09-29 22:30:05","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"504","name":"Red Crown Federal Credit Union","fid":"303986148","org":"Red Crown FCU","url":"https://cre.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:57:55","lastsslvalidation":"2009-12-23 01:57:54"},{"id":"505","name":"B-M S Federal Credit Union","fid":"221277007","org":"B-M S Federal Credit Union","url":"https://bms.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-25 01:33:03","lastsslvalidation":"2013-10-01 22:04:57"},{"id":"506","name":"Fort Stewart GeorgiaFCU","fid":"261271364","org":"Fort Stewart FCU","url":"https://fsg.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-07-31 22:11:12","lastsslvalidation":"2011-08-30 03:21:07"},{"id":"507","name":"Northern Trust - Investments","fid":"6028","org":"Northern Trust Investments","brokerid":"northerntrust.com","url":"https://www3883.ntrs.com/nta/ofxservlet?accounttypegroup=INV","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-03-14 22:33:38","lastsslvalidation":"2015-03-26 23:22:09","profile":{"-addr1":"50 South LaSalle Street","-city":"Chicago","-state":"IL","-postalcode":"60675","-country":"USA","-csphone":"888-635-5350","-tsphone":"888-635-5350","-url":"https://web-xp1-ofx.ntrs.com/ofx/ofxservlet","-email":"www.northerntrust.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"508","name":"Picatinny Federal Credit Union","fid":"221275216","org":"Picatinny Federal Credit Union","url":"https://banking.picacreditunion.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-07-02 23:38:40","lastsslvalidation":"2009-12-23 01:57:48","profile":{"-addr1":"100 Mineral Springs Drive","-city":"Dover","-state":"NJ","-postalcode":"07801","-country":"USA","-csphone":"973-361-5225","-tsphone":"973-361-5225","-url":"http://www.picacreditunion.com","-email":"homebanking@picacreditunion.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"509","name":"SAC FEDERAL CREDIT UNION","fid":"091901480","org":"SAC Federal CU","url":"https://pcu.sacfcu.com/scripts/isaofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2009-11-16 01:56:03","lastsslvalidation":"2009-11-16 01:56:02"},{"id":"510","name":"Merrill Lynch&Co., Inc.","fid":"5550","org":"Merrill Lynch & Co., Inc.","brokerid":"www.mldirect.ml.com","url":"https://taxcert.mlol.ml.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-16 01:08:32","lastsslvalidation":"2016-01-24 17:44:22","profile":{"-addr1":"55 Broad Street","-addr2":"2nd Floor","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-csphone":"212 344 2000","-tsphone":"212 344 2000","-url":"www.joineei.com","-email":"support@joineei.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"511","name":"Southeastern CU","fid":"261271500","org":"Southeastern FCU","url":"https://moo.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 02:05:44","lastsslvalidation":"2009-12-23 02:05:43"},{"id":"512","name":"Texas Dow Employees Credit Union","fid":"313185515","org":"TexasDow","url":"https://allthetime.tdecu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-09-22 17:23:17","lastsslvalidation":"2015-09-17 03:08:13","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"513","name":"University Federal Credit Union","fid":"314977405","org":"Univerisity FCU","url":"https://OnDemand.ufcu.org/scripts/isaofx.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2009-05-08 01:45:24","lastsslvalidation":"2015-07-03 00:09:20"},{"id":"514","name":"Yakima Valley Credit Union","fid":"325183796","org":"Yakima Valley Credit Union","url":"https://secure1.yvcu.org/scripts/isaofx.dll","ofxfail":"2","sslfail":"4","lastofxvalidation":"2009-11-16 02:01:24","lastsslvalidation":"2011-10-03 22:29:53"},{"id":"515","name":"First Community FCU","fid":"272483633","org":"FirstCommunityFCU","url":"https://pcu.1stcomm.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-12-01 22:14:20","lastsslvalidation":"2012-03-06 22:14:29","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"516","name":"Wells Fargo Advisor","fid":"1030","org":"strong.com","brokerid":"strong.com","url":"https://ofx.wellsfargoadvantagefunds.com/eftxWeb/Access.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-01-26 22:29:39","lastsslvalidation":"2013-01-26 22:51:03","profile":{"-addr1":"100 Heritage Reserve","-city":"Menomonee Falls","-state":"WI","-postalcode":"53051","-country":"USA","-csphone":"1-800-359-3379","-tsphone":"1-800-359-3379","-url":"www.wellsfargoadvantagefunds.com","-email":"fundservice@wellsfargo.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"517","name":"Chicago Patrolmens FCU","fid":"271078146","org":"Chicago Patrolmens CU","url":"https://chp.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-07-29 22:04:53","lastsslvalidation":"2012-07-29 22:04:53","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"518","name":"Signal Financial Federal Credit Union","fid":"255075495","org":"Washington Telephone FCU","url":"https://webpb.sfonline.org/scripts/isaofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2009-12-23 02:05:39","lastsslvalidation":"2011-03-31 22:17:19"},{"id":"519","name":"Dupaco Community Credit Union","org":"Dupaco Community Credit Union","url":"https://dupaconnect.dupaco.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:46:52","lastsslvalidation":"2009-12-23 01:46:50","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"520","name":"Bank-Fund Staff FCU","fid":"2","org":"Bank Fund Staff FCU","url":"https://secure.bfsfcu.org/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-03-30 22:03:51","lastsslvalidation":"2011-03-30 22:03:50"},{"id":"521","name":"APCO EMPLOYEES CREDIT UNION","fid":"262087609","org":"APCO Employees Credit Union","url":"https://apc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-08-14 22:03:11","lastsslvalidation":"2013-08-14 22:03:10","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"522","name":"Bank of Tampa, The","fid":"063108680","org":"BOT","url":"https://OFX.Bankoftampa.com/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:22:53","lastsslvalidation":"2015-07-02 22:22:52","profile":{"-addr1":"4503 Woodland Corporate Blvd Suite 100","-city":"Tampa","-state":"FL","-postalcode":"33614","-country":"USA","-csphone":"813-872-1282","-url":"www.bankoftampa.com","-email":"ebanking@bankoftampa.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"523","name":"Cedar Point Federal Credit Union","fid":"255077736","org":"Cedar Point Federal Credit Union","url":"https://pcu.cpfcu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-09 04:26:34","lastsslvalidation":"2015-07-02 22:28:33","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"524","name":"Las Colinas FCU","fid":"311080573","org":"Las Colinas Federal CU","url":"https://las.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-07-01 23:34:50","lastsslvalidation":"2013-10-01 22:25:41","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"525","name":"McCoy Federal Credit Union","fid":"263179956","org":"McCoy Federal Credit Union","url":"https://www.mccoydirect.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:49:22","lastsslvalidation":"2009-12-23 01:49:21"},{"id":"526","name":"Old National Bank","fid":"11638","org":"ONB","url":"https://www.ofx.oldnational.com/ofxpreprocess.asp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:33:34","lastsslvalidation":"2015-07-02 23:33:33","profile":{"-addr1":"420 Main Street","-city":"Evansville","-state":"IN","-postalcode":"47708","-country":"USA","-csphone":"800-844-1720","-tsphone":"800-844-1720","-url":"http://www.oldnational.com","-email":"eftservices@oldnational.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"527","name":"Citizens Bank - Consumer","fid":"CTZBK","org":"CheckFree OFX","url":"https://www.oasis.cfree.com/0CTZBK.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:53","lastsslvalidation":"2015-07-02 22:33:53"},{"id":"528","name":"Citizens Bank - Business","fid":"4639","org":"CheckFree OFX","url":"https://www.oasis.cfree.com/04639.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:52","lastsslvalidation":"2015-07-02 22:33:52"},{"id":"529","name":"Century Federal Credit Union","fid":"241075056","org":"CenturyFederalCU","url":"https://pcu.cenfedcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-01-20 22:45:36","lastsslvalidation":"2015-01-07 22:18:15","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"530","name":"ABNB Federal Credit Union","fid":"251481627","org":"ABNB Federal Credit Union","url":"https://cuathome.abnbfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-10-25 22:02:10","lastsslvalidation":"2011-10-25 22:02:09","profile":{"-addr1":"830 Greenbrier Circle","-city":"Chesapeake","-state":"VA","-postalcode":"23320","-country":"USA","-csphone":"757-523-5300","-tsphone":"757-523-5300","-url":"http://www.abnbfcu.org","-email":"services@abnb.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"531","name":"Allegiance Credit Union","fid":"303085230","org":"Federal Employees CU","url":"https://fed.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-25 01:32:51","lastsslvalidation":"2011-08-30 03:07:31"},{"id":"532","name":"Wright Patman Congressional FCU","fid":"254074345","org":"Wright Patman Congressional FCU","url":"https://www.congressionalonline.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 02:06:54","lastsslvalidation":"2011-02-17 01:20:24"},{"id":"533","name":"America First Credit Union","fid":"54324","org":"America First Credit Union","url":"https://ofx.americafirst.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-23 21:50:58","lastsslvalidation":"2016-01-21 23:33:52","profile":{"-addr1":"PO Box 9199","-city":"Ogden","-state":"UT","-postalcode":"84409","-country":"USA","-csphone":"800.999.3961","-tsphone":"866.224.2158","-url":"http://www.americafirst.com","-email":"support@americafirst.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"534","name":"Motorola Employees Credit Union","fid":"271984311","org":"Motorola Employees CU","url":"https://mecuofx.mecunet.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-06-26 01:37:30","lastsslvalidation":"2009-06-29 01:36:05"},{"id":"535","name":"Finance Center FCU (IN)","fid":"274073876","org":"Finance Center FCU","url":"https://sec.fcfcu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-01 19:20:50","lastsslvalidation":"2015-07-02 22:54:48","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"536","name":"Fort Knox Federal Credit Union","fid":"283978425","org":"Fort Knox Federal Credit Union","url":"https://fcs1.fkfcu.org/scripts/isaofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2012-09-24 22:19:21","lastsslvalidation":"2012-10-24 22:18:55","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"537","name":"Wachovia Bank","fid":"4309","org":"Wachovia","url":"https://pfmpw.wachovia.com/cgi-forte/fortecgi?servicename=ofx&pagename=PFM","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-10-02 22:43:46","lastsslvalidation":"2013-02-04 22:47:39"},{"id":"538","name":"Think Federal Credit Union","fid":"291975465","org":"IBMCU","url":"https://ofx.ibmcu.com","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-05-30 22:20:53","lastsslvalidation":"2011-05-30 22:20:50"},{"id":"539","name":"PSECU","fid":"54354","org":"Teknowledge","url":"https://ofx.psecu.com/servlet/OFXServlet","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-02-19 22:52:18","lastsslvalidation":"2014-07-07 22:36:54","profile":{"-addr1":"1 Credit Union Place","-city":"Harrisburg","-state":"PA","-postalcode":"17110","-country":"USA","-csphone":"(800) 237-7328","-tsphone":"(717) 772-2272","-url":"http://www.psecu.com","-email":"support@psecu.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"540","name":"Envision Credit Union","fid":"263182558","org":"Envision Credit Union","url":"https://pcu.envisioncu.com/scripts/isaofx.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2012-12-11 22:16:18","lastsslvalidation":"2016-01-22 11:27:32","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"541","name":"Columbia Credit Union","fid":"323383349","org":"Columbia Credit Union","url":"https://ofx.columbiacu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-03-05 22:14:48","lastsslvalidation":"2014-03-05 22:14:48","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"542","name":"1st Advantage FCU","fid":"251480563","org":"1st Advantage FCU","url":"https://members.1stadvantage.org/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 01:20:38","lastsslvalidation":"2015-08-04 14:15:23","profile":{"-addr1":"12891 Jefferson Avenue","-city":"Newport News","-state":"VA","-postalcode":"23608","-country":"USA","-csphone":"757-877-2444","-tsphone":"757-877-2444","-url":"http://www.1stadvantage.org","-email":"tmcabee@1stadvantage.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"543","name":"Central Maine FCU","fid":"211287926","org":"Central Maine FCU","url":"https://cro.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-10-01 22:07:56","lastsslvalidation":"2013-10-01 22:07:55","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"544","name":"Kirtland Federal Credit Union","fid":"307070050","org":"Kirtland Federal Credit Union","url":"https://pcu.kirtlandfcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-11-05 22:24:44","lastsslvalidation":"2012-11-05 22:24:43","profile":{"-addr1":"6440 Gibson Blvd. SE","-city":"Albuquerque","-state":"NM","-postalcode":"87108","-country":"USA","-csphone":"505-254-4369","-tsphone":"505-254-4369","-url":"http://www.kirtlandfcu.org","-email":"kirtland@kirtlandfcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"545","name":"Chesterfield Federal Credit Union","fid":"251480327","org":"Chesterfield Employees FCU","url":"https://chf.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:42:22","lastsslvalidation":"2013-10-01 22:08:09"},{"id":"546","name":"Campus USA Credit Union","fid":"263178478","org":"Campus USA Credit Union","url":"https://que.campuscu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"5","lastofxvalidation":"2016-01-22 21:51:36","lastsslvalidation":"2011-01-29 11:15:09","profile":{"-addr1":"PO BOX 147029","-city":"Gainesville","-state":"FL","-postalcode":"32614","-country":"USA","-csphone":"352-335-9090","-tsphone":"352-335-9090","-url":"http://www.campuscu.com","-email":"info@campuscu.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"547","name":"Summit Credit Union (WI)","fid":"275979034","org":"Summit Credit Union","url":"https://branch.summitcreditunion.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-02-18 01:42:39","lastsslvalidation":"2009-05-07 01:43:13"},{"id":"548","name":"Financial Center CU","fid":"321177803","org":"Fincancial Center Credit Union","url":"https://fin.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-10-01 22:16:19","lastsslvalidation":"2013-10-01 22:16:17","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"549","name":"Hawaiian Tel Federal Credit Union","fid":"321379070","org":"Hawaiian Tel FCU","url":"https://htl.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:47:57","lastsslvalidation":"2012-08-15 08:13:42"},{"id":"550","name":"Addison Avenue Federal Credit Union","fid":"11288","org":"hpcu","url":"https://ofx.addisonavenue.com","ofxfail":"0","sslfail":"4","lastofxvalidation":"2015-07-02 22:04:16","lastsslvalidation":"2011-05-26 22:02:25","profile":{"-addr1":"3408 Hillview Ave","-city":"Palo Alto","-state":"CA","-postalcode":"94304","-country":"USA","-csphone":"877.233.4766","-tsphone":"877.233.4766","-url":"http://www.addisonavenue.com","-email":"email@addisonavenue.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"551","name":"Navy Army Federal Credit Union","fid":"111904503","org":"Navy Army Federal Credit Union","url":"https://mybranch.navyarmyfcu.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-07-01 23:39:12","lastsslvalidation":"2012-04-09 22:23:43","profile":{"-addr1":"5725 Spohn Drive","-city":"Corpus Christi","-state":"TX","-postalcode":"78414","-country":"USA","-csphone":"361-986-4500","-tsphone":"800-622-3631","-url":"http://www.navyarmyccu.com","-email":"general@navyarmyccu.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"552","name":"Nevada Federal Credit Union","fid":"10888","org":"PSI","url":"https://ssl4.nevadafederal.org/ofxdirect/ofxrqst.aspx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-09-04 22:26:54","lastsslvalidation":"2012-10-01 22:28:38","profile":{"-addr1":"2645 South Mojave","-city":"Las Vegas","-state":"NV","-postalcode":"98121","-country":"USA","-csphone":"(701) 457-1000","-url":"https://ssl8.onenevada.org/silverlink/login.asp","-email":"oncusupport@onenevada.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"553","name":"66 Federal Credit Union","fid":"289","org":"SixySix","url":"https://ofx.cuonlineaccounts.org","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-03-25 22:00:11","lastsslvalidation":"2012-03-25 22:00:10","profile":{"-addr1":"501 S. Johnstone","-city":"Bartlesville","-state":"ok","-postalcode":"74003","-country":"USA","-csphone":"918.336.7662","-tsphone":"918.337.7716","-url":"http://www.66fcu.org","-email":"talk2us@66fcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"554","name":"FirstBank of Colorado","fid":"FirstBank","org":"FBDC","url":"https://www.efirstbankpfm.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:05:31","lastsslvalidation":"2015-07-02 23:05:31","profile":{"-addr1":"12345 W Colfax Ave.","-city":"Lakewood","-state":"CO","-postalcode":"80215","-country":"USA","-csphone":"303-232-5522 or 800-964-3444","-url":"http://www.efirstbank.com","-email":"banking@efirstbank.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"555","name":"Continental Federal Credit Union","fid":"322077559","org":"Continenetal FCU","url":"https://cnt.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:46:33","lastsslvalidation":"2012-07-30 22:05:38"},{"id":"556","name":"Fremont Bank","fid":"121107882","org":"Fremont Bank","url":"https://ofx.fremontbank.com/OFXServer/FBOFXSrvr.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-05-27 22:24:23","lastsslvalidation":"2014-05-27 22:24:23","profile":{"-addr1":"39150 Fremont Blvd.","-city":"Fremont","-state":"CA","-postalcode":"94538","-country":"USA","-csphone":"(510) 505-5226","-tsphone":"(510) 505-5226","-url":"http://www.fremontbank.com","-email":"bankinfo@fremontbank.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"557","name":"Peninsula Community Federal Credit Union","fid":"325182344","org":"Peninsula Credit Union","url":"https://mas.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:57:43","lastsslvalidation":"2011-08-30 03:27:20"},{"id":"558","name":"Fidelity NetBenefits","fid":"8288","org":"nbofx.fidelity.com","brokerid":"nbofx.fidelity.com","url":"https://nbofx.fidelity.com/netbenefits/ofx/download","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:54:46","lastsslvalidation":"2015-07-02 22:54:46","profile":{"-addr1":"Fidelity Investments","-addr2":"P.O. Box 55017","-city":"Boston","-state":"MA","-postalcode":"02205","-country":"USA","-csphone":"800-581-5800","-tsphone":"800-581-5800","-url":"http://www.401k.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"559","name":"Fall River Municipal CU","fid":"211382591","org":"Fall River Municipal CU","url":"https://fal.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:47:14","lastsslvalidation":"2013-12-04 22:27:24"},{"id":"560","name":"University Credit Union","fid":"267077850","org":"University Credit Union","url":"https://umc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-10-01 22:41:06","lastsslvalidation":"2013-10-01 22:41:05","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"561","name":"Dominion Credit Union","fid":"251082644","org":"Dominion Credit Union","url":"https://dom.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-09-24 22:11:50","lastsslvalidation":"2012-09-24 22:11:50","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"562","name":"HFS Federal Credit Union","fid":"321378660","org":"HFS Federal Credit Union","url":"https://hfs.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-16 01:48:08","lastsslvalidation":"2009-12-23 01:48:00"},{"id":"563","name":"IronStone Bank","fid":"5012","org":"Atlantic States Bank","url":"https://www.oasis.cfree.com/5012.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:16:00","lastsslvalidation":"2015-07-02 23:16:00"},{"id":"564","name":"Utah Community Credit Union","fid":"324377820","org":"Utah Community Credit Union","url":"https://ofx.uccu.com/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-21 10:36:17","lastsslvalidation":"2015-11-04 02:03:24","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"565","name":"OptionsXpress, Inc","fid":"10876","org":"10876","brokerid":"optionxpress.com","url":"https://ofx.optionsxpress.com/cgi-bin/ox.exe","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:33:44","lastsslvalidation":"2015-07-02 23:33:42","profile":{"-addr1":"P. O. Box 2197","-city":"Chicago","-state":"Il","-postalcode":"60690-2197","-country":"USA","-csphone":"1-212-723-2898","-tsphone":"1-212-723-2898","-url":"https://ofx.optionsxpress.com/cgi-bin/ox.exe","-email":"alex_shnir@smb.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true","-notes":"Short sales may be imported as regular sell transactions Mutual fund purchases may show up as dividend reinvestments Other transaction types may be mis-labeled"}},{"id":"566","name":"Ariel Mutual Funds","org":"DST","brokerid":"ariel.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50017080411","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-28 09:57:53","lastsslvalidation":"2016-01-22 21:54:51","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"567","name":"Prudential Retirement","fid":"1271","org":"Prudential Retirement Services","brokerid":"prudential.com","url":"https://ofx.prudential.com/eftxweb/EFTXWebRedirector","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-24 17:21:33","lastsslvalidation":"2015-07-02 23:38:42","profile":{"-addr1":"Gateway Center 3","-addr2":"11th Floor","-city":"Newark","-state":"NJ","-postalcode":"07102","-country":"USA","-csphone":"(800)562-8838","-tsphone":"(732)482-6356","-url":"www.prudential.com/online/retirement/","-email":"rsofeedback@prudential.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"568","name":"Wells Fargo Investments, LLC","fid":"10762","org":"wellsfargo.com","brokerid":"wellsfargo.com","url":"https://invmnt.wellsfargo.com/inv/directConnect","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-09-28 22:29:26","lastsslvalidation":"2011-09-28 22:29:26","profile":{"-addr1":"420 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-csphone":"1-877-823-7782","-tsphone":"1-800-956-4442","-url":"www.wellsfargo.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"569","name":"Cyprus Federal Credit Union","org":"Cyprus Federal Credit Union","url":"https://pctouchlink.cypruscu.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-08-13 22:08:00","lastsslvalidation":"2012-08-13 22:08:00","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"570","name":"Penson Financial Services","fid":"10780","org":"Penson Financial Services Inc","brokerid":"penson.com","url":"https://ofx.penson.com","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-02-03 22:35:47","lastsslvalidation":"2013-02-03 22:35:46","profile":{"-addr1":"1700 Pacific Ave","-addr2":"Suite 1400","-city":"Dallas","-state":"TX","-postalcode":"75201","-country":"USA","-csphone":"214.765.1100","-tsphone":"214.765.1100","-url":"http://www.penson.com","-email":"conversions@penson.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"571","name":"Tri Boro Federal Credit Union","fid":"243382747","org":"Tri Boro Federal Credit Union","url":"https://tri.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 02:05:57","lastsslvalidation":"2013-10-01 22:37:55"},{"id":"572","name":"Hewitt Associates LLC","fid":"242","org":"hewitt.com","brokerid":"hewitt.com","url":"https://seven.was.hewitt.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-12 05:09:20","lastsslvalidation":"2015-07-02 23:14:24","profile":{"-addr1":"100 Half Day Road","-addr2":"NONE","-addr3":"NONE","-city":"Lincolnshire","-state":"IL","-postalcode":"60069","-country":"USA","-csphone":"YOUR 401(K) PLAN","-tsphone":"YOUR 401(K) PLAN","-url":"www.hewitt.com","-email":"2","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"573","name":"Delta Community Credit Union","fid":"3328","org":"decu.org","url":"https://appweb.deltacommunitycu.com/ofxroot/directtocore.asp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 07:57:47","lastsslvalidation":"2016-01-21 08:01:04","profile":{"-addr1":"1025 Virgina Ave","-city":"Atlanta","-state":"GA","-postalcode":"30354","-country":"USA","-csphone":"800 954 3060","-tsphone":"800 954 3060","-url":"www.decu.org","-email":"itemp@decu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"574","name":"Huntington National Bank","fid":"3701","org":"Huntington","url":"https://onlinebanking.huntington.com/scripts/serverext.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2009-12-23 01:48:54","lastsslvalidation":"2016-01-21 08:01:10"},{"id":"575","name":"WSECU","fid":"325181028","org":"WSECU","url":"https://ssl3.wsecu.org/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 18:38:01","lastsslvalidation":"2015-07-03 00:17:22","profile":{"-addr1":"330 Union Ave SE","-city":"Olympia","-state":"WA","-postalcode":"98501","-country":"USA","-csphone":"800-562-0999","-tsphone":"800-562-0999","-url":"www.wsecu.org","-email":"mfm.support@wsecu.org","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"576","name":"Baton Rouge City Parish Emp FCU","fid":"265473333","org":"Baton Rouge City Parish EFCU","url":"https://bat.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-10-01 22:06:12","lastsslvalidation":"2013-10-01 22:06:11","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"577","name":"Schools Financial Credit Union","fid":"90001","org":"Teknowledge","url":"https://ofx.schools.org/TekPortalOFX/servlet/TP_OFX_Controller","ofxfail":"1","sslfail":"5","lastofxvalidation":"2008-11-06 01:36:22","lastsslvalidation":"2008-12-09 01:34:33"},{"id":"578","name":"Charles Schwab Bank, N.A.","fid":"101","org":"ISC","brokerid":"SCHWAB.COM","url":"https://ofx.schwab.com/bankcgi_dev/ofx_server","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:51:38","lastsslvalidation":"2016-01-22 21:54:56","profile":{"-addr1":"101 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-url":"WWW.SCHWAB.COM","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"579","name":"NW Preferred Federal Credit Union","fid":"323076575","org":"NW Preferred FCU","url":"https://nwf.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-01-01 22:33:54","lastsslvalidation":"2013-01-01 22:33:53","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"580","name":"Camino FCU","fid":"322279975","org":"Camino FCU","url":"https://homebanking.caminofcu.org/isaofx/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-12-05 22:04:38","lastsslvalidation":"2013-03-20 22:05:47","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"581","name":"Novartis Federal Credit Union","fid":"221278556","org":"Novartis FCU","url":"https://cib.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:57:32","lastsslvalidation":"2013-08-14 22:48:06"},{"id":"582","name":"U.S. First FCU","fid":"321076289","org":"US First FCU","url":"https://uff.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-09-30 01:46:28","lastsslvalidation":"2009-12-07 02:04:35"},{"id":"583","name":"FAA Technical Center FCU","fid":"231277440","org":"FAA Technical Center FCU","url":"https://ftc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:47:13","lastsslvalidation":"2013-08-14 22:20:13"},{"id":"584","name":"Municipal Employees Credit Union of Baltimore, Inc.","fid":"252076468","org":"Municipal ECU of Baltimore,Inc.","url":"https://mec.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-10-30 01:39:35","lastsslvalidation":"2009-10-30 01:39:34"},{"id":"585","name":"Day Air Credit Union","fid":"242277808","org":"Day Air Credit Union","url":"https://pcu.dayair.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-03-24 22:06:38","lastsslvalidation":"2012-03-24 22:06:38","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"586","name":"Texas State Bank - McAllen","fid":"114909013","org":"Texas State Bank","url":"https://www.tsb-a.com/OFXServer/ofxsrvr.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2008-08-21 01:36:30","lastsslvalidation":"2008-08-21 01:36:29"},{"id":"587","name":"OCTFCU","fid":"17600","org":"OCTFCU","url":"https://ofx.octfcu.org","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:33:32","lastsslvalidation":"2015-07-02 23:33:27","profile":{"-addr1":"15442 Del Amo Ave","-city":"Tustin","-state":"CA","-postalcode":"92780","-country":"USA","-csphone":"714.258.8700","-tsphone":"714.258.8700","-url":"http://www.octfcu.org","-email":"info@octfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"588","name":"Hawaii State FCU","fid":"321379041","org":"Hawaii State FCU","url":"https://hse.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:47:55","lastsslvalidation":"2012-05-31 22:14:10"},{"id":"589","name":"Royce&Associates","org":"DST","brokerid":"www.roycefunds.com","url":"https://ofx.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=51714240204","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:43:37","lastsslvalidation":"2016-01-22 21:55:11","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"590","name":"American Funds","org":"DST","brokerid":"www.americanfunds.com","url":"https://www2.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=3000518","ofxfail":"3","sslfail":"0","lastofxvalidation":"2012-08-11 22:03:36","lastsslvalidation":"2016-01-26 00:21:10","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"591","name":"Wells Fargo Advantage Funds","org":"DST","brokerid":"dstsystems.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=6181917141306","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:14:32","lastsslvalidation":"2016-01-22 21:55:13","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"592","name":"Community First Credit Union","fid":"275982801","org":"Community First Credit Union","url":"https://pcu.communityfirstcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2010-01-17 10:23:24","lastsslvalidation":"2014-01-16 22:14:26"},{"id":"593","name":"MTC Federal Credit Union","fid":"053285173","org":"MTC Federal Credit Union","url":"https://mic.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:53:21","lastsslvalidation":"2009-12-23 01:53:20"},{"id":"594","name":"Home Federal Savings Bank(MN/IA)","fid":"291270050","org":"VOneTwentySevenG","url":"https://ofx1.evault.ws/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-19 21:37:21","lastsslvalidation":"2015-12-18 06:00:54"},{"id":"595","name":"Reliant Community Credit Union","fid":"222382438","org":"W.C.T.A Federal Credit Union","url":"https://wct.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-10-10 22:29:05","lastsslvalidation":"2013-08-14 22:55:22","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"596","name":"Patriots Federal Credit Union","fid":"322281963","org":"PAT FCU","url":"https://pat.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-07-17 22:33:26","lastsslvalidation":"2013-08-14 22:52:53","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"597","name":"SafeAmerica Credit Union","fid":"321171757","org":"SafeAmerica Credit Union","url":"https://saf.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-08-14 22:55:40","lastsslvalidation":"2013-08-14 22:55:40","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"598","name":"Mayo Employees Federal Credit Union","fid":"291975478","org":"Mayo Employees FCU","url":"https://homebank.mayocreditunion.org/ofx/ofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2011-11-03 22:18:43","lastsslvalidation":"2011-11-03 22:18:43","profile":{"-addr1":"200 First Street SW","-city":"Rochester","-state":"MN","-postalcode":"30008","-country":"USA","-csphone":"800-535-2129","-url":"https://homebank.mayocreditunion.org","-email":"test@test.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"599","name":"FivePoint Credit Union","fid":"313187571","org":"FivePoint Credit Union","url":"https://tfcu-nfuse01.texacocommunity.org/internetconnector/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 10:42:27","lastsslvalidation":"2015-12-23 08:47:47","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"600","name":"Community Resource Bank","fid":"091917160","org":"CNB","url":"https://www.cnbinternet.com/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 23:33:02","lastsslvalidation":"2016-01-20 06:21:07","profile":{"-addr1":"1605 Heritage Drive","-city":"Northfield","-state":"MN","-postalcode":"55057","-country":"USA","-csphone":"800-250-8420","-url":"https://www.community-resourcebank.com","-email":"crb@community-resourcebank.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"601","name":"Security 1st FCU","fid":"314986292","org":"Security 1st FCU","url":"https://sec.usersonlnet.com/scripts/isaofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2011-07-17 22:22:56","lastsslvalidation":"2013-10-01 22:34:49"},{"id":"602","name":"First Alliance Credit Union","fid":"291975481","org":"First Alliance Credit Union","url":"https://fia.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-06-27 22:09:42","lastsslvalidation":"2013-10-01 22:16:20"},{"id":"603","name":"Billings Federal Credit Union","fid":"6217","org":"Billings Federal Credit Union","url":"https://bfcuonline.billingsfcu.org/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-03-03 22:19:49","lastsslvalidation":"2012-06-25 22:03:12","profile":{"-addr1":"2522 4th Ave. North","-city":"Billings","-state":"MT","-postalcode":"59101","-country":"USA","-csphone":"1-800-331-5470, local 406 248-1127","-url":"https://bfcuonline.billingsfcu.org","-email":"billingsfcu@billingsfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"604","name":"Windward Community FCU","fid":"321380315","org":"Windward Community FCU","url":"https://wwc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-08-09 22:37:26","lastsslvalidation":"2012-08-09 22:37:26","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"605","name":"Bernstein Global Wealth Mgmt","org":"BGWM","brokerid":"Bernstein.com","url":"https://ofx.bernstein.com/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:26:24","lastsslvalidation":"2015-07-02 22:26:24","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"606","name":"Siouxland Federal Credit Union","fid":"304982235","org":"SIOUXLAND FCU","url":"https://sio.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-07-31 22:24:11","lastsslvalidation":"2013-10-01 22:35:54"},{"id":"607","name":"The Queen\'s Federal Credit Union","fid":"321379504","org":"The Queens Federal Credit Union","url":"https://que.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-06-05 22:21:37","lastsslvalidation":"2011-07-24 22:25:40"},{"id":"608","name":"Edward Jones","fid":"823","org":"Edward Jones","brokerid":"www.edwardjones.com","url":"https://ofx.edwardjones.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-24 20:05:09","lastsslvalidation":"2016-01-16 19:37:20","profile":{"-addr1":"12555 Manchester Road","-city":"Saint Louis","-state":"MO","-postalcode":"63131","-country":"USA","-csphone":"800.441.0503","-tsphone":"800.441.0503","-url":"https://www.edwardjones.com","-email":"accountaccess@edwardjones.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-invstmtmsgset":"true","-emailmsgset":"true","-seclistmsgset":"true"}},{"id":"609","name":"Merck Sharp&Dohme FCU","fid":"231386645","org":"MERCK, SHARPE&DOHME FCU","url":"https://msd.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-01-18 22:17:16","lastsslvalidation":"2012-01-18 22:17:15","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"610","name":"Credit Union 1 - IL","fid":"271188081","org":"Credit Union 1","url":"https://pcu.creditunion1.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:46:34","lastsslvalidation":"2009-12-23 01:46:33"},{"id":"611","name":"Bossier Federal Credit Union","fid":"311175129","org":"Bossier Federal Credit Union","url":"https://bos.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-11-24 01:41:48","lastsslvalidation":"2013-10-01 22:06:33"},{"id":"612","name":"First Florida Credit Union","fid":"263079014","org":"First Llorida Credit Union","url":"https://pcu2.gecuf.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-02-04 22:54:04","lastsslvalidation":"2013-02-21 22:20:33","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"613","name":"NorthEast Alliance FCU","fid":"221982130","org":"NorthEast Alliance FCU","url":"https://nea.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-12-23 01:57:27","lastsslvalidation":"2013-08-14 22:42:22"},{"id":"614","name":"ShareBuilder","fid":"5575","org":"ShareBuilder","brokerid":"sharebuilder.com","url":"https://ofx.sharebuilder.com","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-14 17:48:25","lastsslvalidation":"2015-05-14 23:46:36","profile":{"-addr1":"1445 120th Ave NE","-city":"Bellevue","-state":"WA","-postalcode":"98005","-country":"USA","-csphone":"(800) 747-2537","-url":"http://www.sharebuilder.com","-email":"customercare@sharebuilder.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"615","name":"Janus","brokerid":"janus.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-10 12:05:29","lastsslvalidation":"2016-01-24 01:26:49","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"616","name":"Weitz Funds","fid":"weitz.com","org":"weitz.com","brokerid":"weitz.com","url":"https://www3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=52204081925","ofxfail":"3","sslfail":"0","lastofxvalidation":"2012-08-10 22:54:22","lastsslvalidation":"2016-01-21 08:01:56"},{"id":"617","name":"JPMorgan Retirement Plan Services","fid":"6313","org":"JPMORGAN","brokerid":"JPMORGAN","url":"https://ofx.retireonline.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-13 14:26:09","lastsslvalidation":"2015-09-01 03:49:10","profile":{"-addr1":"9300 Ward Parkway","-city":"Kansas City","-state":"MO","-postalcode":"64114","-country":"USA","-csphone":"1-800-345-2345","-tsphone":"1-800-345-2345","-url":"http://www.retireonline.com","-email":"2","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"618","name":"Credit Union ONE","fid":"14412","org":"Credit Union ONE","url":"https://cuhome.cuone.org/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-11-23 22:28:40","lastsslvalidation":"2013-06-25 22:23:46","profile":{"-addr1":"400 E. Nine Mile Road","-city":"Ferndale","-state":"MI","-postalcode":"48220","-country":"USA","-csphone":"800-451-4292","-url":"http://www.cuone.org","-email":"cuomembers@cuone.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"619","name":"Salt Lake City Credit Union","fid":"324079186","org":"Salt Lake City Credit Union","url":"https://slc.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-02-27 01:35:09","lastsslvalidation":"2009-12-23 02:01:48"},{"id":"620","name":"First Southwest Company","fid":"7048","org":"AFS","brokerid":"https://fswofx.automat","url":"https://fswofx.automatedfinancial.com","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-09 07:33:24","lastsslvalidation":"2015-07-30 06:37:35","profile":{"-addr1":"50 Broadway","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-url":"https://fswofx.automatedfinancial.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"621","name":"Dodge&Cox Funds","brokerid":"dodgeandcox.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50314030604","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:46:23","lastsslvalidation":"2016-01-23 09:34:18","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"622","name":"Wells Fargo Trust-Investment Mgt","fid":"6955","org":"Wells Fargo Trust","brokerid":"Wells Fargo Trust","url":"https://trust.wellsfargo.com/trust/directConnect","ofxfail":"2","sslfail":"0","lastofxvalidation":"2011-09-29 22:30:17","lastsslvalidation":"2015-11-12 11:41:29","profile":{"-addr1":"733 Marquette Ave, 5th Floor","-addr2":"Security Control & Transfer","-city":"Minneapolis","-state":"MN","-postalcode":"55479","-country":"USA","-csphone":"1-800-352-3702","-tsphone":"1-800-956-4442","-url":"www.wellsfargo.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"623","name":"Scottrade, Inc.","fid":"777","org":"Scottrade","brokerid":"www.scottrade.com","url":"https://ofxstl.scottsave.com","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-02-22 23:39:30","lastsslvalidation":"2011-09-28 22:22:22","profile":{"-addr1":"12855 Flushing Meadows Dr.","-city":"St. Louis","-state":"MO","-postalcode":"63131","-country":"USA","-csphone":"314.965.1555","-tsphone":"314.965.1555","-url":"http://www.scottrade.com","-email":"support@scottrade.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"624","name":"Silver State Schools CU","fid":"322484265","org":"SSSCU","url":"https://www.silverstatecu.com/OFXServer/ofxsrvr.dll","ofxfail":"3","sslfail":"5","lastofxvalidation":"2012-04-16 22:27:15","lastsslvalidation":"2012-04-16 22:27:15","profile":{"-addr1":"4221 South McLeod","-city":"Las Vegas","-state":"NV","-postalcode":"89121","-country":"USA","-csphone":"800-357-9654","-url":"www.silverstatecu.com","-email":"support@silverstatecu.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"625","name":"Smith Barney - Investments","brokerid":"smithbarney.com","url":"https://ofx.smithbarney.com/cgi-bin/ofx/ofx.cgi","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-07-20 22:42:55","lastsslvalidation":"2013-07-20 22:42:49","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"626","name":"VISA Information Source","fid":"10942","org":"VISA","url":"https://vis.informationmanagement.visa.com/eftxweb/access.ofx","ofxfail":"1","sslfail":"0","lastofxvalidation":"2015-07-16 14:38:48","lastsslvalidation":"2015-07-03 00:11:15","profile":{"-addr1":"900 Metro Center Blvd","-city":"Foster City","-state":"CA","-postalcode":"94404","-country":"USA","-csphone":"212 344 2000","-tsphone":"212 344 2000","-url":"www.joineei.com","-email":"support@joineei.com","-signonmsgset":"true","-creditcardmsgset":"true"}},{"id":"627","name":"National City","fid":"5860","org":"NATIONAL CITY","url":"https://ofx.nationalcity.com/ofx/OFXConsumer.aspx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2009-10-24 01:39:34","lastsslvalidation":"2014-07-26 22:32:20"},{"id":"628","name":"Capital One","fid":"1001","org":"Hibernia","url":"https://onlinebanking.capitalone.com/scripts/serverext.dll","ofxfail":"2","sslfail":"0","lastofxvalidation":"2009-08-21 01:33:29","lastsslvalidation":"2015-07-02 22:28:14","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"629","name":"Citi Credit Card","fid":"24909","org":"Citigroup","url":"https://www.accountonline.com/cards/svc/CitiOfxManager.do","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-09 05:57:58","lastsslvalidation":"2015-07-02 22:33:34","profile":{"-addr1":"8787 Baypine Road","-city":"Jacksonville","-state":"FL","-postalcode":"32256","-country":"USA","-csphone":"1-800-950-5114","-tsphone":"1-800-347-4934","-url":"http://www.citicards.com","-signonmsgset":"true","-creditcardmsgset":"true"}},{"id":"630","name":"Zions Bank","fid":"1115","org":"244-3","url":"https://quicken.metavante.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:17:25","lastsslvalidation":"2015-07-03 00:17:25","profile":{"-addr1":"2200 South 3270 West","-city":"West Valley City","-state":"UT","-postalcode":"84119","-country":"USA","-csphone":"1-888-440-0339","-tsphone":"1-888-440-0339","-url":"www.zionsbank.com","-email":"zionspfm@zionsbank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-interxfermsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"631","name":"Capital One Bank","fid":"1001","org":"Hibernia","url":"https://onlinebanking.capitalone.com/scripts/serverext.dll","ofxfail":"2","sslfail":"0","lastofxvalidation":"2009-08-21 01:33:30","lastsslvalidation":"2016-01-21 11:05:48","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"633","name":"Redstone Federal Credit Union","fid":"2143","org":"Harland Financial Solutions","url":"https://remotebanking.redfcu.org/ofx/ofx.dll","ofxfail":"3","sslfail":"4","lastofxvalidation":"2009-10-31 01:44:13","lastsslvalidation":"2009-10-31 01:44:12"},{"id":"634","name":"PNC Bank","fid":"4501","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/04501.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-13 22:15:53","lastsslvalidation":"2015-11-22 22:15:29","profile":{"-addr1":"P.O. Box 339","-city":"Pittsburgh","-state":"PA","-postalcode":"152309736","-country":"USA","-url":"http://www.pncbank.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"635","name":"Bank of America (California)","fid":"6805","org":"HAN","url":"https://ofx.bankofamerica.com/cgi-forte/ofx?servicename=ofx_2-3&pagename=bofa","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-03 22:15:30","lastsslvalidation":"2015-05-03 22:15:30","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"800-792-0808","-tsphone":"800-792-0808","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"636","name":"Chase (credit card) ","fid":"10898","org":"B1","url":"https://ofx.chase.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:51:52","lastsslvalidation":"2015-10-22 08:05:10","profile":{"-addr1":"Bank One Plaza","-addr2":"Suite IL1-0852","-city":"Chicago","-state":"IL","-postalcode":"60670","-country":"USA","-csphone":"800-482-3675","-tsphone":"800-482-3675","-url":"https://www.chase.com","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"637","name":"Arizona Federal Credit Union","fid":"322172797","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:19:24","lastsslvalidation":"2015-07-02 22:19:23","profile":{"-addr1":"333 N 44th Street","-city":"Phoenix","-state":"AZ","-postalcode":"85008","-country":"USA","-csphone":"800-523-4603","-tsphone":"800-523-4603","-url":"www.azfcu.org","-email":"member.services@azfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"638","name":"UW Credit Union","fid":"1001","org":"UWCU","url":"https://ofx.uwcu.org/serverext.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:51:55","lastsslvalidation":"2015-07-03 00:09:33","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"639","name":"Bank of America","fid":"5959","org":"HAN","url":"https://eftx.bankofamerica.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-16 09:15:20","lastsslvalidation":"2016-01-22 21:55:22","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"(800) 933-6262","-tsphone":"(800) 933-6262","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"640","name":"Commerce Bank","fid":"1001","org":"CommerceBank","url":"https://ofx.tdbank.com/scripts/serverext.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-29 13:55:14","lastsslvalidation":"2015-07-02 22:35:34","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"641","name":"Securities America","fid":"7784","org":"Fidelity","brokerid":"1234","url":"https://ofx.ibgstreetscape.com:443","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:53:19","lastsslvalidation":"2015-07-02 23:53:19","profile":{"-addr1":"XXXXXXXXXX","-city":"XXXXXXXXXX","-state":"XX","-postalcode":"XXXXX","-country":"USA","-csphone":"Contact your broker/dealer.","-tsphone":"Contact your broker/dealer.","-url":"https://ofx.ibgstreetscape.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"642","name":"First Internet Bank of Indiana","fid":"074014187","org":"DI","brokerid":"074014187","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:03:07","lastsslvalidation":"2015-07-02 23:03:06","profile":{"-addr1":"7820 Innovation Boulevard","-addr2":"Suite 210","-city":"Indianapolis","-state":"IN","-postalcode":"46278","-country":"USA","-csphone":"(888) 873-3424","-tsphone":"(888) 873-3424","-url":"www.firstib.com","-email":"newaccounts@firstib.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"643","name":"Alpine Banks of Colorado","fid":"1451","org":"JackHenry","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:07:32","lastsslvalidation":"2015-07-02 22:07:32","profile":{"-addr1":"2200 GRAND AVE","-addr2":"GLENWOOD SPRINGS, CO 81601","-city":"GRAND JUNCTION","-state":"CO","-postalcode":"815010000","-country":"USA","-csphone":"(970) 945-2424","-tsphone":"800-551-6098","-url":"http://www.alpinebank.com","-email":"onlinebanking@alpinebank.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"644","name":"BancFirst","fid":"103003632","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-15 12:01:29","lastsslvalidation":"2016-01-22 20:18:17","profile":{"-addr1":"101 N. Broadway,Suite 200","-city":"Oklahoma City","-state":"OK","-postalcode":"73102","-country":"USA","-csphone":"405-270-4785","-tsphone":"405-270-4785","-url":"www.bancfirst.com","-email":"onlinebanking@bancfirst.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"645","name":"Desert Schools Federal Credit Union","fid":"1001","org":"DSFCU","url":"https://epal.desertschools.org/scripts/serverext.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:45:34","lastsslvalidation":"2015-07-02 22:45:34","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"646","name":"Kinecta Federal Credit Union","fid":"322278073","org":"KINECTA","url":"https://ofx.kinecta.org/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"5","lastofxvalidation":"2016-01-22 05:21:18","lastsslvalidation":"2015-06-14 23:13:08","profile":{"-addr1":"1440 Rosecrans Avenue","-city":"Manhattan Beach","-state":"CA","-postalcode":"90266","-country":"USA","-csphone":"800-854-9846","-tsphone":"800-854-9846","-url":"http://www.kinecta.org","-email":"ofxsupport@kinecta.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"647","name":"Boeing Employees Credit Union","fid":"1001","org":"becu","url":"https://www.becuonlinebanking.org/scripts/serverext.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-02-23 22:19:52","lastsslvalidation":"2015-10-24 10:08:03","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"648","name":"Capital One Bank - 2","fid":"1001","org":"Hibernia","url":"https://onlinebanking.capitalone.com/ofx/process.ofx","ofxfail":"2","sslfail":"0","lastofxvalidation":"2015-02-06 04:35:52","lastsslvalidation":"2015-07-02 22:28:28","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"649","name":"Michigan State University Federal CU","fid":"272479663","org":"MSUFCU","url":"https://ofx.msufcu.org/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:23:14","lastsslvalidation":"2015-07-02 23:23:14","profile":{"-addr1":"3777 West Road","-city":"East Lansing","-state":"MI","-postalcode":"48823","-country":"USA","-csphone":"1-800-678-4968","-tsphone":"1-517-333-2310","-url":"http://www.msufcu.org","-email":"eservices@msufcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"650","name":"The Community Bank","fid":"211371476","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-08 01:13:12","lastsslvalidation":"2015-07-02 23:59:13","profile":{"-addr1":"1265 Belmont Street","-city":"Brockton","-state":"MA","-postalcode":"02301-4401","-country":"USA","-csphone":"508-587-3210","-tsphone":"508-587-3210","-url":"www.communitybank.com","-email":"trocha@communitybank.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"651","name":"Sacramento Credit Union","fid":"1","org":"SACRAMENTO CREDIT UNION","url":"https://homebank.sactocu.org/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-10 23:34:15","lastsslvalidation":"2015-05-10 23:34:14","profile":{"-addr1":"P.O. BOX 2351","-city":"Sacramento","-state":"CA","-postalcode":"95812","-country":"USA","-csphone":"916 444 6070","-url":"https://homebank.sactocu.org","-email":"info@sactocu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"652","name":"TD Bank","fid":"1001","org":"CommerceBank","url":"https://onlinebanking.tdbank.com/scripts/serverext.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:41","lastsslvalidation":"2016-01-21 08:02:34","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"653","name":"Suncoast Schools FCU","fid":"1001","org":"SunCoast","url":"https://ofx.suncoastfcu.org","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-02-13 23:49:01","lastsslvalidation":"2013-10-23 22:31:20","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"654","name":"Metro Bank","fid":"9970","org":"MTRO","url":"https://ofx.mymetrobank.com/ofx/ofx.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-11-08 15:35:21","lastsslvalidation":"2015-11-19 15:25:09","profile":{"-addr1":"3801 Paxton St","-city":"Harrisburg","-state":"PA","-postalcode":"17111","-country":"USA","-csphone":"800-204-0541","-tsphone":"800-204-0541","-url":"https://online.mymetrobank.com","-email":"customerservice@mymetrobank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"655","name":"First National Bank (Texas)","fid":"12840","org":"JackHenry","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-12 15:08:50","lastsslvalidation":"2015-07-02 23:03:09","profile":{"-addr1":"PO BOX 810","-addr2":"EDINBURG TEXAS 78540-0810","-city":"LUBBOCK","-state":"TX","-postalcode":"794160000","-country":"USA","-csphone":"(956) 380-8500","-tsphone":"1-877-380-8573","-url":"http://www.webfnb.com","-email":"FNB-WebBanking@plainscapital.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"656","name":"Bank of the West","fid":"5809","org":"BancWest Corp","url":"https://olbp.bankofthewest.com/ofx0002/ofx_isapi.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-07 22:15:37","lastsslvalidation":"2015-05-07 22:15:36","profile":{"-addr1":"1450 Treat Blvd","-city":"Walnut Creek","-state":"CA","-postalcode":"94596","-country":"USA","-csphone":"1-800-488-2265","-tsphone":"1-800-488-2265","-url":"http://www.bankofthewest.com","-email":"etimebanker@bankofthewest.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"657","name":"Mountain America Credit Union","fid":"324079555","org":"MACU","url":"https://ofx.macu.org/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"4","lastofxvalidation":"2015-11-05 12:52:18","lastsslvalidation":"2013-11-20 22:24:51","profile":{"-addr1":"7181 S Campus View Dr","-city":"West Jordan","-state":"UT","-postalcode":"84084","-country":"USA","-csphone":"800-748-4302","-tsphone":"1-800-748-4302","-url":"https://www.macu.com","-email":"macumail@macu.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"658","name":"ING DIRECT","fid":"031176110","org":"ING DIRECT","url":"https://ofx.ingdirect.com/OFX/ofx.html","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-03-15 23:07:36","lastsslvalidation":"2015-03-15 23:07:35"},{"id":"659","name":"Santa Barbara Bank & Trust","fid":"5524","org":"pfm-l3g","url":"https://pfm.metavante.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:49:58","lastsslvalidation":"2015-07-02 23:49:57","profile":{"-addr1":"P. O. Box 60839","-city":"Santa Barbara","-state":"CA","-postalcode":"93160","-country":"USA","-csphone":"1-888-400-7228","-url":"http://www.pcbancorp.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-interxfermsgset":"true","-billpaymsgset":"true"}},{"id":"660","name":"UMB","fid":"468","org":"UMBOFX","url":"https://ofx.umb.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-06 15:52:56","lastsslvalidation":"2015-07-03 00:05:26"},{"id":"661","name":"Bank Of America(All except CA,WA,&ID ","fid":"6812","org":"HAN","brokerid":"IDX name=Claw","url":"Https://ofx.bankofamerica.com/cgi-forte/fortecgi?servicename=ofx_2-3&pagename=ofx ","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-03 22:15:34","lastsslvalidation":"2015-05-03 22:15:34","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"(800) 933-6262","-tsphone":"(800) 933-6262","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"662","name":"Centra Credit Union2","fid":"274972883","org":"Centra CU","url":"https://www.centralink.org/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:35","lastsslvalidation":"2015-07-02 22:28:35","profile":{"-addr1":"1430 National Road","-city":"Columbus","-state":"IN","-postalcode":"47201","-country":"USA","-csphone":"800-232-3642","-tsphone":"800-232-3642","-url":"http://www.centra.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"663","name":"Mainline National Bank","fid":"9869","org":"JackHenry","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 19:20:00","lastsslvalidation":"2016-01-21 08:02:58"},{"id":"664","name":"Citizens Bank","fid":"4639","org":"CheckFree OFX","url":"https://www.oasis.cfree.com/04639.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:52","lastsslvalidation":"2015-07-02 22:33:51"},{"id":"665","name":"USAA Investment Mgmt Co","fid":"24592","org":"USAA","brokerid":"USAA.COM","url":"https://service2.usaa.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:09:25","lastsslvalidation":"2015-09-15 12:29:03","profile":{"-addr1":"Attn:USAA BrokSvcs/MutualFunds","-addr2":"PO BOX 659453","-city":"San Antonio","-state":"TX","-postalcode":"78265-9825","-country":"USA","-csphone":"800-531-8777","-tsphone":"877-632-3002","-url":"https://www.usaa.com/inet/gas_imco/ImMainMenu","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"666","name":"121 Financial Credit Union","fid":"000001155","org":"121 Financial Credit Union","url":"https://ppc.121fcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-11-16 22:00:03","lastsslvalidation":"2011-07-03 22:00:04","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"667","name":"Abbott Laboratories Employee CU","fid":"35MXN","org":"Abbott Laboratories ECU - ALEC","url":"https://www.netit.financial-net.com/ofx/","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:02:31","lastsslvalidation":"2015-07-02 22:02:30","profile":{"-addr1":"401 N. RIVERSIDE DRIVE","-city":"GURNEE","-state":"IL","-postalcode":"60031","-country":"US","-url":"https://www.netit.financial-net.com/alec","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"668","name":"Achieva Credit Union","fid":"4491","org":"Achieva Credit Union","url":"https://rbserver.achievacu.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-18 22:02:34","lastsslvalidation":"2015-05-18 22:02:33","profile":{"-addr1":"1499 Gulf to Bay Blvd","-city":"Clearwater","-state":"FL","-postalcode":"34653","-country":"USA","-csphone":"727-431-7680","-url":"https://rbserver.achievacu.com","-email":"john@achievacu.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"669","name":"American National Bank","fid":"4201","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/04201.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:16:05","lastsslvalidation":"2015-07-02 22:16:04","profile":{"-addr1":"33 N. Lasalle","-city":"Chicago","-state":"IL","-postalcode":"60602","-country":"USA","-url":"http://www.americannationalbank.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"670","name":"Andrews Federal Credit Union","fid":"AFCUSMD","org":"FundsXpress","url":"https://ofx.fundsxpress.com/piles/ofx.pile/","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-24 15:19:40","lastsslvalidation":"2015-11-12 21:23:30","profile":{"-addr1":"5711 Allentown Road","-city":"Suitland","-state":"MD","-postalcode":"20746","-country":"USA","-csphone":"800.487.5500 (U.S.) 0.800.487.56","-tsphone":"800.487.5500 (U.S.) 0.800.487.56","-url":"http://www.andrewsfcu.org","-email":"memberservice@andrewsfcu.org","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"671","name":"Citi Personal Wealth Management","fid":"060","org":"Citigroup","brokerid":"investments.citi.com","url":"https://uat-ofx.netxclient.inautix.com/cgi/OFXNetx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-23 18:01:40","lastsslvalidation":"2015-07-23 17:42:27","profile":{"-addr1":"2 Court Square","-city":"Long Island City","-state":"NY","-postalcode":"11120","-country":"USA","-csphone":"877-541-1852","-tsphone":"877-541-1852","-url":"http://www.investments.citi.com/pwm","-email":"-","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"672","name":"Bank One (Chicago)","fid":"1501","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/01501.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:24:31","lastsslvalidation":"2015-07-02 22:24:31","profile":{"-addr1":"P. O. Box 1762","-city":"Chicago","-state":"IL","-postalcode":"606909947","-country":"USA","-url":"http://www.bankone.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"673","name":"Bank One (Michigan and Florida)","fid":"6001","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/06001.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-11 14:25:54","lastsslvalidation":"2015-07-02 22:24:32","profile":{"-addr1":"P.O. Box 7082","-city":"Troy","-state":"MI","-postalcode":"480077082","-country":"USA","-url":"http://www.bankone.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"674","name":"Bank of America (Formerly Fleet)","fid":"1803","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/01803.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:22:45","lastsslvalidation":"2015-07-02 22:22:45","profile":{"-addr1":"MA CPK 04-02-08","-addr2":"P.O. Box 1924","-city":"Boston","-state":"MA","-postalcode":"021059940","-country":"USA","-url":"http://www.bankboston.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"675","name":"BankBoston PC Banking","fid":"1801","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/01801.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:24:33","lastsslvalidation":"2015-07-02 22:24:33","profile":{"-addr1":"MA CPK 04-02-08","-addr2":"P.O. Box 1924","-city":"Boston","-state":"MA","-postalcode":"021059940","-country":"USA","-url":"http://www.bankboston.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"676","name":"Beverly Co-Operative Bank","fid":"531","org":"orcc","url":"https://www19.onlinebank.com/OROFX16Listener","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-05-31 22:10:16","lastsslvalidation":"2014-08-24 22:07:54","profile":{"-addr1":"254 Cabot Street","-city":"Beverly","-state":"MA","-postalcode":"01915","-country":"USA","-csphone":"(877) 314-7816","-tsphone":"(877) 314-7816","-url":"http://www.beverlycoop.com","-email":"info@orcc.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"677","name":"Cambridge Portuguese Credit Union","fid":"983","org":"orcc","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:10","lastsslvalidation":"2015-07-02 22:28:09","profile":{"-addr1":"493 Somerville Avenue","-city":"Somerville","-state":"MA","-postalcode":"02143","-country":"USA","-csphone":"(877) 793-1440","-tsphone":"(877) 793-1440","-url":"http://www.naveo.org","-email":"info@orcc.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"678","name":"Citibank","fid":"2101","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/02101.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:50","lastsslvalidation":"2015-07-02 22:33:50","profile":{"-addr1":"500 W. Madison","-city":"Chicago","-state":"IL","-postalcode":"60661","-country":"USA","-url":"http://www.citibank.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"679","name":"Community Bank, N.A.","fid":"11517","org":"JackHenry","url":"https://directline2.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:35:40","lastsslvalidation":"2016-01-21 08:03:03","profile":{"-addr1":"45 - 49 Court Street","-addr2":"Canton, NY 13617","-city":"CANTON","-state":"NY","-postalcode":"136170000","-country":"USA","-csphone":"(315) 386-4553","-tsphone":"1-866-764-8638","-url":"http://www.communitybankna.com","-email":"corpcom@communitybankna.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"680","name":"Consumers Credit Union","fid":"12541","org":"Consumers Credit Union","url":"https://ofx.lanxtra.com/ofx/servlet/Teller","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-26 00:01:44","lastsslvalidation":"2013-08-19 22:09:48","profile":{"-addr1":"7040 Stadium Dr.","-city":"Oshtemo","-state":"MI","-postalcode":"49077","-country":"USA","-csphone":"2693457804","-tsphone":"2693457804","-url":"http://www.consumerscu.org","-email":"ccu@consumerscu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"681","name":"CPM Federal Credit Union","fid":"253279536","org":"USERS, Inc.","url":"https://cpm.usersonlnet.com/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-01-31 22:06:38","lastsslvalidation":"2013-08-14 22:12:56","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"682","name":"DATCU","fid":"311980725","org":"DATCU","url":"https://online.datcu.coop/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:42:19","lastsslvalidation":"2015-07-02 22:42:19","profile":{"-addr1":"PO Box 827","-city":"Denton","-state":"TX","-postalcode":"76202","-country":"USA","-csphone":"1-866-387-8585","-url":"http://www.datcu.org","-email":"ofx@datcu.org","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"683","name":"Denver Community Federal Credit Union","fid":"10524","org":"Denver Community FCU","url":"https://pccu.dcfcu.coop/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-01-23 22:13:56","lastsslvalidation":"2013-01-23 22:13:56","profile":{"-addr1":"1075 Acoma Street","-city":"Denver","-state":"CO","-postalcode":"80204","-country":"USA","-csphone":"3035731170","-url":"http://www.dcfcu.coop","-email":"memberservices@dcfcu.coop","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"684","name":"Discover Platinum","fid":"7102","org":"Discover Financial Services","url":"https://ofx.discovercard.com/","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:45","lastsslvalidation":"2016-01-22 21:55:24","profile":{"-addr1":"2500 Lake Cook Road","-city":"Riverwoods","-state":"IL","-postalcode":"60015","-country":"USA","-csphone":"1-800-DISCOVER","-tsphone":"1-800-DISCOVER","-url":"http://www.discovercard.com","-email":"websupport@discovercard.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"685","name":"EAB","fid":"6505","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/06505.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:49:38","lastsslvalidation":"2015-07-02 22:49:37","profile":{"-addr1":"Electronic Banking Dept 2839","-addr2":"1 EAB Plaze","-city":"Uniondale","-state":"NY","-postalcode":"11555","-country":"USA","-url":"http://www.eab.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"686","name":"FAA Credit Union","fid":"114","org":"FAA Credit Union","url":"https://flightline.faaecu.org/ofx/ofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:47","lastsslvalidation":"2016-01-22 21:55:25","profile":{"-addr1":"P.O. Box 26406","-city":"Oklahoma City","-state":"OK","-postalcode":"73126","-country":"USA","-csphone":"405-682-1990","-url":"https://flightline.faaecu.org","-email":"info@faaecu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"687","name":"Fairwinds Credit Union","fid":"4842","org":"OSI 2","url":"https://OFX.opensolutionsTOC.com/eftxweb/access.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-07-31 20:56:22","lastsslvalidation":"2015-07-02 22:53:05","profile":{"-addr1":"3087 N Alafaya Trail","-city":"Orlando","-state":"FL","-postalcode":"32826","-country":"USA","-csphone":"407-277-6030","-tsphone":"407-277-6030","-url":"http://www.fairwinds.org","-email":"rharrington@fairwinds.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"688","name":"FedChoice FCU","fid":"254074785","org":"FEDCHOICE","url":"https://ofx.fedchoice.org/ofxserver/ofxsrvr.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-05-19 22:10:56","lastsslvalidation":"2012-05-19 22:10:53","profile":{"-addr1":"10001 Willowdale Rd.","-city":"Lanham","-state":"MD","-postalcode":"20706","-country":"USA","-csphone":"301 699 6151","-tsphone":"301 699 6900","-url":"www.fedchoice.org","-email":"financialadvisorycenter@fedchoice.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"689","name":"First Clearing, LLC","fid":"10033","org":"First Clearing, LLC","url":"https://pfmpw.wachovia.com/cgi-forte/fortecgi?servicename=ofxbrk&pagename=PFM","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-10-02 22:15:22","lastsslvalidation":"2013-02-04 22:20:09"},{"id":"690","name":"First Citizens","fid":"1849","org":"First Citizens","url":"https://www.oasis.cfree.com/fip/genesis/prod/01849.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:58:00","lastsslvalidation":"2015-07-02 22:58:00","profile":{"-addr1":"P.O. Box 29","-city":"Columbia","-state":"SC","-postalcode":"29202","-country":"USA","-url":"www.firstcitizensonline.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"691","name":"First Hawaiian Bank","fid":"3501","org":"BancWest Corp","url":"https://olbp.fhb.com/ofx0001/ofx_isapi.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:03:06","lastsslvalidation":"2015-11-11 05:51:11","profile":{"-addr1":"999 Bishop Street","-city":"Honolulu","-state":"HI","-postalcode":"96813","-country":"USA","-csphone":"1-888-844-4444","-tsphone":"1-888-844-4444","-url":"http://www.fhb.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"692","name":"First National Bank of St. Louis","fid":"162","org":"81004601","url":"https://ofx.centralbancompany.com/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:03:15","lastsslvalidation":"2015-07-02 23:03:10"},{"id":"693","name":"First Interstate Bank","fid":"092901683","org":"FIB","url":"https://ofx.firstinterstatebank.com/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-27 01:47:36","lastsslvalidation":"2015-07-02 23:03:08","profile":{"-addr1":"401 North 31st Street","-city":"Billings","-state":"MT","-postalcode":"59116","-country":"USA","-csphone":"888-752-3332","-tsphone":"888-752-3332","-url":"www.FirstInterstateBank.com","-email":"pcbank@fib.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"694","name":"Goldman Sachs","fid":"1234","org":"gs.com","brokerid":"gs.com","url":"https://portfolio-ofx.gs.com:446/ofx/ofx.eftx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-07-02 23:11:09","profile":{"-addr1":"101 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-csphone":"(212)344-2000","-tsphone":"(212)344-2000","-url":"WWW.SCHWAB.COM","-email":"help@gs.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"695","name":"Hudson Valley FCU","fid":"10767","org":"Hudson Valley FCU","url":"https://internetbanking.hvfcu.org/ofx/ofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:14:28","lastsslvalidation":"2015-07-02 23:14:28","profile":{"-addr1":"159 Barnegat Road","-city":"Poughkeepsie","-state":"NY","-postalcode":"12533","-country":"USA","-csphone":"800-468-3011","-url":"https://www.hvfcu.org","-email":"info@hvfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"696","name":"IBM Southeast Employees Federal Credit Union","fid":"1779","org":"IBM Southeast EFCU","url":"https://rb.ibmsecu.org/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-10-05 22:58:37","lastsslvalidation":"2014-10-05 22:58:36","profile":{"-addr1":"790 Park of Commerce Blvd","-city":"Boca Raton","-state":"FL","-postalcode":"33487","-country":"USA","-csphone":"8008735100","-url":"https://rb.ibmsecu.org","-email":"ktobias@ibmsecu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"697","name":"Insight CU","fid":"10764","org":"Insight Credit Union","url":"https://secure.insightcreditunion.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-09-20 20:41:03","lastsslvalidation":"2013-03-26 22:24:39","profile":{"-addr1":"480 S Keller Rd","-city":"Orlando","-state":"FL","-postalcode":"32810","-country":"USA","-csphone":"407-426-6000","-url":"https://insightcreditunion.com","-email":"moneycoach@insightcreditunion.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"698","name":"Janney Montgomery Scott LLC","fid":"11326","org":"AFS","brokerid":"https://jmsofx.automat","url":"https://jmsofx.automatedfinancial.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:16:09","lastsslvalidation":"2016-01-04 12:05:47","profile":{"-addr1":"50 Broadway","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-url":"https://jmsofx.automatedfinancial.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"699","name":"JSC Federal Credit Union","fid":"10491","org":"JSC Federal Credit Union","url":"https://starpclegacy.jscfcu.org/ofx/ofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-30 22:03:51","lastsslvalidation":"2016-01-23 12:40:45","profile":{"-addr1":"1330 Gemini","-city":"Houston","-state":"TX","-postalcode":"77058","-country":"USA","-csphone":"281-488-7070","-url":"http://www.jscfcu.org","-email":"webhelp@jscfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"700","name":"J.P. Morgan","fid":"4701","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/04701.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:16:01","lastsslvalidation":"2015-07-02 23:16:01","profile":{"-addr1":"902 Market Street, 7th floor","-city":"Wilmington","-state":"DE","-postalcode":"19801","-country":"USA","-url":"http://www.jpmorgan.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"701","name":"J.P. Morgan Clearing Corp.","fid":"7315","org":"GCS","brokerid":"https://ofxpcs.toolkit","url":"https://ofxgcs.toolkit.clearco.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:16:05","lastsslvalidation":"2015-07-02 23:16:05","profile":{"-addr1":"50 broadway","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-url":"https://ofxgcs.toolkit.clearco.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"702","name":"M & T Bank","fid":"2601","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/02601.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-19 02:06:35","lastsslvalidation":"2015-11-26 05:22:45","profile":{"-addr1":"P.O. Box 4627","-city":"Buffalo","-state":"NY","-postalcode":"142409915","-country":"USA","-url":"http://www.MandTBank.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"703","name":"Marquette Banks","fid":"1301","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/01301.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-11 13:54:02","lastsslvalidation":"2015-07-02 23:19:43","profile":{"-addr1":"P.O. Box 1000","-city":"Minneapolis","-state":"MN","-postalcode":"554801000","-country":"USA","-url":"http://www.marquette.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"704","name":"Mercer","fid":"8007527525","org":"PutnamDefinedContributions","url":"https://ofx.mercerhrs.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-12 01:59:29","lastsslvalidation":"2015-07-02 23:21:29","profile":{"-addr1":"Investors Way","-city":"Norwood","-state":"MA","-postalcode":"02062","-country":"USA","-csphone":"(800) 926 9225","-tsphone":"(800) 926 9225","-url":"https://ofx.mercerhrs.com/eftxweb/access.ofx","-email":"2","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"705","name":"Merrill Lynch Online Payment","fid":"7301","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/07301.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 13:19:59","lastsslvalidation":"2016-01-14 01:19:28","profile":{"-addr1":"3 Independence Way","-city":"Princeton","-state":"NJ","-postalcode":"08540","-country":"USA","-url":"http://www.mlol.ml.com/","-signonmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"706","name":"Missoula Federal Credit Union","fid":"5097","org":"Missoula Federal Credit Union","url":"https://secure.missoulafcu.org/ofx/ofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:23:16","lastsslvalidation":"2015-07-02 23:23:16","profile":{"-addr1":"3600 Brooks St","-city":"Missoula","-state":"MT","-postalcode":"59801","-country":"USA","-csphone":"(406)523-3300","-url":"https://secure.missoulafcu.org","-email":"memberservice@missoulafcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"707","name":"Morgan Stanley (Smith Barney)","fid":"5207","org":"Smithbarney.com","brokerid":"smithbarney.com","url":"https://ofx.smithbarney.com/app-bin/ofx/servlets/access.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-07-20 22:29:23","lastsslvalidation":"2013-07-20 22:29:20","profile":{"-addr1":"250 West Str","-city":"New York","-state":"NY","-postalcode":"10005","-country":"USA","-csphone":"1-212-723-2898","-tsphone":"1-212-723-2898","-url":"http://ofx.smithbarney.com","-email":"alex_shnir@smb.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"708","name":"Nevada State Bank - OLD","fid":"5401","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/05401.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-30 03:35:51","lastsslvalidation":"2015-12-27 20:49:37","profile":{"-addr1":"Online Banking Support","-addr2":"PO Box 30709","-city":"Salt Lake City","-state":"UT","-postalcode":"841309976","-country":"USA","-url":"http://www.zionsbank.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"709","name":"New England Federal Credit Union","fid":"2104","org":"New England Federal Credit Union","url":"https://pcaccess.nefcu.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-01-03 22:22:14","lastsslvalidation":"2012-01-03 22:22:12","profile":{"-addr1":"141 Harvest Lane","-city":"Williston","-state":"VT","-postalcode":"05495","-country":"USA","-csphone":"800 400-8790","-url":"http://www.nefcu.com","-email":"online@nefcu.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"710","name":"Norwest","fid":"4601","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/04601.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-09-11 11:21:38","lastsslvalidation":"2015-09-11 12:26:21","profile":{"-addr1":"420 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-url":"http://www.wellsfargo.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"711","name":"Oppenheimer & Co. Inc.","fid":"125","org":"Oppenheimer","brokerid":"Oppenheimer","url":"https://ofx.opco.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:33:39","lastsslvalidation":"2015-07-02 23:33:35","profile":{"-addr1":"125 Broad Street","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-csphone":"1-800-555-1212","-tsphone":"1-800-555-1212","-url":"http://www.opco.com","-email":"support@opco.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"712","name":"Oregon College Savings Plan","fid":"51498","org":"tiaaoregon","brokerid":"tiaa-cref.org","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=b1908000027141704061413","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-10-15 08:51:17","lastsslvalidation":"2016-01-22 21:55:27","profile":{"-addr1":"PO Box 55914","-city":"Boston","-state":"MA","-postalcode":"02205-5914","-country":"USA","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=b1908000027141704061413","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"713","name":"RBC Dain Rauscher","fid":"8035","org":"RBC Dain Rauscher","brokerid":"RBCDain.com","url":"https://ofx.rbcdain.com/","ofxfail":"1","sslfail":"0","lastofxvalidation":"2014-04-29 22:48:22","lastsslvalidation":"2015-07-02 23:40:20","profile":{"-addr1":"RBC Plaza","-addr2":"60 South 6th Street","-city":"Minneapolis","-state":"MN","-postalcode":"55402","-country":"USA","-csphone":"888.281.4094","-tsphone":"888.281.4094","-url":"http://www.rbcwm-usa.com","-email":"connectdesk@rbc.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"714","name":"Robert W. Baird & Co.","fid":"1109","org":"Robert W. Baird & Co.","brokerid":"rwbaird.com","url":"https://ofx.rwbaird.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:43:36","lastsslvalidation":"2015-07-02 23:43:35","profile":{"-addr1":"777 East Wisconsin Avenue","-city":"Milwaukee","-state":"WI","-postalcode":"53202","-country":"USA","-csphone":"414.765.3500","-tsphone":"414.765.3500","-url":"http://www.rwbaird.com","-email":"info@rwbaird.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"715","name":"Sears Card","fid":"26810","org":"CITIGROUP","url":"https://secureofx.bankhost.com/tuxofx/cgi-bin/cgi_chip","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-03-06 22:36:20","lastsslvalidation":"2013-06-11 22:45:23","profile":{"-addr1":"8787 Baypine Road","-city":"Jacksonville","-state":"FL","-postalcode":"32256","-country":"USA","-url":"www.citicards.com","-signonmsgset":"true","-creditcardmsgset":"true"}},{"id":"716","name":"South Trust Bank","fid":"6101","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/06101.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-09-11 13:02:12","lastsslvalidation":"2015-09-11 12:54:04","profile":{"-addr1":"South Trust Online Banking","-addr2":"P.O. Box 2554","-city":"Birmingham","-state":"AL","-postalcode":"35290","-country":"USA","-url":"http://www.southtrust.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"717","name":"Standard Federal Bank","fid":"6507","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/06507.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:58:33","lastsslvalidation":"2015-07-24 23:39:15","profile":{"-addr1":"79 W. Monroe, Suite 302","-addr2":"Online Banking Customer Service","-city":"Chicago","-state":"IL","-postalcode":"60603","-country":"USA","-url":"http://www.standardfederalbank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"718","name":"United California Bank","fid":"2701","org":"ISC","url":"https://www.oasis.cfree.com/fip/genesis/prod/02701.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-09-11 12:56:13","lastsslvalidation":"2015-08-06 04:23:24","profile":{"-addr1":"P.O. Box 3567","-city":"Los Angeles","-state":"CA","-postalcode":"900519738","-country":"USA","-url":"http://www.sanwabank.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"719","name":"United Federal CU - PowerLink","fid":"1908","org":"United Federal Credit Union","url":"https://remotebanking.unitedfcu.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2011-09-30 22:30:11","lastsslvalidation":"2012-01-03 22:30:06","profile":{"-addr1":"2807 S State St","-city":"St Joseph","-state":"MI","-postalcode":"49085","-country":"USA","-csphone":"888-982-1400","-url":"http://www.unitedfcu.com","-email":"frfcu@unitedfcu.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"720","name":"VALIC","fid":"77019","org":"valic.com","brokerid":"valic.com","url":"https://ofx.valic.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:49","lastsslvalidation":"2015-07-03 00:09:35","profile":{"-addr1":"2929 Allen Parkway","-city":"Houston","-state":"TX","-postalcode":"77019","-country":"USA","-csphone":"800-448-2542","-tsphone":"800-448-2542","-url":"http://www.valic.com","-email":"ofxsupport@valic.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"721","name":"Van Kampen Funds, Inc.","fid":"3625","org":"Van Kampen Funds, Inc.","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=9210013100012150413","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:09:36","lastsslvalidation":"2016-01-17 19:19:04","profile":{"-addr1":"1 Parkview Plaza","-city":"Oakbrook Terrace","-state":"IL","-postalcode":"60181","-country":"USA","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=9210013100012150413","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"722","name":"Vanguard Group","fid":"1358","org":"The Vanguard Group","brokerid":"vanguard.com","url":"https://vesnc.vanguard.com/us/OfxProfileServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:52","lastsslvalidation":"2016-01-25 16:18:51","profile":{"-addr1":"P.O. Box 1110","-city":"Valley Forge","-state":"PA","-postalcode":"19482-1110","-country":"USA","-url":"https://vesnc.vanguard.com/us/OfxDirectConnectServlet","-signonmsgset":"true","-invstmtmsgset":"true","-emailmsgset":"true","-notes":"Automatically imports 12 months of transactions"}},{"id":"723","name":"Velocity Credit Union","fid":"9909","org":"Velocity Credit Union","url":"https://rbserver.velocitycu.com/ofx/ofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:09:39","lastsslvalidation":"2016-01-21 08:05:04","profile":{"-addr1":"P.O. Box 1089","-city":"Austin","-state":"TX","-postalcode":"78767-1089","-country":"USA","-csphone":"512-469-7000","-url":"https://www.velocitycu.com","-email":"msc@velocitycu.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"724","name":"Waddell & Reed - Ivy Funds","fid":"49623","org":"waddell","brokerid":"waddell.com","url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=722000303041111","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:12:51","lastsslvalidation":"2016-01-22 21:55:29","profile":{"-addr1":"816 Broadway","-city":"Kansas City","-state":"MO","-postalcode":"64105","-country":"USA","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=722000303041111","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"725","name":"Umpqua Bank","fid":"1001","org":"Umpqua","url":"https://ofx.umpquabank.com/ofx/process.ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-03-14 23:56:10","lastsslvalidation":"2015-03-14 23:56:02","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"726","name":"Discover Bank","fid":"12610","org":"Discover Bank","url":"https://ofx.discovercard.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:53","lastsslvalidation":"2016-01-25 13:14:17","profile":{"-addr1":"2500 Lake Cook Road","-city":"Riverwoods","-state":"IL","-postalcode":"60015","-country":"USA","-csphone":"1-800-DISCOVER","-tsphone":"1-800-DISCOVER","-url":"https://www.discover.com","-email":"websupport@discoverbank.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"727","name":"Elevations Credit Union","fid":"1001","org":"uocfcu","url":"https://ofx.elevationscu.com/scripts/serverext.dll","ofxfail":"2","sslfail":"4","lastofxvalidation":"2011-11-09 22:12:37","lastsslvalidation":"2011-11-09 22:12:36","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"728","name":"Kitsap Community Credit Union","fid":"325180223","org":"Kitsap Community Federal Credit","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-23 02:46:53","lastsslvalidation":"2015-07-02 23:17:54","profile":{"-addr1":"155 Washington Ave","-city":"Bremerton","-state":"WA","-postalcode":"98337","-country":"USA","-csphone":"800-422-5852","-tsphone":"800-422-5852","-url":"www.kitsapcuhb.org","-email":"2","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"729","name":"Charles Schwab Retirement","fid":"1234","org":"SchwabRPS","url":"https://ofx.schwab.com/cgi_dev/ofx_server","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:57","lastsslvalidation":"2016-01-22 21:55:32","profile":{"-addr1":"101 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-csphone":"(212)344-2000","-tsphone":"(212)344-2000","-url":"WWW.SCHWAB.COM","-email":"help@gs.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"730","name":"Charles Schwab Retirement Plan Services","fid":"1234","org":"SchwabRPS","brokerid":"SchwabRPS.dv","url":"https://ofx.schwab.com/cgi_dev/ofx_server","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:52:59","lastsslvalidation":"2016-01-22 21:55:34","profile":{"-addr1":"101 Montgomery Street","-city":"San Francisco","-state":"CA","-postalcode":"94104","-country":"USA","-csphone":"(212)344-2000","-tsphone":"(212)344-2000","-url":"WWW.SCHWAB.COM","-email":"help@gs.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"731","name":"First Tech Federal Credit Union","fid":"3169","org":"First Tech Federal Credit Union","url":"https://ofx.firsttechfed.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:05:28","lastsslvalidation":"2016-01-11 19:07:41","profile":{"-addr1":"3408 Hillview Ave","-city":"Palo Alto","-state":"CA","-postalcode":"94304","-country":"USA","-csphone":"877.233.4766","-tsphone":"877.233.4766","-url":"https://www.firsttechfed.com","-email":"email@firsttechfed.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"732","name":"Affinity Plus Federal Credit Union","fid":"75","org":"Affinity Plus FCU","url":"https://hb.affinityplus.org/ofx/ofx.dll","ofxfail":"3","sslfail":"0","lastofxvalidation":"2015-01-07 22:01:49","lastsslvalidation":"2015-07-02 22:04:18","profile":{"-addr1":"175 West Lafayette Rd","-city":"St. Paul","-state":"MN","-postalcode":"55107","-country":"USA","-csphone":"651-291-3700","-url":"https://hb.affinityplus.org","-email":"affinityplus@affinityplus.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"733","name":"Bank of George","fid":"122402366","org":"122402366","url":"https://ofx.internet-ebanking.com/CCOFXServer/servlet/TP_OFX_Controller","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-12-26 22:06:07","lastsslvalidation":"2013-01-06 22:06:47","profile":{"-addr1":"9115 W. Russell Road","-city":"Las Vegas","-state":"NV","-postalcode":"89148","-country":"USA","-csphone":"(702) 851-4200","-tsphone":"(702) 851-4200","-url":"http://www.bankofgeorge.com","-email":"customerservice@bankofgeorge.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"734","name":"Franklin Templeton Investments","fid":"9444","org":"franklintempleton.com","brokerid":"franklintempleton.com","url":"https://ofx.franklintempleton.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-10-01 07:57:27","lastsslvalidation":"2016-01-14 01:45:46","profile":{"-addr1":"P.O. Box 997152","-city":"Sacramento","-state":"CA","-postalcode":"95670-7313","-country":"USA","-csphone":"1-800-632-2301","-tsphone":"1-800-632-2301","-url":"www.franklintempleton.com","-email":"shareholderservices@frk.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"735","name":"ING Institutional Plan Services ","fid":"1289","org":"ing-usa.com","url":"https://ofx.ingplans.com/ofx/Server","ofxfail":"3","sslfail":"4","lastofxvalidation":"2014-08-29 22:27:37","lastsslvalidation":"2014-08-29 22:27:37","profile":{"-addr1":"One Orange Way","-city":"Windsor","-state":"CT","-postalcode":"06095","-country":"USA","-csphone":"plan info line","-tsphone":"plan info line","-url":"http://foremployers.voya.com/retirement-plans/institutional-plans","-email":"plan info line","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"736","name":"Sterne Agee","fid":"2170","org":"AFS","brokerid":"sterneagee.com","url":"https://salofx.automatedfinancial.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-12-22 09:10:32","lastsslvalidation":"2015-07-02 23:58:35","profile":{"-addr1":"50 Broadway","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-url":"https://salofx.automatedfinancial.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"737","name":"Wells Fargo Advisors","fid":"12748","org":"WF","brokerid":"Wells Fargo Advisors","url":"https://ofxdc.wellsfargo.com/ofxbrokerage/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-25 13:41:49","lastsslvalidation":"2016-01-22 21:55:37","profile":{"-addr1":"P.O. Box 6808","-city":"Concord","-state":"CA","-postalcode":"94524","-country":"USA","-csphone":"1-800-956-4442","-tsphone":"1-800-956-4442","-url":"https://online.wellsfargo.com/","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"738","name":"Community 1st Credit Union","fid":"325082017","org":"Community 1st Credit Union","url":"https://ib.comm1stcu.org/scripts/isaofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2012-08-21 22:07:20","lastsslvalidation":"2012-07-31 22:06:07","profile":{"-addr1":"14625 15th Avenue NE","-city":"Shoreline","-state":"WA","-postalcode":"98155","-country":"USA","-csphone":"1-800-247-7328","-tsphone":"1-800-247-7328","-url":"https://myc1cu.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true"}},{"id":"739","name":"American Century Investments","brokerid":"americancentury.com","url":"https://ofx.americancentury.com/","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:09:15","lastsslvalidation":"2015-07-02 22:09:15","profile":{"-addr1":"P.O. Box 173375","-city":"Denver","-state":"CO","-postalcode":"80217","-country":"USA","-csphone":"816.345.7645","-tsphone":"816.345.7645","-url":"https://ofx3.financialtrans.com/tf/OFXServer?tx=OFXController&cz=702110804131918&cl=50900132018","-email":"service@americancentury.com","-signonmsgset":"true","-bankmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"740","name":"J.P. Morgan Private Banking","fid":"0417","org":"jpmorgan.com","brokerid":"jpmorgan.com","url":"https://ofx.jpmorgan.com/jpmredirector","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-24 21:20:44","lastsslvalidation":"2015-07-02 23:16:05","profile":{"-addr1":"522 5th Ave","-addr2":"null","-city":"New York","-state":"NY","-postalcode":"10036","-country":"USA","-url":"http://localhost:9080/ofx/JPMWebRedirector","-email":"jpmorgan2@jpmorgan.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"741","name":"Northwest Community CU","fid":"1948","org":"Cavion","url":"https://ofx.lanxtra.com/ofx/servlet/Teller","ofxfail":"0","sslfail":"4","lastofxvalidation":"2015-07-02 23:30:15","lastsslvalidation":"2013-08-19 22:37:01","profile":{"-addr1":"P.O BOX 70225","-city":"Eugene","-state":"OR","-postalcode":"97401","-country":"USA","-csphone":"8004529515","-tsphone":"8004529515","-url":"http://www.nwcu.com","-email":"callcenter@nwcu.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"742","name":"North Carolina State Employees Credit Union","fid":"1001","org":"SECU","url":"https://onlineaccess.ncsecu.org/secuofx/secu.ofx ","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-21 07:59:27","lastsslvalidation":"2015-07-02 23:28:24","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"743","name":"International Bank of Commerce","fid":"1001","org":"IBC","url":"https://ibcbankonline2.ibc.com/scripts/serverext.dll","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-24 08:18:05","lastsslvalidation":"2015-10-25 21:17:32","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"744","name":"RaboBank America","fid":"11540","org":"RBB","url":"https://ofx.rabobankamerica.com/ofx/process.ofx","ofxfail":"3","sslfail":"4","lastofxvalidation":"2015-05-28 23:33:45","lastsslvalidation":"2015-05-29 07:31:05","profile":{"-addr1":"PO Box 6002","-city":"Arroyo Grande","-state":"CA","-postalcode":"93420","-country":"USA","-csphone":"800-959-2399","-tsphone":"800-959-2399","-url":"http://www.rabobankamerica.com","-email":"ebanking@rabobank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"745","name":"Hughes Federal Credit Union","fid":"1951","org":"Cavion","url":"https://ofx.lanxtra.com/ofx/servlet/Teller","ofxfail":"0","sslfail":"4","lastofxvalidation":"2016-01-11 11:46:29","lastsslvalidation":"2013-08-19 22:23:31","profile":{"-addr1":"P.O. Box 11900","-city":"Tucson","-state":"AZ","-postalcode":"85734","-country":"USA","-csphone":"(520) 794-8341","-tsphone":"(520) 794-8341","-url":"http://www.hughesfcu.org","-email":"xxxxx","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"746","name":"Apple FCU","fid":"256078514","org":"DI","brokerid":"md:1023","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:19:22","lastsslvalidation":"2015-07-02 22:19:21","profile":{"-addr1":"4029 Ridge Top Road","-city":"Fairfax","-state":"VA","-postalcode":"22030","-country":"USA","-csphone":"800-666-7996","-tsphone":"800-666-7996","-url":"https://www.applefcu.org","-email":"2","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"747","name":"Chemical Bank","fid":"072410013","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:30:22","lastsslvalidation":"2015-07-02 22:30:21","profile":{"-addr1":"333 E. Main Street","-city":"Midland","-state":"MI","-postalcode":"48640","-country":"USA","-csphone":"800-633-3800","-tsphone":"800-633-3800","-url":"www.chemicalbankmi.com","-email":"ebanking@chemicalbankmi.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"748","name":"Local Government Federal Credit Union","fid":"1001","org":"SECU","url":"https://onlineaccess.ncsecu.org/lgfcuofx/lgfcu.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:19:36","lastsslvalidation":"2015-07-02 23:19:35","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"749","name":"Wells Fargo Bank","fid":"3000","org":"WF","url":"https://ofxdc.wellsfargo.com/ofx/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:53:24","lastsslvalidation":"2016-01-22 21:55:43","profile":{"-addr1":"P.O. Box 6808","-city":"Concord","-state":"CA","-postalcode":"94524","-country":"USA","-csphone":"1-800-956-4442","-tsphone":"1-800-956-4442","-url":"https://online.wellsfargo.com/","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"750","name":"Schwab Retirement Plan Services","fid":"11811","org":"The 401k Company","brokerid":"www.401kaccess.com","url":"https://ofx1.401kaccess.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-14 09:10:26","lastsslvalidation":"2015-08-09 06:57:40","profile":{"-addr1":"98 San Jacinto Blvd.","-addr2":"Suite 1100","-city":"Austin","-state":"TX","-postalcode":"78701","-country":"USA","-csphone":"(800) 777-4015","-tsphone":"(800) 777-4015","-url":"http://www.the401k.com","-email":"partserv@the401k.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"751","name":"Southern Community Bank and Trust (SCB&T)","fid":"053112097","org":"MOneFortyEight","url":"https://ofx1.evault.ws/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:58:30","lastsslvalidation":"2015-07-02 23:58:30","profile":{"-addr1":"4605 Country Club Road","-city":"Winston-Salem","-state":"NC","-postalcode":"27104","-country":"USA","-csphone":"(888) 768-2666","-tsphone":"(888) 768-2666","-url":"http://www.smallenoughtocare.com","-email":"noreply@smallenoughtocare.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"752","name":"Elevations Credit Union IB WC-DC","fid":"307074580","org":"uofcfcu","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx ","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:51:25","lastsslvalidation":"2015-07-02 22:51:24","profile":{"-addr1":"Po Box 9004","-city":"Boulder","-state":"CO","-postalcode":"80301","-country":"USA","-csphone":"303-443-4672","-tsphone":"303-443-4672","-url":"www.elevationscu.com","-email":"ecuservice@elevationscu.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"753","name":"Credit Suisse Securities USA LLC","fid":"001","org":"Credit Suisse Securities USA LLC","brokerid":"credit-suisse.com","url":"https://ofx.netxclient.com/cgi/OFXNetx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:40:39","lastsslvalidation":"2015-07-02 22:40:39","profile":{"-addr1":"ELEVEN MADISON AVENUE","-city":"New York","-state":"NY","-postalcode":"10010","-country":"USA","-csphone":"1-877-355-1818","-tsphone":"877-355-1818","-url":"http://www.credit-suisse.com/pbclientview","-email":"pb.clientview@credit-suisse.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"754","name":"North Country FCU","fid":"211691004","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:28:29","lastsslvalidation":"2015-07-02 23:28:28","profile":{"-addr1":"69 Swift St","-addr2":"Ste 100","-city":"S. Burlington","-state":"VT","-postalcode":"05403","-country":"USA","-csphone":"800-660-3258","-tsphone":"800-660-3258","-url":"www.northcountry.org","-email":"memberservices@northcountry.org","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"755","name":"South Carolina Bank and Trust","fid":"053200983","org":"MZeroOneZeroSCBT","url":"https://ofx1.evault.ws/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-11-29 09:01:58","lastsslvalidation":"2015-07-02 23:56:53","profile":{"-addr1":"PO BOX 1287","-city":"Orangeburg","-state":"NC","-postalcode":"29116","-country":"USA","-csphone":"1-877-277-2185","-url":"http://www.scbtonline.com","-email":"noreply@scbtonline.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"756","name":"Wings Financial","fid":"296076152","org":"DI","brokerid":"102","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:53:26","lastsslvalidation":"2016-01-22 21:55:44","profile":{"-addr1":"14985 Glazier Avenue","-city":"Apple Valley","-state":"MN","-postalcode":"55124","-country":"USA","-csphone":"800-692-2274 x8 4357","-tsphone":"800-692-2274 x8 4357","-url":"www.wingsfinancial.com","-email":"helpdesk@wingsfinancial.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"757","name":"Haverhill Bank","fid":"93","org":"orcc","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:11:10","lastsslvalidation":"2015-07-02 23:11:10","profile":{"-addr1":"180 Merrimack Street","-addr2":"P.O. Box 1656","-city":"Haverhill","-state":"MA","-postalcode":"01830","-country":"USA","-csphone":"(800) 686-2831","-tsphone":"(800) 686-2831","-url":"http://www.haverhillbank.com","-email":"ebanking@haverhillbank.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"758","name":"Mission Federal Credit Union","fid":"1001","org":"mission","brokerid":"102","url":"https://missionlink.missionfcu.org/scripts/serverext.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-04-23 23:18:18","lastsslvalidation":"2015-04-23 23:18:17","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"759","name":"Southwest Missouri Bank","fid":"101203641","org":"Jack Henry","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-19 01:22:07","lastsslvalidation":"2015-07-02 23:58:31"},{"id":"760","name":"Cambridge Savings Bank","fid":"211371120","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:11","lastsslvalidation":"2015-07-02 22:28:10","profile":{"-addr1":"1374 Massachusetts Ave","-city":"Cambridge","-state":"MA","-postalcode":"02138-3083","-country":"USA","-csphone":"888-418-5626","-tsphone":"888-418-5626","-url":"www.cambridgesavings.com","-email":"info@csb.usa.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"761","name":"NetxClient UAT","fid":"1023","org":"NetxClient","brokerid":"www.netxclient.com","url":"https://uat-ofx.netxclient.inautix.com/cgi/OFXNetx","ofxfail":"3","sslfail":"0","lastofxvalidation":"2014-02-23 22:43:38","lastsslvalidation":"2015-07-02 23:26:45","profile":{"-addr1":"One Pershing Plaza","-city":"Jersey City","-state":"NJ","-postalcode":"07399","-country":"USA","-csphone":"201-413-2162","-tsphone":"201-413-2162","-url":"http://www.netxclient.com","-email":"mgutierrez@pershing.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"762","name":"bankfinancial","fid":"271972899","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:24:35","lastsslvalidation":"2015-07-02 22:24:34","profile":{"-addr1":"21110 S. Western Ave.","-city":"Olympia Fields","-state":"IL","-postalcode":"60461","-country":"USA","-csphone":"800-894-6900","-tsphone":"800-894-6900","-url":"www.bankfinancial.com","-email":"Please use Phone.","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"763","name":"AXA Equitable","fid":"7199","org":"AXA","brokerid":"AXAonline.com","url":"https://ofx.netxclient.com/cgi/OFXNetx","ofxfail":"3","sslfail":"0","lastofxvalidation":"2014-03-18 22:06:33","lastsslvalidation":"2015-07-02 22:22:37","profile":{"-addr1":"One Pershing Plaza","-city":"Jersey City","-state":"NJ","-postalcode":"07399","-country":"USA","-csphone":"201-413-2162","-tsphone":"201-413-2162","-url":"http://www.netxclient.com","-email":"mgutierrez@pershing.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"764","name":"Premier America Credit Union","fid":"322283990","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:38:42","lastsslvalidation":"2015-07-02 23:38:41","profile":{"-addr1":"19867 Prairie Street","-city":"Chatsworth","-state":"CA","-postalcode":"91311","-country":"USA","-csphone":"800-772-4000","-tsphone":"800-772-4000","-url":"www.premier.org","-email":"info@premier.org","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"765","name":"Bank of America - 5959","fid":"5959","org":"HAN","url":"https://ofx.bankofamerica.com/cgi-forte/fortecgi?servicename=ofx_2-3&pagename=ofx","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-03 22:15:33","lastsslvalidation":"2015-05-03 22:15:32","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"(800) 933-6262","-tsphone":"(800) 933-6262","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"766","name":"First Command Bank","fid":"188","org":"First Command Bank","url":"https://www19.onlinebank.com/OROFX16Listener","ofxfail":"1","sslfail":"5","lastofxvalidation":"2013-05-31 22:27:01","lastsslvalidation":"2014-08-24 22:18:29","profile":{"-addr1":"4100 South Hulen","-addr2":"Suite 150","-city":"Fort Worth","-state":"TX","-postalcode":"76109","-country":"USA","-csphone":"(888) 763-7600","-tsphone":"(888) 763-7600","-url":"http://www.firstcommandbank.com","-email":"ebd@firstcommandbank.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"767","name":"TIAA-CREF","fid":"041","org":"tiaa-cref.org","brokerid":"tiaa-cref.org","url":"https://ofx.netxclient.com/cgi/OFXNetx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:02:28","lastsslvalidation":"2015-07-03 00:02:27","profile":{"-addr1":"730 Third Avenue","-city":"New York","-state":"NY","-postalcode":"10017-3206","-country":"USA","-csphone":"800-927-3059","-tsphone":"800-927-3059","-url":"http://www.tiaa-cref.org","-email":"-","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"768","name":"Citizens National Bank","fid":"111903151","org":"DI","brokerid":"111903151","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:33:54","lastsslvalidation":"2015-07-02 22:33:54","profile":{"-addr1":"201 W. Main Street","-city":"Henderson","-state":"CA","-postalcode":"75653-1009","-country":"USA","-csphone":"877-566-2621","-tsphone":"877-566-2621","-url":"www.cnbtexas.com","-email":"n/a","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"769","name":"Tower Federal Credit Union","fid":"255077370","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:02:30","lastsslvalidation":"2015-07-03 00:02:29","profile":{"-addr1":"7901 Sandy Spring Road","-city":"Laurel","-state":"MD","-postalcode":"20707-3589","-country":"US","-csphone":"(301)497-7000","-url":"www.towerfcu.org","-email":"2","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"770","name":"First Republic Bank","fid":"321081669","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:03:17","lastsslvalidation":"2015-07-02 23:03:16","profile":{"-addr1":"111 Pine Street","-city":"San Francisco","-state":"CA","-postalcode":"94111","-country":"USA","-csphone":"888-372-4891","-tsphone":"888-372-4891","-url":"www.firstrepublic.com","-email":"2","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"771","name":"Texans Credit Union","fid":"-1","org":"TexansCU","url":"https://www.netit.financial-net.com/ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:59:10","lastsslvalidation":"2015-07-02 23:59:10"},{"id":"772","name":"AltaOne","fid":"322274462","org":"AltaOneFCU","url":"https://msconline.altaone.net/scripts/isaofx.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-23 04:00:19","lastsslvalidation":"2016-01-22 21:55:48","profile":{"-addr1":"1250 Drummers Ln.","-city":"Valley Forge","-state":"PA","-postalcode":"19482","-country":"USA","-csphone":"610-687-9400","-tsphone":"610-687-9400","-url":"http://www.users.com","-email":"admin@users.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"773","name":"CenterState Bank","fid":"1942","org":"ORCC","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:34","lastsslvalidation":"2015-07-02 22:28:33","profile":{"-addr1":"1101 First Street South","-city":"Winter Haven","-state":"FL","-postalcode":"33880","-country":"USA","-csphone":"800-786-7749","-tsphone":"800-786-7749","-url":"http://www.centerstatebank.com","-email":"estaton@centerstatebank.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"774","name":"5 Star Bank","fid":"307087713","org":"5 Star Bank","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:02:28","lastsslvalidation":"2015-07-02 22:02:27","profile":{"-addr1":"909 N. washington St","-city":"Alexandria","-state":"VA","-postalcode":"22314","-country":"USA","-csphone":"719-574-2777","-tsphone":"719-574-2777","-url":"www.5staronlinebanking.com","-email":"2","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"775","name":"Belmont Savings Bank","fid":"211371764","org":"DI","brokerid":"9460","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:26:14","lastsslvalidation":"2015-07-02 22:26:13","profile":{"-addr1":"2 Leonard Street","-city":"Belmont","-state":"MA","-postalcode":"02478","-country":"USA","-url":"www.belmontsavings.com","-email":"2","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"776","name":"UNIVERSITY & STATE EMPLOYEES CU","fid":"322281691","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:07:45","lastsslvalidation":"2015-07-03 00:07:44","profile":{"-addr1":"10120 Pacific Heights Blvd.","-city":"San Diego","-state":"CA","-postalcode":"92121","-country":"USA","-csphone":"1-866-USE-4-YOU","-tsphone":"1-866-USE-4-YOU","-url":"http://www.usecu.org","-email":"webmaster@usecu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"777","name":"Wells Fargo Bank 2013","fid":"3001","org":"Wells Fargo","url":"https://www.oasis.cfree.com/3001.ofxgp","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:53:51","lastsslvalidation":"2016-01-22 21:55:49"},{"id":"778","name":"The Golden1 Credit Union","fid":"1001","org":"Golden1","url":"https://homebanking.golden1.com/scripts/serverext.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:59:15","lastsslvalidation":"2016-01-02 00:17:22","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"779","name":"Woodsboro Bank","fid":"7479","org":"JackHenry","brokerid":"102","url":"https://directline.netteller.com/","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-22 21:53:53","lastsslvalidation":"2016-01-22 21:55:51","profile":{"-addr1":"P O Box 36","-addr2":"Woodsboro, MD 21798","-city":"WOODSBORO","-state":"MD","-postalcode":"217980036","-country":"USA","-csphone":"(301) 898-4000","-tsphone":"301-898-4000","-url":"http://www.woodsborobank.com","-email":"customerservice@woodsborobank.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"780","name":"Sandia Laboratory Federal Credit Union","fid":"1001","org":"SLFCU","brokerid":"307083911","url":"https://ofx-prod.slfcu.org/ofx/process.ofx ","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:49:56","lastsslvalidation":"2015-07-02 23:49:56","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"781","name":"Oregon Community Credit Union","fid":"2077","org":"ORCC","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-24 04:19:40","lastsslvalidation":"2015-07-02 23:33:44","profile":{"-addr1":"PO Box 77002","-city":"Eugene","-state":"OR","-postalcode":"97401-0146","-country":"USA","-csphone":"800-365-1111","-tsphone":"800-365-1111","-url":"http://www.OregonCommunityCU.org","-email":"mpenn@OregonCommunityCU.org","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"782","name":"Advantis Credit Union","fid":"323075097","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:04:17","lastsslvalidation":"2015-07-02 22:04:16","profile":{"-addr1":"P.O. BOX 14220","-city":"Portland","-state":"OR","-postalcode":"97293-0220","-country":"USA","-csphone":"503-785-2528 opt 5","-tsphone":"503-785-2528 opt 5","-url":"www.advantiscu.org","-email":"advantiscu@advantiscu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"783","name":"Capital One 360","fid":"031176110","org":"ING DIRECT","url":"https://ofx.capitalone360.com/OFX/ofx.html","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:25","lastsslvalidation":"2015-07-02 22:28:24"},{"id":"784","name":"Flagstar Bank","fid":"272471852","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:05:34","lastsslvalidation":"2015-07-02 23:05:33","profile":{"-addr1":"301 W. Michigan Ave","-city":"Jackson","-state":"MI","-postalcode":"49201","-country":"USA","-csphone":"800-642-0039","-tsphone":"800-642-0039","-url":"www.flagstar.com","-email":"bank@flagstar.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"785","name":"Arizona State Credit Union","fid":"322172496","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:19:25","lastsslvalidation":"2015-07-02 22:19:25","profile":{"-addr1":"1819 W. Monroe St.","-city":"Phoenix","-state":"AZ","-postalcode":"85007","-country":"USA","-csphone":"1-800-671-1098","-tsphone":"1-800-671-1098","-url":"https://www.azstcu.org","-email":"virtualaccess@azstcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"786","name":"AmegyBank","fid":"1165","org":"292-3","url":"https://pfm.metavante.com/ofx/OFXServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:09:10","lastsslvalidation":"2015-07-02 22:09:09","profile":{"-addr1":"4400 Post Oak Parkway","-city":"Houston","-state":"TX","-postalcode":"77027","-country":"USA","-csphone":"18885018157","-tsphone":"18885018157","-url":"www.amegybank.com","-email":"amegypfm@amegybank.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-interxfermsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"787","name":"Bank of Internet, USA","fid":"122287251","org":"Bank of Internet","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:22:49","lastsslvalidation":"2015-07-02 22:22:48","profile":{"-addr1":"1277 High Bluff Derive #100","-city":"San Diego","-state":"CA","-postalcode":"92191-9000","-country":"USA","-csphone":"858-350-6200","-tsphone":"858-350-6200","-url":"www.mybankinternet.com","-email":"secure@BofI.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"788","name":"Amplify Federal Credit Union","fid":"1","org":"Harland Financial Solutions","url":"https://ezonline.goamplify.com/ofx/ofx.dll","ofxfail":"1","sslfail":"5","lastofxvalidation":"2014-04-04 22:03:35","lastsslvalidation":"2014-04-04 22:03:34","profile":{"-addr1":"P.O. BOX 2351","-city":"Sacramento","-state":"CA","-postalcode":"95812","-country":"USA","-csphone":"916 444 6070","-url":"https://homebank.sactocu.org","-email":"info@sactocu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"789","name":"Capitol Federal Savings Bank","fid":"1001","org":"CapFed","brokerid":"CapFed","url":"https://ofx-prod.capfed.com/ofx/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:31","lastsslvalidation":"2015-07-02 22:28:31","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"790","name":"Bank of America - access.ofx","fid":"5959","org":"HAN","url":"https://eftx.bankofamerica.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:22:47","lastsslvalidation":"2015-07-02 22:22:46","profile":{"-addr1":"Interactive Banking","-addr2":"TX1-854-06-12","-addr3":"P.O. Box 655961","-city":"Dallas","-state":"TX","-postalcode":"75265-9964","-country":"USA","-csphone":"(800) 933-6262","-tsphone":"(800) 933-6262","-url":"http://www.bankofamerica.com","-email":"forte@bankofamerica.com","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"791","name":"SVB","fid":"944","org":"SVB","url":"https://ofx.svbconnect.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:59:00","lastsslvalidation":"2015-07-02 23:59:00"},{"id":"792","name":"Iinvestor360","fid":"7784","org":"Fidelity","brokerid":"1234","url":"https://www.investor360.net/OFX/FinService.asmx/GetData","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:14:43","lastsslvalidation":"2015-07-02 23:14:43","profile":{"-addr1":"XXXXXXXXXX","-city":"XXXXXXXXXX","-state":"XX","-postalcode":"XXXXX","-country":"USA","-csphone":"Contact your broker/dealer.","-tsphone":"Contact your broker/dealer.","-url":"https://ofx.ibgstreetscape.com","-signonmsgset":"true","-invstmtmsgset":"true"}},{"id":"793","name":"Sound CU","fid":"325183220","org":"SOUNDCUDC","url":"https://mb.soundcu.com/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:56:53","lastsslvalidation":"2015-07-02 23:56:52","profile":{"-addr1":"1331 Broadway Plaza","-city":"Tacoma","-state":"WA","-postalcode":"98402","-country":"USA","-csphone":"253-383-2016","-tsphone":"253-383-2016","-url":"www.soundcu.com","-email":"info@soundcu.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"794","name":"Tangerine (Canada)","fid":"10951","org":"TangerineBank","url":"https://ofx.tangerine.ca","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:59:02","lastsslvalidation":"2015-07-02 23:59:02","profile":{"-addr1":"3389 Steeles Avenue East","-city":"Toronto","-state":"ON","-postalcode":"M2H 3S8","-country":"CAN","-csphone":"800-464-3473","-tsphone":"800-464-3473","-url":"http://www.tangerine.ca","-email":"clientservices@ingdirect.ca","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"795","name":"First Tennessee","fid":"2250","org":"Online Financial Services ","url":"https://ofx.firsttennessee.com/ofx/ofx_isapi.dll ","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:05:29","lastsslvalidation":"2015-07-02 23:05:29","profile":{"-addr1":"165 Madison Ave.","-city":"Memphis","-state":"TN","-postalcode":"38103","-country":"USA","-csphone":"1-800-382-5465","-tsphone":"1-800-382-5465","-url":"www.firsttennessee.com","-email":"allthingsfinancial@firsttennesse","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true"}},{"id":"796","name":"Alaska Air Visa (Bank of America)","fid":"1142","org":"BofA","brokerid":"1142","url":"https://akairvisa.iglooware.com/visa.php","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-01-10 22:01:53"},{"id":"797","name":"TIAA-CREF Retirement Services","fid":"1304","org":"TIAA-CREF","url":"https://ofx-service.tiaa-cref.org/public/ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2016-01-23 10:21:11","lastsslvalidation":"2015-07-03 00:02:28","profile":{"-addr1":"730 Third Avenue","-city":"New York","-state":"NY","-postalcode":"10017","-country":"USA","-csphone":"800-842-2776","-tsphone":"800-842-2776","-url":"http://www.tiaa-cref.org","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"798","name":"Bofi federal bank","fid":"122287251","org":"Bofi Federal Bank - Business","url":"https://directline.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:04","lastsslvalidation":"2015-07-02 22:28:04","profile":{"-addr1":"1277 High Bluff Derive #100","-city":"San Diego","-state":"CA","-postalcode":"92191-9000","-country":"USA","-csphone":"858-350-6200","-tsphone":"858-350-6200","-url":"www.mybankinternet.com","-email":"secure@BofI.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"799","name":"Vanguard","fid":"15103","org":"Vanguard","brokerid":"vanguard.com","url":"https://vesnc.vanguard.com/us/OfxDirectConnectServlet","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:09:36","lastsslvalidation":"2015-07-03 00:09:36","profile":{"-addr1":"P.O. Box 1110","-city":"Valley Forge","-state":"PA","-postalcode":"19482-1110","-country":"USA"}},{"id":"800","name":"Wright Patt CU","fid":"242279408","org":"DI","brokerid":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:17:21","lastsslvalidation":"2015-07-03 00:17:20","profile":{"-addr1":"2455 Executive Park Boulevard","-city":"Fairborn","-state":"OH","-postalcode":"45324","-country":"USA","-csphone":"1(800)762-0047","-tsphone":"(800)762-0047","-url":"www.wpcu.coop","-email":"ContactUs@wpcu.coop","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"801","name":"Technology Credit Union","fid":"15079","org":"TECHCUDC","url":"https://m.techcu.com/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:59:07","lastsslvalidation":"2015-07-02 23:59:07"},{"id":"802","name":"Capital One Bank (after 12-15-13)","fid":"1001","org":"Capital One","url":"https://ofx.capitalone.com/ofx/103/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:28:27","lastsslvalidation":"2015-07-02 22:28:27","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"803","name":"Bancorpsouth","fid":"1001","org":"BXS","url":"https://ofx-prod.bancorpsouthonline.com/ofx/process.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:22:40","lastsslvalidation":"2015-07-02 22:22:40","profile":{"-addr1":"1200 San Bernardo","-city":"Laredo","-state":"TX","-postalcode":"78040","-country":"USA","-csphone":"210-518-2571","-tsphone":"505-237-3725","-url":"Unknown","-email":"Unknown","-signonmsgset":"true","-bankmsgset":"true","-creditcardmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"804","name":"Monterey Credit Union","fid":"2059","org":"orcc","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:23:17","lastsslvalidation":"2015-07-02 23:23:17","profile":{"-addr1":"PO Box 3288","-city":"Monterey,","-state":"CA","-postalcode":"93942","-country":"USA","-csphone":"877-277-8108","-tsphone":"877-277-8108","-url":"https://secure.montereycu.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"805","name":"D. A. Davidson","fid":"59401","org":"dadco.com","brokerid":"dadco.com","url":"https://pfm.davidsoncompanies.com/eftxweb/access.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:42:18","lastsslvalidation":"2015-07-02 22:42:17","profile":{"-addr1":"8 Third Street North","-city":"Great Falls","-state":"MT","-postalcode":"59401","-country":"USA","-csphone":"1-800-332-5915","-tsphone":"1-800-332-5915","-url":"http://www.davidsoncompanies.com","-email":"itweb@dadco.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"806","name":"Morgan Stanley ClientServ - Quicken Win Format","fid":"1235","org":"msdw.com","brokerid":"msdw.com","url":"https://ofx.morganstanleyclientserv.com/ofx/QuickenWinProfile.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:23:19","lastsslvalidation":"2015-07-02 23:23:18","profile":{"-addr1":"1 New York Plaza","-addr2":"11th Floor","-city":"New York","-state":"NY","-postalcode":"10004","-country":"USA","-csphone":"(800) 531-1596","-tsphone":"(800) 531-1596","-url":"www.morganstanleyclientserv.com","-email":"clientservfeedback@morganstanley","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"807","name":"Star One Credit Union","fid":"321177968","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:58:35","lastsslvalidation":"2015-07-02 23:58:34","profile":{"-addr1":"1306 Bordeaux Dr.","-city":"Sunnyvale","-state":"CA","-postalcode":"94089","-country":"USA","-csphone":"(866)543-5202","-tsphone":"(866)543-5202","-url":"www.starone.org","-email":"service@starone.org","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true"}},{"id":"808","name":"Scottrade Brokerage","fid":"777","org":"Scottrade","brokerid":"www.scottrade.com","url":"https://ofx.scottrade.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:50:07","lastsslvalidation":"2015-07-02 23:50:07","profile":{"-addr1":"12855 Flushing Meadows Dr.","-city":"St. Louis","-state":"MO","-postalcode":"63131","-country":"USA","-csphone":"314.965.1555","-tsphone":"314.965.1555","-url":"http://www.scottrade.com","-email":"support@scottrade.com","-signonmsgset":"true","-invstmtmsgset":"true","-seclistmsgset":"true"}},{"id":"809","name":"Mutual Bank","fid":"88","org":"ORCC","url":"https://www20.onlinebank.com/OROFX16Listener","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:26:31","lastsslvalidation":"2015-07-02 23:26:31","profile":{"-addr1":"P.O. Box 150","-city":"Whitman","-state":"MA","-postalcode":"02382","-country":"USA","-csphone":"866-986-9226","-tsphone":"866-986-9226","-url":"http://www.MyMutualBank.com","-email":"info@orcc.com","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"810","name":"Affinity Plus Federal Credit Union-New","fid":"15268","org":"Affinity Plus Federal Credit Uni","url":"https://mobile.affinityplus.org/OFX/OFXServer.aspx","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 22:04:19","lastsslvalidation":"2015-07-02 22:04:19","profile":{"-addr1":"175 West Lafayette Frontage Road","-city":"St. Paul","-state":"MN","-postalcode":"55107","-country":"USA","-csphone":"800-322-7228","-tsphone":"651-291-3700","-url":"https://www.affinityplus.org","-email":"affinityplus@affinityplus.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"811","name":"Suncoast Credit Union","fid":"15469","org":"SunCoast","url":"https://ofx.suncoastcreditunion.com","ofxfail":"0","sslfail":"4","lastofxvalidation":"2015-07-02 23:58:45","profile":{"-addr1":"6801 E. Hillsborough Ave","-city":"Tampa","-state":"FL","-postalcode":"33680","-country":"USA","-csphone":"813.621.7511","-tsphone":"813.621.7511","-url":"http://www.suncoastcreditunion.com","-email":"contactus@suncoastfcu.org","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"812","name":"Think Mutual Bank","fid":"10139","org":"JackHenry","url":"https://directline2.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-03 00:02:27","lastsslvalidation":"2015-07-03 00:02:26","profile":{"-addr1":"5200 Members Parkway NW","-addr2":"Rochester MN 55903","-city":"ROCHESTER","-state":"MN","-postalcode":"559010000","-country":"USA","-csphone":"(800) 288-3425","-tsphone":"800-288-3425","-url":"https://www.thinkbank.com","-email":"think@thinkbank.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"813","name":"La Banque Postale","fid":"0","org":"0","url":"https://ofx.videoposte.com/","ofxfail":"1","sslfail":"5","lastofxvalidation":"2015-05-12 01:11:28","lastsslvalidation":"2015-06-23 23:19:45"},{"id":"814","name":"Pennsylvania State Employees Credit Union","fid":"231381116","org":"PENNSTATEEMPLOYEES","url":"https://directconnect.psecu.com/ofxserver/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:37:00","lastsslvalidation":"2015-07-02 23:37:00","profile":{"-addr1":"1 Credit Union Pl","-city":"Harrisburg","-state":"PA","-postalcode":"17110","-country":"USA","-csphone":"800-237-7328","-url":"https://directconnect.psecu.com/OFXServer/ofxsrvr.dll","-email":"PSECU@psecu.com","-signonmsgset":"true","-bankmsgset":"true","-emailmsgset":"true"}},{"id":"815","name":"St. Mary\'s Credit Union","fid":"211384214","org":"MSevenThirtySeven","url":"https://ofx1.evault.ws/OFXServer/ofxsrvr.dll","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:58:33","lastsslvalidation":"2015-07-02 23:58:33","profile":{"-addr1":"293 Boston Post Road West","-city":"Marlborough","-state":"MA","-postalcode":"01752","-country":"USA","-csphone":"(508) 490-6707","-tsphone":"(508) 490-6707","-url":"https://ofx1.evault.ws/OFXServer/ofxsrvr.dll","-email":"noreply@stmaryscreditunion.com","-signonmsgset":"true","-bankmsgset":"true"}},{"id":"816","name":"Institution For Savings","fid":"59466","org":"JackHenry","url":"https://directline2.netteller.com","ofxfail":"0","sslfail":"0","lastofxvalidation":"2015-07-02 23:15:52","lastsslvalidation":"2015-07-02 23:15:52"},{"id":"817","name":"PNC Online Banking","fid":"4501","org":"ISC","url":"https://www.oasis.cfree.com/4501.ofxgp","lastofxvalidation":"2015-07-21 11:40:21","profile":{"-addr1":"P.O. Box 339","-city":"Pittsburgh","-state":"PA","-postalcode":"152309736","-country":"USA","-url":"http://www.pncbank.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"818","name":"PNC Banking Online","fid":"4501","org":"ISC","url":"https://www.oasis.cfree.com/4501.ofx","lastofxvalidation":"2015-07-21 11:43:08","profile":{"-addr1":"P.O. Box 339","-city":"Pittsburgh","-state":"PA","-postalcode":"152309736","-country":"USA","-url":"http://www.pncbank.com/","-signonmsgset":"true","-bankmsgset":"true","-billpaymsgset":"true","-emailmsgset":"true"}},{"id":"819","name":"Voya","fid":"1289","url":"https://ofx.voyaplans.com/eofx/Server","lastofxvalidation":"2015-09-01 18:13:12"},{"id":"820","name":"Central Bank Utah","fid":"124300327","org":"DI","brokerid":"102","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","lastofxvalidation":"2015-11-03 08:41:54"},{"id":"821","name":"nuVision Financial FCU","fid":"322282399","org":"DI","url":"https://ofxdi.diginsite.com/cmr/cmr.ofx","lastofxvalidation":"2015-12-28 13:39:28"},{"id":"822","name":"Landings Credit Union","fid":"02114","org":"JackHenry","url":"https://directline.netteller.com","lastofxvalidation":"2015-12-30 04:30:20"}]'; + $banks = json_decode($banks); foreach ($banks as $bank) { - if (!DB::table('banks')->where('remote_id', '=', $bank['remote_id'])->get()) { - Bank::create($bank); + if (!DB::table('banks')->where('remote_id', '=', $bank->id)->get()) { + if ( ! isset($bank->fid) || ! isset($bank->org)) { + continue; + } + + Bank::create([ + 'remote_id' => $bank->id, + 'name' => $bank->name, + 'config' => json_encode([ + 'fid' => $bank->fid, + 'org' => $bank->org, + 'url' => $bank->url + ]), + ]); } } } diff --git a/public/css/built.css b/public/css/built.css index 763c36cddca6..e488cc1f8b68 100644 --- a/public/css/built.css +++ b/public/css/built.css @@ -3385,4 +3385,9 @@ ul.user-accounts a:hover div.remove { div.panel-body div.panel-body { padding-bottom: 0px; +} + +.vcenter { + display: inline-block; + vertical-align: middle; } \ No newline at end of file diff --git a/resources/lang/da/pagination.php b/resources/lang/da/pagination.php index f07b64dfa85f..6e20cbfa387e 100644 --- a/resources/lang/da/pagination.php +++ b/resources/lang/da/pagination.php @@ -1,4 +1,4 @@ - 'Næste »', -); \ No newline at end of file +); diff --git a/resources/lang/da/texts.php b/resources/lang/da/texts.php index d4c7799d3d6d..b3072919d8b8 100644 --- a/resources/lang/da/texts.php +++ b/resources/lang/da/texts.php @@ -989,5 +989,126 @@ 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', - ); + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/da/validation.php b/resources/lang/da/validation.php index 3ec0c4c10358..c345b4353ed9 100644 --- a/resources/lang/da/validation.php +++ b/resources/lang/da/validation.php @@ -25,7 +25,7 @@ return array( "numeric" => ":attribute skal være imellem :min - :max.", "file" => ":attribute skal være imellem :min - :max kilobytes.", "string" => ":attribute skal være imellem :min - :max tegn.", - "array" => ":attribute skal indeholde mellem :min - :max elementer." + "array" => ":attribute skal indeholde mellem :min - :max elementer.", ), "boolean" => ":attribute skal være sandt eller falsk", "confirmed" => ":attribute er ikke det samme som bekræftelsesfeltet.", @@ -44,14 +44,14 @@ return array( "numeric" => ":attribute skal være højest :max.", "file" => ":attribute skal være højest :max kilobytes.", "string" => ":attribute skal være højest :max tegn.", - "array" => ":attribute må ikke indeholde mere end :max elementer." + "array" => ":attribute må ikke indeholde mere end :max elementer.", ), "mimes" => ":attribute skal være en fil af typen: :values.", "min" => array( "numeric" => ":attribute skal være mindst :min.", "file" => ":attribute skal være mindst :min kilobytes.", "string" => ":attribute skal være mindst :min tegn.", - "array" => ":attribute skal indeholde mindst :min elementer." + "array" => ":attribute skal indeholde mindst :min elementer.", ), "not_in" => "Den valgte :attribute er ugyldig.", "numeric" => ":attribute skal være et tal.", @@ -67,7 +67,7 @@ return array( "numeric" => ":attribute skal være :size.", "file" => ":attribute skal være :size kilobytes.", "string" => ":attribute skal være :size tegn lang.", - "array" => ":attribute skal indeholde :size elementer." + "array" => ":attribute skal indeholde :size elementer.", ), "timezone" => "The :attribute must be a valid zone.", "unique" => ":attribute er allerede taget.", @@ -80,7 +80,7 @@ return array( "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/lang/de/pagination.php b/resources/lang/de/pagination.php index 186f22c5288c..5bb69029e529 100644 --- a/resources/lang/de/pagination.php +++ b/resources/lang/de/pagination.php @@ -1,4 +1,4 @@ - 'Dem Kunden :client wurde die Rechnung :invoice über :amount versendet.', 'notification_invoice_viewed' => 'Der Kunde :client hat sich die Rechnung :invoice über :amount angesehen.', 'reset_password' => 'Du kannst dein Passwort zurücksetzen, indem du auf den folgenden Link klickst:', - 'reset_password_footer' => 'Wenn du das Zurücksetzen des Passworts nicht beantragt hast, benachrichtige bitte unseren Support: ' . CONTACT_EMAIL, - + 'reset_password_footer' => 'Wenn du das Zurücksetzen des Passworts nicht beantragt hast, benachrichtige bitte unseren Support: '.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Sichere Zahlung', @@ -300,7 +299,7 @@ return array( 'logout' => 'Ausloggen', 'sign_up_to_save' => 'Melde dich an, um deine Arbeit zu speichern', - 'agree_to_terms' =>'Ich akzeptiere die InvoiceNinja :terms', + 'agree_to_terms' => 'Ich akzeptiere die InvoiceNinja :terms', 'terms_of_service' => 'Service-Bedingungen', 'email_taken' => 'Diese E-Mail-Adresse ist bereits registriert', 'working' => 'Wird bearbeitet', @@ -420,7 +419,7 @@ return array( 'active' => 'Aktiv', 'pending' => 'Ausstehend', 'deleted_user' => 'Benutzer erfolgreich gelöscht', - 'limit_users' => 'Entschuldige, das würde das Limit von ' . MAX_NUM_USERS . ' Benutzern überschreiten', + 'limit_users' => 'Entschuldige, das würde das Limit von '.MAX_NUM_USERS.' Benutzern überschreiten', 'confirm_email_invoice' => 'Bist du sicher, dass du diese Rechnung per E-Mail versenden möchtest?', 'confirm_email_quote' => 'Bist du sicher, dass du dieses Angebot per E-Mail versenden möchtest', @@ -990,5 +989,127 @@ return array( 'schedule' => 'Schedule', 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', - -); + + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php index c10db3ea2a68..e8be6d98b63c 100644 --- a/resources/lang/de/validation.php +++ b/resources/lang/de/validation.php @@ -25,7 +25,7 @@ return array( "numeric" => ":attribute muss zwischen :min & :max liegen.", "file" => ":attribute muss zwischen :min & :max Kilobytes groß sein.", "string" => ":attribute muss zwischen :min & :max Zeichen lang sein.", - "array" => ":attribute muss zwischen :min & :max Elemente haben." + "array" => ":attribute muss zwischen :min & :max Elemente haben.", ), "confirmed" => ":attribute stimmt nicht mit der Bestätigung überein.", "date" => ":attribute muss ein gültiges Datum sein.", @@ -43,14 +43,14 @@ return array( "numeric" => ":attribute darf maximal :max sein.", "file" => ":attribute darf maximal :max Kilobytes groß sein.", "string" => ":attribute darf maximal :max Zeichen haben.", - "array" => ":attribute darf nicht mehr als :max Elemente haben." + "array" => ":attribute darf nicht mehr als :max Elemente haben.", ), "mimes" => ":attribute muss den Dateityp :values haben.", "min" => array( "numeric" => ":attribute muss mindestens :min sein.", "file" => ":attribute muss mindestens :min Kilobytes groß sein.", "string" => ":attribute muss mindestens :min Zeichen lang sein.", - "array" => ":attribute muss mindestens :min Elemente haben." + "array" => ":attribute muss mindestens :min Elemente haben.", ), "not_in" => "Der gewählte Wert für :attribute ist ungültig.", "numeric" => ":attribute muss eine Zahl sein.", @@ -66,7 +66,7 @@ return array( "numeric" => ":attribute muss gleich :size sein.", "file" => ":attribute muss :size Kilobyte groß sein.", "string" => ":attribute muss :size Zeichen lang sein.", - "array" => ":attribute muss genau :size Elemente haben." + "array" => ":attribute muss genau :size Elemente haben.", ), "unique" => ":attribute ist schon vergeben.", "url" => "Das Format von :attribute ist ungültig.", @@ -78,7 +78,7 @@ return array( "has_counter" => 'Der Wert muss {$counter} beinhalten', "valid_contacts" => "Alle Kontake müssen entweder einen Namen oder eine E-Mail Adresse haben", "valid_invoice_items" => "Die Rechnung übersteigt den maximalen Betrag", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php index 62b98ae8d8c5..b573b51e9158 100644 --- a/resources/lang/en/pagination.php +++ b/resources/lang/en/pagination.php @@ -1,4 +1,4 @@ - 'Successfully deleted vendor', 'deleted_vendors' => 'Successfully deleted :count vendors', - // Emails 'confirmation_subject' => 'Invoice Ninja Account Confirmation', 'confirmation_header' => 'Account Confirmation', @@ -284,8 +283,7 @@ return array( 'notification_invoice_sent' => 'The following client :client was emailed Invoice :invoice for :amount.', 'notification_invoice_viewed' => 'The following client :client viewed Invoice :invoice for :amount.', 'reset_password' => 'You can reset your account password by clicking the following button:', - 'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL, - + 'reset_password_footer' => 'If you did not request this password reset please email our support: '.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Secure Payment', @@ -313,7 +311,7 @@ return array( 'logout' => 'Log Out', 'sign_up_to_save' => 'Sign up to save your work', - 'agree_to_terms' =>'I agree to the Invoice Ninja :terms', + 'agree_to_terms' => 'I agree to the Invoice Ninja :terms', 'terms_of_service' => 'Terms of Service', 'email_taken' => 'The email address is already registered', 'working' => 'Working', @@ -433,7 +431,7 @@ return array( 'active' => 'Active', 'pending' => 'Pending', 'deleted_user' => 'Successfully deleted user', - 'limit_users' => 'Sorry, this will exceed the limit of ' . MAX_NUM_USERS . ' users', + 'limit_users' => 'Sorry, this will exceed the limit of '.MAX_NUM_USERS.' users', 'confirm_email_invoice' => 'Are you sure you want to email this invoice?', 'confirm_email_quote' => 'Are you sure you want to email this quote?', @@ -1053,7 +1051,7 @@ return array( 'view' => 'View', 'restore_expense' => 'Restore Expense', 'invoice_expense' => 'Invoice Expense', - 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', 'expense_error_invoiced' => 'Expense has already been invoiced', 'convert_currency' => 'Convert currency', @@ -1107,6 +1105,8 @@ return array( 'payment_type_direct_debit' => 'Direct Debit', 'bank_accounts' => 'Bank Accounts', 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', 'bank_id' => 'bank', 'integration_type' => 'Integration Type', 'updated_bank_account' => 'Successfully updated bank account', @@ -1114,17 +1114,20 @@ return array( 'archive_bank_account' => 'Archive Bank Account', 'archived_bank_account' => 'Successfully archived bank account', 'created_bank_account' => 'Successfully created bank account', - 'test' => 'Test', - 'test_bank_account' => 'Test Bank Account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', 'username' => 'Username', 'account_number' => 'Account Number', + 'account_name' => 'Account Name', 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', 'status_approved' => 'Approved', 'quote_settings' => 'Quote Settings', 'auto_convert_quote' => 'Auto convert quote', 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', - ); diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index a5db12a5eca0..d17016b2b53f 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -68,7 +68,7 @@ return array( ), "unique" => "The :attribute has already been taken.", "url" => "The :attribute format is invalid.", - + "positive" => "The :attribute must be greater than zero.", "has_credit" => "The client does not have enough credit.", "notmasked" => "The values are masked", diff --git a/resources/lang/es/texts.php b/resources/lang/es/texts.php index e84b9c4fe100..50bf8e9e9093 100644 --- a/resources/lang/es/texts.php +++ b/resources/lang/es/texts.php @@ -3,7 +3,7 @@ return array( // client - 'organization' => 'Empresa', + 'organization' => 'Empresa', 'name' => 'Nombre', //Razon social-Colombia, 'website' => 'Sitio Web', 'work_phone' => 'Teléfono', @@ -116,7 +116,7 @@ return array( 'billed_client' => 'cliente facturado', 'billed_clients' => 'clientes facturados', 'active_client' => 'cliente activo', - 'active_clients' => 'clientes activos', + 'active_clients' => 'clientes activos', 'invoices_past_due' => 'Facturas vencidas', 'upcoming_invoices' => 'Próximas facturas', 'average_invoice' => 'Promedio de facturación', @@ -265,12 +265,12 @@ return array( 'notification_invoice_sent' => 'La factura :invoice por valor de :amount fue enviada al cliente :cliente.', 'notification_invoice_viewed' => 'La factura :invoice por valor de :amount fue visualizada por el cliente :client.', 'reset_password' => 'Puedes reconfigurar la contraseña de tu cuenta haciendo clic en el siguiente enlace:', - 'reset_password_footer' => 'Si no has solicitado un cambio de contraseña, por favor contactate con nosostros: ' . CONTACT_EMAIL, + 'reset_password_footer' => 'Si no has solicitado un cambio de contraseña, por favor contactate con nosostros: '.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Pago seguro', 'card_number' => 'Número de tarjeta', - 'expiration_month' => 'Mes de caducidad', + 'expiration_month' => 'Mes de caducidad', 'expiration_year' => 'Año de caducidad', 'cvv' => 'CVV', @@ -290,9 +290,9 @@ return array( 'remove_logo' => ':link haz click para eliminar el logo de Invoice Ninja', //Maybe incorrect for the context 'remove_logo_link' => 'Haz clic aquí', ], - 'logout' => 'Cerrar sesión', - 'sign_up_to_save' => 'Registrate para guardar tu trabajo', - 'agree_to_terms' =>'Estoy de acuerdo con los términos de Invoice Ninja :terms', + 'logout' => 'Cerrar sesión', + 'sign_up_to_save' => 'Registrate para guardar tu trabajo', + 'agree_to_terms' => 'Estoy de acuerdo con los términos de Invoice Ninja :terms', 'terms_of_service' => 'Términos de servicio', 'email_taken' => 'Esta dirección de correo electrónico ya se ha registrado', 'working' => 'Procesando', @@ -311,7 +311,7 @@ return array( 'field_label' => 'Etiqueta del campo', 'field_value' => 'Valor del campo', 'edit' => 'Editar', - 'view_as_recipient' => 'Ver como destinitario', + 'view_as_recipient' => 'Ver como destinitario', // product management 'product_library' => 'Inventario de productos', @@ -374,7 +374,7 @@ return array( 'notification_quote_sent_subject' => 'Cotización :invoice enviada a el cliente :client', 'notification_quote_viewed_subject' => 'Cotización :invoice visualizada por el cliente :client', 'notification_quote_sent' => 'La cotización :invoice por un valor de :amount, ha sido enviada al cliente :client.', - 'notification_quote_viewed' => 'La cotizacion :invoice por un valor de :amount ha sido visualizada por el cliente :client.', + 'notification_quote_viewed' => 'La cotizacion :invoice por un valor de :amount ha sido visualizada por el cliente :client.', 'session_expired' => 'Tu sesión ha caducado.', 'invoice_fields' => 'Campos de factura', 'invoice_options' => 'Opciones de factura', @@ -396,7 +396,7 @@ return array( 'active' => 'Activar', 'pending' => 'Pendiente', 'deleted_user' => 'Usario eliminado con éxito', - 'limit_users' => 'Lo sentimos, esta acción excederá el límite de ' . MAX_NUM_USERS . ' usarios', + 'limit_users' => 'Lo sentimos, esta acción excederá el límite de '.MAX_NUM_USERS.' usarios', 'confirm_email_invoice' => '¿Estás seguro que quieres enviar esta factura?', 'confirm_email_quote' => '¿Estás seguro que quieres enviar esta cotización?', 'confirm_recurring_email_invoice' => 'Se ha marcado esta factura como recurrente, estás seguro que quieres enviar esta factura?', @@ -459,7 +459,7 @@ return array( 'restored_client' => 'Cliente restaurado con éxito', 'restored_payment' => 'Pago restaurado con éxito', 'restored_credit' => 'Crédito restaurado con éxito', - + 'reason_for_canceling' => 'Ayúdenos a mejorar contándonos porqué se va.', 'discount_percent' => 'Porcentaje', 'discount_amount' => 'Cantidad', @@ -481,7 +481,7 @@ return array( 'payment_email' => 'Correo de Pago', 'quote_email' => 'Correo de Cotizacion', 'reset_all' => 'Reiniciar Todos', - 'approve' => 'Aprobar', + 'approve' => 'Aprobar', 'token_billing_type_id' => 'Token de Facturación', 'token_billing_help' => 'Permite almacenar tarjetas de crédito con su gateway de pagos, y facturar en una fecha posterior.', @@ -549,7 +549,7 @@ return array( 'send_email' => 'Enviar Correo', 'set_password' => 'Asignar Contraseña', 'converted' => 'Convertido', - + 'email_approved' => 'Enviarme un correo cuando una cotización sea aprobada', 'notification_quote_approved_subject' => 'Cotización :invoice fue aprobada por :client', 'notification_quote_approved' => 'El cliente :client ha aprobado la cotización :invoice por el valor :amount.', @@ -574,7 +574,7 @@ return array( 'view_documentation' => 'Ver Documentación', 'app_title' => 'Facturación Open-Source Gratuita', 'app_description' => 'Invoice Ninja es una solución open-source gratuita para manejar la facturación de tus clientes. Con Invoice Ninja, se pueden crear y enviar hermosas facturas desde cualquier dispositivo que tenga acceso a Internet. Tus clientes pueden imprimir tus facturas, descargarlas en formato PDF o inclusive pagarlas en linea desde esta misma plataforma', - + 'rows' => 'filas', 'www' => 'www', 'logo' => 'Logo', @@ -717,7 +717,7 @@ return array( 'recent_payments' => 'Pagos Recientes', 'outstanding' => 'Sobresaliente', 'manage_companies' => 'Administrar Compañías', - 'total_revenue' => 'Ingresos Totales', + 'total_revenue' => 'Ingresos Totales', 'current_user' => 'Usuario Actual', 'new_recurring_invoice' => 'Nueva Factura Recurrente', @@ -867,7 +867,7 @@ return array( 'default_invoice_footer' => 'Default Invoice Footer', 'quote_footer' => 'Quote Footer', 'free' => 'Free', - + 'quote_is_approved' => 'This quote is approved', 'apply_credit' => 'Apply Credit', 'system_settings' => 'System Settings', @@ -966,5 +966,126 @@ return array( 'schedule' => 'Schedule', 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', - + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + ); diff --git a/resources/lang/es/validation.php b/resources/lang/es/validation.php index 49a193ab860f..2e2e55921911 100644 --- a/resources/lang/es/validation.php +++ b/resources/lang/es/validation.php @@ -77,7 +77,7 @@ return array( "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/lang/es_ES/texts.php b/resources/lang/es_ES/texts.php index 7918688a5f44..8bf6bd1ae8b0 100644 --- a/resources/lang/es_ES/texts.php +++ b/resources/lang/es_ES/texts.php @@ -888,7 +888,7 @@ return array( 'default_invoice_footer' => 'Default Invoice Footer', 'quote_footer' => 'Quote Footer', 'free' => 'Free', - + 'quote_is_approved' => 'This quote is approved', 'apply_credit' => 'Apply Credit', 'system_settings' => 'System Settings', @@ -988,4 +988,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + ); diff --git a/resources/lang/fr/pagination.php b/resources/lang/fr/pagination.php index 5f0b1d94f7b0..76976c0ef428 100644 --- a/resources/lang/fr/pagination.php +++ b/resources/lang/fr/pagination.php @@ -1,4 +1,4 @@ - 'Suivant »', -); \ No newline at end of file +); diff --git a/resources/lang/fr/reminders.php b/resources/lang/fr/reminders.php index e9f1f353e9d8..69cdcdafb273 100644 --- a/resources/lang/fr/reminders.php +++ b/resources/lang/fr/reminders.php @@ -21,4 +21,4 @@ return array( "sent" => "Rappel du mot de passe envoyé !", -); \ No newline at end of file +); diff --git a/resources/lang/fr/texts.php b/resources/lang/fr/texts.php index b7d6de603e3d..d9cdd8f46a6d 100644 --- a/resources/lang/fr/texts.php +++ b/resources/lang/fr/texts.php @@ -271,7 +271,7 @@ return array( 'notification_invoice_sent' => 'Le client suivant :client a reçu par courriel la facture :invoice d\'un montant de :amount', 'notification_invoice_viewed' => 'Le client suivant :client a vu la facture :invoice d\'un montant de :amount', 'reset_password' => 'Vous pouvez réinitialiser votre mot de passe en cliquant sur le lien suivant :', - 'reset_password_footer' => 'Si vous n\'avez pas effectué de demande de réinitalisation de mot de passe veuillez contacter notre support :' . CONTACT_EMAIL, + 'reset_password_footer' => 'Si vous n\'avez pas effectué de demande de réinitalisation de mot de passe veuillez contacter notre support :'.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Paiement sécurisé', @@ -299,7 +299,7 @@ return array( 'logout' => 'Se déconnecter', 'sign_up_to_save' => 'Connectez vous pour sauvegarder votre travail', - 'agree_to_terms' =>'J\'accepte les conditions d\'utilisation d\'Invoice ninja :terms', + 'agree_to_terms' => 'J\'accepte les conditions d\'utilisation d\'Invoice ninja :terms', 'terms_of_service' => 'Conditions d\'utilisation', 'email_taken' => 'L\'adresse courriel existe déjà', 'working' => 'En cours', @@ -412,7 +412,7 @@ return array( 'active' => 'Actif', 'pending' => 'En attente', 'deleted_user' => 'Utilisateur supprimé', - 'limit_users' => 'Désolé, ceci excédera la limite de ' . MAX_NUM_USERS . ' utilisateurs', + 'limit_users' => 'Désolé, ceci excédera la limite de '.MAX_NUM_USERS.' utilisateurs', 'confirm_email_invoice' => 'Voulez-vous vraiment envoyer cette facture par courriel ?', 'confirm_email_quote' => 'Voulez-vous vraiment envoyer ce devis par courriel ?', @@ -427,7 +427,6 @@ return array( 'hide' => 'Cacher', 'new_version_available' => 'Une nouvelle version de :releases_link est disponible. Vous utilisez v:user_version, la plus récente est v:latest_version', - 'invoice_settings' => 'Paramètres des factures', 'invoice_number_prefix' => 'Préfixe du numéro de facture', 'invoice_number_counter' => 'Compteur du numéro de facture', @@ -731,7 +730,7 @@ return array( 'recent_payments' => 'Paiements récents', 'outstanding' => 'Impayé', 'manage_companies' => 'Gérer les sociétés', - 'total_revenue' => 'Revenu total', + 'total_revenue' => 'Revenu total', 'current_user' => 'Utilisateur actuel', 'new_recurring_invoice' => 'Nouvelle facture récurrente', @@ -776,7 +775,7 @@ return array( 'reminder_subject' => 'Reminder: Invoice :invoice from :account', 'reset' => 'Remettre à zéro', 'invoice_not_found' => 'La facture demandée n\'est pas disponible', - + 'referral_program' => 'Referral Program', 'referral_code' => 'Referral Code', 'last_sent_on' => 'Last sent on :date', @@ -882,7 +881,7 @@ return array( 'default_invoice_footer' => 'Pied de page des factures par défaut', 'quote_footer' => 'Pied de page des devis', 'free' => 'Gratuit', - + 'quote_is_approved' => 'Ce devis est approuvé', 'apply_credit' => 'Appliquer crédit', 'system_settings' => 'Paramètres système', @@ -981,5 +980,127 @@ return array( 'schedule' => 'Schedule', 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', - + + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + ); diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 6388b1f21a1b..3ca6271f5790 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -25,7 +25,7 @@ return array( "numeric" => "La valeur de :attribute doit être comprise entre :min et :max.", "file" => "Le fichier :attribute doit avoir une taille entre :min et :max kilobytes.", "string" => "Le texte :attribute doit avoir entre :min et :max caractères.", - "array" => "Le champ :attribute doit avoir entre :min et :max éléments." + "array" => "Le champ :attribute doit avoir entre :min et :max éléments.", ), "confirmed" => "Le champ de confirmation :attribute ne correspond pas.", "date" => "Le champ :attribute n'est pas une date valide.", @@ -50,7 +50,7 @@ return array( "numeric" => "La valeur de :attribute doit être supérieure à :min.", "file" => "Le fichier :attribute doit être plus que gros que :min kilobytes.", "string" => "Le texte :attribute doit contenir au moins :min caractères.", - "array" => "Le champ :attribute doit avoir au moins :min éléments." + "array" => "Le champ :attribute doit avoir au moins :min éléments.", ), "not_in" => "Le champ :attribute sélectionné n'est pas valide.", "numeric" => "Le champ :attribute doit contenir un nombre.", @@ -66,7 +66,7 @@ return array( "numeric" => "La valeur de :attribute doit être :size.", "file" => "La taille du fichier de :attribute doit être de :size kilobytes.", "string" => "Le texte de :attribute doit contenir :size caractères.", - "array" => "Le champ :attribute doit contenir :size éléments." + "array" => "Le champ :attribute doit contenir :size éléments.", ), "unique" => "La valeur du champ :attribute est déjà utilisée.", "url" => "Le format de l'URL de :attribute n'est pas valide.", @@ -78,7 +78,7 @@ return array( "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines @@ -136,7 +136,7 @@ return array( "date" => "Date", "time" => "Heure", "available" => "Disponible", - "size" => "Taille" + "size" => "Taille", ), ); diff --git a/resources/lang/fr_CA/pagination.php b/resources/lang/fr_CA/pagination.php index ca273ac14306..76976c0ef428 100644 --- a/resources/lang/fr_CA/pagination.php +++ b/resources/lang/fr_CA/pagination.php @@ -1,4 +1,4 @@ - 'Le client suivant :client a reçu par courriel la facture :invoice d\'un montant de :amount', 'notification_invoice_viewed' => 'Le client suivant :client a vu la facture :invoice d\'un montant de :amount', 'reset_password' => 'Vous pouvez réinitialiser votre mot de passe en cliquant sur le lien suivant :', - 'reset_password_footer' => 'Si vous n\'avez pas effectué de demande de réinitalisation de mot de passe veuillez contacter notre support :' . CONTACT_EMAIL, + 'reset_password_footer' => 'Si vous n\'avez pas effectué de demande de réinitalisation de mot de passe veuillez contacter notre support :'.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Paiement sécurisé', @@ -299,7 +299,7 @@ return array( 'logout' => 'Se déconnecter', 'sign_up_to_save' => 'Connectez vous pour sauvegarder votre travail', - 'agree_to_terms' =>'J\'accepte les conditions d\'utilisation d\'Invoice ninja :terms', + 'agree_to_terms' => 'J\'accepte les conditions d\'utilisation d\'Invoice ninja :terms', 'terms_of_service' => 'Conditions d\'utilisation', 'email_taken' => 'L\'adresse courriel existe déjà', 'working' => 'En cours', @@ -412,7 +412,7 @@ return array( 'active' => 'Actif', 'pending' => 'En attente', 'deleted_user' => 'Utilisateur supprimé', - 'limit_users' => 'Désolé, ceci excédera la limite de ' . MAX_NUM_USERS . ' utilisateurs', + 'limit_users' => 'Désolé, ceci excédera la limite de '.MAX_NUM_USERS.' utilisateurs', 'confirm_email_invoice' => 'Voulez-vous vraiment envoyer cette facture par courriel ?', 'confirm_email_quote' => 'Voulez-vous vraiment envoyer ce devis par courriel ?', @@ -427,7 +427,6 @@ return array( 'hide' => 'Cacher', 'new_version_available' => 'Une nouvelle version de :releases_link est disponible. Vous utilisez v:user_version, la plus récente est v:latest_version', - 'invoice_settings' => 'Paramètres des factures', 'invoice_number_prefix' => 'Préfixe du numéro de facture', 'invoice_number_counter' => 'Compteur du numéro de facture', @@ -667,7 +666,6 @@ return array( 'partial_value' => 'Must be greater than zero and less than the total', 'more_actions' => 'More Actions', - 'pro_plan_title' => 'NINJA PRO', 'pro_plan_call_to_action' => 'Upgrade Now!', 'pro_plan_feature1' => 'Create Unlimited Clients', @@ -732,7 +730,7 @@ return array( 'recent_payments' => 'Recent Payments', 'outstanding' => 'Outstanding', 'manage_companies' => 'Manage Companies', - 'total_revenue' => 'Total Revenue', + 'total_revenue' => 'Total Revenue', 'current_user' => 'Current User', 'new_recurring_invoice' => 'New Recurring Invoice', @@ -778,7 +776,7 @@ return array( 'reminder_subject' => 'Reminder: Invoice :invoice from :account', 'reset' => 'Reset', 'invoice_not_found' => 'The requested invoice is not available', - + 'referral_program' => 'Referral Program', 'referral_code' => 'Referral Code', 'last_sent_on' => 'Last sent on :date', @@ -882,7 +880,7 @@ return array( 'default_invoice_footer' => 'Default Invoice Footer', 'quote_footer' => 'Quote Footer', 'free' => 'Free', - + 'quote_is_approved' => 'This quote is approved', 'apply_credit' => 'Apply Credit', 'system_settings' => 'System Settings', @@ -982,4 +980,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + ); diff --git a/resources/lang/fr_CA/validation.php b/resources/lang/fr_CA/validation.php index 14030ec4cb82..ff2ffb19a377 100644 --- a/resources/lang/fr_CA/validation.php +++ b/resources/lang/fr_CA/validation.php @@ -25,7 +25,7 @@ return array( "numeric" => "La valeur de :attribute doit être comprise entre :min et :max.", "file" => "Le fichier :attribute doit avoir une taille entre :min et :max kilobytes.", "string" => "Le texte :attribute doit avoir entre :min et :max caractères.", - "array" => "Le champ :attribute doit avoir entre :min et :max éléments." + "array" => "Le champ :attribute doit avoir entre :min et :max éléments.", ), "confirmed" => "Le champ de confirmation :attribute ne correspond pas.", "date" => "Le champ :attribute n'est pas une date valide.", @@ -50,7 +50,7 @@ return array( "numeric" => "La valeur de :attribute doit être supérieure à :min.", "file" => "Le fichier :attribute doit être plus que gros que :min kilobytes.", "string" => "Le texte :attribute doit contenir au moins :min caractères.", - "array" => "Le champ :attribute doit avoir au moins :min éléments." + "array" => "Le champ :attribute doit avoir au moins :min éléments.", ), "not_in" => "Le champ :attribute sélectionné n'est pas valide.", "numeric" => "Le champ :attribute doit contenir un nombre.", @@ -66,7 +66,7 @@ return array( "numeric" => "La valeur de :attribute doit être :size.", "file" => "La taille du fichier de :attribute doit être de :size kilobytes.", "string" => "Le texte de :attribute doit contenir :size caractères.", - "array" => "Le champ :attribute doit contenir :size éléments." + "array" => "Le champ :attribute doit contenir :size éléments.", ), "unique" => "La valeur du champ :attribute est déjà utilisée.", "url" => "Le format de l'URL de :attribute n'est pas valide.", @@ -78,7 +78,7 @@ return array( "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines @@ -136,7 +136,7 @@ return array( "date" => "Date", "time" => "Heure", "available" => "Disponible", - "size" => "Taille" + "size" => "Taille", ), ); diff --git a/resources/lang/it/pagination.php b/resources/lang/it/pagination.php index f1e10a7b10e1..54f2c22efeaa 100644 --- a/resources/lang/it/pagination.php +++ b/resources/lang/it/pagination.php @@ -1,4 +1,4 @@ - 'Successivo »', -); \ No newline at end of file +); diff --git a/resources/lang/it/texts.php b/resources/lang/it/texts.php index 5a52b2f52ea9..080bd7496baf 100644 --- a/resources/lang/it/texts.php +++ b/resources/lang/it/texts.php @@ -984,4 +984,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', -); + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/it/validation.php b/resources/lang/it/validation.php index 57bbd2e32649..98490593e021 100644 --- a/resources/lang/it/validation.php +++ b/resources/lang/it/validation.php @@ -24,7 +24,7 @@ return array( "numeric" => ":attribute deve trovarsi tra :min - :max.", "file" => ":attribute deve trovarsi tra :min - :max kilobytes.", "string" => ":attribute deve trovarsi tra :min - :max caratteri.", - "array" => ":attribute deve avere tra :min - :max elementi." + "array" => ":attribute deve avere tra :min - :max elementi.", ), "confirmed" => "Il campo di conferma per :attribute non coincide.", "date" => ":attribute non è una data valida.", @@ -42,14 +42,14 @@ return array( "numeric" => ":attribute deve essere minore di :max.", "file" => ":attribute non deve essere più grande di :max kilobytes.", "string" => ":attribute non può contenere più di :max caratteri.", - "array" => ":attribute non può avere più di :max elementi." + "array" => ":attribute non può avere più di :max elementi.", ), "mimes" => ":attribute deve essere del tipo: :values.", "min" => array( "numeric" => ":attribute deve valere almeno :min.", "file" => ":attribute deve essere più grande di :min kilobytes.", "string" => ":attribute deve contenere almeno :min caratteri.", - "array" => ":attribute deve avere almeno :min elementi." + "array" => ":attribute deve avere almeno :min elementi.", ), "not_in" => "Il valore selezionato per :attribute non è valido.", "numeric" => ":attribute deve essere un numero.", @@ -65,7 +65,7 @@ return array( "numeric" => ":attribute deve valere :size.", "file" => ":attribute deve essere grande :size kilobytes.", "string" => ":attribute deve contenere :size caratteri.", - "array" => ":attribute deve contenere :size elementi." + "array" => ":attribute deve contenere :size elementi.", ), "unique" => ":attribute è stato già utilizzato.", "url" => ":attribute deve essere un URL.", @@ -77,7 +77,7 @@ return array( "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/lang/lt/texts.php b/resources/lang/lt/texts.php index 6ccc401ac1d2..35e5c983a7b5 100644 --- a/resources/lang/lt/texts.php +++ b/resources/lang/lt/texts.php @@ -991,5 +991,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', -); + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/nb_NO/pagination.php b/resources/lang/nb_NO/pagination.php index c57908251668..ef922b207966 100644 --- a/resources/lang/nb_NO/pagination.php +++ b/resources/lang/nb_NO/pagination.php @@ -1,20 +1,20 @@ - '« Tilbake', + 'previous' => '« Tilbake', - 'next' => 'Neste »', + 'next' => 'Neste »', -); \ No newline at end of file +); diff --git a/resources/lang/nb_NO/reminders.php b/resources/lang/nb_NO/reminders.php index 88c8a1c920c4..bc5787cbf711 100644 --- a/resources/lang/nb_NO/reminders.php +++ b/resources/lang/nb_NO/reminders.php @@ -2,23 +2,23 @@ return array( - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ + /* + |-------------------------------------------------------------------------- + | Password Reminder Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are the default lines which match reasons + | that are given by the password broker for a password update attempt + | has failed, such as for an invalid token or invalid new password. + | + */ - "password" => "Passord må være minst seks tegn og samsvare med bekreftelsen.", + "password" => "Passord må være minst seks tegn og samsvare med bekreftelsen.", - "user" => "Vi kan ikke finne en bruker med den e-postadressen.", + "user" => "Vi kan ikke finne en bruker med den e-postadressen.", - "token" => "Denne tilbakestillingsnøkkelen er ugyldig.", + "token" => "Denne tilbakestillingsnøkkelen er ugyldig.", - "sent" => "Passord påminnelse sendt!", + "sent" => "Passord påminnelse sendt!", -); \ No newline at end of file +); diff --git a/resources/lang/nb_NO/texts.php b/resources/lang/nb_NO/texts.php index 87405d666dbb..ae6edd1ac401 100644 --- a/resources/lang/nb_NO/texts.php +++ b/resources/lang/nb_NO/texts.php @@ -989,4 +989,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', -); + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' =>'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/nb_NO/validation.php b/resources/lang/nb_NO/validation.php index b779fd348288..8ac62538cdc2 100644 --- a/resources/lang/nb_NO/validation.php +++ b/resources/lang/nb_NO/validation.php @@ -2,103 +2,103 @@ return array( - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | such as the size rules. Feel free to tweak each of these messages. - | - */ + /* + |-------------------------------------------------------------------------- + | Validation Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines contain the default error messages used by + | the validator class. Some of these rules have multiple versions such + | such as the size rules. Feel free to tweak each of these messages. + | + */ - "accepted" => ":attribute må være akseptert.", - "active_url" => ":attribute er ikke en gyldig nettadresse.", - "after" => ":attribute må være en dato etter :date.", - "alpha" => ":attribute kan kun inneholde bokstaver.", - "alpha_dash" => ":attribute kan kun inneholde bokstaver, sifre, og bindestreker.", - "alpha_num" => ":attribute kan kun inneholde bokstaver og sifre.", - "array" => ":attribute må være en matrise.", - "before" => ":attribute må være en dato før :date.", - "between" => array( - "numeric" => ":attribute må være mellom :min - :max.", - "file" => ":attribute må være mellom :min - :max kilobytes.", - "string" => ":attribute må være mellom :min - :max tegn.", - "array" => ":attribute må ha mellom :min - :max elementer.", - ), - "confirmed" => ":attribute bekreftelsen stemmer ikke", - "date" => ":attribute er ikke en gyldig dato.", - "date_format" => ":attribute samsvarer ikke med formatet :format.", - "different" => ":attribute og :other må være forskjellig.", - "digits" => ":attribute må være :digits sifre.", - "digits_between" => ":attribute må være mellom :min og :max sifre.", - "email" => ":attribute formatet er ugyldig.", - "exists" => "Valgt :attribute er ugyldig.", - "image" => ":attribute må være et bilde.", - "in" => "Valgt :attribute er ugyldig.", - "integer" => ":attribute må være heltall.", - "ip" => ":attribute må være en gyldig IP-adresse.", - "max" => array( - "numeric" => ":attribute kan ikke være høyere enn :max.", - "file" => ":attribute kan ikke være større enn :max kilobytes.", - "string" => ":attribute kan ikke være mer enn :max tegn.", - "array" => ":attribute kan ikke inneholde mer enn :max elementer.", - ), - "mimes" => ":attribute må være av filtypen: :values.", - "min" => array( - "numeric" => ":attribute må minimum være :min.", - "file" => ":attribute må minimum være :min kilobytes.", - "string" => ":attribute må minimum være :min tegn.", - "array" => ":attribute må inneholde minimum :min elementer.", - ), - "not_in" => "Valgt :attribute er ugyldig.", - "numeric" => ":attribute må være et siffer.", - "regex" => ":attribute formatet er ugyldig.", - "required" => ":attribute er påkrevd.", - "required_if" => ":attribute er påkrevd når :other er :value.", - "required_with" => ":attribute er påkrevd når :values er valgt.", - "required_without" => ":attribute er påkrevd når :values ikke er valgt.", - "same" => ":attribute og :other må samsvare.", - "size" => array( - "numeric" => ":attribute må være :size.", - "file" => ":attribute må være :size kilobytes.", - "string" => ":attribute må være :size tegn.", - "array" => ":attribute må inneholde :size elementer.", - ), - "unique" => ":attribute er allerede blitt tatt.", - "url" => ":attribute formatet er ugyldig.", - - "positive" => ":attribute må være mer enn null.", - "has_credit" => "Klienten har ikke høy nok kreditt.", - "notmasked" => "Verdiene er skjult", + "accepted" => ":attribute må være akseptert.", + "active_url" => ":attribute er ikke en gyldig nettadresse.", + "after" => ":attribute må være en dato etter :date.", + "alpha" => ":attribute kan kun inneholde bokstaver.", + "alpha_dash" => ":attribute kan kun inneholde bokstaver, sifre, og bindestreker.", + "alpha_num" => ":attribute kan kun inneholde bokstaver og sifre.", + "array" => ":attribute må være en matrise.", + "before" => ":attribute må være en dato før :date.", + "between" => array( + "numeric" => ":attribute må være mellom :min - :max.", + "file" => ":attribute må være mellom :min - :max kilobytes.", + "string" => ":attribute må være mellom :min - :max tegn.", + "array" => ":attribute må ha mellom :min - :max elementer.", + ), + "confirmed" => ":attribute bekreftelsen stemmer ikke", + "date" => ":attribute er ikke en gyldig dato.", + "date_format" => ":attribute samsvarer ikke med formatet :format.", + "different" => ":attribute og :other må være forskjellig.", + "digits" => ":attribute må være :digits sifre.", + "digits_between" => ":attribute må være mellom :min og :max sifre.", + "email" => ":attribute formatet er ugyldig.", + "exists" => "Valgt :attribute er ugyldig.", + "image" => ":attribute må være et bilde.", + "in" => "Valgt :attribute er ugyldig.", + "integer" => ":attribute må være heltall.", + "ip" => ":attribute må være en gyldig IP-adresse.", + "max" => array( + "numeric" => ":attribute kan ikke være høyere enn :max.", + "file" => ":attribute kan ikke være større enn :max kilobytes.", + "string" => ":attribute kan ikke være mer enn :max tegn.", + "array" => ":attribute kan ikke inneholde mer enn :max elementer.", + ), + "mimes" => ":attribute må være av filtypen: :values.", + "min" => array( + "numeric" => ":attribute må minimum være :min.", + "file" => ":attribute må minimum være :min kilobytes.", + "string" => ":attribute må minimum være :min tegn.", + "array" => ":attribute må inneholde minimum :min elementer.", + ), + "not_in" => "Valgt :attribute er ugyldig.", + "numeric" => ":attribute må være et siffer.", + "regex" => ":attribute formatet er ugyldig.", + "required" => ":attribute er påkrevd.", + "required_if" => ":attribute er påkrevd når :other er :value.", + "required_with" => ":attribute er påkrevd når :values er valgt.", + "required_without" => ":attribute er påkrevd når :values ikke er valgt.", + "same" => ":attribute og :other må samsvare.", + "size" => array( + "numeric" => ":attribute må være :size.", + "file" => ":attribute må være :size kilobytes.", + "string" => ":attribute må være :size tegn.", + "array" => ":attribute må inneholde :size elementer.", + ), + "unique" => ":attribute er allerede blitt tatt.", + "url" => ":attribute formatet er ugyldig.", + + "positive" => ":attribute må være mer enn null.", + "has_credit" => "Klienten har ikke høy nok kreditt.", + "notmasked" => "Verdiene er skjult", "less_than" => ':attribute må være mindre enn :value', "has_counter" => 'Verdien må inneholde {$counter}', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - 'custom' => array(), + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ + 'custom' => array(), - 'attributes' => array(), + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => array(), ); diff --git a/resources/lang/nl/pagination.php b/resources/lang/nl/pagination.php index 583b463a6375..6f99c193afa5 100644 --- a/resources/lang/nl/pagination.php +++ b/resources/lang/nl/pagination.php @@ -1,4 +1,4 @@ - 'Volgende »', -); \ No newline at end of file +); diff --git a/resources/lang/nl/texts.php b/resources/lang/nl/texts.php index 6a6316a9f286..35016fec3e9c 100644 --- a/resources/lang/nl/texts.php +++ b/resources/lang/nl/texts.php @@ -1,4 +1,4 @@ - 'Gefactureerde klant', 'billed_clients' => 'Gefactureerde klanten', 'active_client' => 'Actieve klant', - 'active_clients' => 'Actieve klanten', + 'active_clients' => 'Actieve klanten', 'invoices_past_due' => 'Vervallen facturen', 'upcoming_invoices' => 'Aankomende facturen', 'average_invoice' => 'Gemiddelde factuur', - + // list pages 'archive' => 'Archiveer', 'delete' => 'Verwijder', @@ -270,15 +270,15 @@ return array( 'notification_invoice_sent' => 'De volgende klant :client heeft Factuur :invoice voor :amount gemaild gekregen.', 'notification_invoice_viewed' => 'De volgende klant :client heeft Factuur :invoice voor :amount bekeken.', 'reset_password' => 'U kunt het wachtwoord van uw account resetten door op de volgende link te klikken:', - 'reset_password_footer' => 'Neem a.u.b. contact op met onze helpdesk indien u deze wachtwoordreset niet heeft aangevraagd. Het e-mailadres van de helpdesk is ' . CONTACT_EMAIL, + 'reset_password_footer' => 'Neem a.u.b. contact op met onze helpdesk indien u deze wachtwoordreset niet heeft aangevraagd. Het e-mailadres van de helpdesk is '.CONTACT_EMAIL, // Payment page 'secure_payment' => 'Veilige betaling', 'card_number' => 'Kaartnummer', - 'expiration_month' => 'Verval maand', + 'expiration_month' => 'Verval maand', 'expiration_year' => 'Verval jaar', 'cvv' => 'CVV', - + // Security alerts 'security' => [ 'too_many_attempts' => 'Te veel pogingen. Probeer opnieuw binnen enkele minuten.', @@ -289,16 +289,16 @@ return array( 'password_reset' => 'Uw wachtwoord is succesvol aangepast.', 'wrong_password_reset' => 'Ongeldig wachtwoord. Probeer opnieuw', ], - + // Pro Plan 'pro_plan' => [ 'remove_logo' => ':link om het InvoiceNinja logo te verwijderen door het pro plan te nemen', 'remove_logo_link' => 'Klik hier', ], - 'logout' => 'Afmelden', + 'logout' => 'Afmelden', 'sign_up_to_save' => 'Registreer u om uw werk op te slaan', - 'agree_to_terms' =>'Ik accepteer de InvoiceNinja :terms', + 'agree_to_terms' => 'Ik accepteer de InvoiceNinja :terms', 'terms_of_service' => 'Gebruiksvoorwaarden', 'email_taken' => 'Het e-mailadres is al geregistreerd', 'working' => 'Actief', @@ -307,7 +307,7 @@ return array( 'erase_data' => 'Dit zal uw data permanent verwijderen.', 'password' => 'Wachtwoord', 'invoice_subject' => 'Nieuwe factuur :invoice van :account', - 'close' => 'Sluiten', + 'close' => 'Sluiten', 'pro_plan_product' => 'Pro Plan', 'pro_plan_description' => 'Één jaar abbonnement op het InvoiceNinja Pro Plan.', @@ -389,10 +389,10 @@ return array( 'notification_quote_sent_subject' => 'Offerte :invoice is verstuurd naar :client', 'notification_quote_viewed_subject' => 'Offerte :invoice is bekeken door :client', 'notification_quote_sent' => 'Klant :client heeft offerte :invoice voor :amount per email ontvangen.', - 'notification_quote_viewed' => 'Klant :client heeft offerte :invoice voor :amount bekeken.', + 'notification_quote_viewed' => 'Klant :client heeft offerte :invoice voor :amount bekeken.', 'auto_convert_quote' => 'Offerte automatisch omzetten in factuur als deze goed gekeurd wordt', - 'session_expired' => 'Uw sessie is verlopen.', + 'session_expired' => 'Uw sessie is verlopen.', 'invoice_fields' => 'Factuurvelden', 'invoice_options' => 'Factuuropties', @@ -415,11 +415,11 @@ return array( 'active' => 'Actief', 'pending' => 'In afwachting', 'deleted_user' => 'Gebruiker succesvol verwijderd', - 'limit_users' => 'Sorry, dit zou de limiet van ' . MAX_NUM_USERS . ' gebruikers overschrijden', + 'limit_users' => 'Sorry, dit zou de limiet van '.MAX_NUM_USERS.' gebruikers overschrijden', 'confirm_email_invoice' => 'Weet u zeker dat u deze factuur wilt mailen?', 'confirm_email_quote' => 'Weet u zeker dat u deze offerte wilt mailen?', - 'confirm_recurring_email_invoice' => 'Terugkeren (herhalen) staat aan, weet u zeker dat u deze factuur wilt mailen?', + 'confirm_recurring_email_invoice' => 'Terugkeren (herhalen) staat aan, weet u zeker dat u deze factuur wilt mailen?', 'cancel_account' => 'Zeg Account Op', 'cancel_account_message' => 'Waarschuwing: Dit zal al uw data verwijderen. Er is geen manier om dit ongedaan te maken', @@ -438,8 +438,7 @@ return array( 'share_invoice_counter' => 'Deel factuur teller', 'invoice_issued_to' => 'Factuur uitgegeven aan', 'invalid_counter' => 'Stel een factuurnummervoorvoegsel of offertenummervoorvoegsel in om een mogelijk conflict te voorkomen.', - 'mark_sent' => 'Markeer als verzonden', - + 'mark_sent' => 'Markeer als verzonden', 'gateway_help_1' => ':link om in te schrijven voor Authorize.net.', 'gateway_help_2' => ':link om in te schrijven voor Authorize.net.', @@ -455,7 +454,6 @@ return array( 'buy' => 'Koop', 'bought_designs' => 'Aanvullende factuurontwerpen succesvol toegevoegd', - 'sent' => 'verzonden', 'timesheets' => 'Timesheets', @@ -472,7 +470,6 @@ return array( 'bought_white_label' => 'White label licentie succesvol geactiveerd', 'white_labeled' => 'White labeled', - 'restore' => 'Herstel', 'restore_invoice' => 'Herstel factuur', 'restore_quote' => 'Herstel offerte', @@ -485,7 +482,7 @@ return array( 'restored_client' => 'Klant succesvol hersteld', 'restored_payment' => 'Betaling succesvol hersteld', 'restored_credit' => 'Kredietnota succesvol hersteld', - + 'reason_for_canceling' => 'Help ons om onze site te verbeteren door ons te vertellen waarom u weggaat.', 'discount_percent' => 'Percentage', 'discount_amount' => 'Bedrag', @@ -589,7 +586,7 @@ return array( 'knowledge_base' => 'Kennis databank', 'partial' => 'Gedeeld', 'partial_remaining' => ':partial / :balance', - + 'more_fields' => 'Meer velden', 'less_fields' => 'Minder velden', 'client_name' => 'Klantnaam', @@ -600,7 +597,7 @@ return array( 'view_documentation' => 'Bekijk documentatie', 'app_title' => 'Gratis Open-Source Online Facturatie', 'app_description' => 'Invoice Ninja is een gratis, open-source oplossing voor het aanmkaen en versturen van facturen aan klanten. Met Invoice Ninja, kun je gemakkelijk mooie facturen aanmaken en verzenden van om het even welk toestel met internettoegang. Je klanten kunnen je facturen afdrukken, downloaden als pdf bestanden en je zelfs online betalen vanuit het systeem.', - + 'rows' => 'rijen', 'www' => 'www', 'logo' => 'Logo', @@ -736,7 +733,7 @@ return array( 'recent_payments' => 'Recente betalingen', 'outstanding' => 'Uitstaand', 'manage_companies' => 'Beheer bedrijven', - 'total_revenue' => 'Totale opbrengst', + 'total_revenue' => 'Totale opbrengst', 'current_user' => 'Huidige gebruiker', 'new_recurring_invoice' => 'Nieuwe terugkerende factuur', @@ -762,7 +759,7 @@ return array( 'status_partial' => 'Gedeeltelijk', 'status_paid' => 'Betaald', 'show_line_item_tax' => 'BTW-tarieven per regel tonen', - + 'iframe_url' => 'Website', 'iframe_url_help1' => 'Kopieer de volgende code naar een pagina op uw site.', 'iframe_url_help2' => 'U kunt de functionaliteit testen door te klikken op \'Bekijk als ontvanger\' bij een factuur.', @@ -887,7 +884,7 @@ return array( 'default_invoice_footer' => 'Standaard factuurfooter', 'quote_footer' => 'Offertefooter', 'free' => 'Gratis', - + 'quote_is_approved' => 'Deze offerte is geaccordeerd', 'apply_credit' => 'Apply Credit', 'system_settings' => 'Systeeminstellingen', @@ -975,7 +972,7 @@ return array( 'button_confirmation_message' => 'Click to confirm your email address.', 'confirm' => 'Confirm', 'email_preferences' => 'Email Preferences', - 'created_invoices' => 'Successfully created :count invoice(s)', + 'created_invoices' => 'Successfully created :count invoice(s)', 'next_invoice_number' => 'The next invoice number is :number.', 'next_quote_number' => 'The next quote number is :number.', @@ -986,5 +983,127 @@ return array( 'schedule' => 'Schedule', 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', - -); + + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + +); \ No newline at end of file diff --git a/resources/lang/nl/validation.php b/resources/lang/nl/validation.php index 82f3f6ec85af..09fadc64c161 100644 --- a/resources/lang/nl/validation.php +++ b/resources/lang/nl/validation.php @@ -25,7 +25,7 @@ return array( "numeric" => ":attribute moet tussen :min en :max zijn.", "file" => ":attribute moet tussen :min en :max kilobytes zijn.", "string" => ":attribute moet tussen :min en :max karakters zijn.", - "array" => ":attribute moet tussen :min en :max items bevatten." + "array" => ":attribute moet tussen :min en :max items bevatten.", ), "confirmed" => ":attribute bevestiging komt niet overeen.", "count" => ":attribute moet precies :count geselecteerde elementen bevatten.", @@ -48,14 +48,14 @@ return array( "numeric" => ":attribute moet minder dan :max zijn.", "file" => ":attribute moet minder dan :max kilobytes zijn.", "string" => ":attribute moet minder dan :max karakters zijn.", - "array" => ":attribute mag maximaal :max items bevatten." + "array" => ":attribute mag maximaal :max items bevatten.", ), "mimes" => ":attribute moet een bestand zijn van het bestandstype :values.", "min" => array( "numeric" => ":attribute moet minimaal :min zijn.", "file" => ":attribute moet minimaal :min kilobytes zijn.", "string" => ":attribute moet minimaal :min karakters zijn.", - "array" => ":attribute moet minimaal :min items bevatten." + "array" => ":attribute moet minimaal :min items bevatten.", ), "not_in" => "Het geselecteerde :attribute is ongeldig.", "numeric" => ":attribute moet een nummer zijn.", @@ -71,7 +71,7 @@ return array( "numeric" => ":attribute moet :size zijn.", "file" => ":attribute moet :size kilobyte zijn.", "string" => ":attribute moet :size karakters lang zijn.", - "array" => ":attribute moet :size items bevatten." + "array" => ":attribute moet :size items bevatten.", ), "unique" => ":attribute is al in gebruik.", "url" => ":attribute is geen geldige URL.", @@ -83,7 +83,7 @@ return array( "has_counter" => 'De waarde moet {$counter} bevatten', "valid_contacts" => "Alle contacten moeten een e-mailadres of een naam hebben", "valid_invoice_items" => "De factuur overschrijd het maximale aantal", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/lang/pt_BR/texts.php b/resources/lang/pt_BR/texts.php index f3295375279d..93d7892c42bc 100644 --- a/resources/lang/pt_BR/texts.php +++ b/resources/lang/pt_BR/texts.php @@ -908,7 +908,7 @@ return array( 'user' => 'Usuário', 'country' => 'País', 'include' => 'Incluir', - + 'logo_too_large' => 'Sua logo tem :size, para uma melhor performance sugerimos que este tamanho não ultrapasse 200KB', 'email_errors' => [ 'inactive_client' => 'Não é possível enviar e-mails para clientes intativos', @@ -918,7 +918,7 @@ return array( 'user_unconfirmed' => 'Confirme sua conta para enviar e-mails', 'invalid_contact_email' => 'E-mail do contato inválido', ], - + 'import_freshbooks' => 'Importar de FreshBooks', 'import_data' => 'Importar Dados', 'source' => 'Fonte', @@ -981,4 +981,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + ); diff --git a/resources/lang/sv/reminders.php b/resources/lang/sv/reminders.php index ad2262124d4d..b35b56e9584e 100644 --- a/resources/lang/sv/reminders.php +++ b/resources/lang/sv/reminders.php @@ -2,23 +2,23 @@ return array( - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ + /* + |-------------------------------------------------------------------------- + | Password Reminder Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are the default lines which match reasons + | that are given by the password broker for a password update attempt + | has failed, such as for an invalid token or invalid new password. + | + */ - "password" => "Passwords must be at least six characters and match the confirmation.", + "password" => "Passwords must be at least six characters and match the confirmation.", - "user" => "We can't find a user with that e-mail address.", + "user" => "We can't find a user with that e-mail address.", - "token" => "This password reset token is invalid.", + "token" => "This password reset token is invalid.", - "sent" => "Password reminder sent!", + "sent" => "Password reminder sent!", -); \ No newline at end of file +); diff --git a/resources/lang/sv/texts.php b/resources/lang/sv/texts.php index f8dd95dcd907..4dea7c7d16d9 100644 --- a/resources/lang/sv/texts.php +++ b/resources/lang/sv/texts.php @@ -986,5 +986,126 @@ return array( 'email_designs' => 'Email Designs', 'assigned_when_sent' => 'Assigned when sent', + 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Purchase a white label license', + + // Expense / vendor + 'expense' => 'Expense', + 'expenses' => 'Expenses', + 'new_expense' => 'Enter Expense', + 'enter_expense' => 'Enter Expense', + 'vendors' => 'Vendors', + 'new_vendor' => 'Create Vendor', + 'payment_terms_net' => 'Net', + 'vendor' => 'Vendor', + 'edit_vendor' => 'Edit Vendor', + 'archive_vendor' => 'Archive Vendor', + 'delete_vendor' => 'Delete Vendor', + 'view_vendor' => 'View Vendor', + 'deleted_expense' => 'Successfully deleted expense', + 'archived_expense' => 'Successfully archived expense', + 'deleted_expenses' => 'Successfully deleted expenses', + 'archived_expenses' => 'Successfully archived expenses', + + // Expenses + 'expense_amount' => 'Expense Amount', + 'expense_balance' => 'Expense Balance', + 'expense_date' => 'Expense Date', + 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + 'public_notes' => 'Public Notes', + 'invoice_amount' => 'Invoice Amount', + 'exchange_rate' => 'Exchange Rate', + 'yes' => 'Yes', + 'no' => 'No', + 'should_be_invoiced' => 'Should be invoiced', + 'view_expense' => 'View expense # :expense', + 'edit_expense' => 'Edit Expense', + 'archive_expense' => 'Archive Expense', + 'delete_expense' => 'Delete Expense', + 'view_expense_num' => 'Expense # :expense', + 'updated_expense' => 'Successfully updated expense', + 'created_expense' => 'Successfully created expense', + 'enter_expense' => 'Enter Expense', + 'view' => 'View', + 'restore_expense' => 'Restore Expense', + 'invoice_expense' => 'Invoice Expense', + 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', + 'expense_error_invoiced' => 'Expense has already been invoiced', + 'convert_currency' => 'Convert currency', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create Payment Term', + 'edit_payment_terms' => 'Edit Payment Term', + 'edit_payment_term' => 'Edit Payment Term', + 'archive_payment_term' => 'Archive Payment Term', + + // recurring due dates + 'recurring_due_dates' => 'Recurring Invoice Due Dates', + 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

+

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

+

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

+

For example:

+
    +
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • +
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. +
  • +
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. +
  • +
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. +
  • +
', + 'due' => 'Due', + 'next_due_on' => 'Due Next: :date', + 'use_client_terms' => 'Use client terms', + 'day_of_month' => ':ordinal day of month', + 'last_day_of_month' => 'Last day of month', + 'day_of_week_after' => ':ordinal :day after', + 'sunday' => 'Sunday', + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + + // Fonts + 'header_font_id' => 'Header Font', + 'body_font_id' => 'Body Font', + 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + + 'live_preview' => 'Live Preview', + 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + + 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', + 'quote_message_button' => 'To view your quote for :amount, click the button below.', + 'payment_message_button' => 'Thank you for your payment of :amount.', + 'payment_type_direct_debit' => 'Direct Debit', + 'bank_accounts' => 'Bank Accounts', + 'add_bank_account' => 'Add Bank Account', + 'setup_account' => 'Setup Account', + 'import_expenses' => 'Import Expenses', + 'bank_id' => 'bank', + 'integration_type' => 'Integration Type', + 'updated_bank_account' => 'Successfully updated bank account', + 'edit_bank_account' => 'Edit Bank Account', + 'archive_bank_account' => 'Archive Bank Account', + 'archived_bank_account' => 'Successfully archived bank account', + 'created_bank_account' => 'Successfully created bank account', + 'validate_bank_account' => 'Validate Bank Account', + 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', + 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', + 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', + 'username' => 'Username', + 'account_number' => 'Account Number', + 'account_name' => 'Account Name', + 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', + 'status_approved' => 'Approved', + 'quote_settings' => 'Quote Settings', + 'auto_convert_quote' => 'Auto convert quote', + 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', + 'validate' => 'Validate', + 'info' => 'Info', + 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', ); diff --git a/resources/lang/sv/validation.php b/resources/lang/sv/validation.php index 078b54e8c49e..a70f3ce8f165 100644 --- a/resources/lang/sv/validation.php +++ b/resources/lang/sv/validation.php @@ -80,7 +80,7 @@ return [ "has_counter" => 'The value must contain {$counter}', "valid_contacts" => "All of the contacts must have either an email or name", "valid_invoice_items" => "The invoice exceeds the maximum amount", - + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines diff --git a/resources/views/accounts/bank_account.blade.php b/resources/views/accounts/bank_account.blade.php index 9ac7811b247f..eca953dc4250 100644 --- a/resources/views/accounts/bank_account.blade.php +++ b/resources/views/accounts/bank_account.blade.php @@ -2,6 +2,8 @@ @section('head') @parent + + @include('money_script') - @stop @section('content') @@ -19,157 +19,359 @@ @include('accounts.nav', ['selected' => ACCOUNT_BANKS]) - {!! Former::open($url) - ->method($method) - ->rule() - ->addClass('main-form warn-on-exit') !!} + {!! Former::open()->addClass('main-form warn-on-exit') !!}
-

{!! trans($title) !!}

+

-
+
- @if ($bankAccount) - {!! Former::populateField('bank_id', $bankAccount->bank_id) !!} - @endif +
+
+ @if ($bankAccount) + {!! Former::populateField('public_id', $bankAccount->public_id) !!} + {!! Former::hidden('public_id') !!} + @else + {!! Former::select('bank_id') + ->data_bind('combobox: bank_id') + ->addOption('', '') + ->fromQuery($banks, 'name', 'id') + ->blockHelp('texts.bank_accounts_help') !!} + @endif - {!! Former::select('bank_id') - ->data_bind('dropdown: bank_id') - ->addOption('', '') - ->fromQuery($banks, 'name', 'id') !!} + {!! Former::password('bank_username') + ->data_bind("value: bank_username, valueUpdate: 'afterkeydown'") + ->label(trans('texts.username')) !!} - {!! Former::password('bank_username') - ->data_bind("value: bank_username, valueUpdate: 'afterkeydown'") - ->label(trans('texts.username')) - ->blockHelp(trans(Request::secure() ? 'texts.bank_password_help' : 'texts.bank_password_warning')) !!} + {!! Former::password('bank_password') + ->label(trans('texts.password')) + ->data_bind("value: bank_password, valueUpdate: 'afterkeydown'") + ->blockHelp(trans(Request::secure() ? 'texts.bank_password_help' : 'texts.bank_password_warning')) !!} +
+
-
-
+ - +
+
+ + {!! Former::checkbox('all_pages_header')->text(trans('texts.all_pages_header_help')) !!} + {!! Former::checkbox('all_pages_footer')->text(trans('texts.all_pages_footer_help')) !!} + +
+
diff --git a/resources/views/accounts/user_details.blade.php b/resources/views/accounts/user_details.blade.php index 346fc342107a..57bfdb8eb5a4 100644 --- a/resources/views/accounts/user_details.blade.php +++ b/resources/views/accounts/user_details.blade.php @@ -172,7 +172,11 @@ $(['current_password', 'newer_password', 'confirm_password']).each(function(i, field) { var $input = $('form #'+field), val = $.trim($input.val()); - var isValid = val && val.length >= 6; + var isValid = val; + + if (field != 'current_password') { + isValid = val.length >= 6; + } if (isValid && field == 'confirm_password') { isValid = val == $.trim($('#newer_password').val()); diff --git a/resources/views/header.blade.php b/resources/views/header.blade.php index 95b36e25c9d8..9409b617a8b0 100644 --- a/resources/views/header.blade.php +++ b/resources/views/header.blade.php @@ -699,8 +699,9 @@

 

- {{ trans('texts.powered_by') }} InvoiceNinja.com - - {!! link_to(RELEASES_URL, 'v' . NINJA_VERSION, ['target' => '_blank']) !!} | + {{ trans('texts.powered_by') }} + {!! link_to('https://www.invoiceninja.com/?utm_source=powered_by', 'InvoiceNinja.com', ['target' => '_blank', 'title' => 'invoiceninja.com']) !!} - + {!! link_to(RELEASES_URL, 'v' . NINJA_VERSION, ['target' => '_blank', 'title' => trans('texts.trello_roadmap')]) !!} | @if (Auth::user()->account->isWhiteLabel()) {{ trans('texts.white_labeled') }} @else diff --git a/resources/views/vendors/show.blade.php b/resources/views/vendors/show.blade.php index a6ee5cd2cfda..844c61f9b0f8 100644 --- a/resources/views/vendors/show.blade.php +++ b/resources/views/vendors/show.blade.php @@ -40,7 +40,7 @@ )->split() !!} {!! Button::primary(trans("texts.new_expense")) - ->asLinkTo(URL::to("/expenses/create")) + ->asLinkTo(URL::to("/expenses/create/{$vendor->public_id}")) ->appendIcon(Icon::create('plus-sign')) !!} @endif {!! Former::close() !!} diff --git a/storage/templates/modern.js b/storage/templates/modern.js index 9023121aff64..5c1767bb4bab 100644 --- a/storage/templates/modern.js +++ b/storage/templates/modern.js @@ -9,7 +9,7 @@ }, { "stack": "$clientDetails", - "margin": [0, 80, 0, 0] + "margin": [0, 60, 0, 0] } ] }, @@ -246,5 +246,5 @@ "color": "#737373" } }, - "pageMargins": [40, 80, 40, 50] + "pageMargins": [40, 120, 40, 50] } \ No newline at end of file From 63c1293e3b83098ac6de42ec03274ea484535af7 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 31 Jan 2016 23:55:02 +0200 Subject: [PATCH 55/99] Add Header/Footer options to invoice design settings --- app/Http/Controllers/AccountController.php | 1 + resources/lang/en/texts.php | 11 ++++++----- resources/views/accounts/invoice_design.blade.php | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 02921782e035..5cedc354ae12 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -722,6 +722,7 @@ class AccountController extends BaseController private function saveInvoiceDesign() { + //dd(Input::get('all_pages_header')); if (Auth::user()->account->isPro()) { $account = Auth::user()->account; $account->hide_quantity = Input::get('hide_quantity') ? true : false; diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 95566e73f00b..76129376c421 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1135,9 +1135,10 @@ return array( 'expense_error_mismatch_currencies' => 'The client\'s currency does not match the expense currency.', 'trello_roadmap' => 'Trello Roadmap', 'header_footer' => 'Header/Footer', - 'all_pages_header' => 'Header', - 'all_pages_header_help' => 'Show on all pages', - 'all_pages_footer' => 'Footer', - 'all_pages_footer_help' => 'Show on all pages', - + 'first_page' => 'first page', + 'all_pages' => 'all pages', + 'last_page' => 'last page', + 'all_pages_header' => 'Show header on', + 'all_pages_footer' => 'Show footer on', + ); diff --git a/resources/views/accounts/invoice_design.blade.php b/resources/views/accounts/invoice_design.blade.php index 647e9ba4699c..2c7468cb1652 100644 --- a/resources/views/accounts/invoice_design.blade.php +++ b/resources/views/accounts/invoice_design.blade.php @@ -200,8 +200,19 @@
- {!! Former::checkbox('all_pages_header')->text(trans('texts.all_pages_header_help')) !!} - {!! Former::checkbox('all_pages_footer')->text(trans('texts.all_pages_footer_help')) !!} + {!! Former::inline_radios('all_pages_header') + ->label(trans('texts.all_pages_header')) + ->radios([ + trans('texts.first_page') => ['value' => 0, 'name' => 'all_pages_header'], + trans('texts.all_pages') => ['value' => 1, 'name' => 'all_pages_header'], + ])->check($account->all_pages_header) !!} + + {!! Former::inline_radios('all_pages_footer') + ->label(trans('texts.all_pages_footer')) + ->radios([ + trans('texts.last_page') => ['value' => 0, 'name' => 'all_pages_footer'], + trans('texts.all_pages') => ['value' => 1, 'name' => 'all_pages_footer'], + ])->check($account->all_pages_footer) !!}
From f48ac1b6f0dcb6e6f20fb8e7c0400e291d652bc3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 1 Feb 2016 09:45:15 +1100 Subject: [PATCH 56/99] remove redundant method --- app/Http/Controllers/InvoiceApiController.php | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index fdace861b768..5789388c18c4 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -249,7 +249,7 @@ class InvoiceApiController extends BaseAPIController return $item; } - public function emailInvoicev2() + public function emailInvoice() { $data = Input::all(); $error = null; @@ -269,31 +269,6 @@ class InvoiceApiController extends BaseAPIController return Response::make($response, $error ? 400 : 200, $headers); } - public function emailInvoice() - { - $data = Input::all(); - $error = null; - - if (!isset($data['id'])) { - $error = trans('validation.required', ['attribute' => 'id']); - } else { - $invoice = Invoice::scope($data['id'])->first(); - if (!$invoice) { - $error = trans('validation.not_in', ['attribute' => 'id']); - } else { - $this->mailer->sendInvoice($invoice); - } - } - - if ($error) { - $response = json_encode($error, JSON_PRETTY_PRINT); - } else { - $response = json_encode(RESULT_SUCCESS, JSON_PRETTY_PRINT); - } - - $headers = Utils::getApiHeaders(); - return Response::make($response, $error ? 400 : 200, $headers); - } /** * @SWG\Put( From 31b026d08f9cc8967bf31f7795a27a89842b2b73 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 1 Feb 2016 13:32:12 +1100 Subject: [PATCH 57/99] Added Archive Product via API --- app/Http/Controllers/ProductApiController.php | 23 +++++++++++++++---- app/Ninja/Transformers/ProductTransformer.php | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/ProductApiController.php b/app/Http/Controllers/ProductApiController.php index 7aef42393b8d..87bf89403b8a 100644 --- a/app/Http/Controllers/ProductApiController.php +++ b/app/Http/Controllers/ProductApiController.php @@ -1,5 +1,6 @@ productService = $productService; + $this->productRepo = $productRepo; } public function index() @@ -52,14 +56,25 @@ class ProductApiController extends BaseAPIController return $this->save(); } - public function update($publicId) + public function update(\Illuminate\Http\Request $request, $publicId) { - return $this->save($publicId); + + if ($request->action == ACTION_ARCHIVE) { + $product = Product::scope($publicId)->withTrashed()->firstOrFail(); + $this->productRepo->archive($product); + + $transformer = new ProductTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($product, $transformer, 'products'); + + return $this->response($data); + } + else + return $this->save($publicId); } public function destroy($publicId) { - //stub + //stub } private function save($productPublicId = false) diff --git a/app/Ninja/Transformers/ProductTransformer.php b/app/Ninja/Transformers/ProductTransformer.php index 76bf436066aa..34fbcf7f18ff 100644 --- a/app/Ninja/Transformers/ProductTransformer.php +++ b/app/Ninja/Transformers/ProductTransformer.php @@ -16,6 +16,7 @@ class ProductTransformer extends EntityTransformer 'account_key' =>$this->account->account_key, 'default_tax_rate_id' =>$product->default_tax_rate_id, 'updated_at' =>$this->getTimestamp($product->updated_at), + 'archived_at' => $this->getTimestamp($product->deleted_at), ]; } } \ No newline at end of file From c0545be0d480ac9292a76577c7a14ea1a63fe945 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 1 Feb 2016 14:42:05 +1100 Subject: [PATCH 58/99] update account from API --- app/Http/Controllers/AccountApiController.php | 39 +++++++++++++++++++ app/Http/Controllers/BaseAPIController.php | 11 ++++++ app/Http/routes.php | 1 + 3 files changed, 51 insertions(+) diff --git a/app/Http/Controllers/AccountApiController.php b/app/Http/Controllers/AccountApiController.php index 3517be1af9f3..3f5a01d0cc03 100644 --- a/app/Http/Controllers/AccountApiController.php +++ b/app/Http/Controllers/AccountApiController.php @@ -4,6 +4,7 @@ use Auth; use Utils; use Response; use Input; +use Validator; use Cache; use App\Models\Client; use App\Models\Account; @@ -101,4 +102,42 @@ class AccountApiController extends BaseAPIController { return $this->processLogin($request); } + + public function update(Request $request) + { + $rules = array( + 'name' => 'required', + ); + + $validator = Validator::make(Input::all(), $rules); + + if ($validator->fails()) { + $data = $validator->messages(); + return $this->errorResponse($data); + } else { + $account = Auth::user()->account; + $account->name = trim(Input::get('name')); + $account->id_number = trim(Input::get('id_number')); + $account->vat_number = trim(Input::get('vat_number')); + $account->work_email = trim(Input::get('work_email')); + $account->website = trim(Input::get('website')); + $account->work_phone = trim(Input::get('work_phone')); + $account->address1 = trim(Input::get('address1')); + $account->address2 = trim(Input::get('address2')); + $account->city = trim(Input::get('city')); + $account->state = trim(Input::get('state')); + $account->postal_code = trim(Input::get('postal_code')); + $account->country_id = Input::get('country_id') ? Input::get('country_id') : null; + $account->size_id = Input::get('size_id') ? Input::get('size_id') : null; + $account->industry_id = Input::get('industry_id') ? Input::get('industry_id') : null; + $account->email_footer = Input::get('email_footer'); + $account->save(); + + $transformer = new AccountTransformer(null, $request->serializer); + $account = $this->createItem($account, $transformer, 'account'); + + return $this->response($account); + } + + } } diff --git a/app/Http/Controllers/BaseAPIController.php b/app/Http/Controllers/BaseAPIController.php index 4d783556022e..f7ebf9b20d7e 100644 --- a/app/Http/Controllers/BaseAPIController.php +++ b/app/Http/Controllers/BaseAPIController.php @@ -107,6 +107,17 @@ class BaseAPIController extends Controller return Response::make($response, 200, $headers); } + protected function errorResponse($response) + { + $error['error'] = $response; + $error = json_encode($error, JSON_PRETTY_PRINT); + $headers = Utils::getApiHeaders(); + + return Response::make($error, 400, $headers); + + } + + protected function getIncluded() { $data = ['user']; diff --git a/app/Http/routes.php b/app/Http/routes.php index 3582c1c83936..e9e3afc81de0 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -219,6 +219,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::post('login', 'AccountApiController@login'); Route::get('static', 'AccountApiController@getStaticData'); Route::get('accounts', 'AccountApiController@show'); + Route::put('accounts', 'AccountApiController@update'); Route::resource('clients', 'ClientApiController'); Route::get('quotes', 'QuoteApiController@index'); Route::resource('quotes', 'QuoteApiController'); From 523b008d01f80f40d03fb84285a1d063bd82f0b9 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 1 Feb 2016 15:58:52 +0200 Subject: [PATCH 59/99] Added support for right aligning table columns --- app/Http/Controllers/AccountController.php | 1 - app/Http/Controllers/AccountGatewayController.php | 2 ++ public/css/built.css | 4 ++++ public/css/style.css | 4 ++++ resources/views/accounts/bank_account.blade.php | 2 +- resources/views/datatable.blade.php | 14 ++++++++++---- resources/views/list.blade.php | 1 + 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 5cedc354ae12..02921782e035 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -722,7 +722,6 @@ class AccountController extends BaseController private function saveInvoiceDesign() { - //dd(Input::get('all_pages_header')); if (Auth::user()->account->isPro()) { $account = Auth::user()->account; $account->hide_quantity = Input::get('hide_quantity') ? true : false; diff --git a/app/Http/Controllers/AccountGatewayController.php b/app/Http/Controllers/AccountGatewayController.php index 86c76ecf2760..5fc4d55c1a52 100644 --- a/app/Http/Controllers/AccountGatewayController.php +++ b/app/Http/Controllers/AccountGatewayController.php @@ -195,6 +195,8 @@ class AccountGatewayController extends BaseController if ($gatewayId == GATEWAY_DWOLLA) { $optional = array_merge($optional, ['key', 'secret']); + } elseif ($gatewayId == GATEWAY_STRIPE) { + $rules['publishable_key'] = 'required'; } foreach ($fields as $field => $details) { diff --git a/public/css/built.css b/public/css/built.css index 763c36cddca6..a93d1f86a77c 100644 --- a/public/css/built.css +++ b/public/css/built.css @@ -3372,6 +3372,10 @@ ul.user-accounts a:hover div.remove { font-size: .9em; } +td.right { + text-align: right; +} + /* Show selected section in settings nav */ .list-group-item.selected:before { position: absolute; diff --git a/public/css/style.css b/public/css/style.css index d140f23f9661..78c44f781fe2 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1021,6 +1021,10 @@ ul.user-accounts a:hover div.remove { font-size: .9em; } +td.right { + text-align: right; +} + /* Show selected section in settings nav */ .list-group-item.selected:before { position: absolute; diff --git a/resources/views/accounts/bank_account.blade.php b/resources/views/accounts/bank_account.blade.php index eca953dc4250..540463cf1d61 100644 --- a/resources/views/accounts/bank_account.blade.php +++ b/resources/views/accounts/bank_account.blade.php @@ -23,7 +23,7 @@
-

+

 

diff --git a/resources/views/datatable.blade.php b/resources/views/datatable.blade.php index f21f6c8cfff4..2d0b78d9faa4 100644 --- a/resources/views/datatable.blade.php +++ b/resources/views/datatable.blade.php @@ -56,10 +56,16 @@ @if (isset($hasCheckboxes) && $hasCheckboxes) 'aaSorting': [['1', 'asc']], // Disable sorting on the first column - "aoColumnDefs": [ { - 'bSortable': false, - 'aTargets': [ 0, {{ count($columns) - 1 }} ] - } ], + "aoColumnDefs": [ + { + 'bSortable': false, + 'aTargets': [ 0, {{ count($columns) - 1 }} ] + }, + { + 'sClass': 'right', + 'aTargets': {{ isset($values['rightAlign']) ? json_encode($values['rightAlign']) : '[]' }} + } + ], @endif @foreach ($options as $k => $o) {!! json_encode($k) !!}: {!! json_encode($o) !!}, diff --git a/resources/views/list.blade.php b/resources/views/list.blade.php index d7b298957cc3..93aebcebb262 100644 --- a/resources/views/list.blade.php +++ b/resources/views/list.blade.php @@ -45,6 +45,7 @@ {!! Datatable::table() ->addColumn($columns) ->setUrl(route('api.' . $entityType . 's')) + ->setCustomValues('rightAlign', isset($rightAlign) ? $rightAlign : []) ->setOptions('sPaginationType', 'bootstrap') ->setOptions('aaSorting', [[isset($sortCol) ? $sortCol : '1', 'desc']]) ->render('datatable') !!} From 1284c2953475d92c7619e8c524ffd873ff005953 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 2 Feb 2016 00:07:09 +0200 Subject: [PATCH 60/99] Enabled setting expense currency --- app/Http/Controllers/ExpenseController.php | 4 +- app/Models/Expense.php | 8 +-- app/Ninja/Repositories/ExpenseRepository.php | 12 ++-- app/Services/ExpenseService.php | 6 +- ...135956_add_source_currency_to_expenses.php | 47 +++++++++++++ resources/lang/en/texts.php | 3 +- resources/views/expenses/edit.blade.php | 67 +++++++++++-------- 7 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index bb2a81fbba21..6f2a6e884a30 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -200,8 +200,8 @@ class ExpenseController extends BaseController } if (!$currencyId) { - $currencyId = $expense->getCurrencyId(); - } elseif ($currencyId != $expense->getCurrencyId() && $expense->getCurrencyId()) { + $currencyId = $expense->invoice_currency_id; + } elseif ($currencyId != $expense->invoice_currency_id && $expense->invoice_currency_id) { Session::flash('error', trans('texts.expense_error_multiple_currencies')); return Redirect::to('expenses'); } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index b4e1060052df..9fbd5a485c7d 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -18,7 +18,8 @@ class Expense extends EntityModel protected $fillable = [ 'client_id', 'vendor_id', - 'currency_id', + 'expense_currency_id', + 'invoice_currency_id', 'amount', 'foreign_amount', 'exchange_rate', @@ -60,11 +61,6 @@ class Expense extends EntityModel return $this->public_id; } - public function getCurrencyId() - { - return $this->client ? $this->client->currency_id : $this->currency_id; - } - public function getDisplayName() { return $this->getName(); diff --git a/app/Ninja/Repositories/ExpenseRepository.php b/app/Ninja/Repositories/ExpenseRepository.php index fd2f78afc7de..442df6ef2979 100644 --- a/app/Ninja/Repositories/ExpenseRepository.php +++ b/app/Ninja/Repositories/ExpenseRepository.php @@ -64,7 +64,6 @@ class ExpenseRepository extends BaseRepository ->orWhere('contacts.is_primary', '=', null); }) ->select( - DB::raw('COALESCE(clients.currency_id, expenses.currency_id, accounts.currency_id) currency_id'), 'expenses.account_id', 'expenses.amount', 'expenses.deleted_at', @@ -78,9 +77,9 @@ class ExpenseRepository extends BaseRepository 'expenses.public_notes', 'expenses.should_be_invoiced', 'expenses.vendor_id', + 'expenses.expense_currency_id', + 'expenses.invoice_currency_id', 'invoices.public_id as invoice_public_id', - 'accounts.country_id as account_country_id', - 'accounts.currency_id as account_currency_id', 'vendors.name as vendor_name', 'vendors.public_id as vendor_public_id', 'clients.name as client_name', @@ -129,8 +128,11 @@ class ExpenseRepository extends BaseRepository $expense->public_notes = trim($input['public_notes']); $expense->should_be_invoiced = isset($input['should_be_invoiced']) || $expense->client_id ? true : false; - if (! $expense->currency_id) { - $expense->currency_id = \Auth::user()->account->getCurrencyId(); + if ( ! $expense->expense_currency_id) { + $expense->expense_currency_id = \Auth::user()->account->getCurrencyId(); + } + if ( ! $expense->invoice_currency_id) { + $expense->invoice_currency_id = \Auth::user()->account->getCurrencyId(); } $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1; diff --git a/app/Services/ExpenseService.php b/app/Services/ExpenseService.php index 874c17ea71e3..491c0e7957d8 100644 --- a/app/Services/ExpenseService.php +++ b/app/Services/ExpenseService.php @@ -92,10 +92,10 @@ class ExpenseService extends BaseService // show both the amount and the converted amount if ($model->exchange_rate != 1) { $converted = round($model->amount * $model->exchange_rate, 2); - return Utils::formatMoney($model->amount, $model->account_currency_id, $model->account_country_id) . ' | ' . - Utils::formatMoney($converted, $model->currency_id, $model->client_country_id); + return Utils::formatMoney($model->amount, $model->expense_currency_id) . ' | ' . + Utils::formatMoney($converted, $model->invoice_currency_id); } else { - return Utils::formatMoney($model->amount, $model->currency_id, $model->account_country_id); + return Utils::formatMoney($model->amount, $model->expense_currency_id); } } ], diff --git a/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php new file mode 100644 index 000000000000..bdce9926eac7 --- /dev/null +++ b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php @@ -0,0 +1,47 @@ +dropColumn('foreign_amount'); + + $table->unsignedInteger('currency_id')->nullable(false)->change(); + $table->renameColumn('currency_id', 'invoice_currency_id'); + $table->unsignedInteger('expense_currency_id'); + + // set account value so we're able to create foreign constraint + DB::statement('update expenses e + left join accounts a on a.id = e.account_id + set e.expense_currency_id = COALESCE(a.currency_id, 1)'); + + $table->foreign('invoice_currency_id')->references('id')->on('currencies'); + $table->foreign('expense_currency_id')->references('id')->on('currencies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('expenses', function($table) { + + $table->dropColumn('expense_currency_id'); + $table->renameColumn('invoice_currency_id', 'currency_id'); + $table->renameColumn('invoice_amount', 'foreign_amount'); + }); + } +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 76129376c421..76781a31b717 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1140,5 +1140,6 @@ return array( 'last_page' => 'last page', 'all_pages_header' => 'Show header on', 'all_pages_footer' => 'Show footer on', - + 'invoice_currency' => 'Invoice Currency', + ); diff --git a/resources/views/expenses/edit.blade.php b/resources/views/expenses/edit.blade.php index 4436416a1e49..934d339db21d 100644 --- a/resources/views/expenses/edit.blade.php +++ b/resources/views/expenses/edit.blade.php @@ -28,18 +28,24 @@ ->label(trans('texts.vendor')) ->addGroupClass('vendor-select') !!} - {!! Former::text('amount') - ->label(trans('texts.amount')) - ->data_bind("value: amount, valueUpdate: 'afterkeydown'") - ->addGroupClass('amount') - ->append($account->present()->currencyCode) !!} - {!! Former::text('expense_date') ->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT)) ->addGroupClass('expense_date') ->label(trans('texts.date')) ->append('') !!} + {!! Former::select('expense_currency_id')->addOption('','') + ->data_bind('combobox: expense_currency_id') + ->label(trans('texts.currency_id')) + ->data_placeholder(Utils::getFromCache($account->getCurrencyId(), 'currencies')->name) + ->fromQuery($currencies, 'name', 'id') !!} + + {!! Former::text('amount') + ->label(trans('texts.amount')) + ->data_bind("value: amount, valueUpdate: 'afterkeydown'") + ->addGroupClass('amount') + ->append('') !!} + {!! Former::select('client_id') ->addOption('', '') ->label(trans('texts.client')) @@ -54,15 +60,17 @@ @endif - {!! Former::select('currency_id')->addOption('','') - ->data_bind('combobox: currency_id, disable: true') + {!! Former::select('invoice_currency_id')->addOption('','') + ->label(trans('texts.invoice_currency')) + ->data_placeholder(Utils::getFromCache($account->getCurrencyId(), 'currencies')->name) + ->data_bind('combobox: invoice_currency_id, disable: true') ->fromQuery($currencies, 'name', 'id') !!} {!! Former::plaintext('test') - ->value('') + ->value('') ->style('min-height:46px') - ->label(trans('texts.currency_id')) !!} + ->label(trans('texts.invoice_currency')) !!} {!! Former::text('exchange_rate') @@ -71,13 +79,13 @@ {!! Former::text('invoice_amount') ->addGroupClass('converted-amount') ->data_bind("value: convertedAmount, enable: enableExchangeRate") - ->append('') !!} + ->append('') !!}
- {!! Former::textarea('public_notes')->rows(9) !!} - {!! Former::textarea('private_notes')->rows(9) !!} + {!! Former::textarea('public_notes')->style('height:255px') !!} + {!! Former::textarea('private_notes')->style('height:255px') !!}
@@ -111,7 +119,7 @@ var clientId = $('select#client_id').val(); var client = clientMap[clientId]; if (client) { - model.currency_id(client.currency_id); + model.invoice_currency_id(client.currency_id); } } @@ -174,7 +182,8 @@ var ViewModel = function(data) { var self = this; - self.currency_id = ko.observable(); + self.expense_currency_id = ko.observable(); + self.invoice_currency_id = ko.observable(); self.amount = ko.observable(); self.exchange_rate = ko.observable(1); self.should_be_invoiced = ko.observable(); @@ -196,23 +205,27 @@ } }, self); - self.currencyCode = ko.computed(function() { - var currencyId = self.currency_id() || self.account_currency_id(); - var currency = currencyMap[currencyId]; - return currency.code; + + self.getCurrency = function(currencyId) { + return currencyMap[currencyId || self.account_currency_id()]; + }; + + self.expenseCurrencyCode = ko.computed(function() { + return self.getCurrency(self.expense_currency_id()).code; }); - self.currencyName = ko.computed(function() { - var currencyId = self.currency_id() || self.account_currency_id(); - var currency = currencyMap[currencyId]; - return currency.name; + self.invoiceCurrencyCode = ko.computed(function() { + return self.getCurrency(self.invoice_currency_id()).code; + }); + + self.invoiceCurrencyName = ko.computed(function() { + return self.getCurrency(self.invoice_currency_id()).name; }); self.enableExchangeRate = ko.computed(function() { - if (!self.currency_id()) { - return false; - } - return self.currency_id() != self.account_currency_id(); + var expenseCurrencyId = self.expense_currency_id() || self.account_currency_id(); + var invoiceCurrencyId = self.invoice_currency_id() || self.account_currency_id(); + return expenseCurrencyId != invoiceCurrencyId; }) }; From 8bdf973f6ee42940c7564439d369dc8fd7263efa Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 2 Feb 2016 00:12:42 +0200 Subject: [PATCH 61/99] Enabled setting expense currency --- resources/views/expenses/edit.blade.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/views/expenses/edit.blade.php b/resources/views/expenses/edit.blade.php index 934d339db21d..8d413e16b69c 100644 --- a/resources/views/expenses/edit.blade.php +++ b/resources/views/expenses/edit.blade.php @@ -4,6 +4,13 @@ @parent @include('money_script') + + + @stop @section('content') From 6683062d9e349694ded4a869282504c3ef800cd0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 3 Feb 2016 09:10:54 +1100 Subject: [PATCH 62/99] fixed bug in migration --- .../2016_02_01_135956_add_source_currency_to_expenses.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php index bdce9926eac7..16c2f38a1012 100644 --- a/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php +++ b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php @@ -20,6 +20,10 @@ class AddSourceCurrencyToExpenses extends Migration $table->renameColumn('currency_id', 'invoice_currency_id'); $table->unsignedInteger('expense_currency_id'); + }); + + Schema::table('expenses', function (Blueprint $table) { + // set account value so we're able to create foreign constraint DB::statement('update expenses e left join accounts a on a.id = e.account_id From ead2b335d5c9c81a68315f112c724ae79177ecbc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 3 Feb 2016 14:21:13 +1100 Subject: [PATCH 63/99] Added Credit Transformer --- app/Models/Client.php | 6 +++++ app/Ninja/Transformers/ClientTransformer.php | 7 ++++++ app/Ninja/Transformers/CreditTransformer.php | 24 ++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 app/Ninja/Transformers/CreditTransformer.php diff --git a/app/Models/Client.php b/app/Models/Client.php index 6655a9ef2e67..2984f7372fd5 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -136,6 +136,12 @@ class Client extends EntityModel return $this->belongsTo('App\Models\Industry'); } + public function credits() + { + return $this->hasMany('App\Models\Credit'); + } + + public function addContact($data, $isPrimary = false) { $publicId = isset($data['public_id']) ? $data['public_id'] : false; diff --git a/app/Ninja/Transformers/ClientTransformer.php b/app/Ninja/Transformers/ClientTransformer.php index 4289545673c7..66fdd35bf064 100644 --- a/app/Ninja/Transformers/ClientTransformer.php +++ b/app/Ninja/Transformers/ClientTransformer.php @@ -43,6 +43,7 @@ class ClientTransformer extends EntityTransformer protected $availableIncludes = [ 'contacts', 'invoices', + 'credits', ]; public function includeContacts(Client $client) @@ -57,6 +58,12 @@ class ClientTransformer extends EntityTransformer return $this->includeCollection($client->invoices, $transformer, ENTITY_INVOICE); } + public function includeCredits(Client $client) + { + $transformer = new CreditTransformer($this->account, $this->serializer); + return $this->includeCollection($client->credits, $transformer, ENTITY_CREDIT); + } + public function transform(Client $client) { return [ diff --git a/app/Ninja/Transformers/CreditTransformer.php b/app/Ninja/Transformers/CreditTransformer.php new file mode 100644 index 000000000000..a33185d2ff39 --- /dev/null +++ b/app/Ninja/Transformers/CreditTransformer.php @@ -0,0 +1,24 @@ + (int) $credit->public_id, + 'amount' => (float) $credit->amount, + 'balance' => (float) $credit->balance, + 'updated_at' => $this->getTimestamp($credit->updated_at), + 'archived_at' => $this->getTimestamp($credit->deleted_at), + 'is_deleted' => (bool) $credit->is_deleted, + 'account_key' => $this->account->account_key, + 'credit_date' => $credit->credit_date, + 'credit_number' => $credit->credit_number, + 'private_notes' => $credit->private_notes, + ]; + } +} \ No newline at end of file From 5657f480bc2f9989fe81080b2c6030154d878d2a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 10:07:14 +0200 Subject: [PATCH 64/99] Corrected date format --- database/seeds/PaymentLibrariesSeeder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeds/PaymentLibrariesSeeder.php b/database/seeds/PaymentLibrariesSeeder.php index 7dd5d126436c..58015b073206 100644 --- a/database/seeds/PaymentLibrariesSeeder.php +++ b/database/seeds/PaymentLibrariesSeeder.php @@ -152,7 +152,7 @@ class PaymentLibrariesSeeder extends Seeder ['format' => 'M j, Y', 'picker_format' => 'M d, yyyy', 'label' => 'Mar 10, 2013'], ['format' => 'F j, Y', 'picker_format' => 'MM d, yyyy', 'label' => 'March 10, 2013'], ['format' => 'D M j, Y', 'picker_format' => 'D MM d, yyyy', 'label' => 'Mon March 10, 2013'], - ['format' => 'Y-M-d', 'picker_format' => 'yyyy-mm-dd', 'label' => '2013-03-10'], + ['format' => 'Y-m-d', 'picker_format' => 'yyyy-mm-dd', 'label' => '2013-03-10'], ['format' => 'd-m-Y', 'picker_format' => 'dd-mm-yyyy', 'label' => '20-03-2013'], ['format' => 'm/d/Y', 'picker_format' => 'mm/dd/yyyy', 'label' => '03/20/2013'] ]; @@ -208,7 +208,7 @@ class PaymentLibrariesSeeder extends Seeder 'label' => 'Mon March 10th, 2013 6:15 pm' ], [ - 'format' => 'Y-M-d g:i a', + 'format' => 'Y-m-d g:i a', 'format_moment' => 'YYYY-MMM-DD h:mm:ss a', 'label' => '2013-03-10 6:15 pm' ], From 65d36676004af2ac817a9d89ff7221ec7527251b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 10:07:44 +0200 Subject: [PATCH 65/99] Increased timeout when installing/updating --- app/Http/Controllers/AppController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Http/Controllers/AppController.php b/app/Http/Controllers/AppController.php index b31259d88fa1..2ff91cb1bb60 100644 --- a/app/Http/Controllers/AppController.php +++ b/app/Http/Controllers/AppController.php @@ -224,6 +224,7 @@ class AppController extends BaseController { if (!Utils::isNinjaProd() && !Utils::isDatabaseSetup()) { try { + set_time_limit(60 * 5); // shouldn't take this long but just in case Artisan::call('migrate', array('--force' => true)); if (Industry::count() == 0) { Artisan::call('db:seed', array('--force' => true)); @@ -241,6 +242,7 @@ class AppController extends BaseController { if (!Utils::isNinjaProd()) { try { + set_time_limit(60 * 5); Cache::flush(); Session::flush(); Artisan::call('optimize', array('--force' => true)); From 37ffd0146388c1b634185f430aa5bac46cdf76c2 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 10:08:12 +0200 Subject: [PATCH 66/99] Filtered out quotes from reminder emails --- app/Ninja/Repositories/InvoiceRepository.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Ninja/Repositories/InvoiceRepository.php b/app/Ninja/Repositories/InvoiceRepository.php index 47d4e62d40de..47cbf82bbad0 100644 --- a/app/Ninja/Repositories/InvoiceRepository.php +++ b/app/Ninja/Repositories/InvoiceRepository.php @@ -673,6 +673,8 @@ class InvoiceRepository extends BaseRepository $sql = implode(' OR ', $dates); $invoices = Invoice::whereAccountId($account->id) ->where('balance', '>', 0) + ->where('is_quote', '=', false) + ->where('is_recurring', '=', false) ->whereRaw('('.$sql.')') ->get(); From c14133d66e2c407013d72f66a3f9c2a940d0c7fb Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 10:08:28 +0200 Subject: [PATCH 67/99] Added new logo --- public/images/invoiceninja-logo.png | Bin 3952 -> 3373 bytes public/images/invoiceninja-logo@2x.png | Bin 3952 -> 3373 bytes resources/views/header.blade.php | 2 +- resources/views/payments/edit.blade.php | 6 ++++++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/images/invoiceninja-logo.png b/public/images/invoiceninja-logo.png index b6ed40272e88325ce17b0281c9a3c79fad329986..6fa36d566fb9e235a269a5de01517693b7604ff8 100644 GIT binary patch delta 2721 zcmV;S3SRZ_9<3T7iBL{Q4GJ0x0000DNk~Le0002N0000P2nGNE0EjP2-jN}HaIdlMny3;F)}cd`T;SMqXIUQO#&N}^a3H1 zi2@pvF9Sh;d>GDO000T0Nkl+?HtsVEzScg!MQL@f2w_}UQDiN_Hy$2eUhjM#6J0|50u#5w zW`a&7zNg&3PmDhTl;Bq4mAH;0K1v)BBx9RRY)f28>_fD(nCANIA+{4`{60+~Yy6I1 z`e}TBtaQ=19#Rt}*a$vF>;R4GhnH>=pvm1t{0!s?DL3jbT8R7Of^dwziKB?~d~Bag zJeQbBT<6DevHWBZk0&nhwUba{8nG4bPbL-;M`JNAB|Z(ItqBTk7N3ccmc5^acfPKU^sC*@g}$< zIq9>-&n)m?vU?m$5i~k&PFMPvPEIjW*8;CvYp%P?a2j-aI zG~!1=IL2Rykx+yq4q?g`{3?96F|gG46CZk#}Us^ z?%5!$6?HC#v518q%t7vln72PPea7PV4b11Kpbi&ejpE<}6u=#ri#4*sIrt53*NnKE z_zql%Lk{MZjoBRHjc|!pxm*`k?%T0{<4qN13B+D7y!_s`Ax1g@_1Q2_w=ujk@OP@R zqnbF1co}gZ40$A;?}eNu{~eQh{*OP1lZj!(&cqC2B4?2lP9TmTwh+&`O)uh8qKvP1 zqn{AsNyJ5(-_8;Jsq7-^F4ol9DC!h?^w>pgqqG|*%GYT6KAKpp)Tt7EG$t;8@K__8 z7^~?wUetS7Q>O_r&8F{4;uKB0P~tS3cD%NcHgleXdOY_jxZZ|$wOSwD8uqp+n}IT( zyDb*u{E2wF#TZSr)0Cx(eu^O9CNhaphRptyKo-4{nD`g3qz6-JYNqp>oQVAw$`Y1-< z72-KtwnoZ)t2hXOOCsiqvXKsyfbT~s-a>Q$l;BcLd8|_2*`*TLaRl1sg*phFCnECh zk7qq_Fk%PJC-+7B2xL6IhEIApF&{Z=_Bl_{r04o5*Kdllc;Q=KrQCCd<6Y(cZqfD? zVoT((*(d!|DdPaRvx}I2?OyThd14g$K1De@*^T$9uo%-7#Jh--iCq!wni%6EleL@} zPJG$VYqc547>O-N;WN(nEQ?^AdM0Sb!OcNr0Gn5?1KQB!nj-`FasQp z|6C}ODi9MDrQ%cbVd$T8`MHYm>Zi2Jgpf4{%kd5-&NHe{uALwe0X{4DwSHWy?`+Dp z;cv?t^dAAEVV->zsg~Xiu7|K+j%-6K6l2zhP}7}clQrI3qDY>8jNva@@$2;0?aC`LF^ zk@Nk0I_L|ez)0bgyOTV1G+m&<;(%tUg(4Zk%`lNK?pwHjSVR?j9k%o3P|J-l&w%A- z1D6z}>HoIyTJDCNr@}2a&!+B_=LFuc2fpZBbZ|ZV%NS9Q55OLQt27geZ~=aBD17T+ z1}pN9*ftHg6#R~-Ds>hrmWgptv+a5l$`Xg;IUw$%9JVXfDF3fs+LXAMC*FN-fssqZ z*+E&5t>sLAoL?=1yvp&hT&{7l6Rd?_e;PFCK3JpK8U--HzU2hC9*ePs4M$v&q&d(C zCRD+NQ?27vFS|vKxbLdjVPrt(^efRHYyx=|al*jl3Ps(H`M0CnU7L6RXYsBt_~2Cp z5{;1vFmPB}W)o*<2kt@U<01rRyI|S(;1t>ERvQ9;H(~|0C0@XX5JT{nlivraBFOKT zhKiU%e!iV2VvqKCKNHbd2o=j6jwM|zAZOf0i8{kz(cV#f=0Al{vtnK&+QlG#s|nbz z=FdL(3xknCw1$!Ja;o5(+agqKp|fE1hhgho2?4&rsQ&!HSHvNfV5@l#c8FMHU_LPH zKhZsZ+}Nh1N6qibntWli4u)fWIgu6A)rP4p5ak+S1_#2|LG_F~>GS)Ss zoX>hDVq8ZX)#*as^~cs=uD*b$5EevAP^P^5(;};M4CFmURRY$OG`Ko>2q>ZhJjiea zR%{hNLkf?h_#QzriD{b5QihE$&+f;ShW+Qfk*vr>S{*ZzrT2jCM!XjQ!(IiV*YX(T^L|2Zs^`VoW)jI(!;@ zHu}EKs6KHHQ7j%Ct`9ZseuH62giG6h9qU{HcW41JepZ>CuQ8qy2Z}ldyG*`CmMh(& zEDL2>HvR8Fog5c3#bf6$dilV#Ck#RvcCI8Chi-oduXX5ujO!X2VH++DK;JCLP2oPe zUBKo(whKnEYx6s<+t>ubjo|tfSxsgG0)qY7oF+jdhm$fKz zk{xP51L_h^H2%%XEz!hqj?th54XBGqLQKf#SbGr!8x2a(fcgYZ6!7OQoIXCwB1z&H be+e)EL2K4p2Guuk00000NkvXXu0mjfF!u5< delta 3228 zcmV;N3}f@H8t@(=iBL{Q4GJ0x0000DNk~Le0002r0000P2nGNE0I^8>g^?k*B{MB! zFflP8Ha0FXG&MFhF)Sc5FflSOFfuPNHZ3tUIyE*rGB=U^bd%fxB9m$XYm;^YEeIfZ zZE#IZI!Tki0yUHT0UDDI10j>60yY6MliC710W*^p16qHmuzgbi01M%! zeDL<^4Lpr?UXC)ZPiLk~y9f_*#R)YCGYD(2L*0x8l7Mz%Ej15XD++BVOeAzAd=q7! zP3V6D6SIKu6rlomcf06KQ|pRl~UKAk-7{rbS4)$00Y$;8n$WtY(Jl zTmktvNN2vMso!j#Eu%sP)AKpPJUn?vU7AQF{w-wd6F#ALy-~r_=~0oem);%4@0$pG zK;4QoGYM=n7ZLgpUgI<*`%C<;kcN(`L=S2AuP|iV)8iWa{FpF-a1Wsqfd}v?VLg9g zGPPy8N_!qXdWcusNoJI%E_czRo_IBbWS1Ip%~5t!LRG>+!aBlK!fZ;D^f@l*(N(;f zO0ug0`sO-%bR@9pbT;7-VJ+8-FrCttMC{}0sBddR4MHiQ0P|%W<@0$!^2T^BBRRIN z-lV^~5C#%jL`i4xSYhzEEY>~@dbEEf9HFvi({G;dZ3rzPzn|wd;g2D8z6A5)KN0%o za(dj3aW7BUP2e$^LS^iQ$$W>U`6RLSXbG8XS@o(y+ClDP!Z<>ILN8uOgqg6v4;W6A zI&8lS$H=CDI>gp|sH>!bhRhtn|4`WT7L75SQilb9uWy1X?=f2um6goZgoS@0W;^pQ z_LT7xC3}rWu4#mFmJ(`*^eth#YTS_uPT|l6~DVMzr$#QXADLQnG)>uTIQh`&}lH#{j{CY||yr<5-J&ZbhK=?WDu7ueJe}vK2MS{O7 z!bX(Dd3*rQl6WEyLZ3ZjSPx4)$VMyQFC6pq!W*V4jPkz$+Q1 zLD;0LCxXHMidkMNi|;*=exG6Xen*wDOUI4Gj(JS`D}EQn@2&WMRvM|kGBrz7`R$B$ zJfO-GSZ;wcCxut)m%IM`eBYCv}d({+wtaP3z-mm~|b%@WX z0d1M1^7@w2Mv{LXQ)%B3JU)9i444%87(0hN!SAKY`9VN^Ybn`|9xb)RNPC&sl$t5t z?|f%2diM%=J=Obi!h*RqWX^PQCZoY~8|_TP1G*W!@5cxWeQA-EAz1!bX=5XHSJTDo zM9_X)8On&Y_>601qXW(yZt|aH$TU;=JZi{n75qiw{ri9Fx?G;pdXioY8LWQ3vnOjG z#k)nBagv6X!F#;XFgJrB=}wQ9dc{-LI7|D94a+)nEdlQ)_5Mm>S>%Sa(P`Eh2JdYReBVuU!_rO>x- zqhHS9qo|9o6ooXWL>w!cOX!Qm_6Ficj@aYIo-BXfkv^m+?^eSwp*s`a$>8GCgTGv# zIn=^h?8)bC8R2qFJaeYX8q?eUrf2)m&%(R8ZWtaF}SLL%Q z#r~{Q#_?DkBUYC~ZP-AM*YVSZho7;cWN zi_w1{&17Dug$Q$leoq)ljpKM;1DFi=Vv&VWbAS)49Eg6I@|i|?aK#@X+=q_Ml;&G$ zEY3v8qS9Jr8`b&Kkj2L|SPTenRy~a1czN}kFCc92Xr1P2@lB)riam7%w3y>8zQ%tZ&C27$_n!9|0rm%?b8R7AVJEXQ-! zS`YjDOn9-r3m0`+=>XinSE1}Gh>2`W)0r>uTA4U=B(=L+$rTEjzj$OS1q7RidD0At za^}M)H=Bjr5&5-(xT59g7oI@2qmiC+_+0dnIIk_>F%kSGhW9$*$?InEnNUaE1d@OJ zhAw6qVWJ*8`-wh#){q+t-ctdw+^~xS?!xxx#)a*+0bbC#QO@l`evs(Lrq<%)yOwug z!R5izwJ}4V6TO8SF1bJlMmbNr8#aH~RN2X}Q^`DRgbxao%p`fK0Iv8y7)}`-@V+0s zDG?^B^n7kP=9>SioVyF$!4u0Z3j4|-bjX%IK;>Pp3P^A#`3t{JtCk z=Y7ZN1KRbtX;4`V<_MG@XYob3R<<-k5V(!X=dOTG{jJfS{E&f|W27lT5W9cW;Egn5 zm0GjaG|HJAvmBom?iO(IqR4n(;JMW_4E!e}YKn0x-&%%@+oWo!_wMTB{0Qar3AnKB z`tU~vuPQvLNnCxaYsgf=_$9?gw^9mRfLITImNCn?@o>CoFK&+17Fr;9+}E8Bg5!$(49r(H6r2|E(*AZ z`Zi?RM_hbT`xO}*P<1z{17f+uBb4L5hwNtX*6R4G;@>JRI+Vb2`xU|y)5YE1St4FK zL1xeaH&2R_Ck7pc+4AG0=U+)goFKJ5XAVb?c=DN~Zk6PQOc1G68byDcSZ836EbF2W zTH?Zh^c&<+AwaGIzLnf*l(Qcpp*j)k%ps*!o-z9eg7f79(mO3tEk>wgoKJ(%yW8D$ zIfLiE=lo%WGF+RkRqxM(A}W@#Ya@L<+*7u!i7mK%k}K}v9=i>dk*|K!MZSfWNSx5s zj?+FK)T?v;_gT(i0y}?+R{B06DnmKt;L&sDDS!U6g339VLSD5Ig5Y!Q9^_M)bBYm; z53Hr$rS`RqAkU5}){y7IJ6edbEInB}Af=CKvy`PW&bwS;vUmNuc0zXXW$Ad&xoYAZ zxYY89XBS_VvXuV$COy$>e9oin;>%K&(r;?+z{jxs|6HaIdlMny3;F)}cd`T;SMqXIUQO#&N}^a3H1 zi2@pvF9Sh;d>GDO000T0Nkl+?HtsVEzScg!MQL@f2w_}UQDiN_Hy$2eUhjM#6J0|50u#5w zW`a&7zNg&3PmDhTl;Bq4mAH;0K1v)BBx9RRY)f28>_fD(nCANIA+{4`{60+~Yy6I1 z`e}TBtaQ=19#Rt}*a$vF>;R4GhnH>=pvm1t{0!s?DL3jbT8R7Of^dwziKB?~d~Bag zJeQbBT<6DevHWBZk0&nhwUba{8nG4bPbL-;M`JNAB|Z(ItqBTk7N3ccmc5^acfPKU^sC*@g}$< zIq9>-&n)m?vU?m$5i~k&PFMPvPEIjW*8;CvYp%P?a2j-aI zG~!1=IL2Rykx+yq4q?g`{3?96F|gG46CZk#}Us^ z?%5!$6?HC#v518q%t7vln72PPea7PV4b11Kpbi&ejpE<}6u=#ri#4*sIrt53*NnKE z_zql%Lk{MZjoBRHjc|!pxm*`k?%T0{<4qN13B+D7y!_s`Ax1g@_1Q2_w=ujk@OP@R zqnbF1co}gZ40$A;?}eNu{~eQh{*OP1lZj!(&cqC2B4?2lP9TmTwh+&`O)uh8qKvP1 zqn{AsNyJ5(-_8;Jsq7-^F4ol9DC!h?^w>pgqqG|*%GYT6KAKpp)Tt7EG$t;8@K__8 z7^~?wUetS7Q>O_r&8F{4;uKB0P~tS3cD%NcHgleXdOY_jxZZ|$wOSwD8uqp+n}IT( zyDb*u{E2wF#TZSr)0Cx(eu^O9CNhaphRptyKo-4{nD`g3qz6-JYNqp>oQVAw$`Y1-< z72-KtwnoZ)t2hXOOCsiqvXKsyfbT~s-a>Q$l;BcLd8|_2*`*TLaRl1sg*phFCnECh zk7qq_Fk%PJC-+7B2xL6IhEIApF&{Z=_Bl_{r04o5*Kdllc;Q=KrQCCd<6Y(cZqfD? zVoT((*(d!|DdPaRvx}I2?OyThd14g$K1De@*^T$9uo%-7#Jh--iCq!wni%6EleL@} zPJG$VYqc547>O-N;WN(nEQ?^AdM0Sb!OcNr0Gn5?1KQB!nj-`FasQp z|6C}ODi9MDrQ%cbVd$T8`MHYm>Zi2Jgpf4{%kd5-&NHe{uALwe0X{4DwSHWy?`+Dp z;cv?t^dAAEVV->zsg~Xiu7|K+j%-6K6l2zhP}7}clQrI3qDY>8jNva@@$2;0?aC`LF^ zk@Nk0I_L|ez)0bgyOTV1G+m&<;(%tUg(4Zk%`lNK?pwHjSVR?j9k%o3P|J-l&w%A- z1D6z}>HoIyTJDCNr@}2a&!+B_=LFuc2fpZBbZ|ZV%NS9Q55OLQt27geZ~=aBD17T+ z1}pN9*ftHg6#R~-Ds>hrmWgptv+a5l$`Xg;IUw$%9JVXfDF3fs+LXAMC*FN-fssqZ z*+E&5t>sLAoL?=1yvp&hT&{7l6Rd?_e;PFCK3JpK8U--HzU2hC9*ePs4M$v&q&d(C zCRD+NQ?27vFS|vKxbLdjVPrt(^efRHYyx=|al*jl3Ps(H`M0CnU7L6RXYsBt_~2Cp z5{;1vFmPB}W)o*<2kt@U<01rRyI|S(;1t>ERvQ9;H(~|0C0@XX5JT{nlivraBFOKT zhKiU%e!iV2VvqKCKNHbd2o=j6jwM|zAZOf0i8{kz(cV#f=0Al{vtnK&+QlG#s|nbz z=FdL(3xknCw1$!Ja;o5(+agqKp|fE1hhgho2?4&rsQ&!HSHvNfV5@l#c8FMHU_LPH zKhZsZ+}Nh1N6qibntWli4u)fWIgu6A)rP4p5ak+S1_#2|LG_F~>GS)Ss zoX>hDVq8ZX)#*as^~cs=uD*b$5EevAP^P^5(;};M4CFmURRY$OG`Ko>2q>ZhJjiea zR%{hNLkf?h_#QzriD{b5QihE$&+f;ShW+Qfk*vr>S{*ZzrT2jCM!XjQ!(IiV*YX(T^L|2Zs^`VoW)jI(!;@ zHu}EKs6KHHQ7j%Ct`9ZseuH62giG6h9qU{HcW41JepZ>CuQ8qy2Z}ldyG*`CmMh(& zEDL2>HvR8Fog5c3#bf6$dilV#Ck#RvcCI8Chi-oduXX5ujO!X2VH++DK;JCLP2oPe zUBKo(whKnEYx6s<+t>ubjo|tfSxsgG0)qY7oF+jdhm$fKz zk{xP51L_h^H2%%XEz!hqj?th54XBGqLQKf#SbGr!8x2a(fcgYZ6!7OQoIXCwB1z&H be+e)EL2K4p2Guuk00000NkvXXu0mjfF!u5< delta 3228 zcmV;N3}f@H8t@(=iBL{Q4GJ0x0000DNk~Le0002r0000P2nGNE0I^8>g^?k*B{MB! zFflP8Ha0FXG&MFhF)Sc5FflSOFfuPNHZ3tUIyE*rGB=U^bd%fxB9m$XYm;^YEeIfZ zZE#IZI!Tki0yUHT0UDDI10j>60yY6MliC710W*^p16qHmuzgbi01M%! zeDL<^4Lpr?UXC)ZPiLk~y9f_*#R)YCGYD(2L*0x8l7Mz%Ej15XD++BVOeAzAd=q7! zP3V6D6SIKu6rlomcf06KQ|pRl~UKAk-7{rbS4)$00Y$;8n$WtY(Jl zTmktvNN2vMso!j#Eu%sP)AKpPJUn?vU7AQF{w-wd6F#ALy-~r_=~0oem);%4@0$pG zK;4QoGYM=n7ZLgpUgI<*`%C<;kcN(`L=S2AuP|iV)8iWa{FpF-a1Wsqfd}v?VLg9g zGPPy8N_!qXdWcusNoJI%E_czRo_IBbWS1Ip%~5t!LRG>+!aBlK!fZ;D^f@l*(N(;f zO0ug0`sO-%bR@9pbT;7-VJ+8-FrCttMC{}0sBddR4MHiQ0P|%W<@0$!^2T^BBRRIN z-lV^~5C#%jL`i4xSYhzEEY>~@dbEEf9HFvi({G;dZ3rzPzn|wd;g2D8z6A5)KN0%o za(dj3aW7BUP2e$^LS^iQ$$W>U`6RLSXbG8XS@o(y+ClDP!Z<>ILN8uOgqg6v4;W6A zI&8lS$H=CDI>gp|sH>!bhRhtn|4`WT7L75SQilb9uWy1X?=f2um6goZgoS@0W;^pQ z_LT7xC3}rWu4#mFmJ(`*^eth#YTS_uPT|l6~DVMzr$#QXADLQnG)>uTIQh`&}lH#{j{CY||yr<5-J&ZbhK=?WDu7ueJe}vK2MS{O7 z!bX(Dd3*rQl6WEyLZ3ZjSPx4)$VMyQFC6pq!W*V4jPkz$+Q1 zLD;0LCxXHMidkMNi|;*=exG6Xen*wDOUI4Gj(JS`D}EQn@2&WMRvM|kGBrz7`R$B$ zJfO-GSZ;wcCxut)m%IM`eBYCv}d({+wtaP3z-mm~|b%@WX z0d1M1^7@w2Mv{LXQ)%B3JU)9i444%87(0hN!SAKY`9VN^Ybn`|9xb)RNPC&sl$t5t z?|f%2diM%=J=Obi!h*RqWX^PQCZoY~8|_TP1G*W!@5cxWeQA-EAz1!bX=5XHSJTDo zM9_X)8On&Y_>601qXW(yZt|aH$TU;=JZi{n75qiw{ri9Fx?G;pdXioY8LWQ3vnOjG z#k)nBagv6X!F#;XFgJrB=}wQ9dc{-LI7|D94a+)nEdlQ)_5Mm>S>%Sa(P`Eh2JdYReBVuU!_rO>x- zqhHS9qo|9o6ooXWL>w!cOX!Qm_6Ficj@aYIo-BXfkv^m+?^eSwp*s`a$>8GCgTGv# zIn=^h?8)bC8R2qFJaeYX8q?eUrf2)m&%(R8ZWtaF}SLL%Q z#r~{Q#_?DkBUYC~ZP-AM*YVSZho7;cWN zi_w1{&17Dug$Q$leoq)ljpKM;1DFi=Vv&VWbAS)49Eg6I@|i|?aK#@X+=q_Ml;&G$ zEY3v8qS9Jr8`b&Kkj2L|SPTenRy~a1czN}kFCc92Xr1P2@lB)riam7%w3y>8zQ%tZ&C27$_n!9|0rm%?b8R7AVJEXQ-! zS`YjDOn9-r3m0`+=>XinSE1}Gh>2`W)0r>uTA4U=B(=L+$rTEjzj$OS1q7RidD0At za^}M)H=Bjr5&5-(xT59g7oI@2qmiC+_+0dnIIk_>F%kSGhW9$*$?InEnNUaE1d@OJ zhAw6qVWJ*8`-wh#){q+t-ctdw+^~xS?!xxx#)a*+0bbC#QO@l`evs(Lrq<%)yOwug z!R5izwJ}4V6TO8SF1bJlMmbNr8#aH~RN2X}Q^`DRgbxao%p`fK0Iv8y7)}`-@V+0s zDG?^B^n7kP=9>SioVyF$!4u0Z3j4|-bjX%IK;>Pp3P^A#`3t{JtCk z=Y7ZN1KRbtX;4`V<_MG@XYob3R<<-k5V(!X=dOTG{jJfS{E&f|W27lT5W9cW;Egn5 zm0GjaG|HJAvmBom?iO(IqR4n(;JMW_4E!e}YKn0x-&%%@+oWo!_wMTB{0Qar3AnKB z`tU~vuPQvLNnCxaYsgf=_$9?gw^9mRfLITImNCn?@o>CoFK&+17Fr;9+}E8Bg5!$(49r(H6r2|E(*AZ z`Zi?RM_hbT`xO}*P<1z{17f+uBb4L5hwNtX*6R4G;@>JRI+Vb2`xU|y)5YE1St4FK zL1xeaH&2R_Ck7pc+4AG0=U+)goFKJ5XAVb?c=DN~Zk6PQOc1G68byDcSZ836EbF2W zTH?Zh^c&<+AwaGIzLnf*l(Qcpp*j)k%ps*!o-z9eg7f79(mO3tEk>wgoKJ(%yW8D$ zIfLiE=lo%WGF+RkRqxM(A}W@#Ya@L<+*7u!i7mK%k}K}v9=i>dk*|K!MZSfWNSx5s zj?+FK)T?v;_gT(i0y}?+R{B06DnmKt;L&sDDS!U6g339VLSD5Ig5Y!Q9^_M)bBYm; z53Hr$rS`RqAkU5}){y7IJ6edbEInB}Af=CKvy`PW&bwS;vUmNuc0zXXW$Ad&xoYAZ zxYY89XBS_VvXuV$COy$>e9oin;>%K&(r;?+z{jxs|6 - + diff --git a/resources/views/payments/edit.blade.php b/resources/views/payments/edit.blade.php index e26af5c3dba2..10a9aacbed60 100644 --- a/resources/views/payments/edit.blade.php +++ b/resources/views/payments/edit.blade.php @@ -4,6 +4,12 @@ @parent @include('money_script') + + @stop @section('content') From 2c8d3e2013526381c55521992f5c484b713fd31c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 3 Feb 2016 21:06:49 +1100 Subject: [PATCH 68/99] Added Payments to API --- app/Http/Controllers/PaymentApiController.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index 2d4d45fa788c..aacd744d6def 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -1,5 +1,6 @@ paymentRepo = $paymentRepo; + $this->contactMailer = $contactMailer; + } /** @@ -107,12 +111,20 @@ class PaymentApiController extends BaseAPIController return $error; } - $payment = $this->paymentRepo->save($data); - $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); + if (Input::get('email_receipt')) { + $this->contactMailer->sendPaymentConfirmation($payment); + } + + /* + $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); $transformer = new PaymentTransformer(Auth::user()->account, Input::get('serializer')); $data = $this->createItem($payment, $transformer, 'payment'); + */ + $invoice = Invoice::scope($payment->invoice_id)->with('client', 'invoice_items', 'invitations')->first(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); } From b33c896bebaae75f074a3546a47c7ea1b9260894 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 14:12:55 +0200 Subject: [PATCH 69/99] Fix migration down --- .../2016_02_01_135956_add_source_currency_to_expenses.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php index 16c2f38a1012..4fcfa367d6be 100644 --- a/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php +++ b/database/migrations/2016_02_01_135956_add_source_currency_to_expenses.php @@ -43,9 +43,6 @@ class AddSourceCurrencyToExpenses extends Migration { Schema::table('expenses', function($table) { - $table->dropColumn('expense_currency_id'); - $table->renameColumn('invoice_currency_id', 'currency_id'); - $table->renameColumn('invoice_amount', 'foreign_amount'); }); } } From 021f195c45613763fbe352a31fe89c9f7b886f02 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 14:41:40 +0200 Subject: [PATCH 70/99] Implemented UpdateAccountRequest --- app/Http/Controllers/AccountApiController.php | 41 ++----- app/Http/Controllers/AccountController.php | 104 +++++++----------- app/Http/Requests/UpdateAccountRequest.php | 31 ++++++ app/Http/routes.php | 1 + app/Models/Account.php | 36 ++++++ app/Ninja/Repositories/AccountRepository.php | 6 + 6 files changed, 121 insertions(+), 98 deletions(-) create mode 100644 app/Http/Requests/UpdateAccountRequest.php diff --git a/app/Http/Controllers/AccountApiController.php b/app/Http/Controllers/AccountApiController.php index 3f5a01d0cc03..fc909461353f 100644 --- a/app/Http/Controllers/AccountApiController.php +++ b/app/Http/Controllers/AccountApiController.php @@ -19,6 +19,8 @@ use App\Ninja\Transformers\UserAccountTransformer; use App\Http\Controllers\BaseAPIController; use Swagger\Annotations as SWG; +use App\Http\Requests\UpdateAccountRequest; + class AccountApiController extends BaseAPIController { protected $accountRepo; @@ -103,41 +105,14 @@ class AccountApiController extends BaseAPIController return $this->processLogin($request); } - public function update(Request $request) + public function update(UpdateAccountRequest $request) { - $rules = array( - 'name' => 'required', - ); + $account = Auth::user()->account; + $this->accountRepo->save($request->input(), $account); - $validator = Validator::make(Input::all(), $rules); - - if ($validator->fails()) { - $data = $validator->messages(); - return $this->errorResponse($data); - } else { - $account = Auth::user()->account; - $account->name = trim(Input::get('name')); - $account->id_number = trim(Input::get('id_number')); - $account->vat_number = trim(Input::get('vat_number')); - $account->work_email = trim(Input::get('work_email')); - $account->website = trim(Input::get('website')); - $account->work_phone = trim(Input::get('work_phone')); - $account->address1 = trim(Input::get('address1')); - $account->address2 = trim(Input::get('address2')); - $account->city = trim(Input::get('city')); - $account->state = trim(Input::get('state')); - $account->postal_code = trim(Input::get('postal_code')); - $account->country_id = Input::get('country_id') ? Input::get('country_id') : null; - $account->size_id = Input::get('size_id') ? Input::get('size_id') : null; - $account->industry_id = Input::get('industry_id') ? Input::get('industry_id') : null; - $account->email_footer = Input::get('email_footer'); - $account->save(); - - $transformer = new AccountTransformer(null, $request->serializer); - $account = $this->createItem($account, $transformer, 'account'); - - return $this->response($account); - } + $transformer = new AccountTransformer(null, $request->serializer); + $account = $this->createItem($account, $transformer, 'account'); + return $this->response($account); } } diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 02921782e035..454b9d357c58 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -29,6 +29,8 @@ use App\Events\UserLoggedIn; use App\Events\UserSettingsChanged; use App\Services\AuthService; +use App\Http\Requests\UpdateAccountRequest; + class AccountController extends BaseController { protected $accountRepo; @@ -766,80 +768,52 @@ class AccountController extends BaseController return Redirect::to('settings/'.ACCOUNT_NOTIFICATIONS); } - private function saveDetails() + public function updateDetails(UpdateAccountRequest $request) { - $rules = array( - 'name' => 'required', - 'logo' => 'sometimes|max:'.MAX_LOGO_FILE_SIZE.'|mimes:jpeg,gif,png', - ); + $account = Auth::user()->account; + $this->accountRepo->save($request->input(), $account); - $validator = Validator::make(Input::all(), $rules); + /* Logo image file */ + if ($file = Input::file('logo')) { + $path = Input::file('logo')->getRealPath(); + File::delete('logo/'.$account->account_key.'.jpg'); + File::delete('logo/'.$account->account_key.'.png'); - if ($validator->fails()) { - return Redirect::to('settings/'.ACCOUNT_COMPANY_DETAILS) - ->withErrors($validator) - ->withInput(); - } else { - $account = Auth::user()->account; - $account->name = trim(Input::get('name')); - $account->id_number = trim(Input::get('id_number')); - $account->vat_number = trim(Input::get('vat_number')); - $account->work_email = trim(Input::get('work_email')); - $account->website = trim(Input::get('website')); - $account->work_phone = trim(Input::get('work_phone')); - $account->address1 = trim(Input::get('address1')); - $account->address2 = trim(Input::get('address2')); - $account->city = trim(Input::get('city')); - $account->state = trim(Input::get('state')); - $account->postal_code = trim(Input::get('postal_code')); - $account->country_id = Input::get('country_id') ? Input::get('country_id') : null; - $account->size_id = Input::get('size_id') ? Input::get('size_id') : null; - $account->industry_id = Input::get('industry_id') ? Input::get('industry_id') : null; - $account->email_footer = Input::get('email_footer'); - $account->save(); + $mimeType = $file->getMimeType(); - /* Logo image file */ - if ($file = Input::file('logo')) { - $path = Input::file('logo')->getRealPath(); - File::delete('logo/'.$account->account_key.'.jpg'); - File::delete('logo/'.$account->account_key.'.png'); - - $mimeType = $file->getMimeType(); - - if ($mimeType == 'image/jpeg') { - $path = 'logo/'.$account->account_key.'.jpg'; - $file->move('logo/', $account->account_key.'.jpg'); - } elseif ($mimeType == 'image/png') { - $path = 'logo/'.$account->account_key.'.png'; - $file->move('logo/', $account->account_key.'.png'); - } else { - if (extension_loaded('fileinfo')) { - $image = Image::make($path); - $image->resize(200, 120, function ($constraint) { - $constraint->aspectRatio(); - }); - $path = 'logo/'.$account->account_key.'.jpg'; - Image::canvas($image->width(), $image->height(), '#FFFFFF') - ->insert($image)->save($path); - } else { - Session::flash('warning', 'Warning: To support gifs the fileinfo PHP extension needs to be enabled.'); - } - } - - // make sure image isn't interlaced + if ($mimeType == 'image/jpeg') { + $path = 'logo/'.$account->account_key.'.jpg'; + $file->move('logo/', $account->account_key.'.jpg'); + } elseif ($mimeType == 'image/png') { + $path = 'logo/'.$account->account_key.'.png'; + $file->move('logo/', $account->account_key.'.png'); + } else { if (extension_loaded('fileinfo')) { - $img = Image::make($path); - $img->interlace(false); - $img->save(); + $image = Image::make($path); + $image->resize(200, 120, function ($constraint) { + $constraint->aspectRatio(); + }); + $path = 'logo/'.$account->account_key.'.jpg'; + Image::canvas($image->width(), $image->height(), '#FFFFFF') + ->insert($image)->save($path); + } else { + Session::flash('warning', 'Warning: To support gifs the fileinfo PHP extension needs to be enabled.'); } } - event(new UserSettingsChanged()); - - Session::flash('message', trans('texts.updated_settings')); - - return Redirect::to('settings/'.ACCOUNT_COMPANY_DETAILS); + // make sure image isn't interlaced + if (extension_loaded('fileinfo')) { + $img = Image::make($path); + $img->interlace(false); + $img->save(); + } } + + event(new UserSettingsChanged()); + + Session::flash('message', trans('texts.updated_settings')); + + return Redirect::to('settings/'.ACCOUNT_COMPANY_DETAILS); } private function saveUserDetails() diff --git a/app/Http/Requests/UpdateAccountRequest.php b/app/Http/Requests/UpdateAccountRequest.php new file mode 100644 index 000000000000..854531d4a944 --- /dev/null +++ b/app/Http/Requests/UpdateAccountRequest.php @@ -0,0 +1,31 @@ + 'required', + 'logo' => 'sometimes|max:'.MAX_LOGO_FILE_SIZE.'|mimes:jpeg,gif,png', + ]; + } +} +// \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index e9e3afc81de0..a314fa07dab5 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -121,6 +121,7 @@ Route::group(['middleware' => 'auth'], function() { Route::post('settings/charts_and_reports', 'ReportController@showReports'); Route::post('settings/cancel_account', 'AccountController@cancelAccount'); + Route::post('settings/company_details', 'AccountController@updateDetails'); Route::get('settings/{section?}', 'AccountController@showSection'); Route::post('settings/{section?}', 'AccountController@doSection'); diff --git a/app/Models/Account.php b/app/Models/Account.php index 08c10017c0a0..7893267a348b 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -21,6 +21,24 @@ class Account extends Eloquent protected $dates = ['deleted_at']; protected $hidden = ['ip']; + protected $fillable = [ + 'name', + 'id_number', + 'vat_number', + 'work_email', + 'website', + 'work_phone', + 'address1', + 'address2', + 'city', + 'state', + 'postal_code', + 'country_id', + 'size_id', + 'industry_id', + 'email_footer', + ]; + public static $basicSettings = [ ACCOUNT_COMPANY_DETAILS, ACCOUNT_USER_DETAILS, @@ -140,6 +158,24 @@ class Account extends Eloquent return $this->belongsTo('App\Models\TaxRate'); } + + public function setIndustryIdAttribute($value) + { + $this->attributes['industry_id'] = $value ?: null; + } + + public function setCountryIdAttribute($value) + { + $this->attributes['country_id'] = $value ?: null; + } + + public function setSizeIdAttribute($value) + { + $this->attributes['size_id'] = $value ?: null; + } + + + public function isGatewayConfigured($gatewayId = 0) { $this->load('account_gateways'); diff --git a/app/Ninja/Repositories/AccountRepository.php b/app/Ninja/Repositories/AccountRepository.php index 1fd6c7117dcc..af708fcb320f 100644 --- a/app/Ninja/Repositories/AccountRepository.php +++ b/app/Ninja/Repositories/AccountRepository.php @@ -516,4 +516,10 @@ class AccountRepository return $userAccount ? $userAccount->id : false; } + + public function save($data, $account) + { + $account->fill($data); + $account->save(); + } } From e9cacf2fdfe4ed301645196a92508d7a73e52da7 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 16:03:56 +0200 Subject: [PATCH 71/99] Added tax rates and localization to the API --- app/Http/Controllers/TaxRateApiController.php | 68 +++++++++++++++++++ app/Http/Controllers/TaxRateController.php | 45 ++++++------ app/Http/Requests/CreateTaxRateRequest.php | 31 +++++++++ app/Http/Requests/UpdateTaxRateRequest.php | 31 +++++++++ app/Http/routes.php | 4 +- app/Models/Account.php | 6 ++ app/Models/TaxRate.php | 5 ++ app/Ninja/Repositories/TaxRateRepository.php | 16 +++++ tests/acceptance/APICest.php | 6 ++ 9 files changed, 186 insertions(+), 26 deletions(-) create mode 100644 app/Http/Controllers/TaxRateApiController.php create mode 100644 app/Http/Requests/CreateTaxRateRequest.php create mode 100644 app/Http/Requests/UpdateTaxRateRequest.php diff --git a/app/Http/Controllers/TaxRateApiController.php b/app/Http/Controllers/TaxRateApiController.php new file mode 100644 index 000000000000..7cacfcf8311b --- /dev/null +++ b/app/Http/Controllers/TaxRateApiController.php @@ -0,0 +1,68 @@ +taxRateService = $taxRateService; + $this->taxRateRepo = $taxRateRepo; + } + + public function index() + { + $taxRates = TaxRate::scope()->withTrashed(); + $taxRates = $taxRates->paginate(); + + $paginator = TaxRate::scope()->withTrashed()->paginate(); + + $transformer = new TaxRateTransformer(Auth::user()->account, $this->serializer); + $data = $this->createCollection($taxRates, $transformer, 'tax_rates', $paginator); + + return $this->response($data); + } + + public function store(CreateTaxRateRequest $request) + { + return $this->save($request); + } + + public function update(UpdateTaxRateRequest $request, $taxRatePublicId) + { + $taxRate = TaxRate::scope($taxRatePublicId)->firstOrFail(); + + if ($request->action == ACTION_ARCHIVE) { + $this->taxRateRepo->archive($taxRate); + + $transformer = new TaxRateTransformer(Auth::user()->account, $request->serializer); + $data = $this->createItem($taxRate, $transformer, 'tax_rates'); + + return $this->response($data); + } else { + return $this->save($request, $taxRate); + } + } + + private function save($request, $taxRate = false) + { + $taxRate = $this->taxRateRepo->save($request->input(), $taxRate); + + $transformer = new TaxRateTransformer(\Auth::user()->account, $request->serializer); + $data = $this->createItem($taxRate, $transformer, 'tax_rates'); + + return $this->response($data); + } +} diff --git a/app/Http/Controllers/TaxRateController.php b/app/Http/Controllers/TaxRateController.php index 85d3c7903383..acda2602a4d0 100644 --- a/app/Http/Controllers/TaxRateController.php +++ b/app/Http/Controllers/TaxRateController.php @@ -13,16 +13,22 @@ use Redirect; use App\Models\TaxRate; use App\Services\TaxRateService; +use App\Ninja\Repositories\TaxRateRepository; + +use App\Http\Requests\CreateTaxRateRequest; +use App\Http\Requests\UpdateTaxRateRequest; class TaxRateController extends BaseController { protected $taxRateService; + protected $taxRateRepo; - public function __construct(TaxRateService $taxRateService) + public function __construct(TaxRateService $taxRateService, TaxRateRepository $taxRateRepo) { parent::__construct(); $this->taxRateService = $taxRateService; + $this->taxRateRepo = $taxRateRepo; } public function index() @@ -59,34 +65,25 @@ class TaxRateController extends BaseController return View::make('accounts.tax_rate', $data); } - public function store() + public function store(CreateTaxRateRequest $request) { - return $this->save(); - } - - public function update($publicId) - { - return $this->save($publicId); - } - - private function save($publicId = false) - { - if ($publicId) { - $taxRate = TaxRate::scope($publicId)->firstOrFail(); - } else { - $taxRate = TaxRate::createNew(); - } - - $taxRate->name = trim(Input::get('name')); - $taxRate->rate = Utils::parseFloat(Input::get('rate')); - $taxRate->save(); - - $message = $publicId ? trans('texts.updated_tax_rate') : trans('texts.created_tax_rate'); - Session::flash('message', $message); + $this->taxRateRepo->save($request->input()); + Session::flash('message', trans('texts.created_tax_rate')); return Redirect::to('settings/' . ACCOUNT_TAX_RATES); } + public function update(UpdateTaxRateRequest $request, $publicId) + { + $taxRate = TaxRate::scope($publicId)->firstOrFail(); + + $this->taxRateRepo->save($request->input(), $taxRate); + + Session::flash('message', trans('texts.updated_tax_rate')); + return Redirect::to('settings/' . ACCOUNT_TAX_RATES); + } + + public function bulk() { $action = Input::get('bulk_action'); diff --git a/app/Http/Requests/CreateTaxRateRequest.php b/app/Http/Requests/CreateTaxRateRequest.php new file mode 100644 index 000000000000..bcf1ad1115b7 --- /dev/null +++ b/app/Http/Requests/CreateTaxRateRequest.php @@ -0,0 +1,31 @@ + 'required', + 'rate' => 'required', + ]; + } +} diff --git a/app/Http/Requests/UpdateTaxRateRequest.php b/app/Http/Requests/UpdateTaxRateRequest.php new file mode 100644 index 000000000000..6e562ac0d0ab --- /dev/null +++ b/app/Http/Requests/UpdateTaxRateRequest.php @@ -0,0 +1,31 @@ + 'required', + 'rate' => 'required', + ]; + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index a314fa07dab5..362441a4a52b 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -232,9 +232,9 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::resource('tasks', 'TaskApiController'); Route::post('hooks', 'IntegrationController@subscribe'); Route::post('email_invoice', 'InvoiceApiController@emailInvoice'); - Route::post('email_invoicev2', 'InvoiceApiController@emailInvoicev2'); - Route::get('user_accounts','AccountApiController@getUserAccounts'); + Route::get('user_accounts', 'AccountApiController@getUserAccounts'); Route::resource('products', 'ProductApiController'); + Route::resource('tax_rates', 'TaxRateApiController'); // Vendor Route::resource('vendors', 'VendorApiController'); diff --git a/app/Models/Account.php b/app/Models/Account.php index 7893267a348b..f847193ef652 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -37,6 +37,12 @@ class Account extends Eloquent 'size_id', 'industry_id', 'email_footer', + 'timezone_id', + 'date_format_id', + 'datetime_format_id', + 'currency_id', + 'language_id', + 'military_time', ]; public static $basicSettings = [ diff --git a/app/Models/TaxRate.php b/app/Models/TaxRate.php index 751cdb3205b2..7adf6f768b5f 100644 --- a/app/Models/TaxRate.php +++ b/app/Models/TaxRate.php @@ -7,6 +7,11 @@ class TaxRate extends EntityModel use SoftDeletes; protected $dates = ['deleted_at']; + protected $fillable = [ + 'name', + 'rate' + ]; + public function getEntityType() { return ENTITY_TAX_RATE; diff --git a/app/Ninja/Repositories/TaxRateRepository.php b/app/Ninja/Repositories/TaxRateRepository.php index 1b9fa8df773b..2e325100a016 100644 --- a/app/Ninja/Repositories/TaxRateRepository.php +++ b/app/Ninja/Repositories/TaxRateRepository.php @@ -20,6 +20,22 @@ class TaxRateRepository extends BaseRepository ->select('tax_rates.public_id', 'tax_rates.name', 'tax_rates.rate', 'tax_rates.deleted_at'); } + public function save($data, $taxRate = false) + { + if ( ! $taxRate) { + if (isset($data['public_id'])) { + $taxRate = TaxRate::scope($data['public_id'])->firstOrFail(); + } else { + $taxRate = TaxRate::createNew(); + } + } + + $taxRate->fill($data); + $taxRate->save(); + + return $taxRate; + } + /* public function save($taxRates) { diff --git a/tests/acceptance/APICest.php b/tests/acceptance/APICest.php index 53981b9cb256..0260ac75056f 100644 --- a/tests/acceptance/APICest.php +++ b/tests/acceptance/APICest.php @@ -64,6 +64,12 @@ class APICest $this->createEntity('payment', $data); $this->listEntities('payment'); + $data = new stdClass; + $data->name = $this->faker->word; + $data->rate = $this->faker->numberBetween(1, 10); + $this->createEntity('tax_rate', $data); + $this->listEntities('tax_rate'); + $this->listEntities('account'); } From a584973eeaed58b3fb080fb918de710cf9652284 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 20:59:07 +0200 Subject: [PATCH 72/99] Adding https suggestion --- app/Http/Controllers/AccountGatewayController.php | 4 ++++ app/Http/Middleware/StartupCheck.php | 2 +- resources/lang/en/texts.php | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/AccountGatewayController.php b/app/Http/Controllers/AccountGatewayController.php index 5fc4d55c1a52..691e01c46990 100644 --- a/app/Http/Controllers/AccountGatewayController.php +++ b/app/Http/Controllers/AccountGatewayController.php @@ -89,6 +89,10 @@ class AccountGatewayController extends BaseController ->orderBy('name')->get(); $data['hiddenFields'] = Gateway::$hiddenFields; + if ( ! \Request::secure() && ! Utils::isNinjaDev()) { + Session::flash('warning', trans('texts.enable_https')); + } + return View::make('accounts.account_gateway', $data); } diff --git a/app/Http/Middleware/StartupCheck.php b/app/Http/Middleware/StartupCheck.php index 264c485e617f..bfda7bcb4916 100644 --- a/app/Http/Middleware/StartupCheck.php +++ b/app/Http/Middleware/StartupCheck.php @@ -35,7 +35,7 @@ class StartupCheck // Ensure all request are over HTTPS in production if (Utils::requireHTTPS() && !Request::secure()) { - //return Redirect::secure(Request::path()); + return Redirect::secure(Request::path()); } // If the database doens't yet exist we'll skip the rest diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 76781a31b717..47524743b630 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1141,5 +1141,6 @@ return array( 'all_pages_header' => 'Show header on', 'all_pages_footer' => 'Show footer on', 'invoice_currency' => 'Invoice Currency', + 'enable_https' => 'We strongly recommend using HTTPS to accept payments online.' ); From cc49415a7830b860ca4ecc2976ed572b20c69262 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 22:10:09 +0200 Subject: [PATCH 73/99] Added invoiceDate as email template variable --- app/Ninja/Mailers/ContactMailer.php | 6 ++++-- resources/lang/en/texts.php | 3 ++- resources/views/accounts/templates_and_reminders.blade.php | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Ninja/Mailers/ContactMailer.php b/app/Ninja/Mailers/ContactMailer.php index 5e75a81120ad..3c715c6f2d61 100644 --- a/app/Ninja/Mailers/ContactMailer.php +++ b/app/Ninja/Mailers/ContactMailer.php @@ -19,13 +19,14 @@ class ContactMailer extends Mailer public static $variableFields = [ 'footer', 'account', + 'dueDate', + 'invoiceDate', 'client', 'amount', 'contact', 'firstName', 'invoice', 'quote', - 'dueDate', 'viewLink', 'viewButton', 'paymentLink', @@ -234,13 +235,14 @@ class ContactMailer extends Mailer '$footer' => $account->getEmailFooter(), '$client' => $client->getDisplayName(), '$account' => $account->getDisplayName(), + '$dueDate' => $account->formatDate($invoice->due_date), + '$invoiceDate' => $account->formatDate($invoice->invoice_date), '$contact' => $invitation->contact->getDisplayName(), '$firstName' => $invitation->contact->first_name, '$amount' => $account->formatMoney($data['amount'], $client), '$invoice' => $invoice->invoice_number, '$quote' => $invoice->invoice_number, '$link' => $invitation->getLink(), - '$dueDate' => $account->formatDate($invoice->due_date), '$viewLink' => $invitation->getLink(), '$viewButton' => HTML::emailViewButton($invitation->getLink(), $invoice->getEntityType()), '$paymentLink' => $invitation->getLink('payment'), diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 47524743b630..6c933cd63bda 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1141,6 +1141,7 @@ return array( 'all_pages_header' => 'Show header on', 'all_pages_footer' => 'Show footer on', 'invoice_currency' => 'Invoice Currency', - 'enable_https' => 'We strongly recommend using HTTPS to accept payments online.' + 'enable_https' => 'We strongly recommend using HTTPS to accept credit card details online.', + ); diff --git a/resources/views/accounts/templates_and_reminders.blade.php b/resources/views/accounts/templates_and_reminders.blade.php index 6b88ab70f9be..2794a5b2e0f8 100644 --- a/resources/views/accounts/templates_and_reminders.blade.php +++ b/resources/views/accounts/templates_and_reminders.blade.php @@ -203,13 +203,14 @@ var vals = [ {!! json_encode($emailFooter) !!}, "{{ $account->getDisplayName() }}", + "{{ $account->formatDate($account->getDateTime()) }}", + "{{ $account->formatDate($account->getDateTime()) }}", "Client Name", formatMoney(100), "Contact Name", "First Name", "0001", "0001", - "{{ $account->formatDate($account->getDateTime()) }}", "{{ URL::to('/view/...') }}", '{!! HTML::flatButton('view_invoice', '#0b4d78') !!}', "{{ URL::to('/payment/...') }}", From 25b8c54355c362701743699fe4696f2a0b5252df Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 22:19:15 +0200 Subject: [PATCH 74/99] Bug: fix 'Invoice issued to' in business design for quote --- app/Models/Account.php | 1 + public/built.js | 4 ++-- public/js/pdf.pdfmake.js | 4 ++-- resources/lang/en/texts.php | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Models/Account.php b/app/Models/Account.php index f847193ef652..8b10c90dfa36 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -646,6 +646,7 @@ class Account extends Eloquent 'quote_number', 'total', 'invoice_issued_to', + 'quote_issued_to', //'date', 'rate', 'hours', diff --git a/public/built.js b/public/built.js index a9d6cdca45d6..417e368dcb15 100644 --- a/public/built.js +++ b/public/built.js @@ -31100,8 +31100,8 @@ NINJA.decodeJavascript = function(invoice, javascript) if (match.indexOf('?') < 0 || value) { if (invoice.partial && field == 'balance_due') { field = 'amount_due'; - } else if (invoice.is_quote && field == 'your_invoice') { - field = 'your_quote'; + } else if (invoice.is_quote) { + field = field.replace('invoice', 'quote'); } var label = invoiceLabels[field]; if (match.indexOf('UC') >= 0) { diff --git a/public/js/pdf.pdfmake.js b/public/js/pdf.pdfmake.js index 5524fc3f75c7..64eb33811baf 100644 --- a/public/js/pdf.pdfmake.js +++ b/public/js/pdf.pdfmake.js @@ -191,8 +191,8 @@ NINJA.decodeJavascript = function(invoice, javascript) if (match.indexOf('?') < 0 || value) { if (invoice.partial && field == 'balance_due') { field = 'amount_due'; - } else if (invoice.is_quote && field == 'your_invoice') { - field = 'your_quote'; + } else if (invoice.is_quote) { + field = field.replace('invoice', 'quote'); } var label = invoiceLabels[field]; if (match.indexOf('UC') >= 0) { diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 6c933cd63bda..6f209543322c 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1142,6 +1142,6 @@ return array( 'all_pages_footer' => 'Show footer on', 'invoice_currency' => 'Invoice Currency', 'enable_https' => 'We strongly recommend using HTTPS to accept credit card details online.', - + 'quote_issued_to' => 'Quote issued to', ); From 1f105b456fd1abf4a54b28173b14e9892627eb6d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 22:33:29 +0200 Subject: [PATCH 75/99] Fixed dashboard fomatting when using multiple currencies --- resources/views/dashboard.blade.php | 81 ++++++++++++++++------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 56f9690610ec..d36c8334cc2a 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -7,18 +7,21 @@
- -
- {{ trans('texts.total_revenue') }} -
-
- @if (count($paidToDate)) - @foreach ($paidToDate as $item) - {{ Utils::formatMoney($item->value, $item->currency_id) }}
- @endforeach - @else - {{ Utils::formatMoney(0) }} - @endif + +
+
+ {{ trans('texts.total_revenue') }} +
+
+ @if (count($paidToDate)) + @foreach ($paidToDate as $item) + {{ Utils::formatMoney($item->value, $item->currency_id) }}
+ @endforeach + @else + {{ Utils::formatMoney(0) }} + @endif +
@@ -26,18 +29,21 @@
- -
- {{ trans('texts.average_invoice') }} -
-
- @if (count($averageInvoice)) - @foreach ($averageInvoice as $item) - {{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}
- @endforeach - @else - {{ Utils::formatMoney(0) }} - @endif + +
+
+ {{ trans('texts.average_invoice') }} +
+
+ @if (count($averageInvoice)) + @foreach ($averageInvoice as $item) + {{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}
+ @endforeach + @else + {{ Utils::formatMoney(0) }} + @endif +
@@ -45,18 +51,21 @@
- -
- {{ trans('texts.outstanding') }} -
-
- @if (count($balances)) - @foreach ($balances as $item) - {{ Utils::formatMoney($item->value, $item->currency_id) }}
- @endforeach - @else - {{ Utils::formatMoney(0) }} - @endif + +
+
+ {{ trans('texts.outstanding') }} +
+
+ @if (count($balances)) + @foreach ($balances as $item) + {{ Utils::formatMoney($item->value, $item->currency_id) }}
+ @endforeach + @else + {{ Utils::formatMoney(0) }} + @endif +
From 0ce9e426d9617b0927ef6a455a0c067668fc3522 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 22:45:39 +0200 Subject: [PATCH 76/99] Hid 'test email' button until issue updating connection info is resolved --- app/Http/Controllers/AppController.php | 6 +++--- resources/views/partials/system_settings.blade.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/AppController.php b/app/Http/Controllers/AppController.php index 2ff91cb1bb60..0ec584aaf05c 100644 --- a/app/Http/Controllers/AppController.php +++ b/app/Http/Controllers/AppController.php @@ -206,15 +206,15 @@ class AppController extends BaseController Config::set('mail.from.address', $email); Config::set('mail.from.name', $fromName); - + $data = [ 'text' => 'Test email', ]; try { - $this->mailer->sendTo($email, $email, $fromName, 'Test email', 'contact', $data); + $response = $this->mailer->sendTo($email, $email, $fromName, 'Test email', 'contact', $data); - return 'Sent'; + return $response === true ? 'Sent' : $response; } catch (Exception $e) { return $e->getMessage(); } diff --git a/resources/views/partials/system_settings.blade.php b/resources/views/partials/system_settings.blade.php index c508ba0ee896..a16ef5d24dae 100644 --- a/resources/views/partials/system_settings.blade.php +++ b/resources/views/partials/system_settings.blade.php @@ -48,7 +48,7 @@ ->value(isset($_ENV['MAIL_USERNAME']) ? $_ENV['MAIL_USERNAME'] : '') !!} {!! Former::password('mail[password]')->label('Password') ->value(isset($_ENV['MAIL_PASSWORD']) ? $_ENV['MAIL_PASSWORD'] : '') !!} - {!! Former::actions( Button::primary('Send test email')->small()->withAttributes(['onclick' => 'testMail()']), '  ' ) !!} + {{-- Former::actions( Button::primary('Send test email')->small()->withAttributes(['onclick' => 'testMail()']), '  ' ) --}}
@endif From 5f709f76a80abc84464e69294d1329771bf6ba4b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 3 Feb 2016 22:53:18 +0200 Subject: [PATCH 77/99] Bug fix: notification emails have the wrong entity type --- app/Ninja/Mailers/UserMailer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Ninja/Mailers/UserMailer.php b/app/Ninja/Mailers/UserMailer.php index ce0c5383410d..b08d50d7838f 100644 --- a/app/Ninja/Mailers/UserMailer.php +++ b/app/Ninja/Mailers/UserMailer.php @@ -40,8 +40,8 @@ class UserMailer extends Mailer return; } - $entityType = $notificationType == 'approved' ? ENTITY_QUOTE : ENTITY_INVOICE; - $view = "{$entityType}_{$notificationType}"; + $entityType = $invoice->getEntityType(); + $view = ($notificationType == 'approved' ? ENTITY_QUOTE : ENTITY_INVOICE) . "_{$notificationType}"; $account = $user->account; $client = $invoice->client; From e5138120d9fae0d5a332230e6ad9b055e8555feb Mon Sep 17 00:00:00 2001 From: ridgarou Date: Thu, 4 Feb 2016 10:39:00 +0100 Subject: [PATCH 78/99] Update new texts translations --- resources/lang/es_ES/texts.php | 201 ++++++++++++++++----------------- 1 file changed, 100 insertions(+), 101 deletions(-) diff --git a/resources/lang/es_ES/texts.php b/resources/lang/es_ES/texts.php index c7ff90968f51..11cd0fddb32a 100644 --- a/resources/lang/es_ES/texts.php +++ b/resources/lang/es_ES/texts.php @@ -987,128 +987,127 @@ return array( 'email_designs' => 'Diseños de correo', 'assigned_when_sent' => 'Asignado al enviar', - 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', - 'white_label_purchase_link' => 'Purchase a white label license', + 'white_label_custom_css' => ':link para $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', + 'white_label_purchase_link' => 'Comprar licencia de marca blanca', // Expense / vendor - 'expense' => 'Expense', - 'expenses' => 'Expenses', - 'new_expense' => 'Enter Expense', - 'enter_expense' => 'Enter Expense', - 'vendors' => 'Vendors', - 'new_vendor' => 'New Vendor', + 'expense' => 'Gasto', + 'expenses' => 'Gastos', + 'new_expense' => 'Nuevo Gasto', + 'enter_expense' => 'Introducir Gasto', + 'vendors' => 'Proveedor', + 'new_vendor' => 'Nuevo Proveedor', 'payment_terms_net' => 'Net', - 'vendor' => 'Vendor', - 'edit_vendor' => 'Edit Vendor', - 'archive_vendor' => 'Archive Vendor', - 'delete_vendor' => 'Delete Vendor', - 'view_vendor' => 'View Vendor', - 'deleted_expense' => 'Successfully deleted expense', - 'archived_expense' => 'Successfully archived expense', - 'deleted_expenses' => 'Successfully deleted expenses', - 'archived_expenses' => 'Successfully archived expenses', + 'vendor' => 'Proveedor', + 'edit_vendor' => 'Editar Proveedor', + 'archive_vendor' => 'Archivar Proveedor', + 'delete_vendor' => 'Borrar Proveedor', + 'view_vendor' => 'Ver Proveedor', + 'deleted_expense' => 'Gasto borrado correctamente', + 'archived_expense' => 'Gasto archivado correctamente', + 'deleted_expenses' => 'Gastos borrados correctamente', + 'archived_expenses' => 'Gastos archivados correctamente', // Expenses - 'expense_amount' => 'Expense Amount', - 'expense_balance' => 'Expense Balance', - 'expense_date' => 'Expense Date', - 'expense_should_be_invoiced' => 'Should this expense be invoiced?', - 'public_notes' => 'Public Notes', - 'invoice_amount' => 'Invoice Amount', - 'exchange_rate' => 'Exchange Rate', - 'yes' => 'Yes', + 'expense_amount' => 'Importe del Gasto', + 'expense_balance' => 'Saldo del Gasto', + 'expense_date' => 'Fecha del Gasto', + 'expense_should_be_invoiced' => '¿Este gasto debe ser facturado?', + 'public_notes' => 'Notas', + 'invoice_amount' => 'Importe de Factura', + 'exchange_rate' => 'Tipo de Cambio', + 'yes' => 'Si', 'no' => 'No', - 'should_be_invoiced' => 'Should be invoiced', - 'view_expense' => 'View expense # :expense', - 'edit_expense' => 'Edit Expense', - 'archive_expense' => 'Archive Expense', - 'delete_expense' => 'Delete Expense', - 'view_expense_num' => 'Expense # :expense', - 'updated_expense' => 'Successfully updated expense', - 'created_expense' => 'Successfully created expense', - 'enter_expense' => 'Enter Expense', - 'view' => 'View', - 'restore_expense' => 'Restore Expense', - 'invoice_expense' => 'Invoice Expense', - 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', - 'expense_error_invoiced' => 'Expense has already been invoiced', - 'convert_currency' => 'Convert currency', + 'should_be_invoiced' => 'Debe ser Facturado', + 'view_expense' => 'Ver gasto # :expense', + 'edit_expense' => 'Editar Gasto', + 'archive_expense' => 'Archivar Gasto', + 'delete_expense' => 'Borrar Gasto', + 'view_expense_num' => 'Gasto # :expense', + 'updated_expense' => 'Gasto actualizado correctamente', + 'created_expense' => 'Gasto creado correctamente', + 'enter_expense' => 'Introducir Gasto', + 'view' => 'Ver', + 'restore_expense' => 'Restaurar Gasto', + 'invoice_expense' => 'Gasto factura', + 'expense_error_multiple_clients' => 'Los gastos no pertenecen a diferentes clientes', + 'expense_error_invoiced' => 'El gasto ya ha sido Facturado', + 'convert_currency' => 'Convertir moneda', // Payment terms - 'num_days' => 'Number of days', - 'create_payment_term' => 'Create Payment Term', - 'edit_payment_terms' => 'Edit Payment Term', - 'edit_payment_term' => 'Edit Payment Term', - 'archive_payment_term' => 'Archive Payment Term', + 'num_days' => 'Número de días', + 'create_payment_term' => 'Crear Término de Pago', + 'edit_payment_terms' => 'Editar los Términos de Pago', + 'edit_payment_term' => 'Editar el Término de Pago', + 'archive_payment_term' => 'Archivar Término de Pago', // recurring due dates - 'recurring_due_dates' => 'Recurring Invoice Due Dates', - 'recurring_due_date_help' => '

Automatically sets a due date for the invoice.

-

Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.

-

Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.

-

For example:

+ 'recurring_due_dates' => 'Fecha de Vencimiento de Factura Periodica', + 'recurring_due_date_help' => '

Define automáticamente una fecha de vencimiento de la factura..

+

Facturas en un ciclo mensual o anual preparadas para vencer el día que se crearon o antes, vencerán al siguiente mes. Facturas preparadas para vencer el 29 o el 30, en los meses que no tienen ese día, vencerán el último día del mes

+

(Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.)

+

Facturas en un ciclo semanal preparadas para vencer el día de la semana que se crearon, vencerán a la siguiente semana.

+

(Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.)

+

Por ejemplo:

    -
  • Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.
  • -
  • Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. -
  • -
  • Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of next month. -
  • -
  • Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today. -
  • +
  • Hoy es día 15, la fecha de vencimiento es el día 1 de cada mes. La fecha de vencimiento deberá ser el día 1 del siguiente mes.
  • +
  • Hoy es día 15, la fecha de vencimiento es el último día de cada mes. La fecha de vencimiento deberá ser el último día de este mes.
  • +
  • Hoy es día 15, la fecha de vencimiento es el día 15 de cada mes. La fecha de vencimiento deberá ser el día 15 del siguiente mes.
  • +
  • Hoy es Viernes, la fecha de vencimiento es Viernes. La fecha de vencimiento deberá ser el siguiente Viernes, no hoy.
', - 'due' => 'Due', - 'next_due_on' => 'Due Next: :date', - 'use_client_terms' => 'Use client terms', - 'day_of_month' => ':ordinal day of month', - 'last_day_of_month' => 'Last day of month', - 'day_of_week_after' => ':ordinal :day after', - 'sunday' => 'Sunday', - 'monday' => 'Monday', - 'tuesday' => 'Tuesday', - 'wednesday' => 'Wednesday', - 'thursday' => 'Thursday', - 'friday' => 'Friday', - 'saturday' => 'Saturday', + 'due' => 'Vencimiento', + 'next_due_on' => 'Próximo Vencimiento: :date', + 'use_client_terms' => 'Utilizar términos del cliente', + 'day_of_month' => ':ordinal día del mes', + 'last_day_of_month' => 'Último día del mes', + 'day_of_week_after' => ':ordinal :day despues', + 'sunday' => 'Domingo', + 'monday' => 'Lunes', + 'tuesday' => 'Martes', + 'wednesday' => 'Miercoles', + 'thursday' => 'Jueves', + 'friday' => 'Viernes', + 'saturday' => 'Sabado', // Fonts - 'header_font_id' => 'Header Font', - 'body_font_id' => 'Body Font', - 'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.', + 'header_font_id' => 'Tipo de letra de la cabecera', + 'body_font_id' => 'Tipo de letra del cuerpo', + 'color_font_help' => 'Nota: el color primario y las fuentes también se utilizan en el portal del cliente y los diseños de correo electrónico personalizados.', 'live_preview' => 'Live Preview', - 'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.', + 'invalid_mail_config' => 'Imposible enviar el correo, por favor, comprobar que la configuración de correo es correcta..', - 'invoice_message_button' => 'To view your invoice for :amount, click the button below.', - 'quote_message_button' => 'To view your quote for :amount, click the button below.', - 'payment_message_button' => 'Thank you for your payment of :amount.', - 'payment_type_direct_debit' => 'Direct Debit', - 'bank_accounts' => 'Bank Accounts', - 'add_bank_account' => 'Add Bank Account', - 'setup_account' => 'Setup Account', - 'import_expenses' => 'Import Expenses', - 'bank_id' => 'bank', - 'integration_type' => 'Integration Type', - 'updated_bank_account' => 'Successfully updated bank account', - 'edit_bank_account' => 'Edit Bank Account', - 'archive_bank_account' => 'Archive Bank Account', - 'archived_bank_account' => 'Successfully archived bank account', - 'created_bank_account' => 'Successfully created bank account', - 'validate_bank_account' => 'Validate Bank Account', + 'invoice_message_button' => 'Para ver su factura con importe :amount, pulse el siguiente botón.', + 'quote_message_button' => 'Para ver su presupuesto con importe :amount, pulse el siguiente botón.', + 'payment_message_button' => 'Gracias por su pago de :amount.', + 'payment_type_direct_debit' => 'Débito directo', + 'bank_accounts' => 'Cuentas Bancarias', + 'add_bank_account' => 'Añadir Cuenta Bancaria', + 'setup_account' => 'Configurar Cuenta', + 'import_expenses' => 'Importar Gastos', + 'bank_id' => 'banco', + 'integration_type' => 'Tipo de Integración', + 'updated_bank_account' => 'Cuenta Bancaria actualizada correctamente', + 'edit_bank_account' => 'Editar Cuenta Bancaria', + 'archive_bank_account' => 'Archivar Cuenta Bancaria', + 'archived_bank_account' => 'Cuenta Bancaria archivada correctamente', + 'created_bank_account' => 'Cuenta Bancaria creada correctamente', + 'validate_bank_account' => 'Validar Cuenta Bancaria', 'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and 400+ US banks.', 'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.', 'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.', - 'username' => 'Username', - 'account_number' => 'Account Number', - 'account_name' => 'Account Name', - 'bank_account_error' => 'Failed to retreive account details, please check your credentials.', - 'status_approved' => 'Approved', - 'quote_settings' => 'Quote Settings', - 'auto_convert_quote' => 'Auto convert quote', - 'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.', - 'validate' => 'Validate', + 'username' => 'Usuario', + 'account_number' => 'Número de Cuenta', + 'account_name' => 'Nombre de Cuenta', + 'bank_account_error' => 'Error al recuperar los detalles de la cuenta, por favor revisa tus credenciales.', + 'status_approved' => 'Aprobado', + 'quote_settings' => 'Configuración de Presupuestos', + 'auto_convert_quote' => 'Auto convertir presupuesto', + 'auto_convert_quote_help' => 'Convierte un presupuesto en factura automaticamente cuando los aprueba el cliente.', + 'validate' => 'Validar', 'info' => 'Info', - 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', + 'imported_expenses' => ' :count_vendors proveedor(es) and :count_expenses gasto(s) importados correctamente', - 'iframe_url_help3' => 'Note: if you plan on accepting credit cards we strongly recommend having HTTPS enabled on your site.', + 'iframe_url_help3' => 'Nota: Si piensas aceptar tarjetas de credito recomendamos tener habilitado HTTPS.', ); From 2b3e35687ae3c697620d9d3082b7870baf99d17a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 16:12:22 +0200 Subject: [PATCH 79/99] Bug fixes --- app/Http/Controllers/AccountController.php | 5 +++-- app/Http/Controllers/AppController.php | 2 +- app/Http/Requests/CreateVendorRequest.php | 4 +++- app/Http/Requests/UpdateVendorRequest.php | 2 +- resources/lang/en/texts.php | 2 +- resources/views/accounts/email_settings.blade.php | 2 +- resources/views/vendors/edit.blade.php | 7 ++++--- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 454b9d357c58..8d8c829920fa 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -613,11 +613,12 @@ class AccountController extends BaseController $iframeURL = rtrim($iframeURL, "/"); $subdomain = preg_replace('/[^a-zA-Z0-9_\-\.]/', '', substr(strtolower(Input::get('subdomain')), 0, MAX_SUBDOMAIN_LENGTH)); - if ($iframeURL || !$subdomain || in_array($subdomain, ['www', 'app', 'mail', 'admin', 'blog', 'user', 'contact', 'payment', 'payments', 'billing', 'invoice', 'business', 'owner'])) { + if ($iframeURL) { $subdomain = null; } if ($subdomain) { - $rules['subdomain'] = "unique:accounts,subdomain,{$user->account_id},id"; + $exclude = ['www', 'app', 'mail', 'admin', 'blog', 'user', 'contact', 'payment', 'payments', 'billing', 'invoice', 'business', 'owner', 'info', 'ninja']; + $rules['subdomain'] = "unique:accounts,subdomain,{$user->account_id},id|not_in:" . implode(',', $exclude); } $validator = Validator::make(Input::all(), $rules); diff --git a/app/Http/Controllers/AppController.php b/app/Http/Controllers/AppController.php index 0ec584aaf05c..606374a0d5de 100644 --- a/app/Http/Controllers/AppController.php +++ b/app/Http/Controllers/AppController.php @@ -245,7 +245,6 @@ class AppController extends BaseController set_time_limit(60 * 5); Cache::flush(); Session::flush(); - Artisan::call('optimize', array('--force' => true)); Artisan::call('migrate', array('--force' => true)); foreach ([ 'PaymentLibraries', @@ -255,6 +254,7 @@ class AppController extends BaseController ] as $seeder) { Artisan::call('db:seed', array('--force' => true, '--class' => "{$seeder}Seeder")); } + Artisan::call('optimize', array('--force' => true)); Event::fire(new UserSettingsChanged()); Session::flash('message', trans('texts.processed_updates')); } catch (Exception $e) { diff --git a/app/Http/Requests/CreateVendorRequest.php b/app/Http/Requests/CreateVendorRequest.php index 7186077fc666..d901f9e481c8 100644 --- a/app/Http/Requests/CreateVendorRequest.php +++ b/app/Http/Requests/CreateVendorRequest.php @@ -23,10 +23,11 @@ class CreateVendorRequest extends Request public function rules() { return [ - 'vendorcontacts' => 'valid_contacts', + 'name' => 'required', ]; } + /* public function validator($factory) { // support submiting the form with a single contact record @@ -41,4 +42,5 @@ class CreateVendorRequest extends Request $this->input(), $this->container->call([$this, 'rules']), $this->messages() ); } + */ } diff --git a/app/Http/Requests/UpdateVendorRequest.php b/app/Http/Requests/UpdateVendorRequest.php index 568166735d8c..6e17b79bf12b 100644 --- a/app/Http/Requests/UpdateVendorRequest.php +++ b/app/Http/Requests/UpdateVendorRequest.php @@ -23,7 +23,7 @@ class UpdateVendorRequest extends Request public function rules() { return [ - 'vendor_contacts' => 'valid_contacts', + 'name' => 'required', ]; } } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 6f209543322c..89684f78ec03 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1130,7 +1130,7 @@ return array( 'info' => 'Info', 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', - 'iframe_url_help3' => 'Note: if you plan on accepting credit cards we strongly recommend having HTTPS enabled on your site.', + 'iframe_url_help3' => 'Note: if you plan on accepting credit cards details we strongly recommend enabling HTTPS on your site.', 'expense_error_multiple_currencies' => 'The expenses can\'t have different currencies.', 'expense_error_mismatch_currencies' => 'The client\'s currency does not match the expense currency.', 'trello_roadmap' => 'Trello Roadmap', diff --git a/resources/views/accounts/email_settings.blade.php b/resources/views/accounts/email_settings.blade.php index 348f51a792d6..91f70886a9fa 100644 --- a/resources/views/accounts/email_settings.blade.php +++ b/resources/views/accounts/email_settings.blade.php @@ -100,7 +100,7 @@
From db4ec4fb62e84d3552a03097cb2d19b680f8d866 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 20:36:39 +0200 Subject: [PATCH 81/99] Added statust to client view page --- app/Http/Controllers/TaskController.php | 1 + app/Ninja/Presenters/ClientPresenter.php | 19 +++++++ app/Ninja/Presenters/TaskPresenter.php | 19 +++++++ app/Providers/AppServiceProvider.php | 7 ++- resources/views/clients/show.blade.php | 65 ++++++++++++++---------- resources/views/header.blade.php | 2 +- 6 files changed, 84 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index fc822df5d124..735689064a41 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -145,6 +145,7 @@ class TaskController extends BaseController 'actions' => $actions, 'timezone' => Auth::user()->account->timezone ? Auth::user()->account->timezone->name : DEFAULT_TIMEZONE, 'datetimeFormat' => Auth::user()->account->getMomentDateTimeFormat(), + //'entityStatus' => $task->present()->status, ]; $data = array_merge($data, self::getViewModel()); diff --git a/app/Ninja/Presenters/ClientPresenter.php b/app/Ninja/Presenters/ClientPresenter.php index bb6e7db0657b..97551185d514 100644 --- a/app/Ninja/Presenters/ClientPresenter.php +++ b/app/Ninja/Presenters/ClientPresenter.php @@ -9,4 +9,23 @@ class ClientPresenter extends Presenter { { return $this->entity->country ? $this->entity->country->name : ''; } + + public function status() + { + $class = $text = ''; + + if ($this->entity->is_deleted) { + $class = 'danger'; + $text = trans('texts.deleted'); + } elseif ($this->entity->trashed()) { + $class = 'warning'; + $text = trans('texts.archived'); + } else { + $class = 'success'; + $text = trans('texts.active'); + } + + return "{$text}"; + + } } \ No newline at end of file diff --git a/app/Ninja/Presenters/TaskPresenter.php b/app/Ninja/Presenters/TaskPresenter.php index 09b860a1a2bc..367e849ca797 100644 --- a/app/Ninja/Presenters/TaskPresenter.php +++ b/app/Ninja/Presenters/TaskPresenter.php @@ -36,4 +36,23 @@ class TaskPresenter extends Presenter { return implode("\n", $times); } + + public function status() + { + $class = $text = ''; + + if ($this->entity->is_deleted) { + $class = 'danger'; + $text = trans('texts.deleted'); + } elseif ($this->entity->trashed()) { + $class = 'warning'; + $text = trans('texts.archived'); + } else { + $class = 'success'; + $text = trans('texts.active'); + } + + return "{$text}"; + } + } \ No newline at end of file diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index a094b01a6079..c9b163f109a0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -93,7 +93,7 @@ class AppServiceProvider extends ServiceProvider { ->render(); }); - HTML::macro('breadcrumbs', function() { + HTML::macro('breadcrumbs', function($status = false) { $str = ''; }); diff --git a/resources/views/clients/show.blade.php b/resources/views/clients/show.blade.php index 06b0e7774abb..e4209fdd39ee 100644 --- a/resources/views/clients/show.blade.php +++ b/resources/views/clients/show.blade.php @@ -21,43 +21,54 @@ @section('content') -
- {!! Former::open('clients/bulk')->addClass('mainForm') !!} -
- {!! Former::text('action') !!} - {!! Former::text('public_id')->value($client->public_id) !!} -
+
+
+
+ {{ $client->getDisplayName() }} + @if ($client->trashed()) +   {!! $client->present()->status !!} + @endif +
+
+
+
+ {!! Former::open('clients/bulk')->addClass('mainForm') !!} +
+ {!! Former::text('action') !!} + {!! Former::text('public_id')->value($client->public_id) !!} +
- @if ($gatewayLink) - {!! Button::normal(trans('texts.view_in_stripe'))->asLinkTo($gatewayLink)->withAttributes(['target' => '_blank']) !!} - @endif + @if ($gatewayLink) + {!! Button::normal(trans('texts.view_in_stripe'))->asLinkTo($gatewayLink)->withAttributes(['target' => '_blank']) !!} + @endif - @if ($client->trashed()) - {!! Button::primary(trans('texts.restore_client'))->withAttributes(['onclick' => 'onRestoreClick()']) !!} - @else - {!! DropdownButton::normal(trans('texts.edit_client')) - ->withAttributes(['class'=>'normalDropDown']) - ->withContents([ - ['label' => trans('texts.archive_client'), 'url' => "javascript:onArchiveClick()"], - ['label' => trans('texts.delete_client'), 'url' => "javascript:onDeleteClick()"], - ] - )->split() !!} + @if ($client->trashed()) + {!! Button::primary(trans('texts.restore_client'))->withAttributes(['onclick' => 'onRestoreClick()']) !!} + @else + {!! DropdownButton::normal(trans('texts.edit_client')) + ->withAttributes(['class'=>'normalDropDown']) + ->withContents([ + ['label' => trans('texts.archive_client'), 'url' => "javascript:onArchiveClick()"], + ['label' => trans('texts.delete_client'), 'url' => "javascript:onDeleteClick()"], + ] + )->split() !!} - {!! DropdownButton::primary(trans('texts.new_invoice')) - ->withAttributes(['class'=>'primaryDropDown']) - ->withContents($actionLinks)->split() !!} - @endif - {!! Former::close() !!} + {!! DropdownButton::primary(trans('texts.new_invoice')) + ->withAttributes(['class'=>'primaryDropDown']) + ->withContents($actionLinks)->split() !!} + @endif + {!! Former::close() !!} -
+
+
+
- -

{{ $client->getDisplayName() }}

@if ($client->last_login > 0)

{{ trans('texts.last_logged_in') }} {{ Utils::timestampToDateTimeString(strtotime($client->last_login)) }}

@endif +
diff --git a/resources/views/header.blade.php b/resources/views/header.blade.php index 8e28e854fe9c..8e0945e3b7cd 100644 --- a/resources/views/header.blade.php +++ b/resources/views/header.blade.php @@ -519,7 +519,7 @@ @endif @if (!isset($showBreadcrumbs) || $showBreadcrumbs) - {!! HTML::breadcrumbs() !!} + {!! HTML::breadcrumbs(isset($entityStatus) ? $entityStatus : '') !!} @endif @yield('content') From 60a3f3ca28d091928641abcdf11b39e9b3019ff8 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 21:01:17 +0200 Subject: [PATCH 82/99] Removed duplicate recurring invoice status --- resources/views/invoices/edit.blade.php | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/resources/views/invoices/edit.blade.php b/resources/views/invoices/edit.blade.php index be87e3ba1637..d9141de42d0d 100644 --- a/resources/views/invoices/edit.blade.php +++ b/resources/views/invoices/edit.blade.php @@ -128,26 +128,6 @@ @if ($account->showCustomField('custom_invoice_text_label1', $invoice)) {!! Former::text('custom_text_value1')->label($account->custom_invoice_text_label1)->data_bind("value: custom_text_value1, valueUpdate: 'afterkeydown'") !!} - @endif - - @if ($entityType == ENTITY_INVOICE) -
-
- @if ($invoice->recurring_invoice) - {!! trans('texts.created_by_invoice', ['invoice' => link_to('/invoices/'.$invoice->recurring_invoice->public_id, trans('texts.recurring_invoice'))]) !!} - @elseif ($invoice->id) - - @if (isset($lastSent) && $lastSent) - {!! trans('texts.last_sent_on', ['date' => link_to('/invoices/'.$lastSent->public_id, $invoice->last_sent_date, ['id' => 'lastSent'])]) !!}
- @endif - @if ($invoice->is_recurring && $invoice->getNextSendDate()) - {!! trans('texts.next_send_on', ['date' => ''.$account->formatDate($invoice->getNextSendDate()). - '']) !!} - @endif -
- @endif -
-
@endif
From 88b9046ac7eb8157a2f7007375987a96e0906cd6 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 22:35:28 +0200 Subject: [PATCH 83/99] Added users to the API --- app/Http/Controllers/UserApiController.php | 76 ++++++++++++++++++++++ app/Http/Requests/UpdateUserRequest.php | 33 ++++++++++ app/Http/routes.php | 1 + app/Models/User.php | 13 +++- app/Ninja/Repositories/UserRepository.php | 9 +++ app/Ninja/Transformers/UserTransformer.php | 2 +- 6 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/UserApiController.php create mode 100644 app/Http/Requests/UpdateUserRequest.php diff --git a/app/Http/Controllers/UserApiController.php b/app/Http/Controllers/UserApiController.php new file mode 100644 index 000000000000..ee525c1dd9ae --- /dev/null +++ b/app/Http/Controllers/UserApiController.php @@ -0,0 +1,76 @@ +userService = $userService; + $this->userRepo = $userRepo; + } + + public function index() + { + $user = Auth::user(); + $users = User::whereAccountId($user->account_id)->withTrashed(); + $users = $users->paginate(); + + $paginator = User::whereAccountId($user->account_id)->withTrashed()->paginate(); + + $transformer = new UserTransformer(Auth::user()->account, $this->serializer); + $data = $this->createCollection($users, $transformer, 'users', $paginator); + + return $this->response($data); + } + + /* + public function store(CreateUserRequest $request) + { + return $this->save($request); + } + */ + + public function update(UpdateUserRequest $request, $userPublicId) + { + /* + // temporary fix for ids starting at 0 + $userPublicId -= 1; + $user = User::scope($userPublicId)->firstOrFail(); + */ + $user = Auth::user(); + + if ($request->action == ACTION_ARCHIVE) { + $this->userRepo->archive($user); + + $transformer = new UserTransformer(Auth::user()->account, $request->serializer); + $data = $this->createItem($user, $transformer, 'users'); + + return $this->response($data); + } else { + return $this->save($request, $user); + } + } + + private function save($request, $user = false) + { + $user = $this->userRepo->save($request->input(), $user); + + $transformer = new UserTransformer(\Auth::user()->account, $request->serializer); + $data = $this->createItem($user, $transformer, 'users'); + + return $this->response($data); + } +} \ No newline at end of file diff --git a/app/Http/Requests/UpdateUserRequest.php b/app/Http/Requests/UpdateUserRequest.php new file mode 100644 index 000000000000..1bbcc3d7eaea --- /dev/null +++ b/app/Http/Requests/UpdateUserRequest.php @@ -0,0 +1,33 @@ + 'email|required|unique:users,email,' . Auth::user()->id . ',id', + 'first_name' => 'required', + 'last_name' => 'required', + ]; + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index 362441a4a52b..d0e623e0bd7d 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -235,6 +235,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::get('user_accounts', 'AccountApiController@getUserAccounts'); Route::resource('products', 'ProductApiController'); Route::resource('tax_rates', 'TaxRateApiController'); + Route::resource('users', 'UserApiController'); // Vendor Route::resource('vendors', 'VendorApiController'); diff --git a/app/Models/User.php b/app/Models/User.php index 129ddb0abecd..e74d76b5f9bf 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -29,7 +29,13 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon * * @var array */ - protected $fillable = ['first_name', 'last_name', 'email', 'password']; + protected $fillable = [ + 'first_name', + 'last_name', + 'email', + 'password', + 'phone', + ]; /** * The attributes excluded from the model's JSON form. @@ -51,6 +57,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $this->belongsTo('App\Models\Theme'); } + public function setEmailAttribute($value) + { + $this->attributes['email'] = $this->attributes['username'] = $value; + } + public function getName() { return $this->getDisplayName(); diff --git a/app/Ninja/Repositories/UserRepository.php b/app/Ninja/Repositories/UserRepository.php index 01b7017fa0a0..5675a161a6ff 100644 --- a/app/Ninja/Repositories/UserRepository.php +++ b/app/Ninja/Repositories/UserRepository.php @@ -26,4 +26,13 @@ class UserRepository extends BaseRepository return $query; } + + public function save($data, $user) + { + $user->fill($data); + $user->save(); + + return $user; + } + } diff --git a/app/Ninja/Transformers/UserTransformer.php b/app/Ninja/Transformers/UserTransformer.php index dd3c6775dcb1..d700c579baca 100644 --- a/app/Ninja/Transformers/UserTransformer.php +++ b/app/Ninja/Transformers/UserTransformer.php @@ -17,7 +17,7 @@ class UserTransformer extends EntityTransformer 'updated_at' => $this->getTimestamp($user->updated_at), 'deleted_at' => $this->getTimestamp($user->deleted_at), 'phone' => $user->phone, - 'username' => $user->username, + //'username' => $user->username, 'registered' => (bool) $user->registered, 'confirmed' => (bool) $user->confirmed, 'oauth_user_id' => $user->oauth_user_id, From e619bacf66946a4d73184e5fef675cb1f8365e47 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 22:50:30 +0200 Subject: [PATCH 84/99] Fix for renewel logic --- app/Services/PaymentService.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php index 85b20ef81245..dab7bd2924fe 100644 --- a/app/Services/PaymentService.php +++ b/app/Services/PaymentService.php @@ -218,7 +218,9 @@ class PaymentService extends BaseService $account = Account::with('users')->find($invoice->client->public_id); if ($account->pro_plan_paid && $account->pro_plan_paid != '0000-00-00') { $date = DateTime::createFromFormat('Y-m-d', $account->pro_plan_paid); - $account->pro_plan_paid = $date->modify('+1 year')->format('Y-m-d'); + $date->modify('+1 year'); + $date = max($date, date_create()); + $account->pro_plan_paid = $date->format('Y-m-d'); } else { $account->pro_plan_paid = date_create()->format('Y-m-d'); } From 024e1eb04620accb20baee02b4d51d6f09cadf9d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 22:58:34 +0200 Subject: [PATCH 85/99] Fix for issues when updating --- .../2016_01_06_153144_add_invoice_font_support.php | 8 ++++---- database/seeds/DatabaseSeeder.php | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/database/migrations/2016_01_06_153144_add_invoice_font_support.php b/database/migrations/2016_01_06_153144_add_invoice_font_support.php index e018324ac469..a59a7e0cd06b 100644 --- a/database/migrations/2016_01_06_153144_add_invoice_font_support.php +++ b/database/migrations/2016_01_06_153144_add_invoice_font_support.php @@ -11,8 +11,6 @@ class AddInvoiceFontSupport extends Migration */ public function up() { - Schema::dropIfExists('fonts'); - Schema::create('fonts', function ($t) { $t->increments('id'); @@ -30,18 +28,20 @@ class AddInvoiceFontSupport extends Migration }); // Create fonts - $seeder = new FontsSeeder(); - $seeder->run(); + //$seeder = new FontsSeeder(); + //$seeder->run(); Schema::table('accounts', function ($table) { $table->unsignedInteger('header_font_id')->default(1); $table->unsignedInteger('body_font_id')->default(1); }); + /* Schema::table('accounts', function ($table) { $table->foreign('header_font_id')->references('id')->on('fonts'); $table->foreign('body_font_id')->references('id')->on('fonts'); }); + */ } /** diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 8b2949c59360..3584253c4777 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -16,6 +16,7 @@ class DatabaseSeeder extends Seeder $this->call('ConstantsSeeder'); $this->call('CountriesSeeder'); $this->call('PaymentLibrariesSeeder'); + $this->call('FontsSeeder'); $this->call('BanksSeeder'); $this->call('InvoiceStatusSeeder'); } From 7b5cd4f31c3d280179118f1874c46dd8ce76ebcb Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 4 Feb 2016 23:09:03 +0200 Subject: [PATCH 86/99] Fix for fonts seeder --- database/seeds/FontsSeeder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/seeds/FontsSeeder.php b/database/seeds/FontsSeeder.php index 0b0ba7fe851a..5db76296a5c5 100644 --- a/database/seeds/FontsSeeder.php +++ b/database/seeds/FontsSeeder.php @@ -224,6 +224,7 @@ class FontsSeeder extends Seeder foreach ($fonts as $font) { if (!DB::table('fonts')->where('name', '=', $font['name'])->get()) { + $font['is_early_access'] = false; Font::create($font); } } From ce1717cf53975c6d3b8ec461b4d05e6b2e31562d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Fri, 5 Feb 2016 10:48:10 +0200 Subject: [PATCH 87/99] Fix for issue updating --- .../migrations/2016_01_06_153144_add_invoice_font_support.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/migrations/2016_01_06_153144_add_invoice_font_support.php b/database/migrations/2016_01_06_153144_add_invoice_font_support.php index a59a7e0cd06b..bc731ede5131 100644 --- a/database/migrations/2016_01_06_153144_add_invoice_font_support.php +++ b/database/migrations/2016_01_06_153144_add_invoice_font_support.php @@ -53,14 +53,14 @@ class AddInvoiceFontSupport extends Migration { if (Schema::hasColumn('accounts', 'header_font_id')) { Schema::table('accounts', function ($table) { - $table->dropForeign('accounts_header_font_id_foreign'); + //$table->dropForeign('accounts_header_font_id_foreign'); $table->dropColumn('header_font_id'); }); } if (Schema::hasColumn('accounts', 'body_font_id')) { Schema::table('accounts', function ($table) { - $table->dropForeign('accounts_body_font_id_foreign'); + //$table->dropForeign('accounts_body_font_id_foreign'); $table->dropColumn('body_font_id'); }); } From 138749ce6f93bfb7fe7c1eafeff5edd9bdabcf2e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 6 Feb 2016 14:42:21 +1100 Subject: [PATCH 88/99] update payment from API --- app/Http/Controllers/PaymentApiController.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index aacd744d6def..bcdbc6b1ca40 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -64,6 +64,44 @@ class PaymentApiController extends BaseAPIController return $this->response($data); } + + /** + * @SWG\Put( + * path="/payments/{payment_id", + * summary="Update a payment", + * tags={"payment"}, + * @SWG\Parameter( + * in="body", + * name="body", + * @SWG\Schema(ref="#/definitions/Payment") + * ), + * @SWG\Response( + * response=200, + * description="Update payment", + * @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Payment")) + * ), + * @SWG\Response( + * response="default", + * description="an ""unexpected"" error" + * ) + * ) + */ + public function update($publicId) + { + $data = Input::all(); + $data['public_id'] = $publicId; + $error = false; + $payment = $this->paymentRepo->save($data); + if ($error) { + return $error; + } + $invoice = Invoice::scope($payment->invoice_id)->with('client', 'invoice_items', 'invitations')->first(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); + return $this->response($data); + } + + /** * @SWG\Post( * path="/payments", From 502135a977b003c31467479362967b1460aa781a Mon Sep 17 00:00:00 2001 From: ridgarou Date: Sun, 7 Feb 2016 03:51:40 +0100 Subject: [PATCH 89/99] Fix es_ES traslations --- resources/lang/es_ES/texts.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/es_ES/texts.php b/resources/lang/es_ES/texts.php index 11cd0fddb32a..61d9d46e5902 100644 --- a/resources/lang/es_ES/texts.php +++ b/resources/lang/es_ES/texts.php @@ -4,7 +4,7 @@ return array( // client 'organization' => 'Empresa', - 'name' => 'Nombre de Empresa', + 'name' => 'Nombre', 'website' => 'Sitio Web', 'work_phone' => 'Teléfono', 'address' => 'Dirección', @@ -995,7 +995,7 @@ return array( 'expenses' => 'Gastos', 'new_expense' => 'Nuevo Gasto', 'enter_expense' => 'Introducir Gasto', - 'vendors' => 'Proveedor', + 'vendors' => 'Proveedores', 'new_vendor' => 'Nuevo Proveedor', 'payment_terms_net' => 'Net', 'vendor' => 'Proveedor', @@ -1029,7 +1029,7 @@ return array( 'enter_expense' => 'Introducir Gasto', 'view' => 'Ver', 'restore_expense' => 'Restaurar Gasto', - 'invoice_expense' => 'Gasto factura', + 'invoice_expense' => 'Facturar Gasto', 'expense_error_multiple_clients' => 'Los gastos no pertenecen a diferentes clientes', 'expense_error_invoiced' => 'El gasto ya ha sido Facturado', 'convert_currency' => 'Convertir moneda', From 95e1baed2913d2cd422085005274424d631db967 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 19:30:47 +1100 Subject: [PATCH 90/99] testing payment api --- app/Http/Controllers/PaymentApiController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index bcdbc6b1ca40..c2289b952a54 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -101,7 +101,7 @@ class PaymentApiController extends BaseAPIController return $this->response($data); } - + /** * @SWG\Post( * path="/payments", @@ -155,6 +155,8 @@ class PaymentApiController extends BaseAPIController $this->contactMailer->sendPaymentConfirmation($payment); } + Log::info($payment); + /* $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); $transformer = new PaymentTransformer(Auth::user()->account, Input::get('serializer')); From 0c251392eb08bc25c040fbdac5679627a2b0ac40 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 19:32:43 +1100 Subject: [PATCH 91/99] testing payment api --- app/Http/Controllers/PaymentApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index c2289b952a54..33aad548f85b 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -2,6 +2,7 @@ use App\Ninja\Mailers\ContactMailer; use Auth; +use Illuminate\Support\Facades\Log; use Input; use Utils; use Response; @@ -156,7 +157,6 @@ class PaymentApiController extends BaseAPIController } Log::info($payment); - /* $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); $transformer = new PaymentTransformer(Auth::user()->account, Input::get('serializer')); From 7d2f635272f078441f682248c4548907d4696edb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 19:39:51 +1100 Subject: [PATCH 92/99] testing payment api --- app/Http/Controllers/PaymentApiController.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index 33aad548f85b..3a9a5bd5635b 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -156,13 +156,15 @@ class PaymentApiController extends BaseAPIController $this->contactMailer->sendPaymentConfirmation($payment); } - Log::info($payment); /* $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); $transformer = new PaymentTransformer(Auth::user()->account, Input::get('serializer')); $data = $this->createItem($payment, $transformer, 'payment'); */ - $invoice = Invoice::scope($payment->invoice_id)->with('client', 'invoice_items', 'invitations')->first(); + $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); + + + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); From b3346011bc2a15b0647323b30bd8762c0952a2f9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 20:20:38 +1100 Subject: [PATCH 93/99] api bug fixes --- app/Http/Controllers/PaymentApiController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index 3a9a5bd5635b..e52cc2807109 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -91,12 +91,14 @@ class PaymentApiController extends BaseAPIController { $data = Input::all(); $data['public_id'] = $publicId; + $invoice = Invoice::scope($data['invoice_id'])->with('client')->first(); + $error = false; $payment = $this->paymentRepo->save($data); if ($error) { return $error; } - $invoice = Invoice::scope($payment->invoice_id)->with('client', 'invoice_items', 'invitations')->first(); + $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); From 42f3cffca8e2f31fdfb809e9df872983abc391ee Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 21:24:21 +1100 Subject: [PATCH 94/99] Delete a payment from the API --- app/Http/Controllers/ClientApiController.php | 11 ++-- app/Http/Controllers/PaymentApiController.php | 62 ++++++++++++++++--- app/Models/Invoice.php | 2 +- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index d9e2d13d08e8..4f4a6212d1e1 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -51,8 +51,8 @@ class ClientApiController extends BaseAPIController public function index() { $clients = Client::scope() - ->with($this->getIncluded()) - ->orderBy('created_at', 'desc')->withTrashed(); + ->with($this->getIncluded()) + ->orderBy('created_at', 'desc')->withTrashed(); // Filter by email if (Input::has('email')) { @@ -100,8 +100,8 @@ class ClientApiController extends BaseAPIController $client = $this->clientRepo->save($request->input()); $client = Client::scope($client->public_id) - ->with('country', 'contacts', 'industry', 'size', 'currency') - ->first(); + ->with('country', 'contacts', 'industry', 'size', 'currency') + ->first(); $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); $data = $this->createItem($client, $transformer, ENTITY_CLIENT); @@ -156,4 +156,7 @@ class ClientApiController extends BaseAPIController return $this->response($data); } + + + } diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index e52cc2807109..d6f623aab881 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -2,7 +2,7 @@ use App\Ninja\Mailers\ContactMailer; use Auth; -use Illuminate\Support\Facades\Log; +use Illuminate\Http\Request; use Input; use Utils; use Response; @@ -87,18 +87,31 @@ class PaymentApiController extends BaseAPIController * ) * ) */ - public function update($publicId) + + public function update(Request $request, $publicId) { $data = Input::all(); $data['public_id'] = $publicId; - $invoice = Invoice::scope($data['invoice_id'])->with('client')->first(); - $error = false; - $payment = $this->paymentRepo->save($data); + + if ($request->action == ACTION_ARCHIVE) { + $payment = Payment::scope($publicId)->firstOrFail(); + $this->paymentRepo->archive($payment); + + $invoice = Invoice::scope($data['invoice_id'])->with('client')->first(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); + + return $this->response($data); + } + + $this->paymentRepo->save($data); + if ($error) { return $error; } - $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); + + $invoice = Invoice::scope($data['invoice_id'])->with('client', 'invoice_items', 'invitations','payments')->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); @@ -165,11 +178,44 @@ class PaymentApiController extends BaseAPIController */ $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); - - $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); } + + /** + * @SWG\Delete( + * path="/payments/{payment_id}", + * summary="Delete a payment", + * tags={"payment"}, + * @SWG\Parameter( + * in="body", + * name="body", + * @SWG\Schema(ref="#/definitions/Payment") + * ), + * @SWG\Response( + * response=200, + * description="Delete payment", + * @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Payment")) + * ), + * @SWG\Response( + * response="default", + * description="an ""unexpected"" error" + * ) + * ) + */ + + public function destroy($publicId) + { + $payment = Payment::scope($publicId)->withTrashed()->first(); + $invoice = Invoice::scope($payment->invoice->public_id)->first(); + + $this->paymentRepo->delete($payment); + + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); + + return $this->response($data); + } } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index e93c8d3b07f5..349b650e0f01 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -179,7 +179,7 @@ class Invoice extends EntityModel implements BalanceAffecting public function payments() { - return $this->hasMany('App\Models\Payment', 'invoice_id', 'id'); + return $this->hasMany('App\Models\Payment', 'invoice_id', 'id')->withTrashed(); } public function recurring_invoice() From ccaabe292604227d861dc586abd7dceb952aed1c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 22:01:39 +1100 Subject: [PATCH 95/99] working on payments API --- app/Http/Controllers/PaymentApiController.php | 15 +++++++++------ app/Models/Invoice.php | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index d6f623aab881..f61bb53908fc 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -46,7 +46,7 @@ class PaymentApiController extends BaseAPIController { $paginator = Payment::scope(); $payments = Payment::scope() - ->with('client.contacts', 'invitation', 'user', 'invoice'); + ->with('client.contacts', 'invitation', 'user', 'invoice')->withTrashed(); if ($clientPublicId = Input::get('client_id')) { $filter = function($query) use ($clientPublicId) { @@ -95,23 +95,23 @@ class PaymentApiController extends BaseAPIController $error = false; if ($request->action == ACTION_ARCHIVE) { - $payment = Payment::scope($publicId)->firstOrFail(); + $payment = Payment::scope($publicId)->withTrashed()->firstOrFail(); $this->paymentRepo->archive($payment); - $invoice = Invoice::scope($data['invoice_id'])->with('client')->first(); + $invoice = Invoice::scope($data['invoice_id'])->with('client','payments')->withTrashed()->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); } - $this->paymentRepo->save($data); + $payment = $this->paymentRepo->save($data); if ($error) { return $error; } - $invoice = Invoice::scope($data['invoice_id'])->with('client', 'invoice_items', 'invitations','payments')->first(); + $invoice = Invoice::scope($data['invoice_id'])->with('client', 'invoice_items', 'invitations','payments')->withTrashed()->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); @@ -208,11 +208,14 @@ class PaymentApiController extends BaseAPIController public function destroy($publicId) { + $payment = Payment::scope($publicId)->withTrashed()->first(); - $invoice = Invoice::scope($payment->invoice->public_id)->first(); + $invoiceId = $payment->invoice->public_id; $this->paymentRepo->delete($payment); + $invoice = Invoice::scope($invoiceId)->with('payments')->withTrashed()->first(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 349b650e0f01..e93c8d3b07f5 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -179,7 +179,7 @@ class Invoice extends EntityModel implements BalanceAffecting public function payments() { - return $this->hasMany('App\Models\Payment', 'invoice_id', 'id')->withTrashed(); + return $this->hasMany('App\Models\Payment', 'invoice_id', 'id'); } public function recurring_invoice() From 391d721180f8af71d62b8f600f53312835336f2d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 7 Feb 2016 22:30:36 +1100 Subject: [PATCH 96/99] Bug fixes --- app/Http/Controllers/PaymentApiController.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/PaymentApiController.php b/app/Http/Controllers/PaymentApiController.php index f61bb53908fc..5a0f508b98bd 100644 --- a/app/Http/Controllers/PaymentApiController.php +++ b/app/Http/Controllers/PaymentApiController.php @@ -98,7 +98,9 @@ class PaymentApiController extends BaseAPIController $payment = Payment::scope($publicId)->withTrashed()->firstOrFail(); $this->paymentRepo->archive($payment); - $invoice = Invoice::scope($data['invoice_id'])->with('client','payments')->withTrashed()->first(); + $invoice = Invoice::scope($data['invoice_id'])->with('client')->with(['payments' => function($query) { + $query->withTrashed(); + }])->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); @@ -111,7 +113,9 @@ class PaymentApiController extends BaseAPIController return $error; } - $invoice = Invoice::scope($data['invoice_id'])->with('client', 'invoice_items', 'invitations','payments')->withTrashed()->first(); + $invoice = Invoice::scope($data['invoice_id'])->with('client', 'invoice_items', 'invitations')->with(['payments' => function($query) { + $query->withTrashed(); + }])->withTrashed()->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); return $this->response($data); @@ -171,13 +175,9 @@ class PaymentApiController extends BaseAPIController $this->contactMailer->sendPaymentConfirmation($payment); } - /* - $payment = Payment::scope($payment->public_id)->with('client', 'contact', 'user', 'invoice')->first(); - $transformer = new PaymentTransformer(Auth::user()->account, Input::get('serializer')); - $data = $this->createItem($payment, $transformer, 'payment'); - */ - $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); - + $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->with(['payments' => function($query) { + $query->withTrashed(); + }])->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); @@ -214,7 +214,9 @@ class PaymentApiController extends BaseAPIController $this->paymentRepo->delete($payment); - $invoice = Invoice::scope($invoiceId)->with('payments')->withTrashed()->first(); + $invoice = Invoice::scope($invoiceId)->with('client', 'invoice_items', 'invitations')->with(['payments' => function($query) { + $query->withTrashed(); + }])->first(); $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); $data = $this->createItem($invoice, $transformer, 'invoice'); From 1b740d77fcfa8063d4ea0fceb66283c2565d004a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 7 Feb 2016 21:16:47 +0200 Subject: [PATCH 97/99] Made word shorter --- resources/lang/fr_CA/texts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/fr_CA/texts.php b/resources/lang/fr_CA/texts.php index 136394660c64..c32001f0d115 100644 --- a/resources/lang/fr_CA/texts.php +++ b/resources/lang/fr_CA/texts.php @@ -345,7 +345,7 @@ return array( 'chart_builder' => 'Concepteur de graphiques', 'ninja_email_footer' => 'Utilisez :site pour facturer vos clients et être payés en ligne gratuitement!', - 'go_pro' => 'Passez au Plan Pro', + 'go_pro' => 'Devenez Pro', // Quotes 'quote' => 'Devis', From d401a6fb93ed36f4df5d479d7e0ef2367c975a78 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 8 Feb 2016 10:37:38 +1100 Subject: [PATCH 98/99] Bug in Client API not paginating all results --- app/Http/Controllers/ClientApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index 4f4a6212d1e1..62570aea2a2a 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -67,7 +67,7 @@ class ClientApiController extends BaseAPIController $clients = $clients->paginate(); $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); - $paginator = Client::scope()->paginate(); + $paginator = Client::scope()->withTrashed()->paginate(); $data = $this->createCollection($clients, $transformer, ENTITY_CLIENT, $paginator); From ce58c581ef9da63cddcd3bf38d768a49004d0eab Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 8 Feb 2016 15:27:42 +1100 Subject: [PATCH 99/99] Delete Client from API --- app/Http/Controllers/ClientApiController.php | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index 62570aea2a2a..6cd91d1d09f1 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -158,5 +158,45 @@ class ClientApiController extends BaseAPIController } + /** + * @SWG\Delete( + * path="/clients/{client_id}", + * tags={"client"}, + * summary="Delete a client", + * @SWG\Parameter( + * in="body", + * name="body", + * @SWG\Schema(ref="#/definitions/Client") + * ), + * @SWG\Response( + * response=200, + * description="Delete client", + * @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Client")) + * ), + * @SWG\Response( + * response="default", + * description="an ""unexpected"" error" + * ) + * ) + */ + + public function destroy($publicId) + { + + $client = Client::scope($publicId)->withTrashed()->first(); + $this->clientRepo->delete($client); + + $client = Client::scope($publicId) + ->with('country', 'contacts', 'industry', 'size', 'currency') + ->withTrashed() + ->first(); + + $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($client, $transformer, ENTITY_CLIENT); + + return $this->response($data); + + } + }