mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-08 06:14:31 -04:00
Added custom invoice text fields
This commit is contained in:
parent
bb5cc6f645
commit
1d04bc2a05
@ -29,13 +29,20 @@ class SendRenewalInvoices extends Command
|
|||||||
$this->info(date('Y-m-d').' Running SendRenewalInvoices...');
|
$this->info(date('Y-m-d').' Running SendRenewalInvoices...');
|
||||||
$today = new DateTime();
|
$today = new DateTime();
|
||||||
|
|
||||||
|
// get all accounts with pro plans expiring in 10 days
|
||||||
$accounts = Account::whereRaw('datediff(curdate(), pro_plan_paid) = 355')->get();
|
$accounts = Account::whereRaw('datediff(curdate(), pro_plan_paid) = 355')->get();
|
||||||
$this->info(count($accounts).' accounts found');
|
$this->info(count($accounts).' accounts found');
|
||||||
|
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$client = $this->accountRepo->getNinjaClient($account);
|
$client = $this->accountRepo->getNinjaClient($account);
|
||||||
$invitation = $this->accountRepo->createNinjaInvoice($client);
|
$invitation = $this->accountRepo->createNinjaInvoice($client);
|
||||||
$this->mailer->sendInvoice($invitation->invoice);
|
|
||||||
|
// set the due date to 10 days from now
|
||||||
|
$invoice = $invitation->invoice;
|
||||||
|
$invoice->due_date = date('Y-m-d', strtotime('+ 10 days'));
|
||||||
|
$invoice->save();
|
||||||
|
|
||||||
|
$this->mailer->sendInvoice($invoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->info('Done');
|
$this->info('Done');
|
||||||
|
@ -43,6 +43,7 @@ use App\Ninja\Mailers\ContactMailer;
|
|||||||
use App\Events\UserSignedUp;
|
use App\Events\UserSignedUp;
|
||||||
use App\Events\UserLoggedIn;
|
use App\Events\UserLoggedIn;
|
||||||
use App\Events\UserSettingsChanged;
|
use App\Events\UserSettingsChanged;
|
||||||
|
use App\Services\AuthService;
|
||||||
|
|
||||||
class AccountController extends BaseController
|
class AccountController extends BaseController
|
||||||
{
|
{
|
||||||
@ -110,7 +111,6 @@ class AccountController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
Auth::login($user, true);
|
Auth::login($user, true);
|
||||||
event(new UserSignedUp());
|
|
||||||
event(new UserLoggedIn());
|
event(new UserLoggedIn());
|
||||||
|
|
||||||
$redirectTo = Input::get('redirect_to') ?: 'invoices/create';
|
$redirectTo = Input::get('redirect_to') ?: 'invoices/create';
|
||||||
@ -121,13 +121,6 @@ class AccountController extends BaseController
|
|||||||
{
|
{
|
||||||
$invitation = $this->accountRepo->enableProPlan();
|
$invitation = $this->accountRepo->enableProPlan();
|
||||||
|
|
||||||
/*
|
|
||||||
if ($invoice)
|
|
||||||
{
|
|
||||||
$this->contactMailer->sendInvoice($invoice);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return $invitation->invitation_key;
|
return $invitation->invitation_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,7 +146,12 @@ class AccountController extends BaseController
|
|||||||
public function showSection($section = ACCOUNT_DETAILS, $subSection = false)
|
public function showSection($section = ACCOUNT_DETAILS, $subSection = false)
|
||||||
{
|
{
|
||||||
if ($section == ACCOUNT_DETAILS) {
|
if ($section == ACCOUNT_DETAILS) {
|
||||||
$primaryUser = Auth::user()->account->users()->orderBy('id')->first();
|
|
||||||
|
$oauthLoginUrls = [];
|
||||||
|
foreach (AuthService::$providers as $provider) {
|
||||||
|
$oauthLoginUrls[] = ['label' => $provider, 'url' => '/auth/' . strtolower($provider)];
|
||||||
|
}
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
|
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
|
||||||
'countries' => Cache::get('countries'),
|
'countries' => Cache::get('countries'),
|
||||||
@ -164,9 +162,10 @@ class AccountController extends BaseController
|
|||||||
'datetimeFormats' => Cache::get('datetimeFormats'),
|
'datetimeFormats' => Cache::get('datetimeFormats'),
|
||||||
'currencies' => Cache::get('currencies'),
|
'currencies' => Cache::get('currencies'),
|
||||||
'languages' => Cache::get('languages'),
|
'languages' => Cache::get('languages'),
|
||||||
'showUser' => Auth::user()->id === $primaryUser->id,
|
|
||||||
'title' => trans('texts.company_details'),
|
'title' => trans('texts.company_details'),
|
||||||
'primaryUser' => $primaryUser,
|
'user' => Auth::user(),
|
||||||
|
'oauthProviderName' => AuthService::getProviderName(Auth::user()->oauth_provider_id),
|
||||||
|
'oauthLoginUrls' => $oauthLoginUrls,
|
||||||
];
|
];
|
||||||
|
|
||||||
return View::make('accounts.details', $data);
|
return View::make('accounts.details', $data);
|
||||||
@ -402,6 +401,8 @@ class AccountController extends BaseController
|
|||||||
$account->custom_invoice_label2 = trim(Input::get('custom_invoice_label2'));
|
$account->custom_invoice_label2 = trim(Input::get('custom_invoice_label2'));
|
||||||
$account->custom_invoice_taxes1 = Input::get('custom_invoice_taxes1') ? true : false;
|
$account->custom_invoice_taxes1 = Input::get('custom_invoice_taxes1') ? true : false;
|
||||||
$account->custom_invoice_taxes2 = Input::get('custom_invoice_taxes2') ? true : false;
|
$account->custom_invoice_taxes2 = Input::get('custom_invoice_taxes2') ? true : false;
|
||||||
|
$account->custom_invoice_text_label1 = trim(Input::get('custom_invoice_text_label1'));
|
||||||
|
$account->custom_invoice_text_label2 = trim(Input::get('custom_invoice_text_label2'));
|
||||||
|
|
||||||
$account->invoice_number_prefix = Input::get('invoice_number_prefix');
|
$account->invoice_number_prefix = Input::get('invoice_number_prefix');
|
||||||
$account->invoice_number_counter = Input::get('invoice_number_counter');
|
$account->invoice_number_counter = Input::get('invoice_number_counter');
|
||||||
@ -722,23 +723,21 @@ class AccountController extends BaseController
|
|||||||
$account->military_time = Input::get('military_time') ? true : false;
|
$account->military_time = Input::get('military_time') ? true : false;
|
||||||
$account->save();
|
$account->save();
|
||||||
|
|
||||||
if (Auth::user()->id === $user->id) {
|
$user = Auth::user();
|
||||||
$user = Auth::user();
|
$user->first_name = trim(Input::get('first_name'));
|
||||||
$user->first_name = trim(Input::get('first_name'));
|
$user->last_name = trim(Input::get('last_name'));
|
||||||
$user->last_name = trim(Input::get('last_name'));
|
$user->username = trim(Input::get('email'));
|
||||||
$user->username = trim(Input::get('email'));
|
$user->email = trim(strtolower(Input::get('email')));
|
||||||
$user->email = trim(strtolower(Input::get('email')));
|
$user->phone = trim(Input::get('phone'));
|
||||||
$user->phone = trim(Input::get('phone'));
|
if (Utils::isNinja()) {
|
||||||
if (Utils::isNinja()) {
|
if (Input::get('referral_code') && !$user->referral_code) {
|
||||||
if (Input::get('referral_code')) {
|
$user->referral_code = $this->accountRepo->getReferralCode();
|
||||||
$user->referral_code = $this->accountRepo->getReferralCode();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (Utils::isNinjaDev()) {
|
|
||||||
$user->dark_mode = Input::get('dark_mode') ? true : false;
|
|
||||||
}
|
|
||||||
$user->save();
|
|
||||||
}
|
}
|
||||||
|
if (Utils::isNinjaDev()) {
|
||||||
|
$user->dark_mode = Input::get('dark_mode') ? true : false;
|
||||||
|
}
|
||||||
|
$user->save();
|
||||||
|
|
||||||
/* Logo image file */
|
/* Logo image file */
|
||||||
if ($file = Input::file('logo')) {
|
if ($file = Input::file('logo')) {
|
||||||
@ -818,21 +817,11 @@ class AccountController extends BaseController
|
|||||||
$user->registered = true;
|
$user->registered = true;
|
||||||
$user->save();
|
$user->save();
|
||||||
|
|
||||||
if (Utils::isNinjaProd()) {
|
|
||||||
$this->userMailer->sendConfirmation($user);
|
|
||||||
}
|
|
||||||
|
|
||||||
$activities = Activity::scope()->get();
|
|
||||||
foreach ($activities as $activity) {
|
|
||||||
$activity->message = str_replace('Guest', $user->getFullName(), $activity->message);
|
|
||||||
$activity->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Input::get('go_pro') == 'true') {
|
if (Input::get('go_pro') == 'true') {
|
||||||
Session::set(REQUESTED_PRO_PLAN, true);
|
Session::set(REQUESTED_PRO_PLAN, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Session::set(SESSION_COUNTER, -1);
|
event(new UserSignedUp());
|
||||||
|
|
||||||
return "{$user->first_name} {$user->last_name}";
|
return "{$user->first_name} {$user->last_name}";
|
||||||
}
|
}
|
||||||
|
@ -20,18 +20,21 @@ use App\Models\Industry;
|
|||||||
use App\Ninja\Mailers\Mailer;
|
use App\Ninja\Mailers\Mailer;
|
||||||
use App\Ninja\Repositories\AccountRepository;
|
use App\Ninja\Repositories\AccountRepository;
|
||||||
use App\Events\UserSettingsChanged;
|
use App\Events\UserSettingsChanged;
|
||||||
|
use App\Services\EmailService;
|
||||||
|
|
||||||
class AppController extends BaseController
|
class AppController extends BaseController
|
||||||
{
|
{
|
||||||
protected $accountRepo;
|
protected $accountRepo;
|
||||||
protected $mailer;
|
protected $mailer;
|
||||||
|
protected $emailService;
|
||||||
|
|
||||||
public function __construct(AccountRepository $accountRepo, Mailer $mailer)
|
public function __construct(AccountRepository $accountRepo, Mailer $mailer, EmailService $emailService)
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
|
||||||
$this->accountRepo = $accountRepo;
|
$this->accountRepo = $accountRepo;
|
||||||
$this->mailer = $mailer;
|
$this->mailer = $mailer;
|
||||||
|
$this->emailService = $emailService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function showSetup()
|
public function showSetup()
|
||||||
@ -195,4 +198,19 @@ class AppController extends BaseController
|
|||||||
|
|
||||||
return Redirect::to('/');
|
return Redirect::to('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function emailBounced()
|
||||||
|
{
|
||||||
|
$messageId = Input::get('MessageID');
|
||||||
|
$error = Input::get('Name') . ': ' . Input::get('Description');
|
||||||
|
return $this->emailService->markBounced($messageId, $error) ? RESULT_SUCCESS : RESULT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function emailOpened()
|
||||||
|
{
|
||||||
|
$messageId = Input::get('MessageID');
|
||||||
|
return $this->emailService->markOpened($messageId) ? RESULT_SUCCESS : RESULT_FAILURE;
|
||||||
|
|
||||||
|
return RESULT_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ use App\Models\User;
|
|||||||
use App\Events\UserLoggedIn;
|
use App\Events\UserLoggedIn;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Ninja\Repositories\AccountRepository;
|
use App\Ninja\Repositories\AccountRepository;
|
||||||
|
use App\Services\AuthService;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
use Illuminate\Contracts\Auth\Guard;
|
||||||
use Illuminate\Contracts\Auth\Registrar;
|
use Illuminate\Contracts\Auth\Registrar;
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
||||||
@ -30,6 +31,7 @@ class AuthController extends Controller {
|
|||||||
|
|
||||||
protected $loginPath = '/login';
|
protected $loginPath = '/login';
|
||||||
protected $redirectTo = '/dashboard';
|
protected $redirectTo = '/dashboard';
|
||||||
|
protected $authService;
|
||||||
protected $accountRepo;
|
protected $accountRepo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,15 +41,29 @@ class AuthController extends Controller {
|
|||||||
* @param \Illuminate\Contracts\Auth\Registrar $registrar
|
* @param \Illuminate\Contracts\Auth\Registrar $registrar
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(Guard $auth, Registrar $registrar, AccountRepository $repo)
|
public function __construct(Guard $auth, Registrar $registrar, AccountRepository $repo, AuthService $authService)
|
||||||
{
|
{
|
||||||
$this->auth = $auth;
|
$this->auth = $auth;
|
||||||
$this->registrar = $registrar;
|
$this->registrar = $registrar;
|
||||||
$this->accountRepo = $repo;
|
$this->accountRepo = $repo;
|
||||||
|
$this->authService = $authService;
|
||||||
|
|
||||||
//$this->middleware('guest', ['except' => 'getLogout']);
|
//$this->middleware('guest', ['except' => 'getLogout']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function authLogin($provider, Request $request)
|
||||||
|
{
|
||||||
|
return $this->authService->execute($provider, $request->has('code'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authUnlink()
|
||||||
|
{
|
||||||
|
$this->accountRepo->unlinkUserFromOauth(Auth::user());
|
||||||
|
|
||||||
|
Session::flash('message', trans('texts.updated_settings'));
|
||||||
|
return redirect()->to('/company/details');
|
||||||
|
}
|
||||||
|
|
||||||
public function getLoginWrapper()
|
public function getLoginWrapper()
|
||||||
{
|
{
|
||||||
if (!Utils::isNinja() && !User::count()) {
|
if (!Utils::isNinja() && !User::count()) {
|
||||||
@ -63,7 +79,7 @@ class AuthController extends Controller {
|
|||||||
$user = User::where('email', '=', $request->input('email'))->first();
|
$user = User::where('email', '=', $request->input('email'))->first();
|
||||||
|
|
||||||
if ($user && $user->failed_logins >= 3) {
|
if ($user && $user->failed_logins >= 3) {
|
||||||
Session::flash('error', 'These credentials do not match our records.');
|
Session::flash('error', trans('texts.invalid_credentials'));
|
||||||
return redirect()->to('login');
|
return redirect()->to('login');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,20 +358,26 @@ class InvoiceController extends BaseController
|
|||||||
$data['formIsChanged'] = true;
|
$data['formIsChanged'] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the invitation link on the client's contacts
|
// Set the invitation data on the client's contacts
|
||||||
if (!$clone) {
|
if (!$clone) {
|
||||||
$clients = $data['clients'];
|
$clients = $data['clients'];
|
||||||
foreach ($clients as $client) {
|
foreach ($clients as $client) {
|
||||||
if ($client->id == $invoice->client->id) {
|
if ($client->id != $invoice->client->id) {
|
||||||
foreach ($invoice->invitations as $invitation) {
|
continue;
|
||||||
foreach ($client->contacts as $contact) {
|
}
|
||||||
if ($invitation->contact_id == $contact->id) {
|
|
||||||
$contact->invitation_link = $invitation->getLink();
|
foreach ($invoice->invitations as $invitation) {
|
||||||
}
|
foreach ($client->contacts as $contact) {
|
||||||
|
if ($invitation->contact_id == $contact->id) {
|
||||||
|
$contact->email_error = $invitation->email_error;
|
||||||
|
$contact->invitation_link = $invitation->getLink();
|
||||||
|
$contact->invitation_viewed = $invitation->viewed_date;
|
||||||
|
$contact->invitation_status = $contact->email_error ? false : $invitation->getStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@ class VerifyCsrfToken extends BaseVerifier {
|
|||||||
'api/v1/tasks',
|
'api/v1/tasks',
|
||||||
'api/v1/email_invoice',
|
'api/v1/email_invoice',
|
||||||
'api/v1/hooks',
|
'api/v1/hooks',
|
||||||
|
'hook/email_opened',
|
||||||
|
'hook/email_bounced',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,6 +63,10 @@ Route::post('signup/validate', 'AccountController@checkEmail');
|
|||||||
Route::post('signup/submit', 'AccountController@submitSignup');
|
Route::post('signup/submit', 'AccountController@submitSignup');
|
||||||
|
|
||||||
Route::get('auth/{provider}', 'Auth\AuthController@authLogin');
|
Route::get('auth/{provider}', 'Auth\AuthController@authLogin');
|
||||||
|
Route::get('auth_unlink', 'Auth\AuthController@authUnlink');
|
||||||
|
|
||||||
|
Route::post('hook/email_bounced', 'AppController@emailBounced');
|
||||||
|
Route::post('hook/email_opened', 'AppController@emailOpened');
|
||||||
|
|
||||||
|
|
||||||
// Laravel auth routes
|
// Laravel auth routes
|
||||||
@ -436,7 +440,7 @@ if (!defined('CONTACT_EMAIL')) {
|
|||||||
|
|
||||||
define('SOCIAL_GOOGLE', 'Google');
|
define('SOCIAL_GOOGLE', 'Google');
|
||||||
define('SOCIAL_FACEBOOK', 'Facebook');
|
define('SOCIAL_FACEBOOK', 'Facebook');
|
||||||
define('SOCIAL_GITHUB', 'Github');
|
define('SOCIAL_GITHUB', 'GitHub');
|
||||||
define('SOCIAL_LINKEDIN', 'LinkedIn');
|
define('SOCIAL_LINKEDIN', 'LinkedIn');
|
||||||
|
|
||||||
|
|
||||||
|
@ -672,31 +672,6 @@ class Utils
|
|||||||
fwrite($output, "\n");
|
fwrite($output, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function stringToObjectResolution($baseObject, $rawPath)
|
|
||||||
{
|
|
||||||
$val = '';
|
|
||||||
|
|
||||||
if (!is_object($baseObject)) {
|
|
||||||
return $val;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path = preg_split('/->/', $rawPath);
|
|
||||||
$node = $baseObject;
|
|
||||||
|
|
||||||
while (($prop = array_shift($path)) !== null) {
|
|
||||||
if (property_exists($node, $prop)) {
|
|
||||||
$val = $node->$prop;
|
|
||||||
$node = $node->$prop;
|
|
||||||
} else if (is_object($node) && isset($node->$prop)) {
|
|
||||||
$node = $node->{$prop};
|
|
||||||
} else if ( method_exists($node, $prop)) {
|
|
||||||
$val = call_user_func(array($node, $prop));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getFirst($values) {
|
public static function getFirst($values) {
|
||||||
if (is_array($values)) {
|
if (is_array($values)) {
|
||||||
return count($values) ? $values[0] : false;
|
return count($values) ? $values[0] : false;
|
||||||
@ -753,4 +728,12 @@ class Utils
|
|||||||
}
|
}
|
||||||
return $domain;
|
return $domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function splitName($name) {
|
||||||
|
$name = trim($name);
|
||||||
|
$lastName = (strpos($name, ' ') === false) ? '' : preg_replace('#.*\s([\w-]*)$#', '$1', $name);
|
||||||
|
$firstName = trim( preg_replace('#'.$lastName.'#', '', $name ) );
|
||||||
|
return array($firstName, $lastName);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,52 @@
|
|||||||
<?php namespace App\Listeners;
|
<?php namespace app\Listeners;
|
||||||
|
|
||||||
use Utils;
|
use Utils;
|
||||||
use Auth;
|
use Auth;
|
||||||
use App\Events\UserSignedUp;
|
use App\Events\UserSignedUp;
|
||||||
|
use App\Models\Activity;
|
||||||
use App\Ninja\Repositories\AccountRepository;
|
use App\Ninja\Repositories\AccountRepository;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use App\Ninja\Mailers\UserMailer;
|
||||||
use Illuminate\Contracts\Queue\ShouldBeQueued;
|
|
||||||
|
|
||||||
class HandleUserSignedUp {
|
|
||||||
|
|
||||||
|
class HandleUserSignedUp
|
||||||
|
{
|
||||||
protected $accountRepo;
|
protected $accountRepo;
|
||||||
|
protected $userMailer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the event handler.
|
* Create the event handler.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(AccountRepository $accountRepo)
|
public function __construct(AccountRepository $accountRepo, UserMailer $userMailer)
|
||||||
{
|
{
|
||||||
$this->accountRepo = $accountRepo;
|
$this->accountRepo = $accountRepo;
|
||||||
|
$this->userMailer = $userMailer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the event.
|
* Handle the event.
|
||||||
*
|
*
|
||||||
* @param UserSignedUp $event
|
* @param UserSignedUp $event
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function handle(UserSignedUp $event)
|
public function handle(UserSignedUp $event)
|
||||||
{
|
{
|
||||||
if (!Utils::isNinjaProd()) {
|
$user = Auth::user();
|
||||||
$this->accountRepo->registerUser(Auth::user());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (Utils::isNinjaProd()) {
|
||||||
|
$this->userMailer->sendConfirmation($user);
|
||||||
|
} elseif (Utils::isNinjaDev()) {
|
||||||
|
// do nothing
|
||||||
|
} else {
|
||||||
|
$this->accountRepo->registerNinjaUser($user);
|
||||||
|
}
|
||||||
|
|
||||||
|
$activities = Activity::scope()->get();
|
||||||
|
foreach ($activities as $activity) {
|
||||||
|
$activity->message = str_replace('Guest', $user->getFullName(), $activity->message);
|
||||||
|
$activity->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
session([SESSION_COUNTER => -1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,8 +149,13 @@ class Activity extends Eloquent
|
|||||||
|
|
||||||
public static function emailInvoice($invitation)
|
public static function emailInvoice($invitation)
|
||||||
{
|
{
|
||||||
$adjustment = 0;
|
$invoice = $invitation->invoice;
|
||||||
$client = $invitation->invoice->client;
|
$client = $invoice->client;
|
||||||
|
|
||||||
|
if (!$invoice->isSent()) {
|
||||||
|
$invoice->invoice_status_id = INVOICE_STATUS_SENT;
|
||||||
|
$invoice->save();
|
||||||
|
}
|
||||||
|
|
||||||
$activity = Activity::getBlank($invitation);
|
$activity = Activity::getBlank($invitation);
|
||||||
$activity->client_id = $invitation->invoice->client_id;
|
$activity->client_id = $invitation->invoice->client_id;
|
||||||
|
@ -39,15 +39,35 @@ class Invitation extends EntityModel
|
|||||||
|
|
||||||
if ($iframe_url) {
|
if ($iframe_url) {
|
||||||
return "{$iframe_url}/?{$this->invitation_key}";
|
return "{$iframe_url}/?{$this->invitation_key}";
|
||||||
} else if ($this->account->subdomain) {
|
} elseif ($this->account->subdomain) {
|
||||||
$url = Utils::replaceSubdomain($url, $this->account->subdomain);
|
$url = Utils::replaceSubdomain($url, $this->account->subdomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
return "{$url}/view/{$this->invitation_key}";
|
return "{$url}/view/{$this->invitation_key}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getStatus()
|
||||||
|
{
|
||||||
|
$hasValue = false;
|
||||||
|
$parts = [];
|
||||||
|
$statuses = $this->message_id ? ['sent', 'opened', 'viewed'] : ['sent', 'viewed'];
|
||||||
|
|
||||||
|
foreach ($statuses as $status) {
|
||||||
|
$field = "{$status}_date";
|
||||||
|
$date = '';
|
||||||
|
if ($this->$field) {
|
||||||
|
$date = Utils::dateToString($this->$field);
|
||||||
|
$hasValue = true;
|
||||||
|
}
|
||||||
|
$parts[] = trans('texts.invitation_status.' . $status) . ': ' . $date;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $hasValue ? implode($parts, '<br/>') : false;
|
||||||
|
}
|
||||||
|
|
||||||
public function getName()
|
public function getName()
|
||||||
{
|
{
|
||||||
return $this->invitation_key;
|
return $this->invitation_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -140,6 +140,8 @@ class Invoice extends EntityModel
|
|||||||
'custom_taxes2',
|
'custom_taxes2',
|
||||||
'partial',
|
'partial',
|
||||||
'has_tasks',
|
'has_tasks',
|
||||||
|
'custom_text_value1',
|
||||||
|
'custom_text_value2',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->client->setVisible([
|
$this->client->setVisible([
|
||||||
@ -187,6 +189,8 @@ class Invoice extends EntityModel
|
|||||||
'custom_invoice_label2',
|
'custom_invoice_label2',
|
||||||
'pdf_email_attachment',
|
'pdf_email_attachment',
|
||||||
'show_item_taxes',
|
'show_item_taxes',
|
||||||
|
'custom_invoice_text_label1',
|
||||||
|
'custom_invoice_text_label2',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
foreach ($this->invoice_items as $invoiceItem) {
|
foreach ($this->invoice_items as $invoiceItem) {
|
||||||
@ -283,7 +287,7 @@ class Invoice extends EntityModel
|
|||||||
|
|
||||||
public function updateCachedPDF($encodedString = false)
|
public function updateCachedPDF($encodedString = false)
|
||||||
{
|
{
|
||||||
if (!$encodedString) {
|
if (!$encodedString && env('PHANTOMJS_CLOUD_KEY')) {
|
||||||
$invitation = $this->invitations[0];
|
$invitation = $this->invitations[0];
|
||||||
$link = $invitation->getLink();
|
$link = $invitation->getLink();
|
||||||
|
|
||||||
|
@ -31,70 +31,71 @@ class ContactMailer extends Mailer
|
|||||||
$invoice->updateCachedPDF();
|
$invoice->updateCachedPDF();
|
||||||
}
|
}
|
||||||
|
|
||||||
$view = 'invoice';
|
$emailTemplate = $account->getEmailTemplate($reminder ?: $entityType);
|
||||||
$accountName = $invoice->account->getDisplayName();
|
$emailSubject = $account->getEmailSubject($reminder ?: $entityType);
|
||||||
$emailTemplate = $invoice->account->getEmailTemplate($reminder ?: $entityType);
|
|
||||||
$emailSubject = $invoice->account->getEmailSubject($reminder ?: $entityType);
|
|
||||||
|
|
||||||
$this->initClosure($invoice);
|
|
||||||
$response = false;
|
|
||||||
$sent = false;
|
$sent = false;
|
||||||
|
|
||||||
foreach ($invoice->invitations as $invitation) {
|
foreach ($invoice->invitations as $invitation) {
|
||||||
if (Auth::check()) {
|
if ($this->sendInvitation($invitation, $invoice, $emailTemplate, $emailSubject)) {
|
||||||
$user = Auth::user();
|
|
||||||
} else {
|
|
||||||
$user = $invitation->user;
|
|
||||||
if ($invitation->user->trashed()) {
|
|
||||||
$user = $account->users()->orderBy('id')->first();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$user->email || !$user->confirmed) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$invitation->contact->email
|
|
||||||
|| $invitation->contact->trashed()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$invitation->sent_date = \Carbon::now()->toDateTimeString();
|
|
||||||
$invitation->save();
|
|
||||||
|
|
||||||
$variables = [
|
|
||||||
'account' => $account,
|
|
||||||
'client' => $client,
|
|
||||||
'invitation' => $invitation,
|
|
||||||
'amount' => $invoice->getRequestedAmount()
|
|
||||||
];
|
|
||||||
|
|
||||||
$data['body'] = $this->processVariables($emailTemplate, $variables);
|
|
||||||
$data['link'] = $invitation->getLink();
|
|
||||||
$data['entityType'] = $entityType;
|
|
||||||
$data['invoice_id'] = $invoice->id;
|
|
||||||
|
|
||||||
$subject = $this->processVariables($emailSubject, $variables);
|
|
||||||
$fromEmail = $user->email;
|
|
||||||
$response = $this->sendTo($invitation->contact->email, $fromEmail, $accountName, $subject, $view, $data);
|
|
||||||
|
|
||||||
if ($response === true) {
|
|
||||||
$sent = true;
|
$sent = true;
|
||||||
Activity::emailInvoice($invitation);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($sent === true) {
|
$account->loadLocalizationSettings();
|
||||||
if (!$invoice->isSent()) {
|
|
||||||
$invoice->invoice_status_id = INVOICE_STATUS_SENT;
|
|
||||||
$invoice->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
$account->loadLocalizationSettings();
|
if ($sent === true) {
|
||||||
Event::fire(new InvoiceSent($invoice));
|
Event::fire(new InvoiceSent($invoice));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $response ?: trans('texts.email_error');
|
return $sent ?: trans('texts.email_error');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sendInvitation($invitation, $invoice, $body, $subject)
|
||||||
|
{
|
||||||
|
$client = $invoice->client;
|
||||||
|
$account = $invoice->account;
|
||||||
|
|
||||||
|
if (Auth::check()) {
|
||||||
|
$user = Auth::user();
|
||||||
|
} else {
|
||||||
|
$user = $invitation->user;
|
||||||
|
if ($invitation->user->trashed()) {
|
||||||
|
$user = $account->users()->orderBy('id')->first();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user->email || !$user->confirmed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$invitation->contact->email || $invitation->contact->trashed()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$variables = [
|
||||||
|
'account' => $account,
|
||||||
|
'client' => $client,
|
||||||
|
'invitation' => $invitation,
|
||||||
|
'amount' => $invoice->getRequestedAmount()
|
||||||
|
];
|
||||||
|
|
||||||
|
$data['body'] = $this->processVariables($body, $variables);
|
||||||
|
$data['link'] = $invitation->getLink();
|
||||||
|
$data['entityType'] = $invoice->getEntityType();
|
||||||
|
$data['invoiceId'] = $invoice->id;
|
||||||
|
$data['invitation'] = $invitation;
|
||||||
|
|
||||||
|
$subject = $this->processVariables($subject, $variables);
|
||||||
|
$fromEmail = $user->email;
|
||||||
|
$response = $this->sendTo($invitation->contact->email, $fromEmail, $account->getDisplayName(), $subject, ENTITY_INVOICE, $data);
|
||||||
|
|
||||||
|
if ($response === true) {
|
||||||
|
Activity::emailInvoice($invitation);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sendPaymentConfirmation(Payment $payment)
|
public function sendPaymentConfirmation(Payment $payment)
|
||||||
@ -110,8 +111,6 @@ class ContactMailer extends Mailer
|
|||||||
$emailTemplate = $account->getEmailTemplate(ENTITY_PAYMENT);
|
$emailTemplate = $account->getEmailTemplate(ENTITY_PAYMENT);
|
||||||
$emailSubject = $invoice->account->getEmailSubject(ENTITY_PAYMENT);
|
$emailSubject = $invoice->account->getEmailSubject(ENTITY_PAYMENT);
|
||||||
|
|
||||||
$this->initClosure($invoice);
|
|
||||||
|
|
||||||
if ($payment->invitation) {
|
if ($payment->invitation) {
|
||||||
$user = $payment->invitation->user;
|
$user = $payment->invitation->user;
|
||||||
$contact = $payment->contact;
|
$contact = $payment->contact;
|
||||||
@ -190,26 +189,7 @@ class ContactMailer extends Mailer
|
|||||||
}
|
}
|
||||||
|
|
||||||
$str = str_replace(array_keys($variables), array_values($variables), $template);
|
$str = str_replace(array_keys($variables), array_values($variables), $template);
|
||||||
$str = preg_replace_callback('/\{\{\$?(.*)\}\}/', $this->advancedTemplateHandler, $str);
|
|
||||||
|
|
||||||
return $str;
|
return $str;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function initClosure($object)
|
|
||||||
{
|
|
||||||
$this->advancedTemplateHandler = function($match) use ($object) {
|
|
||||||
for ($i = 1; $i < count($match); $i++) {
|
|
||||||
$blobConversion = $match[$i];
|
|
||||||
|
|
||||||
if (isset($$blobConversion)) {
|
|
||||||
return $$blobConversion;
|
|
||||||
} else if (preg_match('/trans\(([\w\.]+)\)/', $blobConversion, $regexTranslation)) {
|
|
||||||
return trans($regexTranslation[1]);
|
|
||||||
} else if (strpos($blobConversion, '->') !== false) {
|
|
||||||
return Utils::stringToObjectResolution($object, $blobConversion);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,7 @@ class Mailer
|
|||||||
{
|
{
|
||||||
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = [])
|
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = [])
|
||||||
{
|
{
|
||||||
// https://github.com/wildbit/laravel-postmark-provider/issues/2
|
if (isset($_ENV['POSTMARK_API_TOKEN'])) {
|
||||||
if (isset($data['invoice_id']) && isset($_ENV['POSTMARK_API_TOKEN'])) {
|
|
||||||
$views = 'emails.'.$view.'_html';
|
$views = 'emails.'.$view.'_html';
|
||||||
} else {
|
} else {
|
||||||
$views = [
|
$views = [
|
||||||
@ -20,7 +19,7 @@ class Mailer
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $data) {
|
$response = Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $data) {
|
||||||
|
|
||||||
$toEmail = strtolower($toEmail);
|
$toEmail = strtolower($toEmail);
|
||||||
$replyEmail = $fromEmail;
|
$replyEmail = $fromEmail;
|
||||||
@ -31,8 +30,9 @@ class Mailer
|
|||||||
->replyTo($replyEmail, $fromName)
|
->replyTo($replyEmail, $fromName)
|
||||||
->subject($subject);
|
->subject($subject);
|
||||||
|
|
||||||
if (isset($data['invoice_id'])) {
|
// Attach the PDF to the email
|
||||||
$invoice = Invoice::with('account')->where('id', '=', $data['invoice_id'])->first();
|
if (isset($data['invoiceId'])) {
|
||||||
|
$invoice = Invoice::with('account')->where('id', '=', $data['invoiceId'])->first();
|
||||||
if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) {
|
if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) {
|
||||||
$message->attach(
|
$message->attach(
|
||||||
$invoice->getPDFPath(),
|
$invoice->getPDFPath(),
|
||||||
@ -42,16 +42,49 @@ class Mailer
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
return $this->handleSuccess($response, $data);
|
||||||
} catch (Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
Utils::logError('Email Error: ' . $exception->getMessage());
|
return $this->handleFailure($exception);
|
||||||
if (isset($_ENV['POSTMARK_API_TOKEN'])) {
|
|
||||||
$response = $exception->getResponse()->getBody()->getContents();
|
|
||||||
$response = json_decode($response);
|
|
||||||
return nl2br($response->Message);
|
|
||||||
} else {
|
|
||||||
return $exception->getMessage();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function handleSuccess($response, $data)
|
||||||
|
{
|
||||||
|
if (isset($data['invitation'])) {
|
||||||
|
$invitation = $data['invitation'];
|
||||||
|
|
||||||
|
// Track the Postmark message id
|
||||||
|
if (isset($_ENV['POSTMARK_API_TOKEN'])) {
|
||||||
|
$json = $response->json();
|
||||||
|
$invitation->message_id = $json['MessageID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$invitation->email_error = null;
|
||||||
|
$invitation->sent_date = \Carbon::now()->toDateTimeString();
|
||||||
|
$invitation->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleFailure($exception)
|
||||||
|
{
|
||||||
|
if (isset($_ENV['POSTMARK_API_TOKEN'])) {
|
||||||
|
$response = $exception->getResponse()->getBody()->getContents();
|
||||||
|
$response = json_decode($response);
|
||||||
|
$emailError = nl2br($response->Message);
|
||||||
|
} else {
|
||||||
|
$emailError = $exception->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils::logError("Email Error: $emailError");
|
||||||
|
|
||||||
|
if (isset($data['invitation'])) {
|
||||||
|
$invitation = $data['invitation'];
|
||||||
|
$invitation->email_error = $emailError;
|
||||||
|
$invitation->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $emailError;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use Utils;
|
use Utils;
|
||||||
|
|
||||||
|
use App\Models\Invitation;
|
||||||
use App\Models\Invoice;
|
use App\Models\Invoice;
|
||||||
use App\Models\Payment;
|
use App\Models\Payment;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
@ -60,4 +61,27 @@ class UserMailer extends Mailer
|
|||||||
|
|
||||||
$this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data);
|
$this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sendEmailBounced(Invitation $invitation)
|
||||||
|
{
|
||||||
|
$user = $invitation->user;
|
||||||
|
$invoice = $invitation->invoice;
|
||||||
|
$entityType = $invoice->getEntityType();
|
||||||
|
|
||||||
|
if (!$user->email) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$subject = trans("texts.notification_{$entityType}_bounced_subject", ['invoice' => $invoice->invoice_number]);
|
||||||
|
$view = 'email_bounced';
|
||||||
|
$data = [
|
||||||
|
'userName' => $user->getDisplayName(),
|
||||||
|
'emailError' => $invitation->email_error,
|
||||||
|
'entityType' => $entityType,
|
||||||
|
'contactName' => $invitation->contact->getDisplayName(),
|
||||||
|
'invoiceNumber' => $invoice->invoice_number,
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ use Session;
|
|||||||
use Utils;
|
use Utils;
|
||||||
use DB;
|
use DB;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
|
use Validator;
|
||||||
use Schema;
|
use Schema;
|
||||||
use App\Models\AccountGateway;
|
use App\Models\AccountGateway;
|
||||||
use App\Models\Invitation;
|
use App\Models\Invitation;
|
||||||
@ -49,6 +50,9 @@ class AccountRepository
|
|||||||
$user->first_name = $firstName;
|
$user->first_name = $firstName;
|
||||||
$user->last_name = $lastName;
|
$user->last_name = $lastName;
|
||||||
$user->email = $user->username = $email;
|
$user->email = $user->username = $email;
|
||||||
|
if (!$password) {
|
||||||
|
$password = str_random(RANDOM_KEY_LENGTH);
|
||||||
|
}
|
||||||
$user->password = bcrypt($password);
|
$user->password = bcrypt($password);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +235,37 @@ class AccountRepository
|
|||||||
return $client;
|
return $client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function registerUser($user)
|
public function unlinkUserFromOauth($user)
|
||||||
|
{
|
||||||
|
$user->oauth_provider_id = null;
|
||||||
|
$user->oauth_user_id = null;
|
||||||
|
$user->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateUserFromOauth($user, $firstName, $lastName, $email, $providerId, $oauthUserId)
|
||||||
|
{
|
||||||
|
if (!$user->registered) {
|
||||||
|
$rules = ['email' => 'email|required|unique:users,email,'.$user->id.',id'];
|
||||||
|
$validator = Validator::make(['email' => $email], $rules);
|
||||||
|
if ($validator->fails()) {
|
||||||
|
$messages = $validator->messages();
|
||||||
|
return $messages->first('email');
|
||||||
|
}
|
||||||
|
|
||||||
|
$user->email = $email;
|
||||||
|
$user->first_name = $firstName;
|
||||||
|
$user->last_name = $lastName;
|
||||||
|
$user->registered = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user->oauth_provider_id = $providerId;
|
||||||
|
$user->oauth_user_id = $oauthUserId;
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function registerNinjaUser($user)
|
||||||
{
|
{
|
||||||
if ($user->email == TEST_USERNAME) {
|
if ($user->email == TEST_USERNAME) {
|
||||||
return false;
|
return false;
|
||||||
@ -259,6 +293,13 @@ class AccountRepository
|
|||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function findUserByOauth($providerId, $oauthUserId)
|
||||||
|
{
|
||||||
|
return User::where('oauth_user_id', $oauthUserId)
|
||||||
|
->where('oauth_provider_id', $providerId)
|
||||||
|
->first();
|
||||||
|
}
|
||||||
|
|
||||||
public function findUserAccounts($userId1, $userId2 = false)
|
public function findUserAccounts($userId1, $userId2 = false)
|
||||||
{
|
{
|
||||||
if (!Schema::hasTable('user_accounts')) {
|
if (!Schema::hasTable('user_accounts')) {
|
||||||
|
@ -374,6 +374,13 @@ class InvoiceRepository
|
|||||||
$invoice->custom_taxes1 = $data['custom_taxes1'] ? true : false;
|
$invoice->custom_taxes1 = $data['custom_taxes1'] ? true : false;
|
||||||
$invoice->custom_taxes2 = $data['custom_taxes2'] ? true : false;
|
$invoice->custom_taxes2 = $data['custom_taxes2'] ? true : false;
|
||||||
|
|
||||||
|
if (isset($data['custom_text_value1'])) {
|
||||||
|
$invoice->custom_text_value1 = trim($data['custom_text_value1']);
|
||||||
|
}
|
||||||
|
if (isset($data['custom_text_value2'])) {
|
||||||
|
$invoice->custom_text_value2 = trim($data['custom_text_value2']);
|
||||||
|
}
|
||||||
|
|
||||||
// custom fields charged taxes
|
// custom fields charged taxes
|
||||||
if ($invoice->custom_value1 && $invoice->custom_taxes1) {
|
if ($invoice->custom_value1 && $invoice->custom_taxes1) {
|
||||||
$total += $invoice->custom_value1;
|
$total += $invoice->custom_value1;
|
||||||
@ -497,7 +504,9 @@ class InvoiceRepository
|
|||||||
'custom_value2',
|
'custom_value2',
|
||||||
'custom_taxes1',
|
'custom_taxes1',
|
||||||
'custom_taxes2',
|
'custom_taxes2',
|
||||||
'partial'] as $field) {
|
'partial',
|
||||||
|
'custom_text_value1',
|
||||||
|
'custom_text_value2'] as $field) {
|
||||||
$clone->$field = $invoice->$field;
|
$clone->$field = $invoice->$field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -615,6 +624,8 @@ class InvoiceRepository
|
|||||||
$invoice->custom_value2 = $recurInvoice->custom_value2;
|
$invoice->custom_value2 = $recurInvoice->custom_value2;
|
||||||
$invoice->custom_taxes1 = $recurInvoice->custom_taxes1;
|
$invoice->custom_taxes1 = $recurInvoice->custom_taxes1;
|
||||||
$invoice->custom_taxes2 = $recurInvoice->custom_taxes2;
|
$invoice->custom_taxes2 = $recurInvoice->custom_taxes2;
|
||||||
|
$invoice->custom_text_value1 = $recurInvoice->custom_text_value1;
|
||||||
|
$invoice->custom_text_value2 = $recurInvoice->custom_text_value2;
|
||||||
$invoice->is_amount_discount = $recurInvoice->is_amount_discount;
|
$invoice->is_amount_discount = $recurInvoice->is_amount_discount;
|
||||||
|
|
||||||
if ($invoice->client->payment_terms != 0) {
|
if ($invoice->client->payment_terms != 0) {
|
||||||
|
85
app/Services/AuthService.php
Normal file
85
app/Services/AuthService.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php namespace App\Services;
|
||||||
|
|
||||||
|
use Session;
|
||||||
|
use Auth;
|
||||||
|
use Utils;
|
||||||
|
use Input;
|
||||||
|
use Socialite;
|
||||||
|
use App\Ninja\Repositories\AccountRepository;
|
||||||
|
use App\Events\UserLoggedIn;
|
||||||
|
use App\Events\UserSignedUp;
|
||||||
|
|
||||||
|
class AuthService
|
||||||
|
{
|
||||||
|
private $accountRepo;
|
||||||
|
|
||||||
|
public static $providers = [
|
||||||
|
1 => SOCIAL_GOOGLE,
|
||||||
|
2 => SOCIAL_FACEBOOK,
|
||||||
|
3 => SOCIAL_GITHUB,
|
||||||
|
4 => SOCIAL_LINKEDIN
|
||||||
|
];
|
||||||
|
|
||||||
|
public function __construct(AccountRepository $repo)
|
||||||
|
{
|
||||||
|
$this->accountRepo = $repo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute($provider, $hasCode)
|
||||||
|
{
|
||||||
|
if (!$hasCode) {
|
||||||
|
return $this->getAuthorization($provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
$socialiteUser = Socialite::driver($provider)->user();
|
||||||
|
$providerId = AuthService::getProviderId($provider);
|
||||||
|
|
||||||
|
if (Auth::check()) {
|
||||||
|
$user = Auth::user();
|
||||||
|
$isRegistered = $user->registered;
|
||||||
|
|
||||||
|
$email = $socialiteUser->email;
|
||||||
|
$oauthUserId = $socialiteUser->id;
|
||||||
|
$name = Utils::splitName($socialiteUser->name);
|
||||||
|
$result = $this->accountRepo->updateUserFromOauth($user, $name[0], $name[1], $email, $providerId, $oauthUserId);
|
||||||
|
|
||||||
|
if ($result === true) {
|
||||||
|
if (!$isRegistered) {
|
||||||
|
event(new UserSignedUp());
|
||||||
|
Session::flash('warning', trans('texts.success_message'));
|
||||||
|
} else {
|
||||||
|
Session::flash('message', trans('texts.updated_settings'));
|
||||||
|
return redirect()->to('/company/details');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Session::flash('error', $result);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($user = $this->accountRepo->findUserByOauth($providerId, $socialiteUser->id)) {
|
||||||
|
Auth::login($user, true);
|
||||||
|
event(new UserLoggedIn());
|
||||||
|
} else {
|
||||||
|
Session::flash('error', trans('texts.invalid_credentials'));
|
||||||
|
return redirect()->to('login');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$redirectTo = Input::get('redirect_to') ?: 'dashboard';
|
||||||
|
return redirect()->to($redirectTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getAuthorization($provider)
|
||||||
|
{
|
||||||
|
return Socialite::driver($provider)->redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getProviderId($provider)
|
||||||
|
{
|
||||||
|
return array_search(strtolower($provider), array_map('strtolower', AuthService::$providers));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getProviderName($providerId)
|
||||||
|
{
|
||||||
|
return $providerId ? AuthService::$providers[$providerId] : '';
|
||||||
|
}
|
||||||
|
}
|
48
app/Services/EmailService.php
Normal file
48
app/Services/EmailService.php
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?php namespace App\Services;
|
||||||
|
|
||||||
|
use Carbon;
|
||||||
|
use App\Models\Invitation;
|
||||||
|
use App\Ninja\Mailers\UserMailer;
|
||||||
|
|
||||||
|
class EmailService {
|
||||||
|
|
||||||
|
protected $userMailer;
|
||||||
|
|
||||||
|
public function __construct(UserMailer $userMailer)
|
||||||
|
{
|
||||||
|
$this->userMailer = $userMailer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function markOpened($messageId)
|
||||||
|
{
|
||||||
|
$invitation = Invitation::whereMessageId($messageId)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$invitation) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$invitation->opened_date = Carbon::now()->toDateTimeString();
|
||||||
|
$invitation->save();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function markBounced($messageId, $error)
|
||||||
|
{
|
||||||
|
$invitation = Invitation::with('user', 'invoice', 'contact')
|
||||||
|
->whereMessageId($messageId)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$invitation) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$invitation->email_error = $error;
|
||||||
|
$invitation->save();
|
||||||
|
|
||||||
|
$this->userMailer->sendEmailBounced($invitation);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -214,15 +214,16 @@ class PaymentService {
|
|||||||
$account = $invoice->account;
|
$account = $invoice->account;
|
||||||
$invitation = $invoice->invitations->first();
|
$invitation = $invoice->invitations->first();
|
||||||
$accountGateway = $account->getGatewayConfig(GATEWAY_STRIPE);
|
$accountGateway = $account->getGatewayConfig(GATEWAY_STRIPE);
|
||||||
|
$token = $client->getGatewayToken();
|
||||||
|
|
||||||
if (!$invitation || !$accountGateway) {
|
if (!$invitation || !$accountGateway || !$token) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup the gateway/payment info
|
// setup the gateway/payment info
|
||||||
$gateway = $this->createGateway($accountGateway);
|
$gateway = $this->createGateway($accountGateway);
|
||||||
$details = $this->getPaymentDetails($invitation);
|
$details = $this->getPaymentDetails($invitation);
|
||||||
$details['cardReference'] = $client->getGatewayToken();
|
$details['cardReference'] = $token;
|
||||||
|
|
||||||
// submit purchase/get response
|
// submit purchase/get response
|
||||||
$response = $gateway->purchase($details)->send();
|
$response = $gateway->purchase($details)->send();
|
||||||
|
@ -37,7 +37,8 @@
|
|||||||
"guzzlehttp/guzzle": "~5.0",
|
"guzzlehttp/guzzle": "~5.0",
|
||||||
"laravelcollective/html": "~5.0",
|
"laravelcollective/html": "~5.0",
|
||||||
"wildbit/laravel-postmark-provider": "dev-master",
|
"wildbit/laravel-postmark-provider": "dev-master",
|
||||||
"Dwolla/omnipay-dwolla": "dev-master"
|
"Dwolla/omnipay-dwolla": "dev-master",
|
||||||
|
"laravel/socialite": "~2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "~4.0",
|
"phpunit/phpunit": "~4.0",
|
||||||
|
401
composer.lock
generated
401
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "064b3e3608e030ecf2bfbf705b02ca5a",
|
"hash": "48ed13e4113a177339d3a20f31dbc6bb",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "alfaproject/omnipay-neteller",
|
"name": "alfaproject/omnipay-neteller",
|
||||||
@ -120,12 +120,12 @@
|
|||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/formers/former.git",
|
"url": "https://github.com/formers/former.git",
|
||||||
"reference": "a2fbec9d29cf820d54dfa6f0ddb875339d77e930"
|
"reference": "9e75217536bf6c377318e5a6f68d4c1f96a8ae3b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/formers/former/zipball/a2fbec9d29cf820d54dfa6f0ddb875339d77e930",
|
"url": "https://api.github.com/repos/formers/former/zipball/9e75217536bf6c377318e5a6f68d4c1f96a8ae3b",
|
||||||
"reference": "a2fbec9d29cf820d54dfa6f0ddb875339d77e930",
|
"reference": "9e75217536bf6c377318e5a6f68d4c1f96a8ae3b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -171,7 +171,7 @@
|
|||||||
"foundation",
|
"foundation",
|
||||||
"laravel"
|
"laravel"
|
||||||
],
|
],
|
||||||
"time": "2015-06-01 18:46:46"
|
"time": "2015-09-24 15:56:30"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "anahkiasen/html-object",
|
"name": "anahkiasen/html-object",
|
||||||
@ -214,16 +214,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "barryvdh/laravel-debugbar",
|
"name": "barryvdh/laravel-debugbar",
|
||||||
"version": "v2.0.5",
|
"version": "v2.0.6",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/barryvdh/laravel-debugbar.git",
|
"url": "https://github.com/barryvdh/laravel-debugbar.git",
|
||||||
"reference": "753106cd1f9c724d05bb48728bc652231174e279"
|
"reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/753106cd1f9c724d05bb48728bc652231174e279",
|
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c",
|
||||||
"reference": "753106cd1f9c724d05bb48728bc652231174e279",
|
"reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -235,7 +235,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.0-dev"
|
"dev-master": "2.1-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -264,7 +264,7 @@
|
|||||||
"profiler",
|
"profiler",
|
||||||
"webprofiler"
|
"webprofiler"
|
||||||
],
|
],
|
||||||
"time": "2015-07-09 14:51:59"
|
"time": "2015-09-09 11:39:27"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "barryvdh/laravel-ide-helper",
|
"name": "barryvdh/laravel-ide-helper",
|
||||||
@ -702,16 +702,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/annotations",
|
"name": "doctrine/annotations",
|
||||||
"version": "v1.2.6",
|
"version": "v1.2.7",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/annotations.git",
|
"url": "https://github.com/doctrine/annotations.git",
|
||||||
"reference": "f4a91702ca3cd2e568c3736aa031ed00c3752af4"
|
"reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/annotations/zipball/f4a91702ca3cd2e568c3736aa031ed00c3752af4",
|
"url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
|
||||||
"reference": "f4a91702ca3cd2e568c3736aa031ed00c3752af4",
|
"reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -766,20 +766,20 @@
|
|||||||
"docblock",
|
"docblock",
|
||||||
"parser"
|
"parser"
|
||||||
],
|
],
|
||||||
"time": "2015-06-17 12:21:22"
|
"time": "2015-08-31 12:32:49"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/cache",
|
"name": "doctrine/cache",
|
||||||
"version": "v1.4.1",
|
"version": "v1.4.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/cache.git",
|
"url": "https://github.com/doctrine/cache.git",
|
||||||
"reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03"
|
"reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/cache/zipball/c9eadeb743ac6199f7eec423cb9426bc518b7b03",
|
"url": "https://api.github.com/repos/doctrine/cache/zipball/8c434000f420ade76a07c64cbe08ca47e5c101ca",
|
||||||
"reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03",
|
"reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -836,7 +836,7 @@
|
|||||||
"cache",
|
"cache",
|
||||||
"caching"
|
"caching"
|
||||||
],
|
],
|
||||||
"time": "2015-04-15 00:11:59"
|
"time": "2015-08-31 12:36:41"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/collections",
|
"name": "doctrine/collections",
|
||||||
@ -906,16 +906,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/common",
|
"name": "doctrine/common",
|
||||||
"version": "v2.5.0",
|
"version": "v2.5.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/common.git",
|
"url": "https://github.com/doctrine/common.git",
|
||||||
"reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3"
|
"reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/common/zipball/cd8daf2501e10c63dced7b8b9b905844316ae9d3",
|
"url": "https://api.github.com/repos/doctrine/common/zipball/0009b8f0d4a917aabc971fb089eba80e872f83f9",
|
||||||
"reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3",
|
"reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -975,20 +975,20 @@
|
|||||||
"persistence",
|
"persistence",
|
||||||
"spl"
|
"spl"
|
||||||
],
|
],
|
||||||
"time": "2015-04-02 19:55:44"
|
"time": "2015-08-31 13:00:22"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/dbal",
|
"name": "doctrine/dbal",
|
||||||
"version": "v2.5.1",
|
"version": "v2.5.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/dbal.git",
|
"url": "https://github.com/doctrine/dbal.git",
|
||||||
"reference": "628c2256b646ae2417d44e063bce8aec5199d48d"
|
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d",
|
"url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c",
|
||||||
"reference": "628c2256b646ae2417d44e063bce8aec5199d48d",
|
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1046,7 +1046,7 @@
|
|||||||
"persistence",
|
"persistence",
|
||||||
"queryobject"
|
"queryobject"
|
||||||
],
|
],
|
||||||
"time": "2015-01-12 21:52:47"
|
"time": "2015-09-16 16:29:33"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/inflector",
|
"name": "doctrine/inflector",
|
||||||
@ -1646,12 +1646,12 @@
|
|||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Intervention/image.git",
|
"url": "https://github.com/Intervention/image.git",
|
||||||
"reference": "1124ff3c6298f0dcf9edf9156623904d7a5c3428"
|
"reference": "44c9a6bb292e50cf8a1e4b5030c7954c2709c089"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Intervention/image/zipball/1124ff3c6298f0dcf9edf9156623904d7a5c3428",
|
"url": "https://api.github.com/repos/Intervention/image/zipball/44c9a6bb292e50cf8a1e4b5030c7954c2709c089",
|
||||||
"reference": "1124ff3c6298f0dcf9edf9156623904d7a5c3428",
|
"reference": "44c9a6bb292e50cf8a1e4b5030c7954c2709c089",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1700,7 +1700,7 @@
|
|||||||
"thumbnail",
|
"thumbnail",
|
||||||
"watermark"
|
"watermark"
|
||||||
],
|
],
|
||||||
"time": "2015-08-16 15:31:59"
|
"time": "2015-08-30 15:37:50"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ircmaxell/password-compat",
|
"name": "ircmaxell/password-compat",
|
||||||
@ -2055,6 +2055,60 @@
|
|||||||
],
|
],
|
||||||
"time": "2015-06-09 13:12:19"
|
"time": "2015-06-09 13:12:19"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "laravel/socialite",
|
||||||
|
"version": "v2.0.13",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/laravel/socialite.git",
|
||||||
|
"reference": "5995d2c9c60b47362412a84286e2a0707e0db386"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/laravel/socialite/zipball/5995d2c9c60b47362412a84286e2a0707e0db386",
|
||||||
|
"reference": "5995d2c9c60b47362412a84286e2a0707e0db386",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzlehttp/guzzle": "~5.0|~6.0",
|
||||||
|
"illuminate/contracts": "~5.0",
|
||||||
|
"illuminate/http": "~5.0",
|
||||||
|
"illuminate/support": "~5.0",
|
||||||
|
"league/oauth1-client": "~1.0",
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "~0.9",
|
||||||
|
"phpunit/phpunit": "~4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Laravel\\Socialite\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylorotwell@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.",
|
||||||
|
"keywords": [
|
||||||
|
"laravel",
|
||||||
|
"oauth"
|
||||||
|
],
|
||||||
|
"time": "2015-09-24 20:59:56"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "laravelcollective/html",
|
"name": "laravelcollective/html",
|
||||||
"version": "v5.0.4",
|
"version": "v5.0.4",
|
||||||
@ -2107,21 +2161,24 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/flysystem",
|
"name": "league/flysystem",
|
||||||
"version": "1.0.11",
|
"version": "1.0.15",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/flysystem.git",
|
"url": "https://github.com/thephpleague/flysystem.git",
|
||||||
"reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040"
|
"reference": "31525caf9e8772683672fefd8a1ca0c0736020f4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c16222fdc02467eaa12cb6d6d0e65527741f6040",
|
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/31525caf9e8772683672fefd8a1ca0c0736020f4",
|
||||||
"reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040",
|
"reference": "31525caf9e8772683672fefd8a1ca0c0736020f4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.4.0"
|
"php": ">=5.4.0"
|
||||||
},
|
},
|
||||||
|
"conflict": {
|
||||||
|
"league/flysystem-sftp": "<1.0.6"
|
||||||
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"ext-fileinfo": "*",
|
"ext-fileinfo": "*",
|
||||||
"mockery/mockery": "~0.9",
|
"mockery/mockery": "~0.9",
|
||||||
@ -2184,7 +2241,70 @@
|
|||||||
"sftp",
|
"sftp",
|
||||||
"storage"
|
"storage"
|
||||||
],
|
],
|
||||||
"time": "2015-07-28 20:41:58"
|
"time": "2015-09-30 22:26:59"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "league/oauth1-client",
|
||||||
|
"version": "1.6.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/thephpleague/oauth1-client.git",
|
||||||
|
"reference": "4d4edd9b6014f882e319231a9b3351e3a1dfdc81"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/4d4edd9b6014f882e319231a9b3351e3a1dfdc81",
|
||||||
|
"reference": "4d4edd9b6014f882e319231a9b3351e3a1dfdc81",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzle/guzzle": "3.*",
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "~0.9",
|
||||||
|
"phpunit/phpunit": "~4.0",
|
||||||
|
"squizlabs/php_codesniffer": "~2.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"League\\OAuth1\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Ben Corlett",
|
||||||
|
"email": "bencorlett@me.com",
|
||||||
|
"homepage": "http://www.webcomm.com.au",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "OAuth 1.0 Client Library",
|
||||||
|
"keywords": [
|
||||||
|
"Authentication",
|
||||||
|
"SSO",
|
||||||
|
"authorization",
|
||||||
|
"bitbucket",
|
||||||
|
"identity",
|
||||||
|
"idp",
|
||||||
|
"oauth",
|
||||||
|
"oauth1",
|
||||||
|
"single sign on",
|
||||||
|
"trello",
|
||||||
|
"tumblr",
|
||||||
|
"twitter"
|
||||||
|
],
|
||||||
|
"time": "2015-08-22 09:49:14"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lokielse/omnipay-alipay",
|
"name": "lokielse/omnipay-alipay",
|
||||||
@ -2192,12 +2312,12 @@
|
|||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/lokielse/omnipay-alipay.git",
|
"url": "https://github.com/lokielse/omnipay-alipay.git",
|
||||||
"reference": "f34ed8783943e01e8ed78abdbbaae487181ce3ba"
|
"reference": "87622e8549b50773a8db83c93c3ad9a22e618991"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/lokielse/omnipay-alipay/zipball/f34ed8783943e01e8ed78abdbbaae487181ce3ba",
|
"url": "https://api.github.com/repos/lokielse/omnipay-alipay/zipball/87622e8549b50773a8db83c93c3ad9a22e618991",
|
||||||
"reference": "f34ed8783943e01e8ed78abdbbaae487181ce3ba",
|
"reference": "87622e8549b50773a8db83c93c3ad9a22e618991",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -2233,7 +2353,7 @@
|
|||||||
"payment",
|
"payment",
|
||||||
"purchase"
|
"purchase"
|
||||||
],
|
],
|
||||||
"time": "2015-08-18 17:43:49"
|
"time": "2015-09-15 16:43:43"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "maximebf/debugbar",
|
"name": "maximebf/debugbar",
|
||||||
@ -2348,16 +2468,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "monolog/monolog",
|
"name": "monolog/monolog",
|
||||||
"version": "1.16.0",
|
"version": "1.17.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Seldaek/monolog.git",
|
"url": "https://github.com/Seldaek/monolog.git",
|
||||||
"reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7"
|
"reference": "0524c87587ab85bc4c2d6f5b41253ccb930a5422"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/c0c0b4bee3aabce7182876b0d912ef2595563db7",
|
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/0524c87587ab85bc4c2d6f5b41253ccb930a5422",
|
||||||
"reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7",
|
"reference": "0524c87587ab85bc4c2d6f5b41253ccb930a5422",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -2374,7 +2494,7 @@
|
|||||||
"php-console/php-console": "^3.1.3",
|
"php-console/php-console": "^3.1.3",
|
||||||
"phpunit/phpunit": "~4.5",
|
"phpunit/phpunit": "~4.5",
|
||||||
"phpunit/phpunit-mock-objects": "2.3.0",
|
"phpunit/phpunit-mock-objects": "2.3.0",
|
||||||
"raven/raven": "~0.8",
|
"raven/raven": "~0.11",
|
||||||
"ruflin/elastica": ">=0.90 <3.0",
|
"ruflin/elastica": ">=0.90 <3.0",
|
||||||
"swiftmailer/swiftmailer": "~5.3",
|
"swiftmailer/swiftmailer": "~5.3",
|
||||||
"videlalvaro/php-amqplib": "~2.4"
|
"videlalvaro/php-amqplib": "~2.4"
|
||||||
@ -2420,7 +2540,7 @@
|
|||||||
"logging",
|
"logging",
|
||||||
"psr-3"
|
"psr-3"
|
||||||
],
|
],
|
||||||
"time": "2015-08-09 17:44:44"
|
"time": "2015-08-31 09:17:37"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "mtdowling/cron-expression",
|
"name": "mtdowling/cron-expression",
|
||||||
@ -2515,16 +2635,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/php-parser",
|
"name": "nikic/php-parser",
|
||||||
"version": "v1.4.0",
|
"version": "v1.4.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||||
"reference": "196f177cfefa0f1f7166c0a05d8255889be12418"
|
"reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/196f177cfefa0f1f7166c0a05d8255889be12418",
|
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51",
|
||||||
"reference": "196f177cfefa0f1f7166c0a05d8255889be12418",
|
"reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -2556,7 +2676,7 @@
|
|||||||
"parser",
|
"parser",
|
||||||
"php"
|
"php"
|
||||||
],
|
],
|
||||||
"time": "2015-07-14 17:31:05"
|
"time": "2015-09-19 14:15:08"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "omnipay/2checkout",
|
"name": "omnipay/2checkout",
|
||||||
@ -3196,16 +3316,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "omnipay/gocardless",
|
"name": "omnipay/gocardless",
|
||||||
"version": "v2.1.1",
|
"version": "2.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/omnipay-gocardless.git",
|
"url": "https://github.com/thephpleague/omnipay-gocardless.git",
|
||||||
"reference": "106c2cc2f992813319c86f45863347c238771548"
|
"reference": "1c0bebdcc32d89fd243e1183028d2d50316e8bb1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/omnipay-gocardless/zipball/106c2cc2f992813319c86f45863347c238771548",
|
"url": "https://api.github.com/repos/thephpleague/omnipay-gocardless/zipball/1c0bebdcc32d89fd243e1183028d2d50316e8bb1",
|
||||||
"reference": "106c2cc2f992813319c86f45863347c238771548",
|
"reference": "1c0bebdcc32d89fd243e1183028d2d50316e8bb1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -3250,7 +3370,7 @@
|
|||||||
"pay",
|
"pay",
|
||||||
"payment"
|
"payment"
|
||||||
],
|
],
|
||||||
"time": "2014-09-17 00:39:16"
|
"time": "2015-09-24 14:44:29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "omnipay/manual",
|
"name": "omnipay/manual",
|
||||||
@ -4652,16 +4772,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/class-loader",
|
"name": "symfony/class-loader",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/ClassLoader.git",
|
"url": "https://github.com/symfony/class-loader.git",
|
||||||
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4"
|
"reference": "d957ea6295d7016e20d7eff33a6c1deef819c0d4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/2fccbc544997340808801a7410cdcb96dd12edc4",
|
"url": "https://api.github.com/repos/symfony/class-loader/zipball/d957ea6295d7016e20d7eff33a6c1deef819c0d4",
|
||||||
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4",
|
"reference": "d957ea6295d7016e20d7eff33a6c1deef819c0d4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -4698,7 +4818,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony ClassLoader Component",
|
"description": "Symfony ClassLoader Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-06-25 12:52:11"
|
"time": "2015-08-26 17:56:37"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
@ -4821,16 +4941,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher",
|
"name": "symfony/event-dispatcher",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/EventDispatcher.git",
|
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||||
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3"
|
"reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae4dcc2a8d3de98bd794167a3ccda1311597c5d9",
|
||||||
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
"reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -4875,20 +4995,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony EventDispatcher Component",
|
"description": "Symfony EventDispatcher Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-06-18 19:21:56"
|
"time": "2015-09-22 13:49:29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/filesystem",
|
"name": "symfony/filesystem",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Filesystem.git",
|
"url": "https://github.com/symfony/filesystem.git",
|
||||||
"reference": "2d7b2ddaf3f548f4292df49a99d19c853d43f0b8"
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/2d7b2ddaf3f548f4292df49a99d19c853d43f0b8",
|
"url": "https://api.github.com/repos/symfony/filesystem/zipball/a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
"reference": "2d7b2ddaf3f548f4292df49a99d19c853d43f0b8",
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -4924,7 +5044,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Filesystem Component",
|
"description": "Symfony Filesystem Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-07-09 16:07:40"
|
"time": "2015-09-09 17:42:36"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
@ -5513,12 +5633,12 @@
|
|||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/webpatser/laravel-countries.git",
|
"url": "https://github.com/webpatser/laravel-countries.git",
|
||||||
"reference": "3142b86c71908a8e63dec07bc8fe48abff9902dd"
|
"reference": "e29dcce821f2c4a522e35483c38632ca534db4ee"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/webpatser/laravel-countries/zipball/3142b86c71908a8e63dec07bc8fe48abff9902dd",
|
"url": "https://api.github.com/repos/webpatser/laravel-countries/zipball/e29dcce821f2c4a522e35483c38632ca534db4ee",
|
||||||
"reference": "3142b86c71908a8e63dec07bc8fe48abff9902dd",
|
"reference": "e29dcce821f2c4a522e35483c38632ca534db4ee",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -5557,7 +5677,7 @@
|
|||||||
"iso_3166_3",
|
"iso_3166_3",
|
||||||
"laravel"
|
"laravel"
|
||||||
],
|
],
|
||||||
"time": "2015-06-10 07:52:21"
|
"time": "2015-08-21 12:12:14"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wildbit/laravel-postmark-provider",
|
"name": "wildbit/laravel-postmark-provider",
|
||||||
@ -5679,23 +5799,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "codeception/codeception",
|
"name": "codeception/codeception",
|
||||||
"version": "2.1.2",
|
"version": "2.1.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Codeception/Codeception.git",
|
"url": "https://github.com/Codeception/Codeception.git",
|
||||||
"reference": "521adbb2ee34e9debdd8508a2c41ab2b5c2f042b"
|
"reference": "cd810cb78a869408602e17271f9b7368b09a7ca8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Codeception/Codeception/zipball/521adbb2ee34e9debdd8508a2c41ab2b5c2f042b",
|
"url": "https://api.github.com/repos/Codeception/Codeception/zipball/cd810cb78a869408602e17271f9b7368b09a7ca8",
|
||||||
"reference": "521adbb2ee34e9debdd8508a2c41ab2b5c2f042b",
|
"reference": "cd810cb78a869408602e17271f9b7368b09a7ca8",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-mbstring": "*",
|
"ext-mbstring": "*",
|
||||||
"facebook/webdriver": ">=1.0.1",
|
"facebook/webdriver": ">=1.0.1",
|
||||||
"guzzlehttp/guzzle": ">=4.0|<7.0",
|
"guzzlehttp/guzzle": ">=4.1.4 <7.0",
|
||||||
"guzzlehttp/psr7": "~1.0",
|
"guzzlehttp/psr7": "~1.0",
|
||||||
"php": ">=5.4.0",
|
"php": ">=5.4.0",
|
||||||
"phpunit/phpunit": "~4.8.0",
|
"phpunit/phpunit": "~4.8.0",
|
||||||
@ -5755,7 +5875,7 @@
|
|||||||
"functional testing",
|
"functional testing",
|
||||||
"unit testing"
|
"unit testing"
|
||||||
],
|
],
|
||||||
"time": "2015-08-09 13:48:55"
|
"time": "2015-10-02 09:38:59"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/instantiator",
|
"name": "doctrine/instantiator",
|
||||||
@ -5942,16 +6062,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpspec/phpspec",
|
"name": "phpspec/phpspec",
|
||||||
"version": "2.2.1",
|
"version": "2.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpspec/phpspec.git",
|
"url": "https://github.com/phpspec/phpspec.git",
|
||||||
"reference": "e9a40577323e67f1de2e214abf32976a0352d8f8"
|
"reference": "36635a903bdeb54899d7407bc95610501fd98559"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpspec/phpspec/zipball/e9a40577323e67f1de2e214abf32976a0352d8f8",
|
"url": "https://api.github.com/repos/phpspec/phpspec/zipball/36635a903bdeb54899d7407bc95610501fd98559",
|
||||||
"reference": "e9a40577323e67f1de2e214abf32976a0352d8f8",
|
"reference": "36635a903bdeb54899d7407bc95610501fd98559",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -5963,15 +6083,14 @@
|
|||||||
"symfony/console": "~2.3",
|
"symfony/console": "~2.3",
|
||||||
"symfony/event-dispatcher": "~2.1",
|
"symfony/event-dispatcher": "~2.1",
|
||||||
"symfony/finder": "~2.1",
|
"symfony/finder": "~2.1",
|
||||||
"symfony/process": "~2.1",
|
"symfony/process": "^2.6",
|
||||||
"symfony/yaml": "~2.1"
|
"symfony/yaml": "~2.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"behat/behat": "^3.0.11",
|
"behat/behat": "^3.0.11",
|
||||||
"bossa/phpspec2-expect": "~1.0",
|
"bossa/phpspec2-expect": "~1.0",
|
||||||
"phpunit/phpunit": "~4.4",
|
"phpunit/phpunit": "~4.4",
|
||||||
"symfony/filesystem": "~2.1",
|
"symfony/filesystem": "~2.1"
|
||||||
"symfony/process": "~2.1"
|
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters"
|
"phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters"
|
||||||
@ -6016,7 +6135,7 @@
|
|||||||
"testing",
|
"testing",
|
||||||
"tests"
|
"tests"
|
||||||
],
|
],
|
||||||
"time": "2015-05-30 15:21:40"
|
"time": "2015-09-07 07:07:37"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpspec/prophecy",
|
"name": "phpspec/prophecy",
|
||||||
@ -6080,16 +6199,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
"version": "2.2.2",
|
"version": "2.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||||
"reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c"
|
"reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2d7c03c0e4e080901b8f33b2897b0577be18a13c",
|
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef1ca6835468857944d5c3b48fa503d5554cff2f",
|
||||||
"reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c",
|
"reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6138,7 +6257,7 @@
|
|||||||
"testing",
|
"testing",
|
||||||
"xunit"
|
"xunit"
|
||||||
],
|
],
|
||||||
"time": "2015-08-04 03:42:39"
|
"time": "2015-09-14 06:51:16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-file-iterator",
|
"name": "phpunit/php-file-iterator",
|
||||||
@ -6271,16 +6390,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-token-stream",
|
"name": "phpunit/php-token-stream",
|
||||||
"version": "1.4.6",
|
"version": "1.4.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
||||||
"reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b"
|
"reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3ab72c62e550370a6cd5dc873e1a04ab57562f5b",
|
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
|
||||||
"reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b",
|
"reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6316,20 +6435,20 @@
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"tokenizer"
|
"tokenizer"
|
||||||
],
|
],
|
||||||
"time": "2015-08-16 08:51:00"
|
"time": "2015-09-15 10:49:45"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "4.8.4",
|
"version": "4.8.10",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7"
|
"reference": "463163747474815c5ccd4ae12b5b355ec12158e8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/463163747474815c5ccd4ae12b5b355ec12158e8",
|
||||||
"reference": "55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7",
|
"reference": "463163747474815c5ccd4ae12b5b355ec12158e8",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6388,24 +6507,24 @@
|
|||||||
"testing",
|
"testing",
|
||||||
"xunit"
|
"xunit"
|
||||||
],
|
],
|
||||||
"time": "2015-08-15 04:21:23"
|
"time": "2015-10-01 09:14:30"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit-mock-objects",
|
"name": "phpunit/phpunit-mock-objects",
|
||||||
"version": "2.3.6",
|
"version": "2.3.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
|
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
|
||||||
"reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42"
|
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/18dfbcb81d05e2296c0bcddd4db96cade75e6f42",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||||
"reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42",
|
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"doctrine/instantiator": "~1.0,>=1.0.2",
|
"doctrine/instantiator": "^1.0.2",
|
||||||
"php": ">=5.3.3",
|
"php": ">=5.3.3",
|
||||||
"phpunit/php-text-template": "~1.2",
|
"phpunit/php-text-template": "~1.2",
|
||||||
"sebastian/exporter": "~1.2"
|
"sebastian/exporter": "~1.2"
|
||||||
@ -6444,7 +6563,7 @@
|
|||||||
"mock",
|
"mock",
|
||||||
"xunit"
|
"xunit"
|
||||||
],
|
],
|
||||||
"time": "2015-07-10 06:54:24"
|
"time": "2015-10-02 06:51:40"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/comparator",
|
"name": "sebastian/comparator",
|
||||||
@ -6819,16 +6938,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/browser-kit",
|
"name": "symfony/browser-kit",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/BrowserKit.git",
|
"url": "https://github.com/symfony/browser-kit.git",
|
||||||
"reference": "176905d3d74c2f99e6ab70f4f5a89460532495ae"
|
"reference": "277a2457776d4cc25706fbdd9d1e4ab2dac884e4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/BrowserKit/zipball/176905d3d74c2f99e6ab70f4f5a89460532495ae",
|
"url": "https://api.github.com/repos/symfony/browser-kit/zipball/277a2457776d4cc25706fbdd9d1e4ab2dac884e4",
|
||||||
"reference": "176905d3d74c2f99e6ab70f4f5a89460532495ae",
|
"reference": "277a2457776d4cc25706fbdd9d1e4ab2dac884e4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6870,20 +6989,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony BrowserKit Component",
|
"description": "Symfony BrowserKit Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-07-09 16:07:40"
|
"time": "2015-09-06 08:36:38"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/css-selector",
|
"name": "symfony/css-selector",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/CssSelector.git",
|
"url": "https://github.com/symfony/css-selector.git",
|
||||||
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092"
|
"reference": "abe19cc0429a06be0c133056d1f9859854860970"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
"url": "https://api.github.com/repos/symfony/css-selector/zipball/abe19cc0429a06be0c133056d1f9859854860970",
|
||||||
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
"reference": "abe19cc0429a06be0c133056d1f9859854860970",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6923,20 +7042,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony CssSelector Component",
|
"description": "Symfony CssSelector Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-05-15 13:33:16"
|
"time": "2015-09-22 13:49:29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/dom-crawler",
|
"name": "symfony/dom-crawler",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/DomCrawler.git",
|
"url": "https://github.com/symfony/dom-crawler.git",
|
||||||
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35"
|
"reference": "2e185ca136399f902b948694987e62c80099c052"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35",
|
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2e185ca136399f902b948694987e62c80099c052",
|
||||||
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35",
|
"reference": "2e185ca136399f902b948694987e62c80099c052",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6976,20 +7095,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony DomCrawler Component",
|
"description": "Symfony DomCrawler Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-07-09 16:07:40"
|
"time": "2015-09-20 21:13:58"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/yaml",
|
"name": "symfony/yaml",
|
||||||
"version": "v2.7.3",
|
"version": "v2.7.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Yaml.git",
|
"url": "https://github.com/symfony/yaml.git",
|
||||||
"reference": "71340e996171474a53f3d29111d046be4ad8a0ff"
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Yaml/zipball/71340e996171474a53f3d29111d046be4ad8a0ff",
|
"url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
"reference": "71340e996171474a53f3d29111d046be4ad8a0ff",
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -7025,7 +7144,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Yaml Component",
|
"description": "Symfony Yaml Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2015-07-28 14:07:07"
|
"time": "2015-09-14 14:14:09"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
@ -149,6 +149,7 @@ return [
|
|||||||
'Webpatser\Countries\CountriesServiceProvider',
|
'Webpatser\Countries\CountriesServiceProvider',
|
||||||
'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
|
'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
|
||||||
'Illuminate\Html\HtmlServiceProvider',
|
'Illuminate\Html\HtmlServiceProvider',
|
||||||
|
'Laravel\Socialite\SocialiteServiceProvider',
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Application Service Providers...
|
* Application Service Providers...
|
||||||
@ -242,6 +243,7 @@ return [
|
|||||||
'Countries' => 'Webpatser\Countries\CountriesFacade',
|
'Countries' => 'Webpatser\Countries\CountriesFacade',
|
||||||
'Carbon' => 'Carbon\Carbon',
|
'Carbon' => 'Carbon\Carbon',
|
||||||
'Rocketeer' => 'Rocketeer\Facades\Rocketeer',
|
'Rocketeer' => 'Rocketeer\Facades\Rocketeer',
|
||||||
|
'Socialite' => 'Laravel\Socialite\Facades\Socialite',
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
@ -36,4 +36,28 @@ return [
|
|||||||
'secret' => '',
|
'secret' => '',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'github' => [
|
||||||
|
'client_id' => env('GITHUB_CLIENT_ID'),
|
||||||
|
'client_secret' => env('GITHUB_CLIENT_SECRET'),
|
||||||
|
'redirect' => 'http://ninja.dev/auth/github'
|
||||||
|
],
|
||||||
|
|
||||||
|
'google' => [
|
||||||
|
'client_id' => '640903115046-dd09j2q24lcc3ilrrv5f2ft2i3n0sreg.apps.googleusercontent.com',
|
||||||
|
'client_secret' => 'Vsfhldq7mRxsCXQTQI8U_4Ua',
|
||||||
|
'redirect' => 'http://ninja.dev/auth/google',
|
||||||
|
],
|
||||||
|
|
||||||
|
'facebook' => [
|
||||||
|
'client_id' => '635126583203143',
|
||||||
|
'client_secret' => '7aa7c391019f2ece3c6aa90f4c9b1485',
|
||||||
|
'redirect' => 'http://ninja.dev/auth/facebook',
|
||||||
|
],
|
||||||
|
|
||||||
|
'linkedin' => [
|
||||||
|
'client_id' => '778is2j21w25xj',
|
||||||
|
'client_secret' => 'DvDExxfBLXUtxc81',
|
||||||
|
'redirect' => 'http://ninja.dev/auth/linkedin',
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
64
database/migrations/2015_10_07_135651_add_social_login.php
Normal file
64
database/migrations/2015_10_07_135651_add_social_login.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddSocialLogin extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('users', function ($table) {
|
||||||
|
$table->string('oauth_user_id')->nullable();
|
||||||
|
$table->unsignedInteger('oauth_provider_id')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('accounts', function ($table) {
|
||||||
|
$table->string('custom_invoice_text_label1')->nullable();
|
||||||
|
$table->string('custom_invoice_text_label2')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('invoices', function ($table) {
|
||||||
|
$table->string('custom_text_value1')->nullable();
|
||||||
|
$table->string('custom_text_value2')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('invitations', function ($table) {
|
||||||
|
$table->timestamp('opened_date')->nullable();
|
||||||
|
$table->string('message_id')->nullable();
|
||||||
|
$table->text('email_error')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('users', function ($table) {
|
||||||
|
$table->dropColumn('oauth_user_id');
|
||||||
|
$table->dropColumn('oauth_provider_id');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('accounts', function ($table) {
|
||||||
|
$table->dropColumn('custom_invoice_text_label1');
|
||||||
|
$table->dropColumn('custom_invoice_text_label2');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('invoices', function ($table) {
|
||||||
|
$table->dropColumn('custom_text_value1');
|
||||||
|
$table->dropColumn('custom_text_value2');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('invitations', function ($table) {
|
||||||
|
$table->dropColumn('opened_date');
|
||||||
|
$table->dropColumn('message_id');
|
||||||
|
$table->dropColumn('email_error');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
4
public/css/built.css
vendored
4
public/css/built.css
vendored
@ -3332,3 +3332,7 @@ ul.user-accounts a:hover div.remove {
|
|||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tooltip-inner {
|
||||||
|
text-align:left;
|
||||||
|
width: 350px;
|
||||||
|
}
|
4
public/css/style.css
vendored
4
public/css/style.css
vendored
@ -982,3 +982,7 @@ ul.user-accounts a:hover div.remove {
|
|||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tooltip-inner {
|
||||||
|
text-align:left;
|
||||||
|
width: 350px;
|
||||||
|
}
|
@ -30400,6 +30400,26 @@ if (window.ko) {
|
|||||||
ko.applyBindingsToNode(element, { attr: { placeholder: underlyingObservable } } );
|
ko.applyBindingsToNode(element, { attr: { placeholder: underlyingObservable } } );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ko.bindingHandlers.tooltip = {
|
||||||
|
init: function(element, valueAccessor) {
|
||||||
|
var local = ko.utils.unwrapObservable(valueAccessor()),
|
||||||
|
options = {};
|
||||||
|
|
||||||
|
ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
|
||||||
|
ko.utils.extend(options, local);
|
||||||
|
|
||||||
|
$(element).tooltip(options);
|
||||||
|
|
||||||
|
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
||||||
|
$(element).tooltip("destroy");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
placement: "bottom",
|
||||||
|
trigger: "hover"
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getContactDisplayName(contact)
|
function getContactDisplayName(contact)
|
||||||
@ -31995,6 +32015,18 @@ NINJA.invoiceDetails = function(invoice) {
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (invoice.custom_text_value1) {
|
||||||
|
data.push([
|
||||||
|
{text: invoice.account.custom_invoice_text_label1},
|
||||||
|
{text: invoice.custom_text_value1}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
if (invoice.custom_text_value2) {
|
||||||
|
data.push([
|
||||||
|
{text: invoice.account.custom_invoice_text_label2},
|
||||||
|
{text: invoice.custom_text_value2}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
var isPartial = NINJA.parseFloat(invoice.partial);
|
var isPartial = NINJA.parseFloat(invoice.partial);
|
||||||
|
|
||||||
@ -32002,18 +32034,18 @@ NINJA.invoiceDetails = function(invoice) {
|
|||||||
data.push([
|
data.push([
|
||||||
{text: invoiceLabels.total},
|
{text: invoiceLabels.total},
|
||||||
{text: formatMoney(invoice.amount, invoice.client.currency_id)}
|
{text: formatMoney(invoice.amount, invoice.client.currency_id)}
|
||||||
]);
|
]);
|
||||||
} else if (isPartial) {
|
} else if (isPartial) {
|
||||||
data.push([
|
data.push([
|
||||||
{text: invoiceLabels.total},
|
{text: invoiceLabels.total},
|
||||||
{text: formatMoney(invoice.total_amount, invoice.client.currency_id)}
|
{text: formatMoney(invoice.total_amount, invoice.client.currency_id)}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.push([
|
data.push([
|
||||||
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||||
{text: formatMoney(invoice.balance_amount, invoice.client.currency_id), style: ['invoiceDetailBalanceDue']}
|
{text: formatMoney(invoice.balance_amount, invoice.client.currency_id), style: ['invoiceDetailBalanceDue']}
|
||||||
])
|
])
|
||||||
|
|
||||||
return NINJA.prepareDataPairs(data, 'invoiceDetails');
|
return NINJA.prepareDataPairs(data, 'invoiceDetails');
|
||||||
}
|
}
|
||||||
|
@ -442,6 +442,18 @@ NINJA.invoiceDetails = function(invoice) {
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (invoice.custom_text_value1) {
|
||||||
|
data.push([
|
||||||
|
{text: invoice.account.custom_invoice_text_label1},
|
||||||
|
{text: invoice.custom_text_value1}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
if (invoice.custom_text_value2) {
|
||||||
|
data.push([
|
||||||
|
{text: invoice.account.custom_invoice_text_label2},
|
||||||
|
{text: invoice.custom_text_value2}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
var isPartial = NINJA.parseFloat(invoice.partial);
|
var isPartial = NINJA.parseFloat(invoice.partial);
|
||||||
|
|
||||||
@ -449,18 +461,18 @@ NINJA.invoiceDetails = function(invoice) {
|
|||||||
data.push([
|
data.push([
|
||||||
{text: invoiceLabels.total},
|
{text: invoiceLabels.total},
|
||||||
{text: formatMoney(invoice.amount, invoice.client.currency_id)}
|
{text: formatMoney(invoice.amount, invoice.client.currency_id)}
|
||||||
]);
|
]);
|
||||||
} else if (isPartial) {
|
} else if (isPartial) {
|
||||||
data.push([
|
data.push([
|
||||||
{text: invoiceLabels.total},
|
{text: invoiceLabels.total},
|
||||||
{text: formatMoney(invoice.total_amount, invoice.client.currency_id)}
|
{text: formatMoney(invoice.total_amount, invoice.client.currency_id)}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.push([
|
data.push([
|
||||||
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||||
{text: formatMoney(invoice.balance_amount, invoice.client.currency_id), style: ['invoiceDetailBalanceDue']}
|
{text: formatMoney(invoice.balance_amount, invoice.client.currency_id), style: ['invoiceDetailBalanceDue']}
|
||||||
])
|
])
|
||||||
|
|
||||||
return NINJA.prepareDataPairs(data, 'invoiceDetails');
|
return NINJA.prepareDataPairs(data, 'invoiceDetails');
|
||||||
}
|
}
|
||||||
|
@ -522,6 +522,26 @@ if (window.ko) {
|
|||||||
ko.applyBindingsToNode(element, { attr: { placeholder: underlyingObservable } } );
|
ko.applyBindingsToNode(element, { attr: { placeholder: underlyingObservable } } );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ko.bindingHandlers.tooltip = {
|
||||||
|
init: function(element, valueAccessor) {
|
||||||
|
var local = ko.utils.unwrapObservable(valueAccessor()),
|
||||||
|
options = {};
|
||||||
|
|
||||||
|
ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
|
||||||
|
ko.utils.extend(options, local);
|
||||||
|
|
||||||
|
$(element).tooltip(options);
|
||||||
|
|
||||||
|
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
||||||
|
$(element).tooltip("destroy");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
placement: "bottom",
|
||||||
|
trigger: "hover"
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getContactDisplayName(contact)
|
function getContactDisplayName(contact)
|
||||||
|
@ -796,5 +796,24 @@
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
@ -795,5 +795,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -305,7 +305,7 @@ return array(
|
|||||||
'email_taken' => 'The email address is already registered',
|
'email_taken' => 'The email address is already registered',
|
||||||
'working' => 'Working',
|
'working' => 'Working',
|
||||||
'success' => 'Success',
|
'success' => 'Success',
|
||||||
'success_message' => 'You have successfully registered. Please visit the link in the account confirmation email to verify your email address.',
|
'success_message' => 'You have successfully registered! Please visit the link in the account confirmation email to verify your email address.',
|
||||||
'erase_data' => 'This will permanently erase your data.',
|
'erase_data' => 'This will permanently erase your data.',
|
||||||
'password' => 'Password',
|
'password' => 'Password',
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ return array(
|
|||||||
-- email us at contact@invoiceninja.com',
|
-- email us at contact@invoiceninja.com',
|
||||||
|
|
||||||
'unsaved_changes' => 'You have unsaved changes',
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
'custom_fields' => 'Custom fields',
|
'custom_fields' => 'Custom Fields',
|
||||||
'company_fields' => 'Company Fields',
|
'company_fields' => 'Company Fields',
|
||||||
'client_fields' => 'Client Fields',
|
'client_fields' => 'Client Fields',
|
||||||
'field_label' => 'Field Label',
|
'field_label' => 'Field Label',
|
||||||
@ -769,7 +769,7 @@ return array(
|
|||||||
|
|
||||||
'iframe_url' => 'Website',
|
'iframe_url' => 'Website',
|
||||||
'iframe_url_help1' => 'Copy the following code to a page on your site.',
|
'iframe_url_help1' => 'Copy the following code to a page on your site.',
|
||||||
'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.',
|
'iframe_url_help2' => 'Currently only supported with on-site gateways (ie, Stripe and Authorize.net). You can test the feature by clicking \'View as recipient\' for an invoice.',
|
||||||
|
|
||||||
'auto_bill' => 'Auto Bill',
|
'auto_bill' => 'Auto Bill',
|
||||||
'military_time' => '24 Hour Time',
|
'military_time' => '24 Hour Time',
|
||||||
@ -795,6 +795,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -773,5 +773,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -795,5 +795,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
@ -787,5 +787,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -788,5 +788,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -790,4 +790,23 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -789,7 +789,6 @@ return array(
|
|||||||
'reset' => 'Reset',
|
'reset' => 'Reset',
|
||||||
'invoice_not_found' => 'The requested invoice is not available',
|
'invoice_not_found' => 'The requested invoice is not available',
|
||||||
|
|
||||||
|
|
||||||
'referral_program' => 'Referral Program',
|
'referral_program' => 'Referral Program',
|
||||||
'referral_code' => 'Referral Code',
|
'referral_code' => 'Referral Code',
|
||||||
'last_sent_on' => 'Last sent on :date',
|
'last_sent_on' => 'Last sent on :date',
|
||||||
@ -798,5 +797,24 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -795,4 +795,23 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
@ -790,4 +790,23 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -790,4 +790,23 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -793,4 +793,23 @@ return array(
|
|||||||
'upcoming_quotes' => 'Upcoming Quotes',
|
'upcoming_quotes' => 'Upcoming Quotes',
|
||||||
'expired_quotes' => 'Expired Quotes',
|
'expired_quotes' => 'Expired Quotes',
|
||||||
|
|
||||||
|
'sign_up_using' => 'Sign up using',
|
||||||
|
'invalid_credentials' => 'These credentials do not match our records',
|
||||||
|
'show_all_options' => 'Show all options',
|
||||||
|
'user_details' => 'User Details',
|
||||||
|
'oneclick_login' => 'One-Click Login',
|
||||||
|
'disable' => 'Disable',
|
||||||
|
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||||
|
'invoice_charges' => 'Invoice Charges',
|
||||||
|
|
||||||
|
'invitation_status' => [
|
||||||
|
'sent' => 'Email Sent',
|
||||||
|
'opened' => 'Email Openend',
|
||||||
|
'viewed' => 'Invoice Viewed',
|
||||||
|
],
|
||||||
|
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||||
|
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||||
|
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||||
|
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -18,15 +18,13 @@
|
|||||||
|
|
||||||
{{ Former::populate($account) }}
|
{{ Former::populate($account) }}
|
||||||
{{ Former::populateField('military_time', intval($account->military_time)) }}
|
{{ Former::populateField('military_time', intval($account->military_time)) }}
|
||||||
@if ($showUser)
|
{{ Former::populateField('first_name', $user->first_name) }}
|
||||||
{{ Former::populateField('first_name', $primaryUser->first_name) }}
|
{{ Former::populateField('last_name', $user->last_name) }}
|
||||||
{{ Former::populateField('last_name', $primaryUser->last_name) }}
|
{{ Former::populateField('email', $user->email) }}
|
||||||
{{ Former::populateField('email', $primaryUser->email) }}
|
{{ Former::populateField('phone', $user->phone) }}
|
||||||
{{ Former::populateField('phone', $primaryUser->phone) }}
|
@if (Utils::isNinjaDev())
|
||||||
@if (Utils::isNinjaDev())
|
{{ Former::populateField('dark_mode', intval($user->dark_mode)) }}
|
||||||
{{ Former::populateField('dark_mode', intval($primaryUser->dark_mode)) }}
|
@endif
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
@ -76,30 +74,40 @@
|
|||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
|
|
||||||
@if ($showUser)
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3 class="panel-title">{!! trans('texts.primary_user') !!}</h3>
|
<h3 class="panel-title">{!! trans('texts.user_details') !!}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{!! Former::text('first_name') !!}
|
{!! Former::text('first_name') !!}
|
||||||
{!! Former::text('last_name') !!}
|
{!! Former::text('last_name') !!}
|
||||||
{!! Former::text('email') !!}
|
{!! Former::text('email') !!}
|
||||||
{!! Former::text('phone') !!}
|
{!! Former::text('phone') !!}
|
||||||
@if (Utils::isNinja() && $primaryUser->confirmed)
|
|
||||||
@if ($primaryUser->referral_code)
|
@if (Utils::isNinja())
|
||||||
|
{!! Former::plaintext('oneclick_login')->value(
|
||||||
|
$user->oauth_provider_id ?
|
||||||
|
$oauthProviderName . ' - ' . link_to('#', trans('texts.disable'), ['onclick' => 'disableSocialLogin()']) :
|
||||||
|
DropdownButton::primary(trans('texts.enable'))->withContents($oauthLoginUrls)->small()
|
||||||
|
) !!}
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if (Utils::isNinja() && $user->confirmed)
|
||||||
|
@if ($user->referral_code)
|
||||||
{!! Former::plaintext('referral_code')
|
{!! Former::plaintext('referral_code')
|
||||||
->value($primaryUser->referral_code . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
->value($user->referral_code . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
||||||
@else
|
@else
|
||||||
{!! Former::checkbox('referral_code')
|
{!! Former::checkbox('referral_code')
|
||||||
->text(trans('texts.enable') . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
->text(trans('texts.enable') . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
||||||
@endif
|
@endif
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if (false && Utils::isNinjaDev())
|
@if (false && Utils::isNinjaDev())
|
||||||
{!! Former::checkbox('dark_mode')->text(trans('texts.dark_mode_help')) !!}
|
{!! Former::checkbox('dark_mode')->text(trans('texts.dark_mode_help')) !!}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if (Utils::isNinja())
|
@if (Utils::isNinja())
|
||||||
|
<br/>
|
||||||
@if (Auth::user()->confirmed)
|
@if (Auth::user()->confirmed)
|
||||||
{!! Former::actions( Button::primary(trans('texts.change_password'))->small()->withAttributes(['onclick'=>'showChangePassword()'])) !!}
|
{!! Former::actions( Button::primary(trans('texts.change_password'))->small()->withAttributes(['onclick'=>'showChangePassword()'])) !!}
|
||||||
@elseif (Auth::user()->registered)
|
@elseif (Auth::user()->registered)
|
||||||
@ -108,7 +116,6 @@
|
|||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
@ -214,8 +221,9 @@
|
|||||||
|
|
||||||
$('#passwordModal').on('shown.bs.modal', function () {
|
$('#passwordModal').on('shown.bs.modal', function () {
|
||||||
$('#current_password').focus();
|
$('#current_password').focus();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
localStorage.setItem('auth_provider', '{{ strtolower($oauthProviderName) }}');
|
||||||
});
|
});
|
||||||
|
|
||||||
function deleteLogo() {
|
function deleteLogo() {
|
||||||
@ -294,6 +302,14 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function disableSocialLogin() {
|
||||||
|
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.location = '{{ URL::to('/auth_unlink') }}';
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@stop
|
@stop
|
||||||
|
@ -17,97 +17,116 @@
|
|||||||
@parent
|
@parent
|
||||||
@include('accounts.nav_advanced')
|
@include('accounts.nav_advanced')
|
||||||
|
|
||||||
{!! Former::open()->addClass('warn-on-exit') !!}
|
{!! Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!}
|
||||||
{{ Former::populate($account) }}
|
{{ Former::populate($account) }}
|
||||||
{{ Former::populateField('custom_invoice_taxes1', intval($account->custom_invoice_taxes1)) }}
|
{{ Former::populateField('custom_invoice_taxes1', intval($account->custom_invoice_taxes1)) }}
|
||||||
{{ Former::populateField('custom_invoice_taxes2', intval($account->custom_invoice_taxes2)) }}
|
{{ Former::populateField('custom_invoice_taxes2', intval($account->custom_invoice_taxes2)) }}
|
||||||
{{ Former::populateField('share_counter', intval($account->share_counter)) }}
|
{{ Former::populateField('share_counter', intval($account->share_counter)) }}
|
||||||
{{ Former::populateField('pdf_email_attachment', intval($account->pdf_email_attachment)) }}
|
{{ Former::populateField('pdf_email_attachment', intval($account->pdf_email_attachment)) }}
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3 class="panel-title">{!! trans('texts.invoice_fields') !!}</h3>
|
<h3 class="panel-title">{!! trans('texts.email_settings') !!}</h3>
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
{!! Former::text('custom_invoice_label1')->label(trans('texts.field_label'))
|
|
||||||
->append(Former::checkbox('custom_invoice_taxes1')->raw() . trans('texts.charge_taxes')) !!}
|
|
||||||
{!! Former::text('custom_invoice_label2')->label(trans('texts.field_label'))
|
|
||||||
->append(Former::checkbox('custom_invoice_taxes2')->raw() . ' ' . trans('texts.charge_taxes')) !!}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title">{!! trans('texts.client_fields') !!}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
{!! Former::text('custom_client_label1')->label(trans('texts.field_label')) !!}
|
|
||||||
{!! Former::text('custom_client_label2')->label(trans('texts.field_label')) !!}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title">{!! trans('texts.company_fields') !!}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
{!! Former::text('custom_label1')->label(trans('texts.field_label')) !!}
|
|
||||||
{!! Former::text('custom_value1')->label(trans('texts.field_value')) !!}
|
|
||||||
<p> </p>
|
|
||||||
{!! Former::text('custom_label2')->label(trans('texts.field_label')) !!}
|
|
||||||
{!! Former::text('custom_value2')->label(trans('texts.field_value')) !!}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title">{!! trans('texts.email_settings') !!}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
@if (Utils::isNinja())
|
@if (Utils::isNinja())
|
||||||
{{ Former::setOption('capitalize_translations', false) }}
|
{{ Former::setOption('capitalize_translations', false) }}
|
||||||
{!! Former::text('subdomain')->placeholder(trans('texts.www'))->onchange('onSubdomainChange()') !!}
|
{!! Former::text('subdomain')->placeholder(trans('texts.www'))->onchange('onSubdomainChange()') !!}
|
||||||
{!! Former::text('iframe_url')->placeholder('http://invoices.example.com/')
|
{!! Former::text('iframe_url')->placeholder('http://invoices.example.com/')
|
||||||
->onchange('onDomainChange()')->appendIcon('question-sign')->addGroupClass('iframe_url') !!}
|
->onchange('onDomainChange()')->appendIcon('question-sign')->addGroupClass('iframe_url') !!}
|
||||||
@endif
|
@endif
|
||||||
{!! Former::checkbox('pdf_email_attachment')->text(trans('texts.enable')) !!}
|
{!! Former::checkbox('pdf_email_attachment')->text(trans('texts.enable')) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3 class="panel-title">{!! trans('texts.invoice_number') !!}</h3>
|
<h3 class="panel-title">{!! trans('texts.invoice_quote_number') !!}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{!! Former::text('invoice_number_prefix')->label(trans('texts.prefix')) !!}
|
<div role="tabpanel">
|
||||||
{!! Former::text('invoice_number_counter')->label(trans('texts.counter')) !!}
|
<ul class="nav nav-tabs" role="tablist" style="border: none">
|
||||||
|
<li role="presentation" class="active"><a href="#invoiceNumber" aria-controls="invoiceNumber" role="tab" data-toggle="tab">{{ trans('texts.invoice_number') }}</a></li>
|
||||||
|
<li role="presentation"><a href="#quoteNumber" aria-controls="quoteNumber" role="tab" data-toggle="tab">{{ trans('texts.quote_number') }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div role="tabpanel" class="tab-pane active" id="invoiceNumber">
|
||||||
|
<div class="panel-body">
|
||||||
|
{!! Former::text('invoice_number_prefix')->label(trans('texts.prefix')) !!}
|
||||||
|
{!! Former::text('invoice_number_counter')->label(trans('texts.counter')) !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="quoteNumber">
|
||||||
|
<div class="panel-body">
|
||||||
|
{!! Former::text('quote_number_prefix')->label(trans('texts.prefix')) !!}
|
||||||
|
{!! Former::text('quote_number_counter')->label(trans('texts.counter'))
|
||||||
|
->append(Former::checkbox('share_counter')->raw()->onclick('setQuoteNumberEnabled()') . ' ' . trans('texts.share_invoice_counter')) !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3 class="panel-title">{!! trans('texts.quote_number') !!}</h3>
|
<h3 class="panel-title">{!! trans('texts.custom_fields') !!}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{!! Former::text('quote_number_prefix')->label(trans('texts.prefix')) !!}
|
|
||||||
{!! Former::text('quote_number_counter')->label(trans('texts.counter'))
|
<div role="tabpanel">
|
||||||
->append(Former::checkbox('share_counter')->raw()->onclick('setQuoteNumberEnabled()') . ' ' . trans('texts.share_invoice_counter')) !!}
|
<ul class="nav nav-tabs" role="tablist" style="border: none">
|
||||||
</div>
|
<li role="presentation" class="active"><a href="#clientFields" aria-controls="clientFields" role="tab" data-toggle="tab">{{ trans('texts.client_fields') }}</a></li>
|
||||||
|
<li role="presentation"><a href="#companyFields" aria-controls="companyFields" role="tab" data-toggle="tab">{{ trans('texts.company_fields') }}</a></li>
|
||||||
|
<li role="presentation"><a href="#invoiceFields" aria-controls="invoiceFields" role="tab" data-toggle="tab">{{ trans('texts.invoice_fields') }}</a></li>
|
||||||
|
<li role="presentation"><a href="#invoiceCharges" aria-controls="invoiceCharges" role="tab" data-toggle="tab">{{ trans('texts.invoice_charges') }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div role="tabpanel" class="tab-pane active" id="clientFields">
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
{!! Former::text('custom_client_label1')->label(trans('texts.field_label')) !!}
|
||||||
|
{!! Former::text('custom_client_label2')->label(trans('texts.field_label')) !!}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="companyFields">
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
{!! Former::text('custom_label1')->label(trans('texts.field_label')) !!}
|
||||||
|
{!! Former::text('custom_value1')->label(trans('texts.field_value')) !!}
|
||||||
|
<p> </p>
|
||||||
|
{!! Former::text('custom_label2')->label(trans('texts.field_label')) !!}
|
||||||
|
{!! Former::text('custom_value2')->label(trans('texts.field_value')) !!}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="invoiceFields">
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
{!! Former::text('custom_invoice_text_label1')->label(trans('texts.field_label')) !!}
|
||||||
|
{!! Former::text('custom_invoice_text_label2')->label(trans('texts.field_label')) !!}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="invoiceCharges">
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
{!! Former::text('custom_invoice_label1')->label(trans('texts.field_label'))
|
||||||
|
->append(Former::checkbox('custom_invoice_taxes1')->raw() . trans('texts.charge_taxes')) !!}
|
||||||
|
{!! Former::text('custom_invoice_label2')->label(trans('texts.field_label'))
|
||||||
|
->append(Former::checkbox('custom_invoice_taxes2')->raw() . trans('texts.charge_taxes')) !!}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if (Auth::user()->isPro())
|
@if (Auth::user()->isPro())
|
||||||
<center>
|
<center>
|
||||||
{!! Button::success(trans('texts.save'))->large()->submit()->appendIcon(Icon::create('floppy-disk')) !!}
|
{!! Button::success(trans('texts.save'))->large()->submit()->appendIcon(Icon::create('floppy-disk')) !!}
|
||||||
|
@ -64,10 +64,9 @@
|
|||||||
|
|
||||||
@include('partials.warn_session', ['redirectTo' => '/login'])
|
@include('partials.warn_session', ['redirectTo' => '/login'])
|
||||||
|
|
||||||
|
|
||||||
{!! Former::open('login')
|
{!! Former::open('login')
|
||||||
->rules(['email' => 'required|email', 'password' => 'required'])
|
->rules(['email' => 'required|email', 'password' => 'required'])
|
||||||
->addClass('form-signin warn-on-exit') !!}
|
->addClass('form-signin') !!}
|
||||||
{{ Former::populateField('remember', 'true') }}
|
{{ Former::populateField('remember', 'true') }}
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
@ -83,14 +82,18 @@
|
|||||||
{!! Former::hidden('remember')->raw() !!}
|
{!! Former::hidden('remember')->raw() !!}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>{!! Button::success(trans(Input::get('new_company') ? 'texts.login' : 'texts.lets_go'))->large()->submit()->block() !!}</p>
|
<p>{!! Button::success(trans('texts.login'))
|
||||||
|
->withAttributes(['id' => 'loginButton'])
|
||||||
|
->large()->submit()->block() !!}</p>
|
||||||
|
|
||||||
@if (Input::get('new_company') && Utils::allowNewAccounts())
|
@if (Input::get('new_company') && Utils::allowNewAccounts())
|
||||||
<center><p>- {{ trans('texts.or') }} -</p></center>
|
<center><p>- {{ trans('texts.or') }} -</p></center>
|
||||||
<p>{!! Button::primary(trans('texts.new_company'))->asLinkTo(URL::to('/invoice_now?new_company=true&sign_up=true'))->large()->submit()->block() !!}</p>
|
<p>{!! Button::primary(trans('texts.new_company'))->asLinkTo(URL::to('/invoice_now?new_company=true&sign_up=true'))->large()->submit()->block() !!}</p><br/>
|
||||||
|
@elseif (Utils::isNinja())
|
||||||
|
<center><p>- {{ trans('texts.or') }} -</p></center>
|
||||||
|
@include('partials.social_login_buttons', ['type' => 'login'])<br/>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|
||||||
<p class="link">
|
<p class="link">
|
||||||
{!! link_to('/forgot', trans('texts.forgot_password')) !!}
|
{!! link_to('/forgot', trans('texts.forgot_password')) !!}
|
||||||
{!! link_to(NINJA_WEB_URL.'/knowledgebase/', trans('texts.knowledge_base'), ['target' => '_blank', 'class' => 'pull-right']) !!}
|
{!! link_to(NINJA_WEB_URL.'/knowledgebase/', trans('texts.knowledge_base'), ['target' => '_blank', 'class' => 'pull-right']) !!}
|
||||||
@ -160,7 +163,15 @@
|
|||||||
} else {
|
} else {
|
||||||
$('#email').focus();
|
$('#email').focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If they're using OAuth we'll show just their provider button
|
||||||
|
var authProvider = localStorage.getItem('auth_provider');
|
||||||
|
if (authProvider) {
|
||||||
|
//$('#loginButton').removeClass('btn-success').addClass('btn-primary');
|
||||||
|
$('#' + authProvider + 'LoginButton').removeClass('btn-primary').addClass('btn-success');
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
20
resources/views/emails/email_bounced_html.blade.php
Normal file
20
resources/views/emails/email_bounced_html.blade.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="{{ App::getLocale() }}">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
@if (false)
|
||||||
|
@include('emails.view_action', ['link' => $invoiceLink, 'entityType' => $entityType])
|
||||||
|
@endif
|
||||||
|
{{ trans('texts.email_salutation', ['name' => $userName]) }} <p/>
|
||||||
|
|
||||||
|
{{ trans("texts.notification_{$entityType}_bounced", ['contact' => $contactName, 'invoice' => $invoiceNumber]) }} <p/>
|
||||||
|
|
||||||
|
{{ $emailError }}<p/>
|
||||||
|
|
||||||
|
{{ trans('texts.email_signature') }} <br/>
|
||||||
|
{{ trans('texts.email_from') }} <p/>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
8
resources/views/emails/email_bounced_text.blade.php
Normal file
8
resources/views/emails/email_bounced_text.blade.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{!! trans('texts.email_salutation', ['name' => $userName]) !!}
|
||||||
|
|
||||||
|
{!! trans("texts.notification_{$entityType}_bounced", ['contact' => $contactName, 'invoice' => $invoiceNumber]) !!}
|
||||||
|
|
||||||
|
{!! $emailError !!}
|
||||||
|
|
||||||
|
{!! trans('texts.email_signature') !!}
|
||||||
|
{!! trans('texts.email_from') !!}
|
@ -163,6 +163,10 @@
|
|||||||
$('#signUpModal').modal('show');
|
$('#signUpModal').modal('show');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hideSignUp() {
|
||||||
|
$('#signUpModal').modal('hide');
|
||||||
|
}
|
||||||
|
|
||||||
NINJA.proPlanFeature = '';
|
NINJA.proPlanFeature = '';
|
||||||
function showProPlan(feature) {
|
function showProPlan(feature) {
|
||||||
$('#proPlanModal').modal('show');
|
$('#proPlanModal').modal('show');
|
||||||
@ -239,6 +243,10 @@
|
|||||||
@endif
|
@endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setSignupEnabled(enabled) {
|
||||||
|
$('.signup-form input[type=text], .signup-form button').prop('disabled', !enabled);
|
||||||
|
}
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
window.setTimeout(function() {
|
window.setTimeout(function() {
|
||||||
$(".alert-hide").fadeOut();
|
$(".alert-hide").fadeOut();
|
||||||
@ -253,6 +261,7 @@
|
|||||||
$('#search').css('width', '{{ Utils::isEnglish() ? 256 : 216 }}px');
|
$('#search').css('width', '{{ Utils::isEnglish() ? 256 : 216 }}px');
|
||||||
$('ul.navbar-right').hide();
|
$('ul.navbar-right').hide();
|
||||||
if (!window.hasOwnProperty('searchData')) {
|
if (!window.hasOwnProperty('searchData')) {
|
||||||
|
trackEvent('/activity', '/search');
|
||||||
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
||||||
window.searchData = true;
|
window.searchData = true;
|
||||||
var datasets = [];
|
var datasets = [];
|
||||||
@ -306,9 +315,6 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
$('ul.navbar-settings, ul.navbar-history').hover(function () {
|
$('ul.navbar-settings, ul.navbar-history').hover(function () {
|
||||||
//$('.user-accounts').find('li').hide();
|
|
||||||
//$('.user-accounts').css({display: 'none'});
|
|
||||||
//console.log($('.user-accounts').dropdown(''))
|
|
||||||
if ($('.user-accounts').css('display') == 'block') {
|
if ($('.user-accounts').css('display') == 'block') {
|
||||||
$('.user-accounts').dropdown('toggle');
|
$('.user-accounts').dropdown('toggle');
|
||||||
}
|
}
|
||||||
@ -320,6 +326,14 @@
|
|||||||
$('#{{ Input::get('focus') }}').focus();
|
$('#{{ Input::get('focus') }}').focus();
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
// Ensure terms is checked for sign up form
|
||||||
|
@if (Auth::check() && !Auth::user()->registered)
|
||||||
|
setSignupEnabled(false);
|
||||||
|
$("#terms_checkbox").change(function() {
|
||||||
|
setSignupEnabled(this.checked);
|
||||||
|
});
|
||||||
|
@endif
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@ -527,11 +541,37 @@
|
|||||||
{!! Former::text('go_pro') !!}
|
{!! Former::text('go_pro') !!}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{!! Former::text('new_first_name')->label(trans('texts.first_name')) !!}
|
|
||||||
{!! Former::text('new_last_name')->label(trans('texts.last_name')) !!}
|
<div class="row signup-form">
|
||||||
{!! Former::text('new_email')->label(trans('texts.email')) !!}
|
<div class="col-md-11 col-md-offset-1">
|
||||||
{!! Former::password('new_password')->label(trans('texts.password')) !!}
|
{!! Former::checkbox('terms_checkbox')->label(' ')->text(trans('texts.agree_to_terms', ['terms' => '<a href="'.URL::to('terms').'" target="_blank">'.trans('texts.terms_of_service').'</a>']))->raw() !!}
|
||||||
{!! Former::checkbox('terms_checkbox')->label(' ')->text(trans('texts.agree_to_terms', ['terms' => '<a href="'.URL::to('terms').'" target="_blank">'.trans('texts.terms_of_service').'</a>'])) !!}
|
<br/>
|
||||||
|
</div>
|
||||||
|
@if (Utils::isNinja())
|
||||||
|
<div class="col-md-4 col-md-offset-1">
|
||||||
|
<h4>{{ trans('texts.sign_up_using') }}</h4><br/>
|
||||||
|
@include('partials.social_login_buttons', ['type' => 'sign_up'])
|
||||||
|
</div>
|
||||||
|
<div class="col-md-1">
|
||||||
|
<div style="border-right:thin solid #CCCCCC;height:110px;width:8px;margin-bottom:10px;"></div>
|
||||||
|
{{ trans('texts.or') }}
|
||||||
|
<div style="border-right:thin solid #CCCCCC;height:110px;width:8px;margin-top:10px;"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
@else
|
||||||
|
<div class="col-md-12">
|
||||||
|
@endif
|
||||||
|
{{ Former::setOption('TwitterBootstrap3.labelWidths.large', 1) }}
|
||||||
|
{{ Former::setOption('TwitterBootstrap3.labelWidths.small', 1) }}
|
||||||
|
{!! Former::text('new_first_name')->placeholder(trans('texts.first_name'))->label(' ') !!}
|
||||||
|
{!! Former::text('new_last_name')->placeholder(trans('texts.last_name'))->label(' ') !!}
|
||||||
|
{!! Former::text('new_email')->placeholder(trans('texts.email'))->label(' ') !!}
|
||||||
|
{!! Former::password('new_password')->placeholder(trans('texts.password'))->label(' ') !!}
|
||||||
|
{{ Former::setOption('TwitterBootstrap3.labelWidths.large', 4) }}
|
||||||
|
{{ Former::setOption('TwitterBootstrap3.labelWidths.small', 4) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{!! Former::close() !!}
|
{!! Former::close() !!}
|
||||||
|
|
||||||
<center><div id="errorTaken" style="display:none"> <br/>{{ trans('texts.email_taken') }}</div></center>
|
<center><div id="errorTaken" style="display:none"> <br/>{{ trans('texts.email_taken') }}</div></center>
|
||||||
|
@ -70,8 +70,14 @@
|
|||||||
<div class="col-lg-8 col-lg-offset-4">
|
<div class="col-lg-8 col-lg-offset-4">
|
||||||
<label class="checkbox" data-bind="attr: {for: $index() + '_check'}" onclick="refreshPDF(true)">
|
<label class="checkbox" data-bind="attr: {for: $index() + '_check'}" onclick="refreshPDF(true)">
|
||||||
<input type="checkbox" value="1" data-bind="checked: send_invoice, attr: {id: $index() + '_check'}">
|
<input type="checkbox" value="1" data-bind="checked: send_invoice, attr: {id: $index() + '_check'}">
|
||||||
<span data-bind="html: email.display"/>
|
<span data-bind="html: email.display"></span>
|
||||||
</label>
|
</label>
|
||||||
|
<span data-bind="html: $data.view_as_recipient"></span>
|
||||||
|
<span style="vertical-align:text-top;color:red" class="fa fa-exclamation-triangle"
|
||||||
|
data-bind="visible: $data.email_error, tooltip: {title: $data.email_error}"></span>
|
||||||
|
<span style="vertical-align:text-top" class="glyphicon glyphicon-info-sign"
|
||||||
|
data-bind="visible: $data.invitation_status, tooltip: {title: $data.invitation_status, html: true},
|
||||||
|
style: {color: $data.hasOwnProperty('invitation_viewed') && $data.invitation_viewed() ? '#57D172':'#B1B5BA'}"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -87,16 +93,23 @@
|
|||||||
{!! Former::text('partial')->data_bind("value: partial, valueUpdate: 'afterkeydown'")->onchange('onPartialChange()')
|
{!! Former::text('partial')->data_bind("value: partial, valueUpdate: 'afterkeydown'")->onchange('onPartialChange()')
|
||||||
->rel('tooltip')->data_toggle('tooltip')->data_placement('bottom')->title(trans('texts.partial_value')) !!}
|
->rel('tooltip')->data_toggle('tooltip')->data_placement('bottom')->title(trans('texts.partial_value')) !!}
|
||||||
</div>
|
</div>
|
||||||
@if ($entityType == ENTITY_INVOICE)
|
@if ($entityType == ENTITY_INVOICE)
|
||||||
<div data-bind="visible: is_recurring" style="display: none">
|
<div data-bind="visible: is_recurring" style="display: none">
|
||||||
{!! Former::select('frequency_id')->options($frequencies)->data_bind("value: frequency_id")
|
{!! Former::select('frequency_id')->options($frequencies)->data_bind("value: frequency_id")
|
||||||
->appendIcon('question-sign')->addGroupClass('frequency_id') !!}
|
->appendIcon('question-sign')->addGroupClass('frequency_id') !!}
|
||||||
{!! Former::text('start_date')->data_bind("datePicker: start_date, valueUpdate: 'afterkeydown'")
|
{!! Former::text('start_date')->data_bind("datePicker: start_date, valueUpdate: 'afterkeydown'")
|
||||||
->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT))->appendIcon('calendar')->addGroupClass('start_date') !!}
|
->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT))->appendIcon('calendar')->addGroupClass('start_date') !!}
|
||||||
{!! Former::text('end_date')->data_bind("datePicker: end_date, valueUpdate: 'afterkeydown'")
|
{!! Former::text('end_date')->data_bind("datePicker: end_date, valueUpdate: 'afterkeydown'")
|
||||||
->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT))->appendIcon('calendar')->addGroupClass('end_date') !!}
|
->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT))->appendIcon('calendar')->addGroupClass('end_date') !!}
|
||||||
</div>
|
</div>
|
||||||
@if ($invoice && $invoice->recurring_invoice)
|
@endif
|
||||||
|
|
||||||
|
@if ($account->custom_invoice_text_label1 || $invoice && $account->custom_text_value1)
|
||||||
|
{!! 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 && $invoice->recurring_invoice)
|
||||||
<div class="pull-right" style="padding-top: 6px">
|
<div class="pull-right" style="padding-top: 6px">
|
||||||
{!! trans('texts.created_by_invoice', ['invoice' => link_to('/invoices/'.$invoice->recurring_invoice->public_id, trans('texts.recurring_invoice'))]) !!}
|
{!! trans('texts.created_by_invoice', ['invoice' => link_to('/invoices/'.$invoice->recurring_invoice->public_id, trans('texts.recurring_invoice'))]) !!}
|
||||||
</div>
|
</div>
|
||||||
@ -128,6 +141,11 @@
|
|||||||
->addOption(trans('texts.discount_amount'), '1')->data_bind("value: is_amount_discount")->raw()
|
->addOption(trans('texts.discount_amount'), '1')->data_bind("value: is_amount_discount")->raw()
|
||||||
) !!}
|
) !!}
|
||||||
|
|
||||||
|
@if ($account->custom_invoice_text_label2 || $invoice && $account->custom_text_value2)
|
||||||
|
{!! Former::text('custom_text_value2')->label($account->custom_invoice_text_label2)->data_bind("value: custom_text_value2, valueUpdate: 'afterkeydown'") !!}
|
||||||
|
@endif
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group" style="margin-bottom: 8px">
|
<div class="form-group" style="margin-bottom: 8px">
|
||||||
<label for="taxes" class="control-label col-lg-4 col-sm-4">{{ trans('texts.taxes') }}</label>
|
<label for="taxes" class="control-label col-lg-4 col-sm-4">{{ trans('texts.taxes') }}</label>
|
||||||
<div class="col-lg-8 col-sm-8" style="padding-top: 10px">
|
<div class="col-lg-8 col-sm-8" style="padding-top: 10px">
|
||||||
@ -614,7 +632,7 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#invoice_footer, #terms, #public_notes, #invoice_number, #invoice_date, #due_date, #po_number, #discount, #currency_id, #invoice_design_id, #recurring, #is_amount_discount, #partial').change(function() {
|
$('#invoice_footer, #terms, #public_notes, #invoice_number, #invoice_date, #due_date, #po_number, #discount, #currency_id, #invoice_design_id, #recurring, #is_amount_discount, #partial, #custom_text_value1, #custom_text_value2').change(function() {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
refreshPDF(true);
|
refreshPDF(true);
|
||||||
}, 1);
|
}, 1);
|
||||||
@ -1207,6 +1225,8 @@
|
|||||||
self.custom_value2 = ko.observable(0);
|
self.custom_value2 = ko.observable(0);
|
||||||
self.custom_taxes1 = ko.observable(false);
|
self.custom_taxes1 = ko.observable(false);
|
||||||
self.custom_taxes2 = ko.observable(false);
|
self.custom_taxes2 = ko.observable(false);
|
||||||
|
self.custom_text_value1 = ko.observable();
|
||||||
|
self.custom_text_value2 = ko.observable();
|
||||||
|
|
||||||
self.mapping = {
|
self.mapping = {
|
||||||
'client': {
|
'client': {
|
||||||
@ -1574,6 +1594,9 @@
|
|||||||
self.phone = ko.observable('');
|
self.phone = ko.observable('');
|
||||||
self.send_invoice = ko.observable(false);
|
self.send_invoice = ko.observable(false);
|
||||||
self.invitation_link = ko.observable('');
|
self.invitation_link = ko.observable('');
|
||||||
|
self.invitation_status = ko.observable('');
|
||||||
|
self.invitation_viewed = ko.observable(false);
|
||||||
|
self.email_error = ko.observable('');
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
ko.mapping.fromJS(data, {}, this);
|
ko.mapping.fromJS(data, {}, this);
|
||||||
@ -1599,7 +1622,11 @@
|
|||||||
if (self.email()) {
|
if (self.email()) {
|
||||||
str += self.email() + '<br/>';
|
str += self.email() + '<br/>';
|
||||||
}
|
}
|
||||||
|
return str;
|
||||||
|
});
|
||||||
|
|
||||||
|
self.view_as_recipient = ko.computed(function() {
|
||||||
|
var str = '';
|
||||||
@if (Utils::isConfirmed())
|
@if (Utils::isConfirmed())
|
||||||
if (self.invitation_link()) {
|
if (self.invitation_link()) {
|
||||||
str += '<a href="' + self.invitation_link() + '" target="_blank">{{ trans('texts.view_as_recipient') }}</a>';
|
str += '<a href="' + self.invitation_link() + '" target="_blank">{{ trans('texts.view_as_recipient') }}</a>';
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
@if (count($paymentTypes) > 1)
|
@if (count($paymentTypes) > 1)
|
||||||
{!! DropdownButton::success(trans('texts.pay_now'))->withContents($paymentTypes)->large() !!}
|
{!! DropdownButton::success(trans('texts.pay_now'))->withContents($paymentTypes)->large() !!}
|
||||||
@else
|
@else
|
||||||
{!! Button::success(trans('texts.pay_now'))->asLinkTo(URL::to($paymentURL))->large() !!}
|
{!! link_to(URL::to($paymentURL), trans('texts.pay_now'), ['class' => 'btn btn-success btn-lg']) !!}
|
||||||
@endif
|
@endif
|
||||||
@else
|
@else
|
||||||
{!! Button::normal('Download PDF')->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}
|
{!! Button::normal('Download PDF')->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}
|
||||||
|
@ -172,8 +172,6 @@
|
|||||||
trackEvent('/view_link', track ? track : url);
|
trackEvent('/view_link', track ? track : url);
|
||||||
window.open(url, '_blank');
|
window.open(url, '_blank');
|
||||||
}
|
}
|
||||||
|
|
||||||
//$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
16
resources/views/partials/social_login_buttons.blade.php
Normal file
16
resources/views/partials/social_login_buttons.blade.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
@foreach (App\Services\AuthService::$providers as $provider)
|
||||||
|
<button type="button" class="btn btn-primary btn-block" onclick="socialSignup('{{ strtolower($provider) }}')" id="{{ strtolower($provider) }}LoginButton">
|
||||||
|
<i class="fa fa-{{ strtolower($provider) }}"></i>
|
||||||
|
{{ $provider }}
|
||||||
|
</button>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function socialSignup(provider) {
|
||||||
|
trackEvent('/account', '/social_{{ $type }}/' + provider);
|
||||||
|
localStorage.setItem('auth_provider', provider);
|
||||||
|
setTimeout(function() {
|
||||||
|
window.location = '{{ SITE_URL }}/auth/' + provider;
|
||||||
|
}, 150);
|
||||||
|
}
|
||||||
|
</script>
|
@ -32,7 +32,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
if ($('form.warn-on-exit').length > 0) {
|
if ($('form.warn-on-exit, form.form-signin').length > 0) {
|
||||||
startWarnSessionTimeout();
|
startWarnSessionTimeout();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<?php //[STAMP] fd572cb1f679911978b9f48a842ed64b
|
<?php //[STAMP] 69e45a9997e207a2465b88d46d4f9fcb
|
||||||
namespace _generated;
|
namespace _generated;
|
||||||
|
|
||||||
// This class was automatically generated by build task
|
// This class was automatically generated by build task
|
||||||
@ -1425,7 +1425,28 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
|
* Grabs either the text content, or attribute values, of nodes
|
||||||
|
* matched by $cssOrXpath and returns them as an array.
|
||||||
*
|
*
|
||||||
|
* ```html
|
||||||
|
* <a href="#first">First</a>
|
||||||
|
* <a href="#second">Second</a>
|
||||||
|
* <a href="#third">Third</a>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* <?php
|
||||||
|
* // would return ['First', 'Second', 'Third']
|
||||||
|
* $aLinkText = $I->grabMultiple('a');
|
||||||
|
*
|
||||||
|
* // would return ['#first', '#second', '#third']
|
||||||
|
* $aLinks = $I->grabMultiple('a', 'href');
|
||||||
|
* ?>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param $cssOrXpath
|
||||||
|
* @param $attribute
|
||||||
|
* @return string[]
|
||||||
* @see \Codeception\Module\WebDriver::grabMultiple()
|
* @see \Codeception\Module\WebDriver::grabMultiple()
|
||||||
*/
|
*/
|
||||||
public function grabMultiple($cssOrXpath, $attribute = null) {
|
public function grabMultiple($cssOrXpath, $attribute = null) {
|
||||||
@ -1640,6 +1661,27 @@ trait AcceptanceTesterActions
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
|
* @see \Codeception\Module\WebDriver::seeNumberOfElementsInDOM()
|
||||||
|
*/
|
||||||
|
public function canSeeNumberOfElementsInDOM($selector, $expected) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeNumberOfElementsInDOM', func_get_args()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @see \Codeception\Module\WebDriver::seeNumberOfElementsInDOM()
|
||||||
|
*/
|
||||||
|
public function seeNumberOfElementsInDOM($selector, $expected) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeNumberOfElementsInDOM', func_get_args()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
@ -2463,34 +2505,7 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Saves current cookies into named snapshot in order to restore them in other tests
|
* @param string $name
|
||||||
* This is useful to save session state between tests.
|
|
||||||
* For example, if user needs log in to site for each test this scenario can be executed once
|
|
||||||
* while other tests can just restore saved cookies.
|
|
||||||
*
|
|
||||||
* ``` php
|
|
||||||
* <?php
|
|
||||||
* // inside AcceptanceTester class:
|
|
||||||
*
|
|
||||||
* public function login()
|
|
||||||
* {
|
|
||||||
* // if snapshot exists - skipping login
|
|
||||||
* if ($I->loadSessionSnapshot('login')) return;
|
|
||||||
*
|
|
||||||
* // logging in
|
|
||||||
* $I->amOnPage('/login');
|
|
||||||
* $I->fillField('name', 'jon');
|
|
||||||
* $I->fillField('password', '123345');
|
|
||||||
* $I->click('Login');
|
|
||||||
*
|
|
||||||
* // saving snapshot
|
|
||||||
* $I->saveSessionSnapshot('login');
|
|
||||||
* }
|
|
||||||
* ?>
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* @param $name
|
|
||||||
* @return mixed
|
|
||||||
* @see \Codeception\Module\WebDriver::saveSessionSnapshot()
|
* @see \Codeception\Module\WebDriver::saveSessionSnapshot()
|
||||||
*/
|
*/
|
||||||
public function saveSessionSnapshot($name) {
|
public function saveSessionSnapshot($name) {
|
||||||
@ -2501,11 +2516,8 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Loads cookies from saved snapshot.
|
* @param string $name
|
||||||
*
|
* @return bool
|
||||||
* @param $name
|
|
||||||
* @see saveSessionSnapshot
|
|
||||||
* @return mixed
|
|
||||||
* @see \Codeception\Module\WebDriver::loadSessionSnapshot()
|
* @see \Codeception\Module\WebDriver::loadSessionSnapshot()
|
||||||
*/
|
*/
|
||||||
public function loadSessionSnapshot($name) {
|
public function loadSessionSnapshot($name) {
|
||||||
@ -2603,13 +2615,13 @@ trait AcceptanceTesterActions
|
|||||||
* ?>
|
* ?>
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @param int $num Expected number
|
* @param int $expectedNumber Expected number
|
||||||
* @param string $table Table name
|
* @param string $table Table name
|
||||||
* @param array $criteria Search criteria [Optional]
|
* @param array $criteria Search criteria [Optional]
|
||||||
* Conditional Assertion: Test won't be stopped on fail
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
* @see \Codeception\Module\Db::seeNumRecords()
|
* @see \Codeception\Module\Db::seeNumRecords()
|
||||||
*/
|
*/
|
||||||
public function canSeeNumRecords($num, $table, $criteria = null) {
|
public function canSeeNumRecords($expectedNumber, $table, $criteria = null) {
|
||||||
return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeNumRecords', func_get_args()));
|
return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeNumRecords', func_get_args()));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -2623,12 +2635,12 @@ trait AcceptanceTesterActions
|
|||||||
* ?>
|
* ?>
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @param int $num Expected number
|
* @param int $expectedNumber Expected number
|
||||||
* @param string $table Table name
|
* @param string $table Table name
|
||||||
* @param array $criteria Search criteria [Optional]
|
* @param array $criteria Search criteria [Optional]
|
||||||
* @see \Codeception\Module\Db::seeNumRecords()
|
* @see \Codeception\Module\Db::seeNumRecords()
|
||||||
*/
|
*/
|
||||||
public function seeNumRecords($num, $table, $criteria = null) {
|
public function seeNumRecords($expectedNumber, $table, $criteria = null) {
|
||||||
return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeNumRecords', func_get_args()));
|
return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeNumRecords', func_get_args()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user