Merge branch 'invoiceninja/develop' into attached-documents

This commit is contained in:
Joshua Dwire 2016-03-22 15:07:12 -04:00
commit 9fbee962de
63 changed files with 1584 additions and 316 deletions

View File

@ -42,3 +42,5 @@ API_SECRET=password
#GOOGLE_CLIENT_ID= #GOOGLE_CLIENT_ID=
#GOOGLE_CLIENT_SECRET= #GOOGLE_CLIENT_SECRET=
#GOOGLE_OAUTH_REDIRECT=http://ninja.dev/auth/google #GOOGLE_OAUTH_REDIRECT=http://ninja.dev/auth/google
#GOOGLE_MAPS_API_KEY=

View File

@ -13,7 +13,7 @@ open-source software.
1. Redistributions of source code, in whole or part and with or without 1. Redistributions of source code, in whole or part and with or without
modification requires the express permission of the author and must prominently modification requires the express permission of the author and must prominently
display "Powered by InvoiceNinja" or the Invoice Ninja logo in verifiable form display "Powered by InvoiceNinja" and the Invoice Ninja logo in verifiable form
with hyperlink to said site. with hyperlink to said site.
2. Neither the name nor any trademark of the Author may be used to 2. Neither the name nor any trademark of the Author may be used to
endorse or promote products derived from this software without specific endorse or promote products derived from this software without specific

View File

@ -760,7 +760,7 @@ class AccountController extends BaseController
} }
$labels = []; $labels = [];
foreach (['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms'] as $field) { foreach (['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms', 'balance_due', 'partial_due'] as $field) {
$labels[$field] = Input::get("labels_{$field}"); $labels[$field] = Input::get("labels_{$field}");
} }
$account->invoice_labels = json_encode($labels); $account->invoice_labels = json_encode($labels);

View File

@ -0,0 +1,179 @@
<?php namespace App\Http\Controllers;
use Auth;
use DB;
use View;
use App\Models\Activity;
class DashboardApiController extends BaseAPIController
{
public function index()
{
$view_all = !Auth::user()->hasPermission('view_all');
$user_id = Auth::user()->id;
// total_income, billed_clients, invoice_sent and active_clients
$select = DB::raw('COUNT(DISTINCT CASE WHEN invoices.id IS NOT NULL THEN clients.id ELSE null END) billed_clients,
SUM(CASE WHEN invoices.invoice_status_id >= '.INVOICE_STATUS_SENT.' THEN 1 ELSE 0 END) invoices_sent,
COUNT(DISTINCT clients.id) active_clients');
$metrics = DB::table('accounts')
->select($select)
->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
->leftJoin('invoices', 'clients.id', '=', 'invoices.client_id')
->where('accounts.id', '=', Auth::user()->account_id)
->where('clients.is_deleted', '=', false)
->where('invoices.is_deleted', '=', false)
->where('invoices.is_recurring', '=', false)
->where('invoices.is_quote', '=', false);
if(!$view_all){
$metrics = $metrics->where(function($query) use($user_id){
$query->where('invoices.user_id', '=', $user_id);
$query->orwhere(function($query) use($user_id){
$query->where('invoices.user_id', '=', null);
$query->where('clients.user_id', '=', $user_id);
});
});
}
$metrics = $metrics->groupBy('accounts.id')
->first();
$select = DB::raw('SUM(clients.paid_to_date) as value, clients.currency_id as currency_id');
$paidToDate = DB::table('accounts')
->select($select)
->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
->where('accounts.id', '=', Auth::user()->account_id)
->where('clients.is_deleted', '=', false);
if(!$view_all){
$paidToDate = $paidToDate->where('clients.user_id', '=', $user_id);
}
$paidToDate = $paidToDate->groupBy('accounts.id')
->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
->get();
$select = DB::raw('AVG(invoices.amount) as invoice_avg, clients.currency_id as currency_id');
$averageInvoice = DB::table('accounts')
->select($select)
->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
->leftJoin('invoices', 'clients.id', '=', 'invoices.client_id')
->where('accounts.id', '=', Auth::user()->account_id)
->where('clients.is_deleted', '=', false)
->where('invoices.is_deleted', '=', false)
->where('invoices.is_quote', '=', false)
->where('invoices.is_recurring', '=', false);
if(!$view_all){
$averageInvoice = $averageInvoice->where('invoices.user_id', '=', $user_id);
}
$averageInvoice = $averageInvoice->groupBy('accounts.id')
->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
->get();
$select = DB::raw('SUM(clients.balance) as value, clients.currency_id as currency_id');
$balances = DB::table('accounts')
->select($select)
->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
->where('accounts.id', '=', Auth::user()->account_id)
->where('clients.is_deleted', '=', false)
->groupBy('accounts.id')
->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
->get();
$pastDue = DB::table('invoices')
->leftJoin('clients', 'clients.id', '=', 'invoices.client_id')
->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
->where('invoices.account_id', '=', Auth::user()->account_id)
->where('clients.deleted_at', '=', null)
->where('contacts.deleted_at', '=', null)
->where('invoices.is_recurring', '=', false)
//->where('invoices.is_quote', '=', false)
->where('invoices.balance', '>', 0)
->where('invoices.is_deleted', '=', false)
->where('invoices.deleted_at', '=', null)
->where('contacts.is_primary', '=', true)
->where('invoices.due_date', '<', date('Y-m-d'));
if(!$view_all){
$pastDue = $pastDue->where('invoices.user_id', '=', $user_id);
}
$pastDue = $pastDue->select(['invoices.due_date', 'invoices.balance', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id', 'is_quote'])
->orderBy('invoices.due_date', 'asc')
->take(50)
->get();
$upcoming = DB::table('invoices')
->leftJoin('clients', 'clients.id', '=', 'invoices.client_id')
->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
->where('invoices.account_id', '=', Auth::user()->account_id)
->where('clients.deleted_at', '=', null)
->where('contacts.deleted_at', '=', null)
->where('invoices.deleted_at', '=', null)
->where('invoices.is_recurring', '=', false)
//->where('invoices.is_quote', '=', false)
->where('invoices.balance', '>', 0)
->where('invoices.is_deleted', '=', false)
->where('contacts.is_primary', '=', true)
->where('invoices.due_date', '>=', date('Y-m-d'))
->orderBy('invoices.due_date', 'asc');
if(!$view_all){
$upcoming = $upcoming->where('invoices.user_id', '=', $user_id);
}
$upcoming = $upcoming->take(50)
->select(['invoices.due_date', 'invoices.balance', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id', 'is_quote'])
->get();
$payments = DB::table('payments')
->leftJoin('clients', 'clients.id', '=', 'payments.client_id')
->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
->leftJoin('invoices', 'invoices.id', '=', 'payments.invoice_id')
->where('payments.account_id', '=', Auth::user()->account_id)
->where('payments.is_deleted', '=', false)
->where('invoices.is_deleted', '=', false)
->where('clients.is_deleted', '=', false)
->where('contacts.deleted_at', '=', null)
->where('contacts.is_primary', '=', true);
if(!$view_all){
$payments = $payments->where('payments.user_id', '=', $user_id);
}
$payments = $payments->select(['payments.payment_date', 'payments.amount', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id'])
->orderBy('payments.payment_date', 'desc')
->take(50)
->get();
$hasQuotes = false;
foreach ([$upcoming, $pastDue] as $data) {
foreach ($data as $invoice) {
if ($invoice->is_quote) {
$hasQuotes = true;
}
}
}
$data = [
'id' => 1,
'paidToDate' => $paidToDate[0]->value,
'paidToDateCurrency' => $paidToDate[0]->currency_id,
'balances' => $balances[0]->value,
'balancesCurrency' => $balances[0]->currency_id,
'averageInvoice' => $averageInvoice[0]->invoice_avg,
'averageInvoiceCurrency' => $averageInvoice[0]->currency_id,
'invoicesSent' => $metrics ? $metrics->invoices_sent : 0,
'activeClients' => $metrics ? $metrics->active_clients : 0,
];
return $this->response($data);
}
}

View File

@ -45,7 +45,7 @@ class ExpenseController extends BaseController
return View::make('list', array( return View::make('list', array(
'entityType' => ENTITY_EXPENSE, 'entityType' => ENTITY_EXPENSE,
'title' => trans('texts.expenses'), 'title' => trans('texts.expenses'),
'sortCol' => '1', 'sortCol' => '3',
'columns' => Utils::trans([ 'columns' => Utils::trans([
'checkbox', 'checkbox',
'vendor', 'vendor',

View File

@ -52,6 +52,7 @@ class InvoiceController extends BaseController
$data = [ $data = [
'title' => trans('texts.invoices'), 'title' => trans('texts.invoices'),
'entityType' => ENTITY_INVOICE, 'entityType' => ENTITY_INVOICE,
'sortCol' => '3',
'columns' => Utils::trans([ 'columns' => Utils::trans([
'checkbox', 'checkbox',
'invoice_number', 'invoice_number',
@ -88,7 +89,7 @@ class InvoiceController extends BaseController
{ {
$account = Auth::user()->account; $account = Auth::user()->account;
$invoice = Invoice::scope($publicId) $invoice = Invoice::scope($publicId)
->with('invitations', 'account.country', 'client.contacts', 'client.country', 'invoice_items') ->with('invitations', 'account.country', 'client.contacts', 'client.country', 'invoice_items', 'payments')
->withTrashed() ->withTrashed()
->firstOrFail(); ->firstOrFail();
@ -154,6 +155,14 @@ class InvoiceController extends BaseController
if (!$invoice->is_recurring && $invoice->balance > 0) { if (!$invoice->is_recurring && $invoice->balance > 0) {
$actions[] = ['url' => 'javascript:onPaymentClick()', 'label' => trans('texts.enter_payment')]; $actions[] = ['url' => 'javascript:onPaymentClick()', 'label' => trans('texts.enter_payment')];
} }
foreach ($invoice->payments as $payment) {
$label = trans("texts.view_payment");
if (count($invoice->payments) > 1) {
$label .= ' - ' . $account->formatMoney($payment->amount, $invoice->client);
}
$actions[] = ['url' => $payment->present()->url, 'label' => $label];
}
} }
if (count($actions) > 3) { if (count($actions) > 3) {

View File

@ -48,6 +48,7 @@ class PaymentController extends BaseController
return View::make('list', array( return View::make('list', array(
'entityType' => ENTITY_PAYMENT, 'entityType' => ENTITY_PAYMENT,
'title' => trans('texts.payments'), 'title' => trans('texts.payments'),
'sortCol' => '6',
'columns' => Utils::trans([ 'columns' => Utils::trans([
'checkbox', 'checkbox',
'invoice', 'invoice',
@ -641,6 +642,6 @@ class PaymentController extends BaseController
$message .= $error ?: trans('texts.payment_error'); $message .= $error ?: trans('texts.payment_error');
Session::flash('error', $message); Session::flash('error', $message);
Utils::logError("Payment Error [{$type}]: " . ($exception ? Utils::getErrorString($exception) : $message)); Utils::logError("Payment Error [{$type}]: " . ($exception ? Utils::getErrorString($exception) : $message), 'PHP', true);
} }
} }

View File

@ -54,6 +54,7 @@ class QuoteController extends BaseController
$data = [ $data = [
'title' => trans('texts.quotes'), 'title' => trans('texts.quotes'),
'entityType' => ENTITY_QUOTE, 'entityType' => ENTITY_QUOTE,
'sortCol' => '3',
'columns' => Utils::trans([ 'columns' => Utils::trans([
'checkbox', 'checkbox',
'quote_number', 'quote_number',

View File

@ -354,7 +354,7 @@ class ReportController extends BaseController
private function generateInvoiceReport($startDate, $endDate, $isExport) private function generateInvoiceReport($startDate, $endDate, $isExport)
{ {
$columns = ['client', 'invoice_number', 'invoice_date', 'amount', 'paid', 'balance']; $columns = ['client', 'invoice_number', 'invoice_date', 'amount', 'payment_date', 'paid', 'method'];
$account = Auth::user()->account; $account = Auth::user()->account;
$displayData = []; $displayData = [];
@ -379,19 +379,25 @@ class ReportController extends BaseController
}]); }]);
foreach ($clients->get() as $client) { foreach ($clients->get() as $client) {
$currencyId = $client->currency_id ?: Auth::user()->account->getCurrencyId();
foreach ($client->invoices as $invoice) { foreach ($client->invoices as $invoice) {
$payments = count($invoice->payments) ? $invoice->payments : [false];
foreach ($payments as $payment) {
$displayData[] = [ $displayData[] = [
$isExport ? $client->getDisplayName() : $client->present()->link, $isExport ? $client->getDisplayName() : $client->present()->link,
$isExport ? $invoice->invoice_number : $invoice->present()->link, $isExport ? $invoice->invoice_number : $invoice->present()->link,
$invoice->present()->invoice_date, $invoice->present()->invoice_date,
$account->formatMoney($invoice->amount, $client), $account->formatMoney($invoice->amount, $client),
$account->formatMoney($invoice->getAmountPaid(), $client), $payment ? $payment->present()->payment_date : '',
$account->formatMoney($invoice->balance, $client), $payment ? $account->formatMoney($payment->amount, $client) : '',
$payment ? $payment->present()->method : '',
]; ];
if ($payment) {
$reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'paid', $payment->amount);
}
}
$reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'amount', $invoice->amount); $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'amount', $invoice->amount);
$reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'paid', $invoice->getAmountPaid());
$reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'balance', $invoice->balance); $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'balance', $invoice->balance);
} }
} }

View File

@ -77,7 +77,6 @@ class UserController extends BaseController
'user' => $user, 'user' => $user,
'method' => 'PUT', 'method' => 'PUT',
'url' => 'users/'.$publicId, 'url' => 'users/'.$publicId,
'title' => trans('texts.edit_user'),
]; ];
return View::make('users.edit', $data); return View::make('users.edit', $data);
@ -120,7 +119,6 @@ class UserController extends BaseController
'user' => null, 'user' => null,
'method' => 'POST', 'method' => 'POST',
'url' => 'users', 'url' => 'users',
'title' => trans('texts.add_user'),
]; ];
return View::make('users.edit', $data); return View::make('users.edit', $data);

View File

@ -257,6 +257,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function()
Route::resource('expenses','ExpenseApiController'); Route::resource('expenses','ExpenseApiController');
Route::post('add_token', 'AccountApiController@addDeviceToken'); Route::post('add_token', 'AccountApiController@addDeviceToken');
Route::post('update_notifications', 'AccountApiController@updatePushNotifications'); Route::post('update_notifications', 'AccountApiController@updatePushNotifications');
Route::get('dashboard', 'DashboardApiController@index');
// Vendor // Vendor
Route::resource('vendors', 'VendorApiController'); Route::resource('vendors', 'VendorApiController');
@ -508,6 +509,8 @@ if (!defined('CONTACT_EMAIL')) {
define('GATEWAY_PAYFAST', 13); define('GATEWAY_PAYFAST', 13);
define('GATEWAY_PAYPAL_EXPRESS', 17); define('GATEWAY_PAYPAL_EXPRESS', 17);
define('GATEWAY_PAYPAL_PRO', 18); define('GATEWAY_PAYPAL_PRO', 18);
define('GATEWAY_SAGE_PAY_DIRECT', 20);
define('GATEWAY_SAGE_PAY_SERVER', 21);
define('GATEWAY_STRIPE', 23); define('GATEWAY_STRIPE', 23);
define('GATEWAY_GOCARDLESS', 6); define('GATEWAY_GOCARDLESS', 6);
define('GATEWAY_TWO_CHECKOUT', 27); define('GATEWAY_TWO_CHECKOUT', 27);
@ -532,7 +535,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.4'); define('NINJA_VERSION', '2.5.1.1');
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');

View File

@ -247,7 +247,7 @@ class Utils
return "***{$class}*** [{$code}] : {$exception->getFile()} [Line {$exception->getLine()}] => {$exception->getMessage()}"; return "***{$class}*** [{$code}] : {$exception->getFile()} [Line {$exception->getLine()}] => {$exception->getMessage()}";
} }
public static function logError($error, $context = 'PHP') public static function logError($error, $context = 'PHP', $info = false)
{ {
if ($error instanceof Exception) { if ($error instanceof Exception) {
$error = self::getErrorString($error); $error = self::getErrorString($error);
@ -271,7 +271,11 @@ class Utils
'count' => Session::get('error_count', 0), 'count' => Session::get('error_count', 0),
]; ];
if ($info) {
Log::info($error."\n", $data);
} else {
Log::error($error."\n", $data); Log::error($error."\n", $data);
}
/* /*
Mail::queue('emails.error', ['message'=>$error.' '.json_encode($data)], function($message) Mail::queue('emails.error', ['message'=>$error.' '.json_encode($data)], function($message)
@ -620,8 +624,8 @@ class Utils
private static function getMonth($offset) private static function getMonth($offset)
{ {
$months = [ "January", "February", "March", "April", "May", "June", $months = [ "january", "february", "march", "april", "may", "june",
"July", "August", "September", "October", "November", "December", ]; "july", "august", "september", "october", "november", "december", ];
$month = intval(date('n')) - 1; $month = intval(date('n')) - 1;
@ -632,7 +636,7 @@ class Utils
$month += 12; $month += 12;
} }
return $months[$month]; return trans('texts.' . $months[$month]);
} }
private static function getQuarter($offset) private static function getQuarter($offset)

View File

@ -683,7 +683,7 @@ class Account extends Eloquent
'subtotal', 'subtotal',
'paid_to_date', 'paid_to_date',
'balance_due', 'balance_due',
'amount_due', 'partial_due',
'terms', 'terms',
'your_invoice', 'your_invoice',
'quote', 'quote',
@ -1023,7 +1023,7 @@ class Account extends Eloquent
return true; return true;
} }
public function showCustomField($field, $entity) public function showCustomField($field, $entity = false)
{ {
if ($this->isPro()) { if ($this->isPro()) {
return $this->$field ? true : false; return $this->$field ? true : false;

View File

@ -75,6 +75,8 @@ class Gateway extends Eloquent
$link = 'https://bitpay.com/dashboard/signup'; $link = 'https://bitpay.com/dashboard/signup';
} elseif ($this->id == GATEWAY_DWOLLA) { } elseif ($this->id == GATEWAY_DWOLLA) {
$link = 'https://www.dwolla.com/register'; $link = 'https://www.dwolla.com/register';
} elseif ($this->id == GATEWAY_SAGE_PAY_DIRECT || $this->id == GATEWAY_SAGE_PAY_SERVER) {
$link = 'https://applications.sagepay.com/apply/2C02C252-0F8A-1B84-E10D-CF933EFCAA99';
} }
$key = 'texts.gateway_help_'.$this->id; $key = 'texts.gateway_help_'.$this->id;

View File

@ -5,6 +5,7 @@ use DB;
use Carbon; use Carbon;
use App\Events\VendorWasCreated; use App\Events\VendorWasCreated;
use App\Events\VendorWasUpdated; use App\Events\VendorWasUpdated;
use App\Events\VendorWasDeleted;
use Laracasts\Presenter\PresentableTrait; use Laracasts\Presenter\PresentableTrait;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;

View File

@ -81,7 +81,7 @@ class Mailer
$emailError = $exception->getMessage(); $emailError = $exception->getMessage();
} }
Utils::logError("Email Error: $emailError"); //Utils::logError("Email Error: $emailError");
if (isset($data['invitation'])) { if (isset($data['invitation'])) {
$invitation = $data['invitation']; $invitation = $data['invitation'];

View File

@ -19,7 +19,7 @@ class InvoicePresenter extends Presenter {
public function balanceDueLabel() public function balanceDueLabel()
{ {
if ($this->entity->partial) { if ($this->entity->partial) {
return 'amount_due'; return 'partial_due';
} elseif ($this->entity->is_quote) { } elseif ($this->entity->is_quote) {
return 'total'; return 'total';
} else { } else {

View File

@ -1,5 +1,6 @@
<?php namespace App\Ninja\Presenters; <?php namespace App\Ninja\Presenters;
use URL;
use Utils; use Utils;
use Laracasts\Presenter\Presenter; use Laracasts\Presenter\Presenter;
@ -24,4 +25,14 @@ class PaymentPresenter extends Presenter {
} }
} }
public function url()
{
return URL::to('/payments/' . $this->entity->public_id . '/edit');
}
public function link()
{
return link_to('/payments/' . $this->entity->public_id . '/edit', $this->entity->getDisplayName());
}
} }

View File

@ -58,4 +58,9 @@ if (strstr($_SERVER['HTTP_USER_AGENT'], 'PhantomJS') && Utils::isNinjaDev()) {
} }
*/ */
// Write info messages to a separate file
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(new Monolog\Handler\StreamHandler(storage_path() . '/logs/laravel-info.log', Monolog\Logger::INFO, false));
});
return $app; return $app;

229
composer.lock generated
View File

@ -123,12 +123,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/formers/former.git", "url": "https://github.com/formers/former.git",
"reference": "795f7b9b200a4ff4a33b37a96eaaab0229e36325" "reference": "d97f907741323b390f43954a90a227921ecc6b96"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/formers/former/zipball/795f7b9b200a4ff4a33b37a96eaaab0229e36325", "url": "https://api.github.com/repos/formers/former/zipball/d97f907741323b390f43954a90a227921ecc6b96",
"reference": "795f7b9b200a4ff4a33b37a96eaaab0229e36325", "reference": "d97f907741323b390f43954a90a227921ecc6b96",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -174,7 +174,7 @@
"foundation", "foundation",
"laravel" "laravel"
], ],
"time": "2015-11-05 15:53:52" "time": "2016-03-16 01:43:45"
}, },
{ {
"name": "anahkiasen/html-object", "name": "anahkiasen/html-object",
@ -381,12 +381,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git", "url": "https://github.com/barryvdh/laravel-ide-helper.git",
"reference": "19553f63e4635480363ff2254350075f285fbbc5" "reference": "e97ed532f09e290b91ff7713b785ed7ab11d0812"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/19553f63e4635480363ff2254350075f285fbbc5", "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/e97ed532f09e290b91ff7713b785ed7ab11d0812",
"reference": "19553f63e4635480363ff2254350075f285fbbc5", "reference": "e97ed532f09e290b91ff7713b785ed7ab11d0812",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -436,7 +436,7 @@
"phpstorm", "phpstorm",
"sublime" "sublime"
], ],
"time": "2016-03-02 10:03:09" "time": "2016-03-03 14:38:04"
}, },
{ {
"name": "cardgate/omnipay-cardgate", "name": "cardgate/omnipay-cardgate",
@ -579,7 +579,7 @@
"laravel" "laravel"
], ],
"abandoned": "OpenSkill/Datatable", "abandoned": "OpenSkill/Datatable",
"time": "2015-11-23 21:33:41" "time": "2015-04-29 07:00:36"
}, },
{ {
"name": "classpreloader/classpreloader", "name": "classpreloader/classpreloader",
@ -880,12 +880,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/delatbabel/omnipay-fatzebra.git", "url": "https://github.com/delatbabel/omnipay-fatzebra.git",
"reference": "7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc" "reference": "d0a56a8704357d91457672741a48a4cb6c7ecd53"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/delatbabel/omnipay-fatzebra/zipball/7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc", "url": "https://api.github.com/repos/delatbabel/omnipay-fatzebra/zipball/d0a56a8704357d91457672741a48a4cb6c7ecd53",
"reference": "7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc", "reference": "d0a56a8704357d91457672741a48a4cb6c7ecd53",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -929,7 +929,7 @@
"payment", "payment",
"paystream" "paystream"
], ],
"time": "2015-02-15 11:27:23" "time": "2016-03-21 09:21:14"
}, },
{ {
"name": "dercoder/omnipay-ecopayz", "name": "dercoder/omnipay-ecopayz",
@ -1039,12 +1039,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/descubraomundo/omnipay-pagarme.git", "url": "https://github.com/descubraomundo/omnipay-pagarme.git",
"reference": "528953568929b57189de16fa7431eaab75d61840" "reference": "8571396139eb1fb1a7011450714a5e8d8d604d8c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/descubraomundo/omnipay-pagarme/zipball/528953568929b57189de16fa7431eaab75d61840", "url": "https://api.github.com/repos/descubraomundo/omnipay-pagarme/zipball/8571396139eb1fb1a7011450714a5e8d8d604d8c",
"reference": "528953568929b57189de16fa7431eaab75d61840", "reference": "8571396139eb1fb1a7011450714a5e8d8d604d8c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1081,7 +1081,7 @@
"pay", "pay",
"payment" "payment"
], ],
"time": "2015-10-27 19:17:20" "time": "2016-03-18 19:37:37"
}, },
{ {
"name": "dioscouri/omnipay-cybersource", "name": "dioscouri/omnipay-cybersource",
@ -1938,16 +1938,16 @@
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
"version": "6.1.1", "version": "6.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/guzzle.git", "url": "https://github.com/guzzle/guzzle.git",
"reference": "c6851d6e48f63b69357cbfa55bca116448140e0c" "reference": "d094e337976dff9d8e2424e8485872194e768662"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/c6851d6e48f63b69357cbfa55bca116448140e0c", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d094e337976dff9d8e2424e8485872194e768662",
"reference": "c6851d6e48f63b69357cbfa55bca116448140e0c", "reference": "d094e337976dff9d8e2424e8485872194e768662",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1963,7 +1963,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "6.1-dev" "dev-master": "6.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -1996,20 +1996,20 @@
"rest", "rest",
"web service" "web service"
], ],
"time": "2015-11-23 00:47:50" "time": "2016-03-21 20:02:09"
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "1.0.3", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea" "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/b1e1c0d55f8083c71eda2c28c12a228d708294ea", "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8",
"reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea", "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2047,7 +2047,7 @@
"keywords": [ "keywords": [
"promise" "promise"
], ],
"time": "2015-10-15 22:28:00" "time": "2016-03-08 01:15:46"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
@ -2603,12 +2603,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/labs7in0/omnipay-wechat.git", "url": "https://github.com/labs7in0/omnipay-wechat.git",
"reference": "4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a" "reference": "40c9f86df6573ad98ae1dd0d29712ccbc789a74e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/labs7in0/omnipay-wechat/zipball/4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a", "url": "https://api.github.com/repos/labs7in0/omnipay-wechat/zipball/40c9f86df6573ad98ae1dd0d29712ccbc789a74e",
"reference": "4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a", "reference": "40c9f86df6573ad98ae1dd0d29712ccbc789a74e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2644,7 +2644,7 @@
"purchase", "purchase",
"wechat" "wechat"
], ],
"time": "2015-11-16 11:04:21" "time": "2016-03-18 09:59:11"
}, },
{ {
"name": "laracasts/presenter", "name": "laracasts/presenter",
@ -2694,16 +2694,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.2.22", "version": "v5.2.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "aec1b7cb9ec0bac0107361a3730cac9b6f945ef4" "reference": "396297a5fd3c70c2fc1af68f09ee574a2380175c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/aec1b7cb9ec0bac0107361a3730cac9b6f945ef4", "url": "https://api.github.com/repos/laravel/framework/zipball/396297a5fd3c70c2fc1af68f09ee574a2380175c",
"reference": "aec1b7cb9ec0bac0107361a3730cac9b6f945ef4", "reference": "396297a5fd3c70c2fc1af68f09ee574a2380175c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2716,7 +2716,7 @@
"monolog/monolog": "~1.11", "monolog/monolog": "~1.11",
"mtdowling/cron-expression": "~1.0", "mtdowling/cron-expression": "~1.0",
"nesbot/carbon": "~1.20", "nesbot/carbon": "~1.20",
"paragonie/random_compat": "~1.1", "paragonie/random_compat": "~1.4",
"php": ">=5.5.9", "php": ">=5.5.9",
"psy/psysh": "0.7.*", "psy/psysh": "0.7.*",
"swiftmailer/swiftmailer": "~5.1", "swiftmailer/swiftmailer": "~5.1",
@ -2818,7 +2818,7 @@
"framework", "framework",
"laravel" "laravel"
], ],
"time": "2016-02-27 22:09:19" "time": "2016-03-22 13:45:19"
}, },
{ {
"name": "laravel/socialite", "name": "laravel/socialite",
@ -2975,16 +2975,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "1.0.17", "version": "1.0.20",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "02f5b6c9a8b9278c8381e3361e7bd9d641c740ca" "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/02f5b6c9a8b9278c8381e3361e7bd9d641c740ca", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
"reference": "02f5b6c9a8b9278c8381e3361e7bd9d641c740ca", "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3054,7 +3054,7 @@
"sftp", "sftp",
"storage" "storage"
], ],
"time": "2016-02-19 15:35:38" "time": "2016-03-14 21:54:11"
}, },
{ {
"name": "league/fractal", "name": "league/fractal",
@ -3587,16 +3587,16 @@
}, },
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "1.18.0", "version": "1.18.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Seldaek/monolog.git", "url": "https://github.com/Seldaek/monolog.git",
"reference": "e19b764b5c855580e8ffa7e615f72c10fd2f99cc" "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/e19b764b5c855580e8ffa7e615f72c10fd2f99cc", "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a5f2734e8c16f3aa21b3da09715d10e15b4d2d45",
"reference": "e19b764b5c855580e8ffa7e615f72c10fd2f99cc", "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3661,7 +3661,7 @@
"logging", "logging",
"psr-3" "psr-3"
], ],
"time": "2016-03-01 18:00:40" "time": "2016-03-13 16:08:35"
}, },
{ {
"name": "mtdowling/cron-expression", "name": "mtdowling/cron-expression",
@ -3815,7 +3815,7 @@
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/omnipay-2checkout/zipball/31394ce58d5999b6f49b321cb3547747837c1297", "url": "https://api.github.com/repos/thephpleague/omnipay-2checkout/zipball/77b316bd08c6b7a1e93721f15d1bfbd21a62ba6b",
"reference": "e9c079c2dde0d7ba461903b3b7bd5caf6dee1248", "reference": "e9c079c2dde0d7ba461903b3b7bd5caf6dee1248",
"shasum": "" "shasum": ""
}, },
@ -3866,16 +3866,16 @@
}, },
{ {
"name": "omnipay/authorizenet", "name": "omnipay/authorizenet",
"version": "v2.3.0", "version": "2.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/omnipay-authorizenet.git", "url": "https://github.com/thephpleague/omnipay-authorizenet.git",
"reference": "142a95f550a5320db09e66019ecf5c8b8c3885b9" "reference": "e2e813b0b6306ef97b8763037f05476456546b3e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/omnipay-authorizenet/zipball/142a95f550a5320db09e66019ecf5c8b8c3885b9", "url": "https://api.github.com/repos/thephpleague/omnipay-authorizenet/zipball/e2e813b0b6306ef97b8763037f05476456546b3e",
"reference": "142a95f550a5320db09e66019ecf5c8b8c3885b9", "reference": "e2e813b0b6306ef97b8763037f05476456546b3e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3921,7 +3921,7 @@
"pay", "pay",
"payment" "payment"
], ],
"time": "2015-07-15 18:11:17" "time": "2016-03-10 11:35:24"
}, },
{ {
"name": "omnipay/bitpay", "name": "omnipay/bitpay",
@ -3929,12 +3929,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/omnipay-bitpay.git", "url": "https://github.com/thephpleague/omnipay-bitpay.git",
"reference": "e659f0e993c586cb36acafaf50835570b4a16eb2" "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/omnipay-bitpay/zipball/e659f0e993c586cb36acafaf50835570b4a16eb2", "url": "https://api.github.com/repos/thephpleague/omnipay-bitpay/zipball/cf813f1d5436a1d2f942d3df6666695d1e2b5280",
"reference": "e659f0e993c586cb36acafaf50835570b4a16eb2", "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3979,7 +3979,7 @@
"pay", "pay",
"payment" "payment"
], ],
"time": "2015-03-23 14:18:26" "time": "2016-03-10 03:16:04"
}, },
{ {
"name": "omnipay/buckaroo", "name": "omnipay/buckaroo",
@ -4328,16 +4328,16 @@
}, },
{ {
"name": "omnipay/eway", "name": "omnipay/eway",
"version": "v2.2.0", "version": "v2.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/omnipay-eway.git", "url": "https://github.com/thephpleague/omnipay-eway.git",
"reference": "0dcf28596f0382fbfc3ee229e98e60798675ed16" "reference": "1c953630f7097bfdeed200b17a847015a4df5607"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/omnipay-eway/zipball/0dcf28596f0382fbfc3ee229e98e60798675ed16", "url": "https://api.github.com/repos/thephpleague/omnipay-eway/zipball/1c953630f7097bfdeed200b17a847015a4df5607",
"reference": "0dcf28596f0382fbfc3ee229e98e60798675ed16", "reference": "1c953630f7097bfdeed200b17a847015a4df5607",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4381,7 +4381,7 @@
"pay", "pay",
"payment" "payment"
], ],
"time": "2015-03-30 00:28:33" "time": "2016-03-22 01:11:02"
}, },
{ {
"name": "omnipay/firstdata", "name": "omnipay/firstdata",
@ -5536,16 +5536,16 @@
}, },
{ {
"name": "paragonie/random_compat", "name": "paragonie/random_compat",
"version": "v1.2.1", "version": "v1.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/paragonie/random_compat.git", "url": "https://github.com/paragonie/random_compat.git",
"reference": "f078eba3bcf140fd69b5fcc3ea5ac809abf729dc" "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/f078eba3bcf140fd69b5fcc3ea5ac809abf729dc", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
"reference": "f078eba3bcf140fd69b5fcc3ea5ac809abf729dc", "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5580,7 +5580,7 @@
"pseudorandom", "pseudorandom",
"random" "random"
], ],
"time": "2016-02-29 17:25:04" "time": "2016-03-18 20:34:03"
}, },
{ {
"name": "patricktalmadge/bootstrapper", "name": "patricktalmadge/bootstrapper",
@ -5836,16 +5836,16 @@
}, },
{ {
"name": "psy/psysh", "name": "psy/psysh",
"version": "v0.7.1", "version": "v0.7.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/bobthecow/psysh.git", "url": "https://github.com/bobthecow/psysh.git",
"reference": "5e8cedbe0a3681f18782594eefc78423f8401fc8" "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/5e8cedbe0a3681f18782594eefc78423f8401fc8", "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280",
"reference": "5e8cedbe0a3681f18782594eefc78423f8401fc8", "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5904,20 +5904,20 @@
"interactive", "interactive",
"shell" "shell"
], ],
"time": "2016-02-27 18:59:18" "time": "2016-03-09 05:03:14"
}, },
{ {
"name": "samvaughton/omnipay-barclays-epdq", "name": "samvaughton/omnipay-barclays-epdq",
"version": "2.1.1", "version": "2.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/samvaughton/omnipay-barclays-epdq.git", "url": "https://github.com/samvaughton/omnipay-barclays-epdq.git",
"reference": "f971de37aa40c72cc58f02d05f540a93b2c5958e" "reference": "b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/samvaughton/omnipay-barclays-epdq/zipball/f971de37aa40c72cc58f02d05f540a93b2c5958e", "url": "https://api.github.com/repos/samvaughton/omnipay-barclays-epdq/zipball/b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da",
"reference": "f971de37aa40c72cc58f02d05f540a93b2c5958e", "reference": "b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5966,7 +5966,7 @@
"pay", "pay",
"payment" "payment"
], ],
"time": "2015-05-07 14:45:43" "time": "2016-03-03 14:40:27"
}, },
{ {
"name": "simshaun/recurr", "name": "simshaun/recurr",
@ -6716,7 +6716,7 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
@ -6775,16 +6775,16 @@
}, },
{ {
"name": "symfony/polyfill-php54", "name": "symfony/polyfill-php54",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php54.git", "url": "https://github.com/symfony/polyfill-php54.git",
"reference": "74663d5a2ff3c530c1bc0571500e0feec9094054" "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/74663d5a2ff3c530c1bc0571500e0feec9094054", "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/9ba741ca01c77282ecf5796c2c1d667f03454ffb",
"reference": "74663d5a2ff3c530c1bc0571500e0feec9094054", "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6829,11 +6829,11 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2016-01-20 09:13:37" "time": "2016-01-25 19:13:00"
}, },
{ {
"name": "symfony/polyfill-php55", "name": "symfony/polyfill-php55",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php55.git", "url": "https://github.com/symfony/polyfill-php55.git",
@ -6889,7 +6889,7 @@
}, },
{ {
"name": "symfony/polyfill-php56", "name": "symfony/polyfill-php56",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php56.git", "url": "https://github.com/symfony/polyfill-php56.git",
@ -6945,7 +6945,7 @@
}, },
{ {
"name": "symfony/polyfill-util", "name": "symfony/polyfill-util",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-util.git", "url": "https://github.com/symfony/polyfill-util.git",
@ -8211,41 +8211,42 @@
}, },
{ {
"name": "codeception/codeception", "name": "codeception/codeception",
"version": "2.1.6", "version": "2.1.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Codeception/Codeception.git", "url": "https://github.com/Codeception/Codeception.git",
"reference": "b199941f5e59d1e7fd32d78296c8ab98db873d89" "reference": "65971b0dee4972710365b6102154cd412a9bf7b1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Codeception/Codeception/zipball/b199941f5e59d1e7fd32d78296c8ab98db873d89", "url": "https://api.github.com/repos/Codeception/Codeception/zipball/65971b0dee4972710365b6102154cd412a9bf7b1",
"reference": "b199941f5e59d1e7fd32d78296c8ab98db873d89", "reference": "65971b0dee4972710365b6102154cd412a9bf7b1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"facebook/webdriver": ">=1.0.1", "facebook/webdriver": ">=1.0.1 <2.0",
"guzzlehttp/guzzle": ">=4.1.4 <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 <8.0",
"phpunit/phpunit": "~4.8.0", "phpunit/php-code-coverage": ">=2.1.3",
"symfony/browser-kit": ">=2.4|<3.1", "phpunit/phpunit": ">4.8.20 <6.0",
"symfony/console": ">=2.4|<3.1", "symfony/browser-kit": ">=2.5 <3.1",
"symfony/css-selector": ">=2.4|<3.1", "symfony/console": ">=2.5 <3.1",
"symfony/dom-crawler": ">=2.4|<3.1", "symfony/css-selector": ">=2.5 <3.1",
"symfony/event-dispatcher": ">=2.4|<3.1", "symfony/dom-crawler": ">=2.5 <3.1",
"symfony/finder": ">=2.4|<3.1", "symfony/event-dispatcher": ">=2.5 <3.1",
"symfony/yaml": ">=2.4|<3.1" "symfony/finder": ">=2.5 <3.1",
"symfony/yaml": ">=2.5 <3.1"
}, },
"require-dev": { "require-dev": {
"codeception/specify": "~0.3", "codeception/specify": "~0.3",
"facebook/php-sdk-v4": "~4.0", "facebook/php-sdk-v4": "~5.0",
"flow/jsonpath": "~0.2", "flow/jsonpath": "~0.2",
"monolog/monolog": "~1.8", "monolog/monolog": "~1.8",
"pda/pheanstalk": "~2.0", "pda/pheanstalk": "~2.0",
"videlalvaro/php-amqplib": "~2.4" "php-amqplib/php-amqplib": "~2.4"
}, },
"suggest": { "suggest": {
"codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests", "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests",
@ -8287,7 +8288,7 @@
"functional testing", "functional testing",
"unit testing" "unit testing"
], ],
"time": "2016-02-09 22:27:48" "time": "2016-03-12 01:15:25"
}, },
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
@ -8474,16 +8475,16 @@
}, },
{ {
"name": "phpspec/phpspec", "name": "phpspec/phpspec",
"version": "2.4.1", "version": "2.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpspec/phpspec.git", "url": "https://github.com/phpspec/phpspec.git",
"reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed" "reference": "385ecb015e97c13818074f1517928b24d4a26067"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpspec/phpspec/zipball/5528ce1e93a1efa090c9404aba3395c329b4e6ed", "url": "https://api.github.com/repos/phpspec/phpspec/zipball/385ecb015e97c13818074f1517928b24d4a26067",
"reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed", "reference": "385ecb015e97c13818074f1517928b24d4a26067",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8548,7 +8549,7 @@
"testing", "testing",
"tests" "tests"
], ],
"time": "2016-01-01 10:17:54" "time": "2016-03-20 20:34:32"
}, },
{ {
"name": "phpspec/prophecy", "name": "phpspec/prophecy",
@ -8854,16 +8855,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "4.8.23", "version": "4.8.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483" "reference": "a1066c562c52900a142a0e2bbf0582994671385e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6e351261f9cd33daf205a131a1ba61c6d33bd483", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e",
"reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483", "reference": "a1066c562c52900a142a0e2bbf0582994671385e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8922,7 +8923,7 @@
"testing", "testing",
"xunit" "xunit"
], ],
"time": "2016-02-11 14:56:33" "time": "2016-03-14 06:16:08"
}, },
{ {
"name": "phpunit/phpunit-mock-objects", "name": "phpunit/phpunit-mock-objects",

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddSupportThreeDecimalTaxes extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tax_rates', function($table) {
$table->decimal('rate', 13, 3)->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tax_rates', function($table) {
$table->decimal('rate', 13, 2)->change();
});
}
}

View File

@ -54,6 +54,7 @@ class CurrenciesSeeder extends Seeder
['name' => 'Croatian Kuna', 'code' => 'HKR', 'symbol' => 'kn', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','], ['name' => 'Croatian Kuna', 'code' => 'HKR', 'symbol' => 'kn', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Saudi Riyal', 'code' => 'SAR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['name' => 'Saudi Riyal', 'code' => 'SAR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Japanese Yen', 'code' => 'JPY', 'symbol' => '¥', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['name' => 'Japanese Yen', 'code' => 'JPY', 'symbol' => '¥', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Maldivian Rufiyaa', 'code' => 'MVR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
]; ];
foreach ($currencies as $currency) { foreach ($currencies as $currency) {

View File

@ -30487,6 +30487,7 @@ function calculateAmounts(invoice) {
for (var i=0; i<invoice.invoice_items.length; i++) { for (var i=0; i<invoice.invoice_items.length; i++) {
var item = invoice.invoice_items[i]; var item = invoice.invoice_items[i];
var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty)); var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty));
lineTotal = roundToTwo(lineTotal);
if (lineTotal) { if (lineTotal) {
total += lineTotal; total += lineTotal;
} }
@ -31182,7 +31183,7 @@ NINJA.decodeJavascript = function(invoice, javascript)
var value = getDescendantProp(invoice, field); var value = getDescendantProp(invoice, field);
if (match.indexOf('?') < 0 || value) { if (match.indexOf('?') < 0 || value) {
if (invoice.partial && field == 'balance_due') { if (invoice.partial && field == 'balance_due') {
field = 'amount_due'; field = 'partial_due';
} else if (invoice.is_quote) { } else if (invoice.is_quote) {
field = field.replace('invoice', 'quote'); field = field.replace('invoice', 'quote');
} }
@ -31259,10 +31260,10 @@ NINJA.invoiceColumns = function(invoice)
columns.push("*") columns.push("*")
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
columns.push("10%"); columns.push("10%");
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
columns.push("10%"); columns.push("10%");
} }
@ -31314,10 +31315,10 @@ NINJA.invoiceLines = function(invoice) {
grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']}); grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']});
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']}); grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']});
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']}); grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']});
} }
@ -31372,10 +31373,10 @@ NINJA.invoiceLines = function(invoice) {
row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist
} }
row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]}); row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]});
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '}); row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '});
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '}); row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '});
} }
row.push({style:["cost", rowStyle], text:cost}); row.push({style:["cost", rowStyle], text:cost});
@ -31439,21 +31440,31 @@ NINJA.subtotals = function(invoice, hideBalance)
data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]); data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]);
} }
if (!hideBalance) {
var isPartial = NINJA.parseFloat(invoice.partial); var isPartial = NINJA.parseFloat(invoice.partial);
if (!hideBalance || isPartial) {
data.push([ data.push([
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']}, { text: invoiceLabels.balance_due, style: [isPartial ? '' : 'balanceDueLabel'] },
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']} { text: formatMoneyInvoice(invoice.total_amount, invoice), style: [isPartial ? '' : 'balanceDue'] }
]); ]);
} }
if (!hideBalance) {
if (isPartial) {
data.push([
{ text: invoiceLabels.partial_due, style: ['balanceDueLabel'] },
{ text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['balanceDue'] }
]);
}
}
return NINJA.prepareDataPairs(data, 'subtotals'); return NINJA.prepareDataPairs(data, 'subtotals');
} }
NINJA.subtotalsBalance = function(invoice) { NINJA.subtotalsBalance = function(invoice) {
var isPartial = NINJA.parseFloat(invoice.partial); var isPartial = NINJA.parseFloat(invoice.partial);
return [[ return [[
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']}, {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']} {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
]]; ]];
} }
@ -31531,18 +31542,18 @@ NINJA.invoiceDetails = function(invoice) {
if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) { if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) {
data.push([ data.push([
{text: invoiceLabels.total}, {text: invoiceLabels.balance_due},
{text: formatMoneyInvoice(invoice.amount, invoice)} {text: formatMoneyInvoice(invoice.amount, invoice)}
]); ]);
} else if (isPartial) { } else if (isPartial) {
data.push([ data.push([
{text: invoiceLabels.total}, {text: invoiceLabels.balance_due},
{text: formatMoneyInvoice(invoice.total_amount, invoice)} {text: formatMoneyInvoice(invoice.total_amount, invoice)}
]); ]);
} }
data.push([ data.push([
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']}, {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']} {text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
]) ])

13
public/css/built.css vendored
View File

@ -2216,7 +2216,8 @@ th:last-child {
} }
tr {border: none;} tr {border: none;}
th {border-left: 1px solid #d26b26; } thead th {border-left: 1px solid #d26b26;}
tbody td {border-left: 1px solid #FFFFFF;}
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
vertical-align: middle; vertical-align: middle;
border-top: none; border-top: none;
@ -2528,6 +2529,16 @@ font-weight: bold;
filter: none; filter: none;
} }
.navbar,
.panel-default,
ul.dropdown-menu,
.twitter-typeahead .tt-menu,
canvas {
x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
}
.navbar .active > a { .navbar .active > a {
background-color: #09334f !important; background-color: #09334f !important;
background-image: none; background-image: none;

View File

@ -790,14 +790,24 @@ html {
overflow-y: scroll; overflow-y: scroll;
} }
@media screen and (min-width: 700px) {
.navbar-header { .navbar-header {
padding-top: 16px; padding-top: 4px;
padding-bottom: 16px; padding-bottom: 4px;
} }
.navbar li a { .navbar li a {
padding: 31px 20px 31px 20px; padding-top: 18px;
} font-weight: 500;
font-size: 15px;
font-weight: bold;
padding-left: 20px;
padding-right: 20px;
}
.navbar {
x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
} }
#footer { #footer {

View File

@ -7,14 +7,24 @@ html {
overflow-y: scroll; overflow-y: scroll;
} }
@media screen and (min-width: 700px) {
.navbar-header { .navbar-header {
padding-top: 16px; padding-top: 4px;
padding-bottom: 16px; padding-bottom: 4px;
} }
.navbar li a { .navbar li a {
padding: 31px 20px 31px 20px; padding-top: 18px;
} font-weight: 500;
font-size: 15px;
font-weight: bold;
padding-left: 20px;
padding-right: 20px;
}
.navbar {
x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
} }
#footer { #footer {

13
public/css/style.css vendored
View File

@ -89,7 +89,8 @@ th:last-child {
} }
tr {border: none;} tr {border: none;}
th {border-left: 1px solid #d26b26; } thead th {border-left: 1px solid #d26b26;}
tbody td {border-left: 1px solid #FFFFFF;}
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
vertical-align: middle; vertical-align: middle;
border-top: none; border-top: none;
@ -401,6 +402,16 @@ font-weight: bold;
filter: none; filter: none;
} }
.navbar,
.panel-default,
ul.dropdown-menu,
.twitter-typeahead .tt-menu,
canvas {
x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
}
.navbar .active > a { .navbar .active > a {
background-color: #09334f !important; background-color: #09334f !important;
background-image: none; background-image: none;

View File

@ -190,7 +190,7 @@ NINJA.decodeJavascript = function(invoice, javascript)
var value = getDescendantProp(invoice, field); var value = getDescendantProp(invoice, field);
if (match.indexOf('?') < 0 || value) { if (match.indexOf('?') < 0 || value) {
if (invoice.partial && field == 'balance_due') { if (invoice.partial && field == 'balance_due') {
field = 'amount_due'; field = 'partial_due';
} else if (invoice.is_quote) { } else if (invoice.is_quote) {
field = field.replace('invoice', 'quote'); field = field.replace('invoice', 'quote');
} }
@ -267,10 +267,10 @@ NINJA.invoiceColumns = function(invoice)
columns.push("*") columns.push("*")
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
columns.push("10%"); columns.push("10%");
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
columns.push("10%"); columns.push("10%");
} }
@ -322,10 +322,10 @@ NINJA.invoiceLines = function(invoice) {
grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']}); grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']});
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']}); grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']});
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']}); grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']});
} }
@ -380,10 +380,10 @@ NINJA.invoiceLines = function(invoice) {
row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist
} }
row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]}); row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]});
if (account.custom_invoice_item_label1) { if (invoice.is_pro && account.custom_invoice_item_label1) {
row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '}); row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '});
} }
if (account.custom_invoice_item_label2) { if (invoice.is_pro && account.custom_invoice_item_label2) {
row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '}); row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '});
} }
row.push({style:["cost", rowStyle], text:cost}); row.push({style:["cost", rowStyle], text:cost});
@ -447,21 +447,31 @@ NINJA.subtotals = function(invoice, hideBalance)
data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]); data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]);
} }
if (!hideBalance) {
var isPartial = NINJA.parseFloat(invoice.partial); var isPartial = NINJA.parseFloat(invoice.partial);
if (!hideBalance || isPartial) {
data.push([ data.push([
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']}, { text: invoiceLabels.balance_due, style: [isPartial ? '' : 'balanceDueLabel'] },
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']} { text: formatMoneyInvoice(invoice.total_amount, invoice), style: [isPartial ? '' : 'balanceDue'] }
]); ]);
} }
if (!hideBalance) {
if (isPartial) {
data.push([
{ text: invoiceLabels.partial_due, style: ['balanceDueLabel'] },
{ text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['balanceDue'] }
]);
}
}
return NINJA.prepareDataPairs(data, 'subtotals'); return NINJA.prepareDataPairs(data, 'subtotals');
} }
NINJA.subtotalsBalance = function(invoice) { NINJA.subtotalsBalance = function(invoice) {
var isPartial = NINJA.parseFloat(invoice.partial); var isPartial = NINJA.parseFloat(invoice.partial);
return [[ return [[
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']}, {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']} {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
]]; ]];
} }
@ -539,18 +549,18 @@ NINJA.invoiceDetails = function(invoice) {
if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) { if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) {
data.push([ data.push([
{text: invoiceLabels.total}, {text: invoiceLabels.balance_due},
{text: formatMoneyInvoice(invoice.amount, invoice)} {text: formatMoneyInvoice(invoice.amount, invoice)}
]); ]);
} else if (isPartial) { } else if (isPartial) {
data.push([ data.push([
{text: invoiceLabels.total}, {text: invoiceLabels.balance_due},
{text: formatMoneyInvoice(invoice.total_amount, invoice)} {text: formatMoneyInvoice(invoice.total_amount, invoice)}
]); ]);
} }
data.push([ data.push([
{text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']}, {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']} {text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
]) ])

View File

@ -595,6 +595,7 @@ function calculateAmounts(invoice) {
for (var i=0; i<invoice.invoice_items.length; i++) { for (var i=0; i<invoice.invoice_items.length; i++) {
var item = invoice.invoice_items[i]; var item = invoice.invoice_items[i];
var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty)); var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty));
lineTotal = roundToTwo(lineTotal);
if (lineTotal) { if (lineTotal) {
total += lineTotal; total += lineTotal;
} }

View File

@ -52,7 +52,7 @@ Note: we've recently updated this branch to Laravel 5.2. If you're upgrading her
* [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/)
* [User Guide](https://www.invoiceninja.com/app-user-guide/) * [User Guide](https://www.invoiceninja.com/app-user-guide/)
* [Developer Guide](https://www.invoiceninja.com/knowledgebase/developer-guide/) * [Developer Guide](https://www.invoiceninja.com/knowledgebase/developer-guide/)
* [API Documentation](https://www.invoiceninja.com/knowledgebase/api-documentation/) * [API Documentation](https://www.invoiceninja.com/api-documentation/)
* [Support Forum](https://www.invoiceninja.com/forums/forum/support/) * [Support Forum](https://www.invoiceninja.com/forums/forum/support/)
* [Feature Roadmap](https://trello.com/b/63BbiVVe/) * [Feature Roadmap](https://trello.com/b/63BbiVVe/)

View File

@ -942,7 +942,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1131,4 +1131,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -943,7 +943,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1132,4 +1132,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -161,7 +161,7 @@ $LANG = array(
'work_email' => 'Email', 'work_email' => 'Email',
'language_id' => 'Language', 'language_id' => 'Language',
'timezone_id' => 'Timezone', 'timezone_id' => 'Timezone',
'date_format_id' => 'Date format', 'date_format_id' => 'Date Format',
'datetime_format_id' => 'Date/Time Format', 'datetime_format_id' => 'Date/Time Format',
'users' => 'Users', 'users' => 'Users',
'localization' => 'Localization', 'localization' => 'Localization',
@ -826,7 +826,7 @@ $LANG = array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process', 'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process',
@ -950,7 +950,7 @@ $LANG = array(
'add_bank_account' => 'Add Bank Account', 'add_bank_account' => 'Add Bank Account',
'setup_account' => 'Setup Account', 'setup_account' => 'Setup Account',
'import_expenses' => 'Import Expenses', 'import_expenses' => 'Import Expenses',
'bank_id' => 'bank', 'bank_id' => 'Bank',
'integration_type' => 'Integration Type', 'integration_type' => 'Integration Type',
'updated_bank_account' => 'Successfully updated bank account', 'updated_bank_account' => 'Successfully updated bank account',
'edit_bank_account' => 'Edit Bank Account', 'edit_bank_account' => 'Edit Bank Account',
@ -1062,14 +1062,40 @@ $LANG = array(
'invalid_card_number' => 'The credit card number is not valid.', 'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.', 'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.', 'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions // User Permissions
'owner' => 'Owner', 'owner' => 'Owner',
'administrator' => 'Administrator', 'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings, and view and modify all data', 'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.', 'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.', 'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.', 'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -920,7 +920,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1108,4 +1108,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -1128,4 +1128,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -934,7 +934,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1123,4 +1123,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -1121,4 +1121,73 @@ return array(
'overdue' => 'En souffrance', 'overdue' => 'En souffrance',
'white_label_text' => 'Achetez une licence sans pub d\'un an à $'.WHITE_LABEL_PRICE.' pour retirer le logo de Invoice Ninja du portail client et supporter notre projet.', 'white_label_text' => 'Achetez une licence sans pub d\'un an à $'.WHITE_LABEL_PRICE.' pour retirer le logo de Invoice Ninja du portail client et supporter notre projet.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -937,7 +937,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1126,4 +1126,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -1052,6 +1052,51 @@ $LANG = array(
'enable_client_portal' => 'ダッシュボード', 'enable_client_portal' => 'ダッシュボード',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.', 'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );
return $LANG; return $LANG;

View File

@ -944,7 +944,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1133,4 +1133,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -942,7 +942,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1131,4 +1131,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -937,7 +937,7 @@ return array(
'notes' => 'Notities', 'notes' => 'Notities',
'invoice_will_create' => 'klant zal worden aangemaakt', 'invoice_will_create' => 'klant zal worden aangemaakt',
'invoices_will_create' => 'factuur zal worden aangemaakt', 'invoices_will_create' => 'factuur zal worden aangemaakt',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1126,4 +1126,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -1123,4 +1123,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -939,7 +939,7 @@ return array(
'notes' => 'Notes', 'notes' => 'Notes',
'invoice_will_create' => 'client will be created', 'invoice_will_create' => 'client will be created',
'invoices_will_create' => 'invoices will be created', 'invoices_will_create' => 'invoices will be created',
'failed_to_import' => 'The following records failed to import', 'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
'publishable_key' => 'Publishable Key', 'publishable_key' => 'Publishable Key',
'secret_key' => 'Secret Key', 'secret_key' => 'Secret Key',
@ -1128,4 +1128,73 @@ return array(
'overdue' => 'Overdue', 'overdue' => 'Overdue',
'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.', 'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
'navigation' => 'Navigation',
'list_invoices' => 'List Invoices',
'list_clients' => 'List Clients',
'list_quotes' => 'List Quotes',
'list_tasks' => 'List Tasks',
'list_expenses' => 'List Expenses',
'list_recurring_invoices' => 'List Recurring Invoices',
'list_payments' => 'List Payments',
'list_credits' => 'List Credits',
'tax_name' => 'Tax Name',
'report_settings' => 'Report Settings',
'search_hotkey' => 'shortcut is /',
'new_user' => 'New User',
'new_product' => 'New Product',
'new_tax_rate' => 'New Tax Rate',
'invoiced_amount' => 'Invoiced Amount',
'invoice_item_fields' => 'Invoice Item Fields',
'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
'recurring_invoice_number' => 'Recurring Invoice Number',
'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
'enable_client_portal' => 'Dashboard',
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
// Client Passwords
'enable_portal_password'=>'Password protect invoices',
'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
'send_portal_password'=>'Generate password automatically',
'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
'expired' => 'Expired',
'invalid_card_number' => 'The credit card number is not valid.',
'invalid_expiry' => 'The expiration date is not valid.',
'invalid_cvv' => 'The CVV is not valid.',
'cost' => 'Cost',
'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
// User Permissions
'owner' => 'Owner',
'administrator' => 'Administrator',
'administrator_help' => 'Allow user to manage users, change settings and modify all records',
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
'restored_expense' => 'Successfully restored expense',
'permissions' => 'Permissions',
'create_all_help' => 'Allow user to create and modify records',
'view_all_help' => 'Allow user to view records they didn\'t create',
'edit_all_help' => 'Allow user to modify records they didn\'t create',
'view_payment' => 'View Payment',
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
); );

View File

@ -52,6 +52,15 @@
@foreach ($gateways as $gateway) @foreach ($gateways as $gateway)
<div id="gateway_{{ $gateway->id }}_div" class='gateway-fields' style="display: none"> <div id="gateway_{{ $gateway->id }}_div" class='gateway-fields' style="display: none">
@if ($gateway->getHelp())
<div class="form-group">
<label class="control-label col-lg-4 col-sm-4"></label>
<div class="col-lg-8 col-sm-8 help-block">
{!! $gateway->getHelp() !!}
</div>
</div>
@endif
@foreach ($gateway->fields as $field => $details) @foreach ($gateway->fields as $field => $details)
@if ($details && !$accountGateway) @if ($details && !$accountGateway)
@ -64,24 +73,15 @@
&& isset($_ENV['DWOLLA_KEY']) && isset($_ENV['DWOLLA_SECRET'])) && isset($_ENV['DWOLLA_KEY']) && isset($_ENV['DWOLLA_SECRET']))
{{-- do nothing --}} {{-- do nothing --}}
@elseif ($field == 'testMode' || $field == 'developerMode' || $field == 'sandbox') @elseif ($field == 'testMode' || $field == 'developerMode' || $field == 'sandbox')
{!! Former::checkbox($gateway->id.'_'.$field)->label(Utils::toSpaceCase($field))->text('Enable')->value('true') !!} {!! Former::checkbox($gateway->id.'_'.$field)->label(ucwords(Utils::toSpaceCase($field)))->text('Enable')->value('true') !!}
@elseif ($field == 'username' || $field == 'password') @elseif ($field == 'username' || $field == 'password')
{!! Former::text($gateway->id.'_'.$field)->label('API '. ucfirst(Utils::toSpaceCase($field))) !!} {!! Former::text($gateway->id.'_'.$field)->label('API '. ucfirst(Utils::toSpaceCase($field))) !!}
@else @else
{!! Former::text($gateway->id.'_'.$field)->label($gateway->id == GATEWAY_STRIPE ? trans('texts.secret_key') : Utils::toSpaceCase($field)) !!} {!! Former::text($gateway->id.'_'.$field)->label($gateway->id == GATEWAY_STRIPE ? trans('texts.secret_key') : ucwords(Utils::toSpaceCase($field))) !!}
@endif @endif
@endforeach @endforeach
@if ($gateway->getHelp())
<div class="form-group">
<label class="control-label col-lg-4 col-sm-4"></label>
<div class="col-lg-8 col-sm-8 help-block">
{!! $gateway->getHelp() !!}
</div>
</div>
@endif
@if ($gateway->id == GATEWAY_STRIPE) @if ($gateway->id == GATEWAY_STRIPE)
{!! Former::text('publishable_key') !!} {!! Former::text('publishable_key') !!}

View File

@ -5,7 +5,7 @@
@include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true]) @include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true])
<div class="pull-right"> <div class="pull-right">
{!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/knowledgebase/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!} {!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!}
@if (Utils::isNinja()) @if (Utils::isNinja())
{!! Button::normal(trans('texts.zapier'))->asLinkTo(ZAPIER_URL)->withAttributes(['target' => '_blank']) !!} {!! Button::normal(trans('texts.zapier'))->asLinkTo(ZAPIER_URL)->withAttributes(['target' => '_blank']) !!}
@endif @endif
@ -51,4 +51,9 @@
</script> </script>
@if (Utils::isNinja() && !Utils::isReseller())
<p>&nbsp;</p>
<script src="https://zapier.com/zapbook/embed/widget.js?services=invoice-ninja&container=false&limit=6"></script>
@endif
@stop @stop

View File

@ -28,6 +28,7 @@
@include('accounts.nav', ['selected' => ACCOUNT_CLIENT_PORTAL]) @include('accounts.nav', ['selected' => ACCOUNT_CLIENT_PORTAL])
<div class="row"> <div class="row">
<div class="col-md-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.client_portal') !!}</h3> <h3 class="panel-title">{!! trans('texts.client_portal') !!}</h3>
@ -67,6 +68,7 @@
->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!} ->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!}
</div> </div>
</div> </div>
</div>
</div> </div>
</div> </div>

View File

@ -153,7 +153,6 @@
@if (isset($sampleInvoice) && $sampleInvoice) @if (isset($sampleInvoice) && $sampleInvoice)
var sample = {!! $sampleInvoice->toJSON() !!} var sample = {!! $sampleInvoice->toJSON() !!}
console.log(sample);
$('#sampleData').show().html(prettyJson(sample)); $('#sampleData').show().html(prettyJson(sample));
@endif @endif
}); });
@ -222,6 +221,9 @@
{!! trans('texts.customize_help') !!} {!! trans('texts.customize_help') !!}
<pre id="sampleData" style="display:none;height:200px;padding-top:16px;"></pre> <pre id="sampleData" style="display:none;height:200px;padding-top:16px;"></pre>
@if (empty($sampleInvoice))
<div class="help-block">{{ trans('texts.create_invoice_for_sample') }}</div>
@endif
</div> </div>
<div class="modal-footer" style="margin-top: 0px"> <div class="modal-footer" style="margin-top: 0px">

View File

@ -50,7 +50,7 @@
->help(trans('texts.subdomain_help')) !!} ->help(trans('texts.subdomain_help')) !!}
{!! Former::text('iframe_url') {!! Former::text('iframe_url')
->placeholder('http://www.example.com/invoice') ->placeholder('https://www.example.com/invoice')
->appendIcon('question-sign') ->appendIcon('question-sign')
->addGroupClass('iframe_url') ->addGroupClass('iframe_url')
->label(' ') ->label(' ')

View File

@ -60,7 +60,16 @@
@else @else
NINJA.headerFont = NINJA.bodyFont = 'Roboto'; NINJA.headerFont = NINJA.bodyFont = 'Roboto';
@endif @endif
var fields = ['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms']; var fields = [
'item',
'description',
'unit_cost',
'quantity',
'line_total',
'terms',
'balance_due',
'partial_due'
];
invoiceLabels.old = {}; invoiceLabels.old = {};
for (var i=0; i<fields.length; i++) { for (var i=0; i<fields.length; i++) {
var field = fields[i]; var field = fields[i];
@ -181,11 +190,13 @@
{!! Former::text('labels_item')->label(trans('texts.item')) !!} {!! Former::text('labels_item')->label(trans('texts.item')) !!}
{!! Former::text('labels_description')->label(trans('texts.description')) !!} {!! Former::text('labels_description')->label(trans('texts.description')) !!}
{!! Former::text('labels_unit_cost')->label(trans('texts.unit_cost')) !!} {!! Former::text('labels_unit_cost')->label(trans('texts.unit_cost')) !!}
{!! Former::text('labels_quantity')->label(trans('texts.quantity')) !!}
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
{!! Former::text('labels_quantity')->label(trans('texts.quantity')) !!}
{!! Former::text('labels_line_total')->label(trans('texts.line_total')) !!} {!! Former::text('labels_line_total')->label(trans('texts.line_total')) !!}
{!! Former::text('labels_terms')->label(trans('texts.terms')) !!} {!! Former::text('labels_terms')->label(trans('texts.terms')) !!}
{!! Former::text('labels_balance_due')->label(trans('texts.balance_due')) !!}
{!! Former::text('labels_partial_due')->label(trans('texts.partial_due')) !!}
</div> </div>
</div> </div>

View File

@ -12,6 +12,8 @@
<div class="row"> <div class="row">
<div class="col-md-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.localization') !!}</h3> <h3 class="panel-title">{!! trans('texts.localization') !!}</h3>
@ -34,6 +36,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<center> <center>
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!} {!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!}

View File

@ -6,7 +6,7 @@
@include('accounts.nav', ['selected' => ACCOUNT_SYSTEM_SETTINGS]) @include('accounts.nav', ['selected' => ACCOUNT_SYSTEM_SETTINGS])
<div class="row"> <div class="row">
<div class="col-md-12">
{!! Former::open('/update_setup') {!! Former::open('/update_setup')
->addClass('warn-on-exit') ->addClass('warn-on-exit')
->autocomplete('off') ->autocomplete('off')
@ -23,6 +23,7 @@
@include('partials.system_settings') @include('partials.system_settings')
</div> </div>
</div>
<center> <center>
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!} {!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!}

View File

@ -14,7 +14,7 @@
} }
</style> </style>
<script src="https://maps.googleapis.com/maps/api/js"></script> <script src="https://maps.googleapis.com/maps/api/js?key={{ env('GOOGLE_MAPS_API_KEY') }}"></script>
@endif @endif
@stop @stop

View File

@ -401,6 +401,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a href="{{ URL::to(NINJA_WEB_URL) }}" class='navbar-brand' target="_blank"> <a href="{{ URL::to(NINJA_WEB_URL) }}" class='navbar-brand' target="_blank">
{{-- Per our license, please do not remove or modify this link. --}}
<img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px;width:auto;padding-right:10px"/> <img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px;width:auto;padding-right:10px"/>
</a> </a>
</div> </div>

View File

@ -196,10 +196,10 @@
<th style="min-width:32px;" class="hide-border"></th> <th style="min-width:32px;" class="hide-border"></th>
<th style="min-width:160px">{{ $invoiceLabels['item'] }}</th> <th style="min-width:160px">{{ $invoiceLabels['item'] }}</th>
<th style="width:100%">{{ $invoiceLabels['description'] }}</th> <th style="width:100%">{{ $invoiceLabels['description'] }}</th>
@if ($account->custom_invoice_item_label1) @if ($account->showCustomField('custom_invoice_item_label1'))
<th style="min-width:120px">{{ $account->custom_invoice_item_label1 }}</th> <th style="min-width:120px">{{ $account->custom_invoice_item_label1 }}</th>
@endif @endif
@if ($account->custom_invoice_item_label2) @if ($account->showCustomField('custom_invoice_item_label2'))
<th style="min-width:120px">{{ $account->custom_invoice_item_label2 }}</th> <th style="min-width:120px">{{ $account->custom_invoice_item_label2 }}</th>
@endif @endif
<th style="min-width:120px" data-bind="text: costLabel">{{ $invoiceLabels['unit_cost'] }}</th> <th style="min-width:120px" data-bind="text: costLabel">{{ $invoiceLabels['unit_cost'] }}</th>
@ -224,12 +224,12 @@
<input type="text" data-bind="value: task_public_id, attr: {name: 'invoice_items[' + $index() + '][task_public_id]'}" style="display: none"/> <input type="text" data-bind="value: task_public_id, attr: {name: 'invoice_items[' + $index() + '][task_public_id]'}" style="display: none"/>
<input type="text" data-bind="value: expense_public_id, attr: {name: 'invoice_items[' + $index() + '][expense_public_id]'}" style="display: none"/> <input type="text" data-bind="value: expense_public_id, attr: {name: 'invoice_items[' + $index() + '][expense_public_id]'}" style="display: none"/>
</td> </td>
@if ($account->custom_invoice_item_label1) @if ($account->showCustomField('custom_invoice_item_label1'))
<td> <td>
<input data-bind="value: custom_value1, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value1]'}" class="form-control invoice-item"/> <input data-bind="value: custom_value1, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value1]'}" class="form-control invoice-item"/>
</td> </td>
@endif @endif
@if ($account->custom_invoice_item_label2) @if ($account->showCustomField('custom_invoice_item_label2'))
<td> <td>
<input data-bind="value: custom_value2, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value2]'}" class="form-control invoice-item"/> <input data-bind="value: custom_value2, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value2]'}" class="form-control invoice-item"/>
</td> </td>
@ -262,7 +262,7 @@
<tfoot> <tfoot>
<tr> <tr>
<td class="hide-border"/> <td class="hide-border"/>
<td class="hide-border" colspan="{{ 2 + ($account->custom_invoice_item_label1 ? 1 : 0) + ($account->custom_invoice_item_label2 ? 1 : 0) }}" rowspan="6" style="vertical-align:top"> <td class="hide-border" colspan="{{ 2 + ($account->showCustomField('custom_invoice_item_label1') ? 1 : 0) + ($account->showCustomField('custom_invoice_item_label2') ? 1 : 0) }}" rowspan="6" style="vertical-align:top">
<br/> <br/>
<div role="tabpanel"> <div role="tabpanel">
@ -385,11 +385,18 @@
</tr> </tr>
@endif @endif
<tr style="font-size:1.05em"> <tr data-bind="style: { 'font-weight': partial() ? 'normal' : 'bold', 'font-size': partial() ? '1em' : '1.05em' }">
<td class="hide-border" colspan="3"/> <td class="hide-border" colspan="3"/>
<td class="hide-border" style="display:none" data-bind="visible: $root.invoice_item_taxes.show"/> <td class="hide-border" style="display:none" data-bind="visible: $root.invoice_item_taxes.show"/>
<td class="hide-border" colspan="{{ $account->hide_quantity ? 1 : 2 }}"><b>{{ trans($entityType == ENTITY_INVOICE ? 'texts.balance_due' : 'texts.total') }}</b></td> <td class="hide-border" data-bind="css: {'hide-border': !partial()}" colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $entityType == ENTITY_INVOICE ? $invoiceLabels['balance_due'] : trans('texts.total') }}</td>
<td class="hide-border" style="text-align: right"><span data-bind="text: totals.total"></span></td> <td class="hide-border" data-bind="css: {'hide-border': !partial()}" style="text-align: right"><span data-bind="text: totals.total"></span></td>
</tr>
<tr style="font-size:1.05em; display:none; font-weight:bold" data-bind="visible: partial">
<td class="hide-border" colspan="3"/>
<td class="hide-border" style="display:none" data-bind="visible: $root.invoice_item_taxes.show"/>
<td class="hide-border" colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $invoiceLabels['partial_due'] }}</td>
<td class="hide-border" style="text-align: right"><span data-bind="text: totals.partial"></span></td>
</tr> </tr>
</tfoot> </tfoot>

View File

@ -512,7 +512,11 @@ function InvoiceModel(data) {
}); });
self.totals.total = ko.computed(function() { self.totals.total = ko.computed(function() {
return self.formatMoney(self.partial() ? self.partial() : self.totals.rawTotal()); return self.formatMoney(self.totals.rawTotal());
});
self.totals.partial = ko.computed(function() {
return self.formatMoney(self.partial());
}); });
self.onDragged = function(item) { self.onDragged = function(item) {

View File

@ -70,7 +70,7 @@
</button> </button>
@if (!isset($hideLogo) || !$hideLogo) @if (!isset($hideLogo) || !$hideLogo)
{{-- Per our license, please do not remove or modify this link. --}} {{-- Per our license, please do not remove or modify this link. --}}
<a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img src="{{ asset('images/invoiceninja-logo.png') }}"></a> <a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px"></a>
@endif @endif
</div> </div>
<div id="navbar" class="collapse navbar-collapse"> <div id="navbar" class="collapse navbar-collapse">

View File

@ -35,7 +35,7 @@
</div> </div>
--> -->
<h2>{{ $title }}</h2> <h3>{{ $title }}</h3>
{!! Datatable::table() {!! Datatable::table()
->addColumn($columns) ->addColumn($columns)

View File

@ -16,13 +16,24 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! $title !!}</h3> <h3 class="panel-title">{!! trans('texts.user_details') !!}</h3>
</div> </div>
<div class="panel-body form-padding-right"> <div class="panel-body form-padding-right">
{!! Former::text('first_name') !!} {!! Former::text('first_name') !!}
{!! Former::text('last_name') !!} {!! Former::text('last_name') !!}
{!! Former::text('email') !!} {!! Former::text('email') !!}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.permissions') !!}</h3>
</div>
<div class="panel-body form-padding-right">
{!! Former::checkbox('is_admin') {!! Former::checkbox('is_admin')
->label('&nbsp;') ->label('&nbsp;')
->text(trans('texts.administrator')) ->text(trans('texts.administrator'))
@ -31,17 +42,20 @@
->value('create_all') ->value('create_all')
->label('&nbsp;') ->label('&nbsp;')
->id('permissions_create_all') ->id('permissions_create_all')
->text(trans('texts.user_create_all')) !!} ->text(trans('texts.user_create_all'))
->help(trans('texts.create_all_help')) !!}
{!! Former::checkbox('permissions[view_all]') {!! Former::checkbox('permissions[view_all]')
->value('view_all') ->value('view_all')
->label('&nbsp;') ->label('&nbsp;')
->id('permissions_view_all') ->id('permissions_view_all')
->text(trans('texts.user_view_all')) !!} ->text(trans('texts.user_view_all'))
->help(trans('texts.view_all_help')) !!}
{!! Former::checkbox('permissions[edit_all]') {!! Former::checkbox('permissions[edit_all]')
->value('edit_all') ->value('edit_all')
->label('&nbsp;') ->label('&nbsp;')
->id('permissions_edit_all') ->id('permissions_edit_all')
->text(trans('texts.user_edit_all')) !!} ->text(trans('texts.user_edit_all'))
->help(trans('texts.edit_all_help')) !!}
</div> </div>
</div> </div>

View File

@ -14,7 +14,7 @@
} }
</style> </style>
<script src="https://maps.googleapis.com/maps/api/js"></script> <script src="https://maps.googleapis.com/maps/api/js?key={{ env('GOOGLE_MAPS_API_KEY') }}"></script>
@endif @endif
@stop @stop

View File

@ -80,9 +80,9 @@ $I->amOnPage('/settings/user_management');
$I->see('Add User'); $I->see('Add User');
//try to logout //try to logout
$I->click('#myAccountButton'); //$I->click('#myAccountButton');
$I->see('Log Out'); //$I->see('Log Out');
$I->click('Log Out'); //$I->click('Log Out');
// Miscellaneous pages // Miscellaneous pages
$I->amOnPage('/terms'); $I->amOnPage('/terms');

View File

@ -67,6 +67,7 @@ class OnlinePaymentCest
$I->amOnPage('/view/' . $invitationKey); $I->amOnPage('/view/' . $invitationKey);
$I->click('Pay Now'); $I->click('Pay Now');
/*
$I->fillField(['name' => 'first_name'], $this->faker->firstName); $I->fillField(['name' => 'first_name'], $this->faker->firstName);
$I->fillField(['name' => 'last_name'], $this->faker->lastName); $I->fillField(['name' => 'last_name'], $this->faker->lastName);
$I->fillField(['name' => 'address1'], $this->faker->streetAddress); $I->fillField(['name' => 'address1'], $this->faker->streetAddress);
@ -75,6 +76,8 @@ class OnlinePaymentCest
$I->fillField(['name' => 'state'], $this->faker->state); $I->fillField(['name' => 'state'], $this->faker->state);
$I->fillField(['name' => 'postal_code'], $this->faker->postcode); $I->fillField(['name' => 'postal_code'], $this->faker->postcode);
$I->selectDropdown($I, 'United States', '.country-select .dropdown-toggle'); $I->selectDropdown($I, 'United States', '.country-select .dropdown-toggle');
*/
$I->fillField('#card_number', '4242424242424242'); $I->fillField('#card_number', '4242424242424242');
$I->fillField('#cvv', '1234'); $I->fillField('#cvv', '1234');
$I->selectOption('#expiration_month', 12); $I->selectOption('#expiration_month', 12);

View File

@ -30,8 +30,8 @@ class TaxRatesCest
$total += round($itemCost * $itemTaxRate / 100, 2); $total += round($itemCost * $itemTaxRate / 100, 2);
$total += round($itemCost * $invoiceTaxRate / 100, 2); $total += round($itemCost * $invoiceTaxRate / 100, 2);
$itemTaxRate = number_format($itemTaxRate, 2); $itemTaxRate = number_format($itemTaxRate, 3);
$invoiceTaxRate = number_format($invoiceTaxRate, 2); $invoiceTaxRate = number_format($invoiceTaxRate, 3);
// create tax rates // create tax rates
$I->amOnPage('/tax_rates/create'); $I->amOnPage('/tax_rates/create');
@ -72,7 +72,7 @@ class TaxRatesCest
$I->selectDropdown($I, $clientEmail, '.client_select .dropdown-toggle'); $I->selectDropdown($I, $clientEmail, '.client_select .dropdown-toggle');
$I->fillField('table.invoice-table tbody tr:nth-child(1) #product_key', $productKey); $I->fillField('table.invoice-table tbody tr:nth-child(1) #product_key', $productKey);
$I->click('table.invoice-table tbody tr:nth-child(1) .tt-selectable'); $I->click('table.invoice-table tbody tr:nth-child(1) .tt-selectable');
$I->selectOption('#taxRateSelect', $invoiceTaxName . ' ' . $invoiceTaxRate . '%'); $I->selectOption('#taxRateSelect', $invoiceTaxName . ' ' . floatval($invoiceTaxRate) . '%');
$I->wait(2); $I->wait(2);
// check total is right before saving // check total is right before saving