diff --git a/app/Console/Commands/SendRenewalInvoices.php b/app/Console/Commands/SendRenewalInvoices.php
index ceae80e611dc..cf9a968d56ba 100644
--- a/app/Console/Commands/SendRenewalInvoices.php
+++ b/app/Console/Commands/SendRenewalInvoices.php
@@ -31,7 +31,7 @@ class SendRenewalInvoices extends Command
$accounts = Account::whereRaw('datediff(curdate(), pro_plan_paid) = 355')->get();
$this->info(count($accounts).' accounts found');
- dd(0);
+
foreach ($accounts as $account) {
$client = $this->accountRepo->getNinjaClient($account);
$invitation = $this->accountRepo->createNinjaInvoice($client);
diff --git a/app/Http/Controllers/AccountGatewayController.php b/app/Http/Controllers/AccountGatewayController.php
index 29002f8727b1..87a4aef80993 100644
--- a/app/Http/Controllers/AccountGatewayController.php
+++ b/app/Http/Controllers/AccountGatewayController.php
@@ -69,6 +69,7 @@ class AccountGatewayController extends BaseController
$data['method'] = 'PUT';
$data['title'] = trans('texts.edit_gateway') . ' - ' . $accountGateway->gateway->name;
$data['config'] = $configFields;
+ $data['hiddenFields'] = Gateway::$hiddenFields;
$data['paymentTypeId'] = $accountGateway->getPaymentType();
$data['selectGateways'] = Gateway::where('id', '=', $accountGateway->gateway_id)->get();
@@ -97,6 +98,7 @@ class AccountGatewayController extends BaseController
$data['method'] = 'POST';
$data['title'] = trans('texts.add_gateway');
$data['selectGateways'] = Gateway::where('payment_library_id', '=', 1)->where('id', '!=', GATEWAY_PAYPAL_EXPRESS)->where('id', '!=', GATEWAY_PAYPAL_EXPRESS)->orderBy('name')->get();
+ $data['hiddenFields'] = Gateway::$hiddenFields;
return View::make('accounts.account_gateway', $data);
}
@@ -107,7 +109,7 @@ class AccountGatewayController extends BaseController
$account = Auth::user()->account;
$paymentTypes = [];
- foreach ([PAYMENT_TYPE_CREDIT_CARD, PAYMENT_TYPE_PAYPAL, PAYMENT_TYPE_BITCOIN] as $type) {
+ foreach (Gateway::$paymentTypes as $type) {
if ($accountGateway || !$account->getGatewayByType($type)) {
$paymentTypes[$type] = trans('texts.'.strtolower($type));
@@ -132,7 +134,9 @@ class AccountGatewayController extends BaseController
$gateways = Gateway::where('payment_library_id', '=', 1)->orderBy('name')->get();
foreach ($gateways as $gateway) {
- $gateway->fields = $gateway->getFields();
+ $fields = $gateway->getFields();
+ asort($fields);
+ $gateway->fields = $fields;
if ($accountGateway && $accountGateway->gateway_id == $gateway->id) {
$accountGateway->fields = $gateway->fields;
}
@@ -182,6 +186,8 @@ class AccountGatewayController extends BaseController
$gatewayId = GATEWAY_PAYPAL_EXPRESS;
} elseif ($paymentType == PAYMENT_TYPE_BITCOIN) {
$gatewayId = GATEWAY_BITPAY;
+ } elseif ($paymentType = PAYMENT_TYPE_DWOLLA) {
+ $gatewayId = GATEWAY_DWOLLA;
}
if (!$gatewayId) {
@@ -194,7 +200,7 @@ class AccountGatewayController extends BaseController
$fields = $gateway->getFields();
foreach ($fields as $field => $details) {
- if (!in_array($field, ['testMode', 'developerMode', 'headerImageUrl', 'solutionType', 'landingPage', 'brandName', 'logoImageUrl', 'borderColor'])) {
+ if (!in_array($field, array_merge(Gateway::$hiddenFields, Gateway::$optionalFields))) {
if (strtolower($gateway->name) == 'beanstream') {
if (in_array($field, ['merchant_id', 'passCode'])) {
$rules[$gateway->id.'_'.$field] = 'required';
diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php
index d0f20de07839..9072f6960d70 100644
--- a/app/Http/Controllers/ClientController.php
+++ b/app/Http/Controllers/ClientController.php
@@ -76,9 +76,16 @@ class ClientController extends BaseController
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
$str .= '
'.trans('texts.edit_client').'
- '.trans('texts.new_invoice').'
- '.trans('texts.new_payment').'
- '.trans('texts.new_credit').'
+ '.trans('texts.new_task').'
+ '.trans('texts.new_invoice').'';
+
+ if (Auth::user()->isPro()) {
+ $str .= ''.trans('texts.new_quote').'';
+ }
+
+ $str .= '
+ '.trans('texts.enter_payment').'
+ '.trans('texts.enter_credit').'
'.trans('texts.archive_client').'';
} else {
@@ -113,15 +120,18 @@ class ClientController extends BaseController
Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT);
$actionLinks = [
- ['label' => trans('texts.create_task'), 'url' => '/tasks/create/'.$client->public_id],
- ['label' => trans('texts.enter_payment'), 'url' => '/payments/create/'.$client->public_id],
- ['label' => trans('texts.enter_credit'), 'url' => '/credits/create/'.$client->public_id],
+ ['label' => trans('texts.new_task'), 'url' => '/tasks/create/'.$client->public_id]
];
if (Utils::isPro()) {
- array_unshift($actionLinks, ['label' => trans('texts.create_quote'), 'url' => '/quotes/create/'.$client->public_id]);
+ array_push($actionLinks, ['label' => trans('texts.new_quote'), 'url' => '/quotes/create/'.$client->public_id]);
}
+ array_push($actionLinks,
+ ['label' => trans('texts.enter_payment'), 'url' => '/payments/create/'.$client->public_id],
+ ['label' => trans('texts.enter_credit'), 'url' => '/credits/create/'.$client->public_id]
+ );
+
$data = array(
'actionLinks' => $actionLinks,
'showBreadcrumbs' => false,
diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php
index d35fbf7efdad..35dcaa08a996 100644
--- a/app/Http/Controllers/InvoiceController.php
+++ b/app/Http/Controllers/InvoiceController.php
@@ -221,7 +221,7 @@ class InvoiceController extends BaseController
'url' => URL::to("payment/{$invitation->invitation_key}/".PAYMENT_TYPE_TOKEN), 'label' => trans('texts.use_card_on_file')
];
}
- foreach([PAYMENT_TYPE_CREDIT_CARD, PAYMENT_TYPE_PAYPAL, PAYMENT_TYPE_BITCOIN] as $type) {
+ foreach(Gateway::$paymentTypes as $type) {
if ($account->getGatewayByType($type)) {
$paymentTypes[] = [
'url' => URL::to("/payment/{$invitation->invitation_key}/{$type}"), 'label' => trans('texts.'.strtolower($type))
diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php
index cc6eee7c98f5..8f38932de149 100644
--- a/app/Http/Controllers/PaymentController.php
+++ b/app/Http/Controllers/PaymentController.php
@@ -195,11 +195,6 @@ class PaymentController extends BaseController
$gateway = Omnipay::create($accountGateway->gateway->provider);
$config = json_decode($accountGateway->config);
- /*
- $gateway->setSolutionType("Sole");
- $gateway->setLandingPage("Billing");
- */
-
foreach ($config as $key => $val) {
if (!$val) {
continue;
@@ -209,8 +204,8 @@ class PaymentController extends BaseController
$gateway->$function($val);
}
- if (Utils::isNinjaDev()) {
- $gateway->setTestMode(true);
+ if ($accountGateway->gateway->id == GATEWAY_DWOLLA) {
+ $gateway->setKeySecret($_ENV['DWOLLA_KEY'], $_ENV['DWOLLA_SECRET']);
}
return $gateway;
diff --git a/app/Http/routes.php b/app/Http/routes.php
index cb055e408ee6..7b7b45a01b89 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -31,6 +31,7 @@ Route::get('/', 'HomeController@showIndex');
Route::get('terms', 'HomeController@showTerms');
Route::get('log_error', 'HomeController@logError');
Route::get('invoice_now', 'HomeController@invoiceNow');
+Route::get('keep_alive', 'HomeController@keepAlive');
Route::post('get_started', 'AccountController@getStarted');
// Client visible pages
@@ -78,7 +79,6 @@ if (Utils::isNinja()) {
Route::post('/signup/register', 'AccountController@doRegister');
Route::get('/news_feed/{user_type}/{version}/', 'HomeController@newsFeed');
Route::get('/demo', 'AccountController@demo');
- Route::get('/keep_alive', 'HomeController@keepAlive');
}
Route::group(['middleware' => 'auth'], function() {
@@ -339,6 +339,7 @@ define('GATEWAY_BEANSTREAM', 29);
define('GATEWAY_PSIGATE', 30);
define('GATEWAY_MOOLAH', 31);
define('GATEWAY_BITPAY', 42);
+define('GATEWAY_DWOLLA', 43);
define('EVENT_CREATE_CLIENT', 1);
define('EVENT_CREATE_INVOICE', 2);
@@ -383,6 +384,7 @@ define('TOKEN_BILLING_ALWAYS', 4);
define('PAYMENT_TYPE_PAYPAL', 'PAYMENT_TYPE_PAYPAL');
define('PAYMENT_TYPE_CREDIT_CARD', 'PAYMENT_TYPE_CREDIT_CARD');
define('PAYMENT_TYPE_BITCOIN', 'PAYMENT_TYPE_BITCOIN');
+define('PAYMENT_TYPE_DWOLLA', 'PAYMENT_TYPE_DWOLLA');
define('PAYMENT_TYPE_TOKEN', 'PAYMENT_TYPE_TOKEN');
define('PAYMENT_TYPE_ANY', 'PAYMENT_TYPE_ANY');
diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php
index 5af3974f6249..08b605da5833 100644
--- a/app/Models/Gateway.php
+++ b/app/Models/Gateway.php
@@ -7,6 +7,40 @@ class Gateway extends Eloquent
{
public $timestamps = true;
+ public static $paymentTypes = [
+ PAYMENT_TYPE_CREDIT_CARD,
+ PAYMENT_TYPE_PAYPAL,
+ PAYMENT_TYPE_BITCOIN,
+ //PAYMENT_TYPE_DWOLLA
+ ];
+
+ public static $hiddenFields = [
+ // PayPal
+ 'headerImageUrl',
+ 'solutionType',
+ 'landingPage',
+ 'brandName',
+ 'logoImageUrl',
+ 'borderColor',
+ // Dwolla
+ 'gatewaySession',
+ 'purchaseOrder',
+ 'Callback',
+ 'Redirect',
+ 'shipping',
+ 'tax',
+ 'discount',
+ 'notes',
+ 'AllowFundingSources',
+ 'AllowGuestCheckout',
+ ];
+
+ public static $optionalFields = [
+ // PayPal
+ 'testMode',
+ 'developerMode',
+ ];
+
public function getLogoUrl()
{
return '/images/gateways/logo_'.$this->provider.'.png';
@@ -24,6 +58,8 @@ class Gateway extends Eloquent
$link = 'https://www.2checkout.com/referral?r=2c37ac2298';
} elseif ($this->id == GATEWAY_BITPAY) {
$link = 'https://bitpay.com/dashboard/signup';
+ } elseif ($this->id == GATEWAY_DWOLLA) {
+ $link = 'https://www.dwolla.com/register';
}
$key = 'texts.gateway_help_'.$this->id;
@@ -42,6 +78,8 @@ class Gateway extends Eloquent
return PAYMENT_TYPE_PAYPAL;
} else if ($gatewayId == GATEWAY_BITPAY) {
return PAYMENT_TYPE_BITCOIN;
+ } else if ($gatewayId == GATEWAY_DWOLLA) {
+ return PAYMENT_TYPE_DWOLLA;
} else {
return PAYMENT_TYPE_CREDIT_CARD;
}
diff --git a/composer.json b/composer.json
index 162fc4a65401..b038cab105f0 100644
--- a/composer.json
+++ b/composer.json
@@ -36,7 +36,8 @@
"omnipay/bitpay": "dev-master",
"guzzlehttp/guzzle": "~5.0",
"laravelcollective/html": "~5.0",
- "wildbit/laravel-postmark-provider": "dev-master"
+ "wildbit/laravel-postmark-provider": "dev-master",
+ "mach-kernel/omnipay-dwolla": "dev-master"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
diff --git a/composer.lock b/composer.lock
index b2702896333a..7752c4a5b476 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "493811fbf580a8bbd5eb08b10f5bb9d1",
+ "hash": "c3732ac70e554cbab216fc1993487412",
"packages": [
{
"name": "alfaproject/omnipay-neteller",
@@ -120,12 +120,12 @@
"source": {
"type": "git",
"url": "https://github.com/formers/former.git",
- "reference": "e37cb69d12d4436282e6754800903d94788528f3"
+ "reference": "5d4dbc7bc98b363946dc59ce63565a2b49f138ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/formers/former/zipball/e37cb69d12d4436282e6754800903d94788528f3",
- "reference": "e37cb69d12d4436282e6754800903d94788528f3",
+ "url": "https://api.github.com/repos/formers/former/zipball/5d4dbc7bc98b363946dc59ce63565a2b49f138ca",
+ "reference": "5d4dbc7bc98b363946dc59ce63565a2b49f138ca",
"shasum": ""
},
"require": {
@@ -171,7 +171,7 @@
"foundation",
"laravel"
],
- "time": "2015-05-06 00:01:16"
+ "time": "2015-05-26 22:05:25"
},
{
"name": "anahkiasen/html-object",
@@ -384,20 +384,20 @@
},
{
"name": "classpreloader/classpreloader",
- "version": "1.3.0",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/ClassPreloader/ClassPreloader.git",
- "reference": "0544616ba33fb2a6b792b3a7822650810c6d65d9"
+ "reference": "b76f3f4f603ebbe7e64351a7ef973431ddaf7b27"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/0544616ba33fb2a6b792b3a7822650810c6d65d9",
- "reference": "0544616ba33fb2a6b792b3a7822650810c6d65d9",
+ "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/b76f3f4f603ebbe7e64351a7ef973431ddaf7b27",
+ "reference": "b76f3f4f603ebbe7e64351a7ef973431ddaf7b27",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^1.2.2",
+ "nikic/php-parser": "~1.3",
"php": ">=5.3.3",
"symfony/console": "~2.1",
"symfony/filesystem": "~2.1",
@@ -412,7 +412,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.4-dev"
}
},
"autoload": {
@@ -425,13 +425,13 @@
"MIT"
],
"authors": [
- {
- "name": "Graham Campbell",
- "email": "graham@mineuk.com"
- },
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@cachethq.io"
}
],
"description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case",
@@ -440,7 +440,7 @@
"class",
"preload"
],
- "time": "2015-04-15 21:59:30"
+ "time": "2015-05-26 10:57:51"
},
{
"name": "coatesap/omnipay-datacash",
@@ -2115,6 +2115,63 @@
],
"time": "2015-03-26 11:54:18"
},
+ {
+ "name": "mach-kernel/omnipay-dwolla",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mach-kernel/omnipay-dwolla.git",
+ "reference": "cdf228962a28ea1d9d150e33ef25f0e57f157124"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mach-kernel/omnipay-dwolla/zipball/cdf228962a28ea1d9d150e33ef25f0e57f157124",
+ "reference": "cdf228962a28ea1d9d150e33ef25f0e57f157124",
+ "shasum": ""
+ },
+ "require": {
+ "omnipay/common": "~2.0"
+ },
+ "require-dev": {
+ "omnipay/tests": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Omnipay\\Dwolla\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Adrian Macneil",
+ "email": "adrian@adrianmacneil.com"
+ },
+ {
+ "name": "David Stancu",
+ "homepage": "https://github.com/mach-kernel"
+ }
+ ],
+ "description": "Dwolla support for the Omnipay payment library",
+ "homepage": "https://github.com/mach-kernel/omnipay-dwolla",
+ "keywords": [
+ "dwolla",
+ "gateway",
+ "merchant",
+ "omnipay",
+ "pay",
+ "payment"
+ ],
+ "time": "2014-06-10 16:41:50"
+ },
{
"name": "maximebf/debugbar",
"version": "v1.10.4",
@@ -4479,17 +4536,17 @@
},
{
"name": "symfony/class-loader",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/ClassLoader",
"source": {
"type": "git",
"url": "https://github.com/symfony/ClassLoader.git",
- "reference": "695134c9b39559297fa5d1dcff6a9054bb56facb"
+ "reference": "abf5632a31402ae6ac19cd00683faf603046440a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/695134c9b39559297fa5d1dcff6a9054bb56facb",
- "reference": "695134c9b39559297fa5d1dcff6a9054bb56facb",
+ "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/abf5632a31402ae6ac19cd00683faf603046440a",
+ "reference": "abf5632a31402ae6ac19cd00683faf603046440a",
"shasum": ""
},
"require": {
@@ -4526,21 +4583,21 @@
],
"description": "Symfony ClassLoader Component",
"homepage": "https://symfony.com",
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-15 13:32:45"
},
{
"name": "symfony/console",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
"url": "https://github.com/symfony/Console.git",
- "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272"
+ "reference": "2343f6d8026306bd330e0c987e4c102483c213e7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Console/zipball/ebc5679854aa24ed7d65062e9e3ab0b18a917272",
- "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272",
+ "url": "https://api.github.com/repos/symfony/Console/zipball/2343f6d8026306bd330e0c987e4c102483c213e7",
+ "reference": "2343f6d8026306bd330e0c987e4c102483c213e7",
"shasum": ""
},
"require": {
@@ -4584,21 +4641,21 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-22 14:53:08"
},
{
"name": "symfony/debug",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Debug",
"source": {
"type": "git",
"url": "https://github.com/symfony/Debug.git",
- "reference": "ad4511a8fddce7ec163b513ba39a30ea4f32c9e7"
+ "reference": "4851a041c48e76b91a221db84ab5850daa6a7b33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Debug/zipball/ad4511a8fddce7ec163b513ba39a30ea4f32c9e7",
- "reference": "ad4511a8fddce7ec163b513ba39a30ea4f32c9e7",
+ "url": "https://api.github.com/repos/symfony/Debug/zipball/4851a041c48e76b91a221db84ab5850daa6a7b33",
+ "reference": "4851a041c48e76b91a221db84ab5850daa6a7b33",
"shasum": ""
},
"require": {
@@ -4645,11 +4702,11 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2015-05-08 13:17:44"
+ "time": "2015-05-20 13:09:45"
},
{
"name": "symfony/event-dispatcher",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/EventDispatcher",
"source": {
"type": "git",
@@ -4708,17 +4765,17 @@
},
{
"name": "symfony/filesystem",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Filesystem",
"source": {
"type": "git",
"url": "https://github.com/symfony/Filesystem.git",
- "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde"
+ "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Filesystem/zipball/f73904bd2dae525c42ea1f0340c7c98480ecacde",
- "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde",
+ "url": "https://api.github.com/repos/symfony/Filesystem/zipball/1f8429f72a5bfa58b33fd96824bea146fc4b3f49",
+ "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49",
"shasum": ""
},
"require": {
@@ -4754,21 +4811,21 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2015-05-08 00:09:07"
+ "time": "2015-05-15 13:32:45"
},
{
"name": "symfony/finder",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Finder",
"source": {
"type": "git",
"url": "https://github.com/symfony/Finder.git",
- "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99"
+ "reference": "ffedd3e0ff8155188155e9322fe21b9ee012ac14"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Finder/zipball/704c64c8b12c8882640d5c0330a8414b1e06dc99",
- "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99",
+ "url": "https://api.github.com/repos/symfony/Finder/zipball/ffedd3e0ff8155188155e9322fe21b9ee012ac14",
+ "reference": "ffedd3e0ff8155188155e9322fe21b9ee012ac14",
"shasum": ""
},
"require": {
@@ -4804,21 +4861,21 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-15 13:32:45"
},
{
"name": "symfony/http-foundation",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/HttpFoundation",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpFoundation.git",
- "reference": "8a0d00980ef9f6b47ddbf24bdfbf70fead760816"
+ "reference": "f9b28dcc6d3e50f5568b42dda7292656a9fe8432"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/8a0d00980ef9f6b47ddbf24bdfbf70fead760816",
- "reference": "8a0d00980ef9f6b47ddbf24bdfbf70fead760816",
+ "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/f9b28dcc6d3e50f5568b42dda7292656a9fe8432",
+ "reference": "f9b28dcc6d3e50f5568b42dda7292656a9fe8432",
"shasum": ""
},
"require": {
@@ -4858,21 +4915,21 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-22 14:53:08"
},
{
"name": "symfony/http-kernel",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/HttpKernel",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpKernel.git",
- "reference": "2010194de0a57731af9404c7f97fd300db98b7a3"
+ "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/2010194de0a57731af9404c7f97fd300db98b7a3",
- "reference": "2010194de0a57731af9404c7f97fd300db98b7a3",
+ "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/a9a6f595941fce8dddd64f4e9bf47747cf1515fc",
+ "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc",
"shasum": ""
},
"require": {
@@ -4936,21 +4993,21 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2015-05-11 01:58:49"
+ "time": "2015-05-27 00:17:10"
},
{
"name": "symfony/process",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Process",
"source": {
"type": "git",
"url": "https://github.com/symfony/Process.git",
- "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562"
+ "reference": "7856d78ab6cce6e59d02d9e1a873441f6bd21306"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Process/zipball/9f3c4baaf840ed849e1b1f7bfd5ae246e8509562",
- "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562",
+ "url": "https://api.github.com/repos/symfony/Process/zipball/7856d78ab6cce6e59d02d9e1a873441f6bd21306",
+ "reference": "7856d78ab6cce6e59d02d9e1a873441f6bd21306",
"shasum": ""
},
"require": {
@@ -4986,21 +5043,21 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-15 13:32:45"
},
{
"name": "symfony/routing",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Routing",
"source": {
"type": "git",
"url": "https://github.com/symfony/Routing.git",
- "reference": "1455ec537940f7428ea6aa9411f3c4bca69413a0"
+ "reference": "dc9df18a1cfe87de65e270e8f01407ca6d7c39cb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Routing/zipball/1455ec537940f7428ea6aa9411f3c4bca69413a0",
- "reference": "1455ec537940f7428ea6aa9411f3c4bca69413a0",
+ "url": "https://api.github.com/repos/symfony/Routing/zipball/dc9df18a1cfe87de65e270e8f01407ca6d7c39cb",
+ "reference": "dc9df18a1cfe87de65e270e8f01407ca6d7c39cb",
"shasum": ""
},
"require": {
@@ -5055,21 +5112,21 @@
"uri",
"url"
],
- "time": "2015-05-02 15:18:45"
+ "time": "2015-05-15 13:32:45"
},
{
"name": "symfony/security-core",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Security/Core",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-core.git",
- "reference": "d25c17db741f58c0f615e52006a47f6fb23cd9b3"
+ "reference": "1ad0ee4b2a1ab32924cd0be397f0196b5d47e5d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/security-core/zipball/d25c17db741f58c0f615e52006a47f6fb23cd9b3",
- "reference": "d25c17db741f58c0f615e52006a47f6fb23cd9b3",
+ "url": "https://api.github.com/repos/symfony/security-core/zipball/1ad0ee4b2a1ab32924cd0be397f0196b5d47e5d0",
+ "reference": "1ad0ee4b2a1ab32924cd0be397f0196b5d47e5d0",
"shasum": ""
},
"require": {
@@ -5108,32 +5165,32 @@
"MIT"
],
"authors": [
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- },
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Security Component - Core Library",
- "homepage": "http://symfony.com",
- "time": "2015-03-30 15:54:10"
+ "homepage": "https://symfony.com",
+ "time": "2015-05-15 13:53:19"
},
{
"name": "symfony/translation",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Translation",
"source": {
"type": "git",
"url": "https://github.com/symfony/Translation.git",
- "reference": "398e0eedcb89243ad34a10d079a4b6ea4c0b61ff"
+ "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Translation/zipball/398e0eedcb89243ad34a10d079a4b6ea4c0b61ff",
- "reference": "398e0eedcb89243ad34a10d079a4b6ea4c0b61ff",
+ "url": "https://api.github.com/repos/symfony/Translation/zipball/d030b3d8d9699795dbf8c59e915ef879007a4483",
+ "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483",
"shasum": ""
},
"require": {
@@ -5178,11 +5235,11 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2015-05-05 16:51:00"
+ "time": "2015-05-22 14:37:51"
},
{
"name": "symfony/var-dumper",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/VarDumper",
"source": {
"type": "git",
@@ -5698,16 +5755,16 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "2.0.16",
+ "version": "2.0.17",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c"
+ "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/934fd03eb6840508231a7f73eb8940cf32c3b66c",
- "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c4e8e7725e351184a76544634855b8a9c405a6e3",
+ "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3",
"shasum": ""
},
"require": {
@@ -5756,7 +5813,7 @@
"testing",
"xunit"
],
- "time": "2015-04-11 04:35:00"
+ "time": "2015-05-25 05:11:59"
},
{
"name": "phpunit/php-file-iterator",
@@ -5944,16 +6001,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "4.6.6",
+ "version": "4.6.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "3afe303d873a4d64c62ef84de491b97b006fbdac"
+ "reference": "a6cd74b523ef7bad7a23a94e4045d72968e8165b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3afe303d873a4d64c62ef84de491b97b006fbdac",
- "reference": "3afe303d873a4d64c62ef84de491b97b006fbdac",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6cd74b523ef7bad7a23a94e4045d72968e8165b",
+ "reference": "a6cd74b523ef7bad7a23a94e4045d72968e8165b",
"shasum": ""
},
"require": {
@@ -6012,20 +6069,20 @@
"testing",
"xunit"
],
- "time": "2015-04-29 15:18:52"
+ "time": "2015-05-28 09:54:11"
},
{
"name": "phpunit/phpunit-mock-objects",
- "version": "2.3.1",
+ "version": "2.3.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "74ffb87f527f24616f72460e54b595f508dccb5c"
+ "reference": "787e06820578ca103b21e323e27f0e2eb0712ae5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c",
- "reference": "74ffb87f527f24616f72460e54b595f508dccb5c",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/787e06820578ca103b21e323e27f0e2eb0712ae5",
+ "reference": "787e06820578ca103b21e323e27f0e2eb0712ae5",
"shasum": ""
},
"require": {
@@ -6067,7 +6124,7 @@
"mock",
"xunit"
],
- "time": "2015-04-02 05:36:41"
+ "time": "2015-05-28 09:50:37"
},
{
"name": "sebastian/comparator",
@@ -6442,7 +6499,7 @@
},
{
"name": "symfony/yaml",
- "version": "v2.6.7",
+ "version": "v2.6.8",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
@@ -6502,7 +6559,8 @@
"alfaproject/omnipay-neteller": 20,
"alfaproject/omnipay-skrill": 20,
"omnipay/bitpay": 20,
- "wildbit/laravel-postmark-provider": 20
+ "wildbit/laravel-postmark-provider": 20,
+ "mach-kernel/omnipay-dwolla": 20
},
"prefer-stable": false,
"prefer-lowest": false,
diff --git a/database/seeds/PaymentLibrariesSeeder.php b/database/seeds/PaymentLibrariesSeeder.php
index a02a6c92135c..351eb56e7a72 100644
--- a/database/seeds/PaymentLibrariesSeeder.php
+++ b/database/seeds/PaymentLibrariesSeeder.php
@@ -25,6 +25,7 @@ class PaymentLibrariesSeeder extends Seeder
['name' => 'Sisow', 'provider' => 'Sisow', 'payment_library_id' => 1],
['name' => 'Skrill', 'provider' => 'Skrill', 'payment_library_id' => 1],
['name' => 'BitPay', 'provider' => 'BitPay', 'payment_library_id' => 1],
+ ['name' => 'Dwolla', 'provider' => 'Dwolla', 'payment_library_id' => 1],
];
foreach ($gateways as $gateway)
diff --git a/public/css/built.css b/public/css/built.css
index 77420cf91582..b7bb6dbbab3c 100644
--- a/public/css/built.css
+++ b/public/css/built.css
@@ -3204,6 +3204,12 @@ div.checkbox > label {
border-radius: 3px;
}
+.container input:focus,
+.container textarea:focus,
+.container select:focus {
+ background: #fff !important;
+}
+
.container input[placeholder],
.container textarea[placeholder],
.container select[placeholder] {
diff --git a/public/css/style.css b/public/css/style.css
index 3ffbd7538c59..0c2e7d33afea 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -820,6 +820,12 @@ div.checkbox > label {
border-radius: 3px;
}
+.container input:focus,
+.container textarea:focus,
+.container select:focus {
+ background: #fff !important;
+}
+
.container input[placeholder],
.container textarea[placeholder],
.container select[placeholder] {
diff --git a/readme.md b/readme.md
index ec3f19b5a709..3709ccde9d84 100644
--- a/readme.md
+++ b/readme.md
@@ -19,8 +19,9 @@ Developed by [@hillelcoren](https://twitter.com/hillelcoren) | Designed by [kant
* Live PDF generation
* Integrates with 30+ payment providers
* Recurring invoices
-* Tax rates and payment terms
+* Tasks with time-tracking
* Multi-user support
+* Tax rates and payment terms
* Partial payments
* Custom email templates
* [Zapier](https://zapier.com/) integration
diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php
index c425f8031181..818478b44e1f 100644
--- a/resources/lang/en/texts.php
+++ b/resources/lang/en/texts.php
@@ -135,8 +135,8 @@ return array(
'filter' => 'Filter',
'new_client' => 'New Client',
'new_invoice' => 'New Invoice',
- 'new_payment' => 'New Payment',
- 'new_credit' => 'New Credit',
+ 'new_payment' => 'Enter Payment',
+ 'new_credit' => 'Enter Credit',
'contact' => 'Contact',
'date_created' => 'Date Created',
'last_login' => 'Last Login',
@@ -671,5 +671,7 @@ return array(
'prefix' => 'Prefix',
'counter' => 'Counter',
+ 'payment_type_dwolla' => 'Dwolla',
+ 'gateway_help_43' => ':link to sign up for Dwolla.',
);
diff --git a/resources/views/accounts/account_gateway.blade.php b/resources/views/accounts/account_gateway.blade.php
index 01c123d1224c..23815b1b2f07 100644
--- a/resources/views/accounts/account_gateway.blade.php
+++ b/resources/views/accounts/account_gateway.blade.php
@@ -19,7 +19,7 @@
{!! Former::populateField('recommendedGateway_id', $accountGateway->gateway_id) !!}
@if ($config)
@foreach ($accountGateway->fields as $field => $junk)
- @if (in_array($field, ['solutionType', 'landingPage', 'headerImageUrl', 'brandName']))
+ @if (in_array($field, $hiddenFields))
{{-- do nothing --}}
@elseif (isset($config->$field))
{{ Former::populateField($accountGateway->gateway_id.'_'.$field, $config->$field) }}
@@ -46,9 +46,11 @@
@foreach ($gateway->fields as $field => $details)
- @if (in_array($field, ['solutionType', 'landingPage', 'headerImageUrl', 'brandName']))
+ @if (in_array($field, $hiddenFields))
{{-- do nothing --}}
- @elseif ($field == 'testMode' || $field == 'developerMode')
+ @elseif ($gateway->id == GATEWAY_DWOLLA && ($field == 'Key' || $field == 'Secret'))
+ {{-- do nothing --}}
+ @elseif ($field == 'testMode' || $field == 'developerMode' || $field == 'sandbox')
{!! Former::checkbox($gateway->id.'_'.$field)->label(Utils::toSpaceCase($field))->text('Enable')->value('true') !!}
@elseif ($field == 'username' || $field == 'password')
{!! Former::text($gateway->id.'_'.$field)->label('API '. ucfirst(Utils::toSpaceCase($field))) !!}
@@ -104,6 +106,8 @@
if (val == 'PAYMENT_TYPE_PAYPAL') {
setFieldsShown({{ GATEWAY_PAYPAL_EXPRESS }});
+ } else if (val == 'PAYMENT_TYPE_DWOLLA') {
+ setFieldsShown({{ GATEWAY_DWOLLA }});
} else {
setFieldsShown({{ GATEWAY_BITPAY }});
}
diff --git a/resources/views/clients/show.blade.php b/resources/views/clients/show.blade.php
index 0929d62702b2..880555fcbed4 100644
--- a/resources/views/clients/show.blade.php
+++ b/resources/views/clients/show.blade.php
@@ -25,7 +25,7 @@
]
)->split() !!}
- {!! DropdownButton::primary(trans('texts.create_invoice'))
+ {!! DropdownButton::primary(trans('texts.new_invoice'))
->withAttributes(['class'=>'primaryDropDown'])
->withContents($actionLinks)->split() !!}
@endif
diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php
index 42c5e3d8941c..292c22ea4d93 100644
--- a/resources/views/master.blade.php
+++ b/resources/views/master.blade.php
@@ -83,6 +83,7 @@
url = '/track' + url.replace('http:/', '');
dataLayer.push({'event':url, 'eventLabel':this.src});
}
+ function trackEvent(category, action) {}
@elseif (isset($_ENV['ANALYTICS_KEY']) && $_ENV['ANALYTICS_KEY'])
@else
@endif