From 1a8245dcff508b6e42216ba252746f8eeab5c840 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 31 May 2015 15:37:29 +0300 Subject: [PATCH] Adding support for Dwolla --- app/Console/Commands/SendRenewalInvoices.php | 2 +- .../Controllers/AccountGatewayController.php | 12 +- app/Http/Controllers/ClientController.php | 24 +- app/Http/Controllers/InvoiceController.php | 2 +- app/Http/Controllers/PaymentController.php | 9 +- app/Http/routes.php | 4 +- app/Models/Gateway.php | 38 +++ composer.json | 3 +- composer.lock | 248 +++++++++++------- database/seeds/PaymentLibrariesSeeder.php | 1 + public/css/built.css | 6 + public/css/style.css | 6 + readme.md | 3 +- resources/lang/en/texts.php | 6 +- .../views/accounts/account_gateway.blade.php | 10 +- resources/views/clients/show.blade.php | 2 +- resources/views/master.blade.php | 8 +- 17 files changed, 260 insertions(+), 124 deletions(-) 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 @@