diff --git a/app/Events/InvoicePaid.php b/app/Events/InvoicePaid.php index 42a50a8b7644..4dced73471a0 100644 --- a/app/Events/InvoicePaid.php +++ b/app/Events/InvoicePaid.php @@ -8,14 +8,16 @@ class InvoicePaid extends Event { use SerializesModels; + public $payment; + /** * Create a new event instance. * * @return void */ - public function __construct() + public function __construct($payment) { - // + $this->payment = $payment; } } diff --git a/app/Events/InvoiceSent.php b/app/Events/InvoiceSent.php index 365cc7485cd1..cbe08d0528f3 100644 --- a/app/Events/InvoiceSent.php +++ b/app/Events/InvoiceSent.php @@ -8,14 +8,16 @@ class InvoiceSent extends Event { use SerializesModels; + public $invoice; + /** * Create a new event instance. * * @return void */ - public function __construct() - { - // - } + public function __construct($invoice) + { + $this->invoice = $invoice; + } } diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index e54328e71247..a8f523fca51c 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -3,7 +3,10 @@ use Auth; use Utils; use View; +use URL; + use App\Models\Client; +use App\Models\Invoice; use App\Models\Size; use App\Models\PaymentTerm; use App\Models\Industry; diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 14102d7a2446..f52144178cd3 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -182,7 +182,6 @@ class InvoiceController extends BaseController if (!Session::has($invitationKey) && (!Auth::check() || Auth::user()->account_id != $invoice->account_id)) { Activity::viewInvoice($invitation); - //Event::fire('invoice.viewed', $invoice); Event::fire(new InvoiceViewed($invoice)); } diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index 3d5b8a468437..02b59b870efb 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -15,6 +15,7 @@ use App\Ninja\Repositories\PaymentRepository; use App\Ninja\Repositories\InvoiceRepository; use App\Ninja\Repositories\AccountRepository; use App\Ninja\Mailers\ContactMailer; +use App\Events\InvoicePaid; class PaymentController extends BaseController { @@ -669,7 +670,7 @@ class PaymentController extends BaseController $payment->save(); - Event::fire('invoice.paid', $payment); + Event::fire(new InvoicePaid($payment)); return $payment; } diff --git a/app/Http/Middleware/StartupCheck.php b/app/Http/Middleware/StartupCheck.php index e32e0a3b9625..0c37fd5d2cf5 100644 --- a/app/Http/Middleware/StartupCheck.php +++ b/app/Http/Middleware/StartupCheck.php @@ -9,6 +9,7 @@ use Redirect; use Cache; use App\Models\Currency; +use App\Events\UserSettingsChanged; class StartupCheck { @@ -106,7 +107,7 @@ class StartupCheck { // Make sure the account/user localization settings are in the session if (Auth::check() && !Session::has(SESSION_TIMEZONE)) { - Event::fire('user.refresh'); + Event::fire(new UserSettingsChanged()); } // Check if the user is claiming a license (ie, additional invoices, white label, etc.) diff --git a/app/Listeners/HandleInvoicePaid.php b/app/Listeners/HandleInvoicePaid.php index b1165c2e1a0a..159b001abad4 100644 --- a/app/Listeners/HandleInvoicePaid.php +++ b/app/Listeners/HandleInvoicePaid.php @@ -32,7 +32,8 @@ class HandleInvoicePaid { public function handle(InvoicePaid $event) { $this->contactMailer->sendPaymentConfirmation($payment); - + $invoice = $payment->invoice; + foreach ($invoice->account->users as $user) { if ($user->{'notify_paid'}) diff --git a/app/Listeners/HandleInvoiceSent.php b/app/Listeners/HandleInvoiceSent.php index 0ecdf78016c6..35a3a07106a6 100644 --- a/app/Listeners/HandleInvoiceSent.php +++ b/app/Listeners/HandleInvoiceSent.php @@ -28,6 +28,8 @@ class HandleInvoiceSent { */ public function handle(InvoiceSent $event) { + $invoice = $event->invoice; + foreach ($invoice->account->users as $user) { if ($user->{'notify_sent'}) diff --git a/app/Models/Client.php b/app/Models/Client.php index 0bfcc156e635..c13e3c5befd8 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -1,5 +1,7 @@ id_number) { - $str .= ''.trans('texts.id_number').': '.$this->id_number; - } - - return $str; - } - public function getVatNumber() { $str = ''; diff --git a/app/Models/Contact.php b/app/Models/Contact.php index da7fb3436d34..69653d91171f 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -1,5 +1,7 @@ save(); } - \Event::fire('invoice.sent', $invoice); + Event::fire(new InvoiceSent($invoice)); } public function sendPaymentConfirmation(Payment $payment) diff --git a/app/Ninja/Mailers/UserMailer.php b/app/Ninja/Mailers/UserMailer.php index 4bf1d2b51b23..ad82923b7727 100644 --- a/app/Ninja/Mailers/UserMailer.php +++ b/app/Ninja/Mailers/UserMailer.php @@ -1,10 +1,11 @@ version != NINJA_VERSION) { - $params = [ - 'user_version' => NINJA_VERSION, - 'latest_version'=> $data->version, - 'releases_link' => link_to(RELEASES_URL, 'Invoice Ninja', ['target' => '_blank']) - ]; - Session::put('news_feed_id', NEW_VERSION_AVAILABLE); - Session::put('news_feed_message', trans('texts.new_version_available', $params)); - } else { - Session::put('news_feed_id', $data->id); - if ($data->message && $data->id > Auth::user()->news_feed_id) { - Session::put('news_feed_message', $data->message); - } - } - } else { - Session::put('news_feed_id', true); - } - } - } - - // Check if we're requesting to change the account's language - if (Input::has('lang')) - { - $locale = Input::get('lang'); - App::setLocale($locale); - Session::set(SESSION_LOCALE, $locale); - - if (Auth::check()) - { - if ($language = Language::whereLocale($locale)->first()) - { - $account = Auth::user()->account; - $account->language_id = $language->id; - $account->save(); - } - } - } - else if (Auth::check()) - { - $locale = Session::get(SESSION_LOCALE, DEFAULT_LOCALE); - App::setLocale($locale); - } - - // Make sure the account/user localization settings are in the session - if (Auth::check() && !Session::has(SESSION_TIMEZONE)) - { - Event::fire('user.refresh'); - } - - // Check if the user is claiming a license (ie, additional invoices, white label, etc.) - $claimingLicense = Utils::startsWith($_SERVER['REQUEST_URI'], '/claim_license'); - if (!$claimingLicense && Input::has('license_key') && Input::has('product_id')) - { - $licenseKey = Input::get('license_key'); - $productId = Input::get('product_id'); - - $data = trim(file_get_contents((Utils::isNinjaDev() ? 'http://ninja.dev' : NINJA_APP_URL) . "/claim_license?license_key={$licenseKey}&product_id={$productId}")); - - if ($productId == PRODUCT_INVOICE_DESIGNS) - { - if ($data = json_decode($data)) - { - foreach ($data as $item) - { - $design = new InvoiceDesign(); - $design->id = $item->id; - $design->name = $item->name; - $design->javascript = $item->javascript; - $design->save(); - } - - if (!Utils::isNinjaProd()) { - Cache::forget('invoice_designs_cache_' . Auth::user()->maxInvoiceDesignId()); - } - - Session::flash('message', trans('texts.bought_designs')); - } - } - else if ($productId == PRODUCT_WHITE_LABEL) - { - if ($data == 'valid') - { - $account = Auth::user()->account; - $account->pro_plan_paid = NINJA_DATE; - $account->save(); - - Session::flash('message', trans('texts.bought_white_label')); - } - } - } - }); - - /* - |-------------------------------------------------------------------------- - | Authentication Filters - |-------------------------------------------------------------------------- - | - | The following filters are used to verify that the user of the current - | session is logged into this application. The "basic" filter easily - | integrates HTTP Basic authentication for quick, simple checking. - | - */ - - $router->filter('auth', function() - { - if (Auth::guest()) - { - if (Utils::isNinja() || Account::count() == 0) - { - return Redirect::guest('/'); - } - else - { - return Redirect::guest('/login'); - } - } - }); - - - $router->filter('auth.basic', function() - { - return Auth::basic(); - }); - - $router->filter('api.access', function() - { - $headers = Utils::getApiHeaders(); - - // check for a valid token - $token = AccountToken::where('token', '=', Request::header('X-Ninja-Token'))->first(['id', 'user_id']); - - if ($token) { - Auth::loginUsingId($token->user_id); - Session::set('token_id', $token->id); - } else { - sleep(3); - return Response::make('Invalid token', 403, $headers); - } - - if (!Utils::isNinja()) { - return null; - } - - if (!Utils::isPro()) { - return Response::make('API requires pro plan', 403, $headers); - } else { - $accountId = Auth::user()->account->id; - - // http://stackoverflow.com/questions/1375501/how-do-i-throttle-my-sites-api-users - $hour = 60 * 60; - $hour_limit = 100; # users are limited to 100 requests/hour - $hour_throttle = Cache::get("hour_throttle:{$accountId}", null); - $last_api_request = Cache::get("last_api_request:{$accountId}", 0); - $last_api_diff = time() - $last_api_request; - - if (is_null($hour_throttle)) { - $new_hour_throttle = 0; - } else { - $new_hour_throttle = $hour_throttle - $last_api_diff; - $new_hour_throttle = $new_hour_throttle < 0 ? 0 : $new_hour_throttle; - $new_hour_throttle += $hour / $hour_limit; - $hour_hits_remaining = floor(( $hour - $new_hour_throttle ) * $hour_limit / $hour); - $hour_hits_remaining = $hour_hits_remaining >= 0 ? $hour_hits_remaining : 0; - } - - if ($new_hour_throttle > $hour) { - $wait = ceil($new_hour_throttle - $hour); - sleep(1); - return Response::make("Please wait {$wait} second(s)", 403, $headers); - } - - Cache::put("hour_throttle:{$accountId}", $new_hour_throttle, 10); - Cache::put("last_api_request:{$accountId}", time(), 10); - } - - return null; - }); - - - - /* - |-------------------------------------------------------------------------- - | Guest Filter - |-------------------------------------------------------------------------- - | - | The "guest" filter is the counterpart of the authentication filters as - | it simply checks that the current user is not logged in. A redirect - | response will be issued if they are, which you may freely change. - | - */ - - $router->filter('guest', function() - { - if (Auth::check()) return Redirect::to('/'); - }); - - /* - |-------------------------------------------------------------------------- - | CSRF Protection Filter - |-------------------------------------------------------------------------- - | - | The CSRF filter is responsible for protecting your application against - | cross-site request forgery attacks. If this special token in a user - | session does not match the one given in this request, we'll bail. - | - */ - - $router->filter('csrf', function() - { - if ($_SERVER['REQUEST_URI'] != '/signup/register') - { - $token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token'); - - if (Session::token() != $token) - { - Session::flash('warning', trans('texts.session_expired')); - - return Redirect::to('/'); - //throw new Illuminate\Session\TokenMismatchException; - } - } - }); - - - - } - - /** - * Define the routes for the application. - * - * @param \Illuminate\Routing\Router $router - * @return void - */ - public function map(Router $router) - { - $router->group(['namespace' => $this->namespace], function($router) - { - require app_path('Http/routes.php'); - }); - } - -} diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 3e68c0ea9499..9bebd1fb3b3a 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -56,6 +56,8 @@ {!! Former::open('login')->rules(['email' => 'required|email', 'password' => 'required'])->addClass('form-signin') !!} + {{ Former::populateField('remember', 'true') }} + @@ -63,9 +65,10 @@

{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!} {!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!} + {!! Former::hidden('remember')->raw() !!}

-

{!! Button::success(trans('texts.lets_go'))->withAttributes(array('class' => 'btn-lg'))->submit()->block() !!}

+

{!! Button::success(trans('texts.lets_go'))->large()->submit()->block() !!}

-

{!! Button::success(trans('texts.send_email'))->withAttributes(array('class' => 'btn-lg'))->submit()->block() !!}

+

{!! Button::success(trans('texts.send_email'))->large()->submit()->block() !!}

@if (count($errors->all()))
diff --git a/resources/views/auth/reset.blade.php b/resources/views/auth/reset.blade.php index 7bdf2a66a550..85fd6e9a3e19 100644 --- a/resources/views/auth/reset.blade.php +++ b/resources/views/auth/reset.blade.php @@ -72,7 +72,7 @@

-

{!! Button::success(trans('texts.save'), array('class' => 'btn-lg'))->submit()->block() !!}

+

{!! Button::success(trans('texts.save'))->large()->submit()->block() !!}

@if (count($errors->all())) diff --git a/resources/views/clients/show.blade.php b/resources/views/clients/show.blade.php index 7e692a6bc552..d411e3bde44e 100644 --- a/resources/views/clients/show.blade.php +++ b/resources/views/clients/show.blade.php @@ -11,24 +11,23 @@
@if ($gatewayLink) - {{ Button::link($gatewayLink, trans('texts.view_in_stripe'), ['target' => '_blank']) }} + {!! Button::link($gatewayLink, trans('texts.view_in_stripe'), ['target' => '_blank']) !!} @endif @if ($client->trashed()) - {{ Button::primary(trans('texts.restore_client'), ['onclick' => 'onRestoreClick()']) }} + {!! Button::primary(trans('texts.restore_client'), ['onclick' => 'onRestoreClick()']) !!} @else - {{ DropdownButton::normal(trans('texts.edit_client'), - Navigation::links( - [ - [trans('texts.edit_client'), URL::to('clients/' . $client->public_id . '/edit')], - [Navigation::DIVIDER], - [trans('texts.archive_client'), "javascript:onArchiveClick()"], - [trans('texts.delete_client'), "javascript:onDeleteClick()"], + {!! DropdownButton::normal(trans('texts.edit_client')) + ->withAttributes(['class'=>'normalDropDown']) + ->withContents([ + ['label' => trans('texts.edit_client'), 'url' => URL::to('clients/' . $client->public_id . '/edit')], + Navigation::NAVIGATION_DIVIDER, + ['label' => trans('texts.archive_client'), 'url' => "javascript:onArchiveClick()"], + ['label' => trans('texts.delete_client'), 'url' => "javascript:onDeleteClick()"], ] - ) - , ['id'=>'normalDropDown'])->split() }} + )->split() !!} - {{ DropdownButton::primary(trans('texts.create_invoice'), Navigation::links($actionLinks), ['id'=>'primaryDropDown'])->split() }} + {!! DropdownButton::primary(trans('texts.create_invoice'), Navigation::links($actionLinks), ['id'=>'primaryDropDown'])->split() !!} @endif {!! Former::close() !!} @@ -46,9 +45,11 @@

{{ trans('texts.details') }}

-

{{ $client->getIdNumber() }}

+ @if ($client->id_number) +

{{ trans('texts.id_number').': '.$this->id_number }}

+ @endif

{{ $client->getVatNumber() }}

-

{{ $client->getAddress() }}

+

{{ $client->getAddress() }}

{{ $client->getCustomFields() }}

{{ $client->getPhone() }}

{{ $client->getNotes() }}

@@ -203,10 +204,10 @@