mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-11 13:42:49 +01:00
Merge remote-tracking branch 'upstream/develop' into develop
This commit is contained in:
commit
2e2e3ee3f2
12
.travis.yml
12
.travis.yml
@ -63,7 +63,7 @@ before_script:
|
|||||||
- curl -L http://ninja.dev:8000/update
|
- curl -L http://ninja.dev:8000/update
|
||||||
|
|
||||||
script:
|
script:
|
||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance AllPagesCept.php
|
- php ./vendor/codeception/codeception/codecept run --debug acceptance AllPagesCept.php
|
||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance APICest.php
|
#- php ./vendor/codeception/codeception/codecept run --debug acceptance APICest.php
|
||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance CheckBalanceCest.php
|
#- php ./vendor/codeception/codeception/codecept run --debug acceptance CheckBalanceCest.php
|
||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance ClientCest.php
|
#- php ./vendor/codeception/codeception/codecept run --debug acceptance ClientCest.php
|
||||||
@ -75,10 +75,16 @@ script:
|
|||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance TaskCest.php
|
#- php ./vendor/codeception/codeception/codecept run --debug acceptance TaskCest.php
|
||||||
#- php ./vendor/codeception/codeception/codecept run --debug acceptance TaxRatesCest.php
|
#- php ./vendor/codeception/codeception/codecept run --debug acceptance TaxRatesCest.php
|
||||||
|
|
||||||
- sed -i 's/NINJA_DEV=true/NINJA_PROD=true/g' .env
|
#- sed -i 's/NINJA_DEV=true/NINJA_PROD=true/g' .env
|
||||||
- php ./vendor/codeception/codeception/codecept run acceptance GoProCest.php
|
#- php ./vendor/codeception/codeception/codecept run acceptance GoProCest.php
|
||||||
|
|
||||||
after_script:
|
after_script:
|
||||||
|
- cat .env
|
||||||
|
- mysql -u root -e 'select * from accounts;' ninja
|
||||||
|
- mysql -u root -e 'select * from account_gateways;' ninja
|
||||||
|
- mysql -u root -e 'select * from clients;' ninja
|
||||||
|
- mysql -u root -e 'select * from invoices;' ninja
|
||||||
|
- mysql -u root -e 'select * from invoice_items;' ninja
|
||||||
- cat storage/logs/laravel.log
|
- cat storage/logs/laravel.log
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
|
63
app/Console/Commands/ChargeRenewalInvoices.php
Normal file
63
app/Console/Commands/ChargeRenewalInvoices.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use App\Ninja\Mailers\ContactMailer as Mailer;
|
||||||
|
use App\Ninja\Repositories\AccountRepository;
|
||||||
|
use App\Services\PaymentService;
|
||||||
|
use App\Models\Invoice;
|
||||||
|
|
||||||
|
class ChargeRenewalInvoices extends Command
|
||||||
|
{
|
||||||
|
protected $name = 'ninja:charge-renewals';
|
||||||
|
protected $description = 'Charge renewal invoices';
|
||||||
|
|
||||||
|
protected $mailer;
|
||||||
|
protected $accountRepo;
|
||||||
|
protected $paymentService;
|
||||||
|
|
||||||
|
public function __construct(Mailer $mailer, AccountRepository $repo, PaymentService $paymentService)
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->mailer = $mailer;
|
||||||
|
$this->accountRepo = $repo;
|
||||||
|
$this->paymentService = $paymentService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fire()
|
||||||
|
{
|
||||||
|
$this->info(date('Y-m-d').' ChargeRenewalInvoices...');
|
||||||
|
|
||||||
|
$account = $this->accountRepo->getNinjaAccount();
|
||||||
|
$invoices = Invoice::whereAccountId($account->id)
|
||||||
|
->whereDueDate(date('Y-m-d'))
|
||||||
|
->with('client')
|
||||||
|
->orderBy('id')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$this->info(count($invoices).' invoices found');
|
||||||
|
|
||||||
|
foreach ($invoices as $invoice) {
|
||||||
|
$this->info("Charging invoice {$invoice->invoice_number}");
|
||||||
|
$this->paymentService->autoBillInvoice($invoice);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->info('Done');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getArguments()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
//array('example', InputArgument::REQUIRED, 'An example argument.'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getOptions()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
//array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
68
app/Console/Commands/GenerateResources.php
Normal file
68
app/Console/Commands/GenerateResources.php
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?php namespace app\Console\Commands;
|
||||||
|
|
||||||
|
use File;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class GenerateResources extends Command
|
||||||
|
{
|
||||||
|
protected $name = 'ninja:generate-resources';
|
||||||
|
protected $description = 'Generate Resouces';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the command.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function fire()
|
||||||
|
{
|
||||||
|
$langs = [
|
||||||
|
'da',
|
||||||
|
'de',
|
||||||
|
'en',
|
||||||
|
'es',
|
||||||
|
'es_ES',
|
||||||
|
'fr',
|
||||||
|
'fr_CA',
|
||||||
|
'it',
|
||||||
|
'lt',
|
||||||
|
'nb_NO',
|
||||||
|
'nl',
|
||||||
|
'pt_BR',
|
||||||
|
'sv'
|
||||||
|
];
|
||||||
|
|
||||||
|
$texts = File::getRequire(base_path() . '/resources/lang/en/texts.php');
|
||||||
|
|
||||||
|
foreach ($texts as $key => $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
echo $key;
|
||||||
|
} else {
|
||||||
|
echo "$key => $value\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getArguments()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
//array('example', InputArgument::REQUIRED, 'An example argument.'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getOptions()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
//array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -47,7 +47,7 @@ class SendRenewalInvoices extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
$client = $this->accountRepo->getNinjaClient($account);
|
$client = $this->accountRepo->getNinjaClient($account);
|
||||||
$invitation = $this->accountRepo->createNinjaInvoice($client);
|
$invitation = $this->accountRepo->createNinjaInvoice($client, $account);
|
||||||
|
|
||||||
// set the due date to 10 days from now
|
// set the due date to 10 days from now
|
||||||
$invoice = $invitation->invoice;
|
$invoice = $invitation->invoice;
|
||||||
|
@ -16,8 +16,10 @@ class Kernel extends ConsoleKernel
|
|||||||
'App\Console\Commands\ResetData',
|
'App\Console\Commands\ResetData',
|
||||||
'App\Console\Commands\CheckData',
|
'App\Console\Commands\CheckData',
|
||||||
'App\Console\Commands\SendRenewalInvoices',
|
'App\Console\Commands\SendRenewalInvoices',
|
||||||
|
'App\Console\Commands\ChargeRenewalInvoices',
|
||||||
'App\Console\Commands\SendReminders',
|
'App\Console\Commands\SendReminders',
|
||||||
'App\Console\Commands\TestOFX',
|
'App\Console\Commands\TestOFX',
|
||||||
|
'App\Console\Commands\GenerateResources',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -243,6 +243,7 @@ class AppController extends BaseController
|
|||||||
if (!Utils::isNinjaProd()) {
|
if (!Utils::isNinjaProd()) {
|
||||||
try {
|
try {
|
||||||
set_time_limit(60 * 5);
|
set_time_limit(60 * 5);
|
||||||
|
Artisan::call('optimize', array('--force' => true));
|
||||||
Cache::flush();
|
Cache::flush();
|
||||||
Session::flush();
|
Session::flush();
|
||||||
Artisan::call('migrate', array('--force' => true));
|
Artisan::call('migrate', array('--force' => true));
|
||||||
@ -254,7 +255,6 @@ class AppController extends BaseController
|
|||||||
] as $seeder) {
|
] as $seeder) {
|
||||||
Artisan::call('db:seed', array('--force' => true, '--class' => "{$seeder}Seeder"));
|
Artisan::call('db:seed', array('--force' => true, '--class' => "{$seeder}Seeder"));
|
||||||
}
|
}
|
||||||
Artisan::call('optimize', array('--force' => true));
|
|
||||||
Event::fire(new UserSettingsChanged());
|
Event::fire(new UserSettingsChanged());
|
||||||
Session::flash('message', trans('texts.processed_updates'));
|
Session::flash('message', trans('texts.processed_updates'));
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
@ -10,8 +10,6 @@ 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 App\Services\AuthService;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
|
||||||
use Illuminate\Contracts\Auth\Registrar;
|
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
||||||
|
|
||||||
class AuthController extends Controller {
|
class AuthController extends Controller {
|
||||||
@ -41,16 +39,38 @@ 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, AuthService $authService)
|
public function __construct(AccountRepository $repo, AuthService $authService)
|
||||||
{
|
{
|
||||||
$this->auth = $auth;
|
|
||||||
$this->registrar = $registrar;
|
|
||||||
$this->accountRepo = $repo;
|
$this->accountRepo = $repo;
|
||||||
$this->authService = $authService;
|
$this->authService = $authService;
|
||||||
|
|
||||||
//$this->middleware('guest', ['except' => 'getLogout']);
|
//$this->middleware('guest', ['except' => 'getLogout']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validator(array $data)
|
||||||
|
{
|
||||||
|
return Validator::make($data, [
|
||||||
|
'name' => 'required|max:255',
|
||||||
|
'email' => 'required|email|max:255|unique:users',
|
||||||
|
'password' => 'required|confirmed|min:6',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new user instance after a valid registration.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function create(array $data)
|
||||||
|
{
|
||||||
|
return User::create([
|
||||||
|
'name' => $data['name'],
|
||||||
|
'email' => $data['email'],
|
||||||
|
'password' => bcrypt($data['password']),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function authLogin($provider, Request $request)
|
public function authLogin($provider, Request $request)
|
||||||
{
|
{
|
||||||
return $this->authService->execute($provider, $request->has('code'));
|
return $this->authService->execute($provider, $request->has('code'));
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
<?php namespace App\Http\Controllers\Auth;
|
<?php namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
|
||||||
use Illuminate\Contracts\Auth\PasswordBroker;
|
|
||||||
use Illuminate\Foundation\Auth\ResetsPasswords;
|
use Illuminate\Foundation\Auth\ResetsPasswords;
|
||||||
|
|
||||||
class PasswordController extends Controller {
|
class PasswordController extends Controller {
|
||||||
@ -29,11 +27,8 @@ class PasswordController extends Controller {
|
|||||||
* @param \Illuminate\Contracts\Auth\PasswordBroker $passwords
|
* @param \Illuminate\Contracts\Auth\PasswordBroker $passwords
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(Guard $auth, PasswordBroker $passwords)
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->auth = $auth;
|
|
||||||
$this->passwords = $passwords;
|
|
||||||
|
|
||||||
$this->middleware('guest');
|
$this->middleware('guest');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,7 +509,7 @@ if (!defined('CONTACT_EMAIL')) {
|
|||||||
define('NINJA_GATEWAY_CONFIG', 'NINJA_GATEWAY_CONFIG');
|
define('NINJA_GATEWAY_CONFIG', 'NINJA_GATEWAY_CONFIG');
|
||||||
define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
|
define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
|
||||||
define('NINJA_APP_URL', 'https://app.invoiceninja.com');
|
define('NINJA_APP_URL', 'https://app.invoiceninja.com');
|
||||||
define('NINJA_VERSION', '2.5.0.2');
|
define('NINJA_VERSION', '2.5.0.3');
|
||||||
define('NINJA_DATE', '2000-01-01');
|
define('NINJA_DATE', '2000-01-01');
|
||||||
|
|
||||||
define('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja');
|
define('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja');
|
||||||
|
@ -24,29 +24,49 @@ class SubscriptionListener
|
|||||||
{
|
{
|
||||||
public function createdClient(ClientWasCreated $event)
|
public function createdClient(ClientWasCreated $event)
|
||||||
{
|
{
|
||||||
|
if ( ! Auth::check()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$transformer = new ClientTransformer(Auth::user()->account);
|
$transformer = new ClientTransformer(Auth::user()->account);
|
||||||
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CLIENT, $event->client, $transformer);
|
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CLIENT, $event->client, $transformer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createdQuote(QuoteWasCreated $event)
|
public function createdQuote(QuoteWasCreated $event)
|
||||||
{
|
{
|
||||||
|
if ( ! Auth::check()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$transformer = new InvoiceTransformer(Auth::user()->account);
|
$transformer = new InvoiceTransformer(Auth::user()->account);
|
||||||
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_QUOTE, $event->quote, $transformer, ENTITY_CLIENT);
|
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_QUOTE, $event->quote, $transformer, ENTITY_CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createdPayment(PaymentWasCreated $event)
|
public function createdPayment(PaymentWasCreated $event)
|
||||||
{
|
{
|
||||||
|
if ( ! Auth::check()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$transformer = new PaymentTransformer(Auth::user()->account);
|
$transformer = new PaymentTransformer(Auth::user()->account);
|
||||||
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_PAYMENT, $event->payment, $transformer, [ENTITY_CLIENT, ENTITY_INVOICE]);
|
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_PAYMENT, $event->payment, $transformer, [ENTITY_CLIENT, ENTITY_INVOICE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createdCredit(CreditWasCreated $event)
|
public function createdCredit(CreditWasCreated $event)
|
||||||
{
|
{
|
||||||
|
if ( ! Auth::check()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CREDIT, $event->credit);
|
//$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CREDIT, $event->credit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createdInvoice(InvoiceWasCreated $event)
|
public function createdInvoice(InvoiceWasCreated $event)
|
||||||
{
|
{
|
||||||
|
if ( ! Auth::check()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$transformer = new InvoiceTransformer(Auth::user()->account);
|
$transformer = new InvoiceTransformer(Auth::user()->account);
|
||||||
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_INVOICE, $event->invoice, $transformer, ENTITY_CLIENT);
|
$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_INVOICE, $event->invoice, $transformer, ENTITY_CLIENT);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ use Request;
|
|||||||
use Session;
|
use Session;
|
||||||
use Utils;
|
use Utils;
|
||||||
use DB;
|
use DB;
|
||||||
|
use URL;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
use Validator;
|
use Validator;
|
||||||
use Schema;
|
use Schema;
|
||||||
@ -70,6 +71,16 @@ class AccountRepository
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getSearchData()
|
public function getSearchData()
|
||||||
|
{
|
||||||
|
$data = $this->getAccountSearchData();
|
||||||
|
|
||||||
|
$type = trans('texts.navigation');
|
||||||
|
$data[$type] = $this->getNavigationSearchData();
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getAccountSearchData()
|
||||||
{
|
{
|
||||||
$clients = \DB::table('clients')
|
$clients = \DB::table('clients')
|
||||||
->where('clients.deleted_at', '=', null)
|
->where('clients.deleted_at', '=', null)
|
||||||
@ -109,9 +120,56 @@ class AccountRepository
|
|||||||
|
|
||||||
$data[$type][] = [
|
$data[$type][] = [
|
||||||
'value' => $row->name,
|
'value' => $row->name,
|
||||||
'public_id' => $row->public_id,
|
|
||||||
'tokens' => $tokens,
|
'tokens' => $tokens,
|
||||||
'entity_type' => $row->type,
|
'url' => URL::to("/{$row->type}/{$row->public_id}"),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getNavigationSearchData()
|
||||||
|
{
|
||||||
|
$features = [
|
||||||
|
['dashboard', '/dashboard'],
|
||||||
|
['customize_design', '/settings/customize_design'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$entityTypes = [
|
||||||
|
ENTITY_INVOICE,
|
||||||
|
ENTITY_CLIENT,
|
||||||
|
ENTITY_QUOTE,
|
||||||
|
ENTITY_TASK,
|
||||||
|
ENTITY_EXPENSE,
|
||||||
|
ENTITY_RECURRING_INVOICE,
|
||||||
|
ENTITY_PAYMENT,
|
||||||
|
ENTITY_CREDIT
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($entityTypes as $entityType) {
|
||||||
|
$features[] = [
|
||||||
|
"new_{$entityType}",
|
||||||
|
"/{$entityType}s/create",
|
||||||
|
];
|
||||||
|
$features[] = [
|
||||||
|
"list_{$entityType}s",
|
||||||
|
"/{$entityType}s",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$settings = array_merge(Account::$basicSettings, Account::$advancedSettings);
|
||||||
|
|
||||||
|
foreach ($settings as $setting) {
|
||||||
|
$features[] = [
|
||||||
|
$setting,
|
||||||
|
"/settings/{$setting}",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($features as $feature) {
|
||||||
|
$data[] = [
|
||||||
|
'value' => trans('texts.' . $feature[0]),
|
||||||
|
'url' => URL::to($feature[1])
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,13 +182,14 @@ class AccountRepository
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$client = $this->getNinjaClient(Auth::user()->account);
|
$account = Auth::user()->account;
|
||||||
$invitation = $this->createNinjaInvoice($client);
|
$client = $this->getNinjaClient($account);
|
||||||
|
$invitation = $this->createNinjaInvoice($client, $account);
|
||||||
|
|
||||||
return $invitation;
|
return $invitation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createNinjaInvoice($client)
|
public function createNinjaInvoice($client, $account)
|
||||||
{
|
{
|
||||||
$account = $this->getNinjaAccount();
|
$account = $this->getNinjaAccount();
|
||||||
$lastInvoice = Invoice::withTrashed()->whereAccountId($account->id)->orderBy('public_id', 'DESC')->first();
|
$lastInvoice = Invoice::withTrashed()->whereAccountId($account->id)->orderBy('public_id', 'DESC')->first();
|
||||||
@ -142,7 +201,7 @@ class AccountRepository
|
|||||||
$invoice->public_id = $publicId;
|
$invoice->public_id = $publicId;
|
||||||
$invoice->client_id = $client->id;
|
$invoice->client_id = $client->id;
|
||||||
$invoice->invoice_number = $account->getNextInvoiceNumber($invoice);
|
$invoice->invoice_number = $account->getNextInvoiceNumber($invoice);
|
||||||
$invoice->invoice_date = Auth::user()->account->getRenewalDate();
|
$invoice->invoice_date = $account->getRenewalDate();
|
||||||
$invoice->amount = PRO_PLAN_PRICE;
|
$invoice->amount = PRO_PLAN_PRICE;
|
||||||
$invoice->balance = PRO_PLAN_PRICE;
|
$invoice->balance = PRO_PLAN_PRICE;
|
||||||
$invoice->save();
|
$invoice->save();
|
||||||
|
@ -273,10 +273,13 @@ class PaymentService extends BaseService
|
|||||||
|
|
||||||
// submit purchase/get response
|
// submit purchase/get response
|
||||||
$response = $gateway->purchase($details)->send();
|
$response = $gateway->purchase($details)->send();
|
||||||
$ref = $response->getTransactionReference();
|
|
||||||
|
|
||||||
// create payment record
|
if ($response->isSuccessful()) {
|
||||||
return $this->createPayment($invitation, $accountGateway, $ref);
|
$ref = $response->getTransactionReference();
|
||||||
|
return $this->createPayment($invitation, $accountGateway, $ref);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDatatable($clientPublicId, $search)
|
public function getDatatable($clientPublicId, $search)
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
<?php namespace App\Services;
|
|
||||||
|
|
||||||
use App\Model\User;
|
|
||||||
use Validator;
|
|
||||||
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
|
|
||||||
|
|
||||||
class Registrar implements RegistrarContract {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a validator for an incoming registration request.
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @return \Illuminate\Contracts\Validation\Validator
|
|
||||||
*/
|
|
||||||
public function validator(array $data)
|
|
||||||
{
|
|
||||||
return Validator::make($data, [
|
|
||||||
'name' => 'required|max:255',
|
|
||||||
'email' => 'required|email|max:255|unique:users',
|
|
||||||
'password' => 'required|confirmed|min:6',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new user instance after a valid registration.
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @return User
|
|
||||||
*/
|
|
||||||
public function create(array $data)
|
|
||||||
{
|
|
||||||
return User::create([
|
|
||||||
'name' => $data['name'],
|
|
||||||
'email' => $data['email'],
|
|
||||||
'password' => bcrypt($data['password']),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -30,7 +30,7 @@ require __DIR__.'/../vendor/autoload.php';
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$compiledPath = __DIR__.'/../vendor/compiled.php';
|
$compiledPath = __DIR__.'/cache/compiled.php';
|
||||||
|
|
||||||
if (file_exists($compiledPath))
|
if (file_exists($compiledPath))
|
||||||
{
|
{
|
||||||
|
2
bootstrap/cache/.gitignore
vendored
Executable file
2
bootstrap/cache/.gitignore
vendored
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
@ -14,7 +14,7 @@
|
|||||||
"omnipay/2checkout": "dev-master#e9c079c2dde0d7ba461903b3b7bd5caf6dee1248",
|
"omnipay/2checkout": "dev-master#e9c079c2dde0d7ba461903b3b7bd5caf6dee1248",
|
||||||
"omnipay/gocardless": "dev-master",
|
"omnipay/gocardless": "dev-master",
|
||||||
"omnipay/stripe": "2.3.0",
|
"omnipay/stripe": "2.3.0",
|
||||||
"laravel/framework": "5.0.*",
|
"laravel/framework": "5.1.*",
|
||||||
"patricktalmadge/bootstrapper": "5.5.x",
|
"patricktalmadge/bootstrapper": "5.5.x",
|
||||||
"anahkiasen/former": "4.0.*@dev",
|
"anahkiasen/former": "4.0.*@dev",
|
||||||
"barryvdh/laravel-debugbar": "~2.0.2",
|
"barryvdh/laravel-debugbar": "~2.0.2",
|
||||||
|
793
composer.lock
generated
793
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -137,6 +137,7 @@ return [
|
|||||||
'Illuminate\Translation\TranslationServiceProvider',
|
'Illuminate\Translation\TranslationServiceProvider',
|
||||||
'Illuminate\Validation\ValidationServiceProvider',
|
'Illuminate\Validation\ValidationServiceProvider',
|
||||||
'Illuminate\View\ViewServiceProvider',
|
'Illuminate\View\ViewServiceProvider',
|
||||||
|
'Illuminate\Broadcasting\BroadcastServiceProvider',
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Additional Providers
|
* Additional Providers
|
||||||
|
@ -126,6 +126,7 @@ class PaymentLibrariesSeeder extends Seeder
|
|||||||
['name' => 'Bulgarian Lev', 'code' => 'BGN', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
|
['name' => 'Bulgarian Lev', 'code' => 'BGN', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
|
||||||
['name' => 'Aruban Florin', 'code' => 'AWG', 'symbol' => 'Afl. ', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
|
['name' => 'Aruban Florin', 'code' => 'AWG', 'symbol' => 'Afl. ', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
|
||||||
['name' => 'Turkish Lira', 'code' => 'TRY', 'symbol' => 'TL ', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
|
['name' => 'Turkish Lira', 'code' => 'TRY', 'symbol' => 'TL ', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
|
||||||
|
['name' => 'Romanian New Leu', 'code' => 'RON', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($currencies as $currency) {
|
foreach ($currencies as $currency) {
|
||||||
|
@ -12,4 +12,8 @@
|
|||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
RewriteRule ^ index.php [L]
|
RewriteRule ^ index.php [L]
|
||||||
|
|
||||||
|
# In case of running InvoiceNinja in a Subdomain like invoiceninja.example.com,
|
||||||
|
# you have to enablel the following line:
|
||||||
|
# RewriteBase /
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
12
readme.md
12
readme.md
@ -9,8 +9,8 @@
|
|||||||
[![Join the chat at https://gitter.im/hillelcoren/invoice-ninja](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/hillelcoren/invoice-ninja?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[![Join the chat at https://gitter.im/hillelcoren/invoice-ninja](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/hillelcoren/invoice-ninja?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
### Affiliates Programs
|
### Affiliates Programs
|
||||||
* Referral: $100 per signup paid over 3 years - [Learn more](https://www.invoiceninja.com/referral-program/)
|
* Referral program (we pay you): $100 per signup paid over 3 years - [Learn more](https://www.invoiceninja.com/referral-program/)
|
||||||
* Reseller: 10% of revenue
|
* White-label reseller (you pay us): 10% of revenue with a $100 sign up fee
|
||||||
|
|
||||||
### Installation Options
|
### Installation Options
|
||||||
* [Self-Host Zip](https://www.invoiceninja.com/knowledgebase/self-host/) - Free
|
* [Self-Host Zip](https://www.invoiceninja.com/knowledgebase/self-host/) - Free
|
||||||
@ -23,6 +23,10 @@
|
|||||||
* MCrypt PHP Extension
|
* MCrypt PHP Extension
|
||||||
* MySQL
|
* MySQL
|
||||||
|
|
||||||
|
### Recommended Providers
|
||||||
|
* [Stripe](https://stripe.com/)
|
||||||
|
* [Postmark](https://postmarkapp.com/)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
* Built using Laravel 5
|
* Built using Laravel 5
|
||||||
* Live PDF generation using [pdfmake](http://pdfmake.org/)
|
* Live PDF generation using [pdfmake](http://pdfmake.org/)
|
||||||
@ -38,10 +42,6 @@
|
|||||||
* Custom email templates
|
* Custom email templates
|
||||||
* [D3.js](http://d3js.org/) visualizations
|
* [D3.js](http://d3js.org/) visualizations
|
||||||
|
|
||||||
### Recommended Providers
|
|
||||||
* [Stripe](https://stripe.com/)
|
|
||||||
* [Postmark](https://postmarkapp.com/)
|
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
* [Ubuntu and Apache](http://blog.technerdservices.com/index.php/2015/04/techpop-how-to-install-invoice-ninja-on-ubuntu-14-04/)
|
* [Ubuntu and Apache](http://blog.technerdservices.com/index.php/2015/04/techpop-how-to-install-invoice-ninja-on-ubuntu-14-04/)
|
||||||
* [Debian and Nginx](https://www.rosehosting.com/blog/install-invoice-ninja-on-a-debian-7-vps/)
|
* [Debian and Nginx](https://www.rosehosting.com/blog/install-invoice-ninja-on-a-debian-7-vps/)
|
||||||
|
@ -122,8 +122,8 @@ $LANG = array(
|
|||||||
'filter' => 'Filter',
|
'filter' => 'Filter',
|
||||||
'new_client' => 'New Client',
|
'new_client' => 'New Client',
|
||||||
'new_invoice' => 'New Invoice',
|
'new_invoice' => 'New Invoice',
|
||||||
'new_payment' => 'Enter Payment',
|
'new_payment' => 'New Payment',
|
||||||
'new_credit' => 'Enter Credit',
|
'new_credit' => 'New Credit',
|
||||||
'contact' => 'Contact',
|
'contact' => 'Contact',
|
||||||
'date_created' => 'Date Created',
|
'date_created' => 'Date Created',
|
||||||
'last_login' => 'Last Login',
|
'last_login' => 'Last Login',
|
||||||
@ -868,7 +868,7 @@ $LANG = array(
|
|||||||
'white_label_purchase_link' => 'Purchase a white label license',
|
'white_label_purchase_link' => 'Purchase a white label license',
|
||||||
'expense' => 'Expense',
|
'expense' => 'Expense',
|
||||||
'expenses' => 'Expenses',
|
'expenses' => 'Expenses',
|
||||||
'new_expense' => 'Enter Expense',
|
'new_expense' => 'New Expense',
|
||||||
'enter_expense' => 'Enter Expense',
|
'enter_expense' => 'Enter Expense',
|
||||||
'vendors' => 'Vendors',
|
'vendors' => 'Vendors',
|
||||||
'new_vendor' => 'New Vendor',
|
'new_vendor' => 'New Vendor',
|
||||||
@ -1028,6 +1028,16 @@ $LANG = array(
|
|||||||
'user_unconfirmed' => 'Please confirm your account to send emails',
|
'user_unconfirmed' => 'Please confirm your account to send emails',
|
||||||
'invalid_contact_email' => 'Invalid contact email',
|
'invalid_contact_email' => 'Invalid contact email',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'navigation' => 'Navigation',
|
||||||
|
'list_invoices' => 'List Invoices',
|
||||||
|
'list_clients' => 'List Clients',
|
||||||
|
'list_quotes' => 'List Quotes',
|
||||||
|
'list_tasks' => 'List Tasks',
|
||||||
|
'list_expensess' => 'List Expenses',
|
||||||
|
'list_recurring_invoices' => 'List Recurring Invoices',
|
||||||
|
'list_payments' => 'List Payments',
|
||||||
|
'list_credits' => 'List Credits',
|
||||||
);
|
);
|
||||||
|
|
||||||
return $LANG;
|
return $LANG;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8">
|
<div class="col-md-7">
|
||||||
<div>
|
<div>
|
||||||
<span style="font-size:28px">{{ $client->getDisplayName() }}</span>
|
<span style="font-size:28px">{{ $client->getDisplayName() }}</span>
|
||||||
@if ($client->trashed())
|
@if ($client->trashed())
|
||||||
@ -30,7 +30,7 @@
|
|||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-5">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
{!! Former::open('clients/bulk')->addClass('mainForm') !!}
|
{!! Former::open('clients/bulk')->addClass('mainForm') !!}
|
||||||
<div style="display:none">
|
<div style="display:none">
|
||||||
|
@ -268,6 +268,7 @@
|
|||||||
} else {
|
} else {
|
||||||
trackEvent('/activity', '/search');
|
trackEvent('/activity', '/search');
|
||||||
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
||||||
|
console.log(data);
|
||||||
window.searchData = true;
|
window.searchData = true;
|
||||||
var datasets = [];
|
var datasets = [];
|
||||||
for (var type in data)
|
for (var type in data)
|
||||||
@ -283,8 +284,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$('#search').typeahead(datasets).on('typeahead:selected', function(element, datum, name) {
|
$('#search').typeahead(datasets).on('typeahead:selected', function(element, datum, name) {
|
||||||
var type = name == 'Contacts' ? 'clients' : name.toLowerCase();
|
window.location = datum.url;
|
||||||
window.location = '{{ URL::to('/') }}' + '/' + datum.entity_type + '/' + datum.public_id;
|
|
||||||
}).focus().typeahead('setQuery', $('#search').val());
|
}).focus().typeahead('setQuery', $('#search').val());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<?php //[STAMP] fd572cb1f679911978b9f48a842ed64b
|
<?php //[STAMP] 5d3610ae822b6990504d5dce501c103b
|
||||||
namespace _generated;
|
namespace _generated;
|
||||||
|
|
||||||
// This class was automatically generated by build task
|
// This class was automatically generated by build task
|
||||||
@ -17,6 +17,17 @@ trait AcceptanceTesterActions
|
|||||||
abstract protected function getScenario();
|
abstract protected function getScenario();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
* Print out latest Selenium Logs in debug mode
|
||||||
|
* @see \Codeception\Module\WebDriver::debugWebDriverLogs()
|
||||||
|
*/
|
||||||
|
public function debugWebDriverLogs() {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\Action('debugWebDriverLogs', func_get_args()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
@ -166,7 +177,7 @@ trait AcceptanceTesterActions
|
|||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Sets a cookie with the given name and value.
|
* Sets a cookie with the given name and value.
|
||||||
* You can set additional cookie params like `domain`, `path`, `expire`, `secure` in array passed as last argument.
|
* You can set additional cookie params like `domain`, `path`, `expires`, `secure` in array passed as last argument.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
@ -249,7 +260,6 @@ trait AcceptanceTesterActions
|
|||||||
* $I->amOnPage('/');
|
* $I->amOnPage('/');
|
||||||
* // opens /register page
|
* // opens /register page
|
||||||
* $I->amOnPage('/register');
|
* $I->amOnPage('/register');
|
||||||
* ?>
|
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @param $page
|
* @param $page
|
||||||
@ -263,17 +273,32 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks that the current page contains the given string.
|
* Checks that the current page contains the given string (case insensitive).
|
||||||
* Specify a locator as the second parameter to match a specific region.
|
*
|
||||||
|
* You can specify a specific HTML element (via CSS or XPath) as the second
|
||||||
|
* parameter to only search within that element.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
* $I->see('Logout'); // I can suppose user is logged in
|
* $I->see('Logout'); // I can suppose user is logged in
|
||||||
* $I->see('Sign Up','h1'); // I can suppose it's a signup page
|
* $I->see('Sign Up', 'h1'); // I can suppose it's a signup page
|
||||||
* $I->see('Sign Up','//body/h1'); // with XPath
|
* $I->see('Sign Up', '//body/h1'); // with XPath
|
||||||
* ?>
|
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
|
* Note that the search is done after stripping all HTML tags from the body,
|
||||||
|
* so `$I->see('strong')` will return true for strings like:
|
||||||
|
*
|
||||||
|
* - `<p>I am Stronger than thou</p>`
|
||||||
|
* - `<script>document.createElement('strong');</script>`
|
||||||
|
*
|
||||||
|
* But will *not* be true for strings like:
|
||||||
|
*
|
||||||
|
* - `<strong>Home</strong>`
|
||||||
|
* - `<div class="strong">Home</strong>`
|
||||||
|
* - `<!-- strong -->`
|
||||||
|
*
|
||||||
|
* For checking the raw source code, use `seeInSource()`.
|
||||||
|
*
|
||||||
* @param $text
|
* @param $text
|
||||||
* @param null $selector
|
* @param null $selector
|
||||||
* Conditional Assertion: Test won't be stopped on fail
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
@ -285,17 +310,32 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks that the current page contains the given string.
|
* Checks that the current page contains the given string (case insensitive).
|
||||||
* Specify a locator as the second parameter to match a specific region.
|
*
|
||||||
|
* You can specify a specific HTML element (via CSS or XPath) as the second
|
||||||
|
* parameter to only search within that element.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
* $I->see('Logout'); // I can suppose user is logged in
|
* $I->see('Logout'); // I can suppose user is logged in
|
||||||
* $I->see('Sign Up','h1'); // I can suppose it's a signup page
|
* $I->see('Sign Up', 'h1'); // I can suppose it's a signup page
|
||||||
* $I->see('Sign Up','//body/h1'); // with XPath
|
* $I->see('Sign Up', '//body/h1'); // with XPath
|
||||||
* ?>
|
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
|
* Note that the search is done after stripping all HTML tags from the body,
|
||||||
|
* so `$I->see('strong')` will return true for strings like:
|
||||||
|
*
|
||||||
|
* - `<p>I am Stronger than thou</p>`
|
||||||
|
* - `<script>document.createElement('strong');</script>`
|
||||||
|
*
|
||||||
|
* But will *not* be true for strings like:
|
||||||
|
*
|
||||||
|
* - `<strong>Home</strong>`
|
||||||
|
* - `<div class="strong">Home</strong>`
|
||||||
|
* - `<!-- strong -->`
|
||||||
|
*
|
||||||
|
* For checking the raw source code, use `seeInSource()`.
|
||||||
|
*
|
||||||
* @param $text
|
* @param $text
|
||||||
* @param null $selector
|
* @param null $selector
|
||||||
* @see \Codeception\Module\WebDriver::see()
|
* @see \Codeception\Module\WebDriver::see()
|
||||||
@ -308,17 +348,30 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks that the current page doesn't contain the text specified.
|
* Checks that the current page doesn't contain the text specified (case insensitive).
|
||||||
* Give a locator as the second parameter to match a specific region.
|
* Give a locator as the second parameter to match a specific region.
|
||||||
*
|
*
|
||||||
* ```php
|
* ```php
|
||||||
* <?php
|
* <?php
|
||||||
* $I->dontSee('Login'); // I can suppose user is already logged in
|
* $I->dontSee('Login'); // I can suppose user is already logged in
|
||||||
* $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page
|
* $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page
|
||||||
* $I->dontSee('Sign Up','//body/h1'); // with XPath
|
* $I->dontSee('Sign Up','//body/h1'); // with XPath
|
||||||
* ?>
|
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
|
* Note that the search is done after stripping all HTML tags from the body,
|
||||||
|
* so `$I->dontSee('strong')` will fail on strings like:
|
||||||
|
*
|
||||||
|
* - `<p>I am Stronger than thou</p>`
|
||||||
|
* - `<script>document.createElement('strong');</script>`
|
||||||
|
*
|
||||||
|
* But will ignore strings like:
|
||||||
|
*
|
||||||
|
* - `<strong>Home</strong>`
|
||||||
|
* - `<div class="strong">Home</strong>`
|
||||||
|
* - `<!-- strong -->`
|
||||||
|
*
|
||||||
|
* For checking the raw source code, use `seeInSource()`.
|
||||||
|
*
|
||||||
* @param $text
|
* @param $text
|
||||||
* @param null $selector
|
* @param null $selector
|
||||||
* Conditional Assertion: Test won't be stopped on fail
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
@ -330,17 +383,30 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks that the current page doesn't contain the text specified.
|
* Checks that the current page doesn't contain the text specified (case insensitive).
|
||||||
* Give a locator as the second parameter to match a specific region.
|
* Give a locator as the second parameter to match a specific region.
|
||||||
*
|
*
|
||||||
* ```php
|
* ```php
|
||||||
* <?php
|
* <?php
|
||||||
* $I->dontSee('Login'); // I can suppose user is already logged in
|
* $I->dontSee('Login'); // I can suppose user is already logged in
|
||||||
* $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page
|
* $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page
|
||||||
* $I->dontSee('Sign Up','//body/h1'); // with XPath
|
* $I->dontSee('Sign Up','//body/h1'); // with XPath
|
||||||
* ?>
|
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
|
* Note that the search is done after stripping all HTML tags from the body,
|
||||||
|
* so `$I->dontSee('strong')` will fail on strings like:
|
||||||
|
*
|
||||||
|
* - `<p>I am Stronger than thou</p>`
|
||||||
|
* - `<script>document.createElement('strong');</script>`
|
||||||
|
*
|
||||||
|
* But will ignore strings like:
|
||||||
|
*
|
||||||
|
* - `<strong>Home</strong>`
|
||||||
|
* - `<div class="strong">Home</strong>`
|
||||||
|
* - `<!-- strong -->`
|
||||||
|
*
|
||||||
|
* For checking the raw source code, use `seeInSource()`.
|
||||||
|
*
|
||||||
* @param $text
|
* @param $text
|
||||||
* @param null $selector
|
* @param null $selector
|
||||||
* @see \Codeception\Module\WebDriver::dontSee()
|
* @see \Codeception\Module\WebDriver::dontSee()
|
||||||
@ -350,6 +416,80 @@ trait AcceptanceTesterActions
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
* Checks that the current page contains the given string in its
|
||||||
|
* raw source code.
|
||||||
|
*
|
||||||
|
* ``` php
|
||||||
|
* <?php
|
||||||
|
* $I->seeInSource('<h1>Green eggs & ham</h1>');
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param $raw
|
||||||
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
|
* @see \Codeception\Module\WebDriver::seeInSource()
|
||||||
|
*/
|
||||||
|
public function canSeeInSource($raw) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInSource', func_get_args()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
* Checks that the current page contains the given string in its
|
||||||
|
* raw source code.
|
||||||
|
*
|
||||||
|
* ``` php
|
||||||
|
* <?php
|
||||||
|
* $I->seeInSource('<h1>Green eggs & ham</h1>');
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param $raw
|
||||||
|
* @see \Codeception\Module\WebDriver::seeInSource()
|
||||||
|
*/
|
||||||
|
public function seeInSource($raw) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInSource', func_get_args()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
* Checks that the current page contains the given string in its
|
||||||
|
* raw source code.
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* <?php
|
||||||
|
* $I->dontSeeInSource('<h1>Green eggs & ham</h1>');
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param $raw
|
||||||
|
* Conditional Assertion: Test won't be stopped on fail
|
||||||
|
* @see \Codeception\Module\WebDriver::dontSeeInSource()
|
||||||
|
*/
|
||||||
|
public function cantSeeInSource($raw) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInSource', func_get_args()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
|
*
|
||||||
|
* Checks that the current page contains the given string in its
|
||||||
|
* raw source code.
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* <?php
|
||||||
|
* $I->dontSeeInSource('<h1>Green eggs & ham</h1>');
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param $raw
|
||||||
|
* @see \Codeception\Module\WebDriver::dontSeeInSource()
|
||||||
|
*/
|
||||||
|
public function dontSeeInSource($raw) {
|
||||||
|
return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInSource', func_get_args()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
@ -790,7 +930,6 @@ trait AcceptanceTesterActions
|
|||||||
*
|
*
|
||||||
* @param null $uri
|
* @param null $uri
|
||||||
*
|
*
|
||||||
* @internal param $url
|
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @see \Codeception\Module\WebDriver::grabFromCurrentUrl()
|
* @see \Codeception\Module\WebDriver::grabFromCurrentUrl()
|
||||||
*/
|
*/
|
||||||
@ -1388,7 +1527,7 @@ trait AcceptanceTesterActions
|
|||||||
*
|
*
|
||||||
* @param $cssOrXpath
|
* @param $cssOrXpath
|
||||||
* @param $attribute
|
* @param $attribute
|
||||||
* @internal param $element
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @see \Codeception\Module\WebDriver::grabAttributeFrom()
|
* @see \Codeception\Module\WebDriver::grabAttributeFrom()
|
||||||
*/
|
*/
|
||||||
@ -1425,7 +1564,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 +1800,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.
|
||||||
*
|
*
|
||||||
@ -2179,7 +2360,7 @@ trait AcceptanceTesterActions
|
|||||||
* If Codeception commands are not enough, this allows you to use Selenium WebDriver methods directly:
|
* If Codeception commands are not enough, this allows you to use Selenium WebDriver methods directly:
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* $I->executeInSelenium(function(\Facebook\WebDriver\RemoteWebDriver $webdriver) {
|
* $I->executeInSelenium(function(\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
|
||||||
* $webdriver->get('http://google.com');
|
* $webdriver->get('http://google.com');
|
||||||
* });
|
* });
|
||||||
* ```
|
* ```
|
||||||
@ -2222,7 +2403,7 @@ trait AcceptanceTesterActions
|
|||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
* $I->executeInSelenium(function (\Facebook\WebDriver\RemoteWebDriver $webdriver) {
|
* $I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
|
||||||
* $handles=$webdriver->getWindowHandles();
|
* $handles=$webdriver->getWindowHandles();
|
||||||
* $last_window = end($handles);
|
* $last_window = end($handles);
|
||||||
* $webdriver->switchTo()->window($last_window);
|
* $webdriver->switchTo()->window($last_window);
|
||||||
@ -2463,34 +2644,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 +2655,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) {
|
||||||
@ -2516,7 +2667,7 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Inserts SQL record into database. This record will be erased after the test.
|
* Inserts an SQL record into a database. This record will be erased after the test.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
@ -2538,7 +2689,7 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks if a row with given column values exists.
|
* Asserts that a row with the given column values exists.
|
||||||
* Provide table name and column values.
|
* Provide table name and column values.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
@ -2566,7 +2717,7 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Checks if a row with given column values exists.
|
* Asserts that a row with the given column values exists.
|
||||||
* Provide table name and column values.
|
* Provide table name and column values.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
@ -2595,7 +2746,7 @@ trait AcceptanceTesterActions
|
|||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Asserts that found number of records in database
|
* Asserts that the given number of records were found in the database.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
@ -2603,19 +2754,19 @@ 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()));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* [!] Method is generated. Documentation taken from corresponding module.
|
* [!] Method is generated. Documentation taken from corresponding module.
|
||||||
*
|
*
|
||||||
* Asserts that found number of records in database
|
* Asserts that the given number of records were found in the database.
|
||||||
*
|
*
|
||||||
* ``` php
|
* ``` php
|
||||||
* <?php
|
* <?php
|
||||||
@ -2623,12 +2774,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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2638,7 +2789,7 @@ trait AcceptanceTesterActions
|
|||||||
*
|
*
|
||||||
* Effect is opposite to ->seeInDatabase
|
* Effect is opposite to ->seeInDatabase
|
||||||
*
|
*
|
||||||
* Checks if there is no record with such column values in database.
|
* Asserts that there is no record with the given column values in a database.
|
||||||
* Provide table name and column values.
|
* Provide table name and column values.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
@ -2668,7 +2819,7 @@ trait AcceptanceTesterActions
|
|||||||
*
|
*
|
||||||
* Effect is opposite to ->seeInDatabase
|
* Effect is opposite to ->seeInDatabase
|
||||||
*
|
*
|
||||||
* Checks if there is no record with such column values in database.
|
* Asserts that there is no record with the given column values in a database.
|
||||||
* Provide table name and column values.
|
* Provide table name and column values.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
|
Loading…
Reference in New Issue
Block a user