mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-08 12:12:48 +01:00
Merge remote-tracking branch 'upstream/develop' into develop
This commit is contained in:
commit
c84d75e7bf
@ -9,6 +9,7 @@ use Session;
|
||||
use Utils;
|
||||
use Validator;
|
||||
use View;
|
||||
use URL;
|
||||
use stdClass;
|
||||
use Cache;
|
||||
use Response;
|
||||
@ -18,6 +19,7 @@ use App\Models\License;
|
||||
use App\Models\Invoice;
|
||||
use App\Models\User;
|
||||
use App\Models\Account;
|
||||
use App\Models\Document;
|
||||
use App\Models\Gateway;
|
||||
use App\Models\InvoiceDesign;
|
||||
use App\Models\TaxRate;
|
||||
@ -234,7 +236,7 @@ class AccountController extends BaseController
|
||||
{
|
||||
$oauthLoginUrls = [];
|
||||
foreach (AuthService::$providers as $provider) {
|
||||
$oauthLoginUrls[] = ['label' => $provider, 'url' => '/auth/'.strtolower($provider)];
|
||||
$oauthLoginUrls[] = ['label' => $provider, 'url' => URL::to('/auth/'.strtolower($provider))];
|
||||
}
|
||||
|
||||
$data = [
|
||||
@ -377,7 +379,8 @@ class AccountController extends BaseController
|
||||
|
||||
$invoice->client = $client;
|
||||
$invoice->invoice_items = [$invoiceItem];
|
||||
$invoice->documents = $account->isPro()?[$document,$document,$document,$document]:[];
|
||||
//$invoice->documents = $account->isPro() ? [$document] : [];
|
||||
$invoice->documents = [];
|
||||
|
||||
$data['account'] = $account;
|
||||
$data['invoice'] = $invoice;
|
||||
@ -550,6 +553,7 @@ class AccountController extends BaseController
|
||||
$account->client_view_css = $sanitized_css;
|
||||
|
||||
$account->enable_client_portal = !!Input::get('enable_client_portal');
|
||||
$account->enable_client_portal_dashboard = !!Input::get('enable_client_portal_dashboard');
|
||||
$account->enable_portal_password = !!Input::get('enable_portal_password');
|
||||
$account->send_portal_password = !!Input::get('send_portal_password');
|
||||
|
||||
@ -799,39 +803,77 @@ class AccountController extends BaseController
|
||||
$this->accountRepo->save($request->input(), $account);
|
||||
|
||||
/* Logo image file */
|
||||
if ($file = Input::file('logo')) {
|
||||
if ($uploaded = Input::file('logo')) {
|
||||
$path = Input::file('logo')->getRealPath();
|
||||
File::delete('logo/'.$account->account_key.'.jpg');
|
||||
File::delete('logo/'.$account->account_key.'.png');
|
||||
|
||||
$disk = $account->getLogoDisk();
|
||||
if ($account->hasLogo()) {
|
||||
$disk->delete($account->logo);
|
||||
}
|
||||
|
||||
$extension = strtolower($uploaded->getClientOriginalExtension());
|
||||
if(empty(Document::$types[$extension]) && !empty(Document::$extraExtensions[$extension])){
|
||||
$documentType = Document::$extraExtensions[$extension];
|
||||
}
|
||||
else{
|
||||
$documentType = $extension;
|
||||
}
|
||||
|
||||
$mimeType = $file->getMimeType();
|
||||
|
||||
if ($mimeType == 'image/jpeg') {
|
||||
$path = 'logo/'.$account->account_key.'.jpg';
|
||||
$file->move('logo/', $account->account_key.'.jpg');
|
||||
} elseif ($mimeType == 'image/png') {
|
||||
$path = 'logo/'.$account->account_key.'.png';
|
||||
$file->move('logo/', $account->account_key.'.png');
|
||||
if(!in_array($documentType, array('jpeg', 'png', 'gif'))){
|
||||
Session::flash('warning', 'Unsupported file type');
|
||||
} else {
|
||||
if (extension_loaded('fileinfo')) {
|
||||
$image = Image::make($path);
|
||||
$image->resize(200, 120, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
});
|
||||
$path = 'logo/'.$account->account_key.'.jpg';
|
||||
Image::canvas($image->width(), $image->height(), '#FFFFFF')
|
||||
->insert($image)->save($path);
|
||||
$documentTypeData = Document::$types[$documentType];
|
||||
|
||||
$filePath = $uploaded->path();
|
||||
$size = filesize($filePath);
|
||||
|
||||
if($size/1000 > MAX_DOCUMENT_SIZE){
|
||||
Session::flash('warning', 'File too large');
|
||||
} else {
|
||||
Session::flash('warning', 'Warning: To support gifs the fileinfo PHP extension needs to be enabled.');
|
||||
if ($documentType != 'gif') {
|
||||
$account->logo = $account->account_key.'.'.$documentType;
|
||||
|
||||
$imageSize = getimagesize($filePath);
|
||||
$account->logo_width = $imageSize[0];
|
||||
$account->logo_height = $imageSize[1];
|
||||
$account->logo_size = $size;
|
||||
|
||||
// make sure image isn't interlaced
|
||||
if (extension_loaded('fileinfo')) {
|
||||
$image = Image::make($path);
|
||||
$image->interlace(false);
|
||||
$imageStr = (string) $image->encode($documentType);
|
||||
$disk->put($account->logo, $imageStr);
|
||||
|
||||
$account->logo_size = strlen($imageStr);
|
||||
} else {
|
||||
$stream = fopen($filePath, 'r');
|
||||
$disk->getDriver()->putStream($account->logo, $stream, ['mimetype'=>$documentTypeData['mime']]);
|
||||
fclose($stream);
|
||||
}
|
||||
} else {
|
||||
if (extension_loaded('fileinfo')) {
|
||||
$image = Image::make($path);
|
||||
$image->resize(200, 120, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
});
|
||||
|
||||
$account->logo = $account->account_key.'.png';
|
||||
$image = Image::canvas($image->width(), $image->height(), '#FFFFFF')->insert($image);
|
||||
$imageStr = (string) $image->encode('png');
|
||||
$disk->put($account->logo, $imageStr);
|
||||
|
||||
$account->logo_size = strlen($imageStr);
|
||||
$account->logo_width = $image->width();
|
||||
$account->logo_height = $image->height();
|
||||
} else {
|
||||
Session::flash('warning', 'Warning: To support gifs the fileinfo PHP extension needs to be enabled.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// make sure image isn't interlaced
|
||||
if (extension_loaded('fileinfo')) {
|
||||
$img = Image::make($path);
|
||||
$img->interlace(false);
|
||||
$img->save();
|
||||
}
|
||||
|
||||
$account->save();
|
||||
}
|
||||
|
||||
event(new UserSettingsChanged());
|
||||
@ -897,10 +939,18 @@ class AccountController extends BaseController
|
||||
|
||||
public function removeLogo()
|
||||
{
|
||||
File::delete('logo/'.Auth::user()->account->account_key.'.jpg');
|
||||
File::delete('logo/'.Auth::user()->account->account_key.'.png');
|
||||
$account = Auth::user()->account;
|
||||
if ($account->hasLogo()) {
|
||||
$account->getLogoDisk()->delete($account->logo);
|
||||
|
||||
$account->logo = null;
|
||||
$account->logo_size = null;
|
||||
$account->logo_width = null;
|
||||
$account->logo_height = null;
|
||||
$account->save();
|
||||
|
||||
Session::flash('message', trans('texts.removed_logo'));
|
||||
Session::flash('message', trans('texts.removed_logo'));
|
||||
}
|
||||
|
||||
return Redirect::to('settings/'.ACCOUNT_COMPANY_DETAILS);
|
||||
}
|
||||
|
@ -112,10 +112,10 @@ class ClientController extends BaseController
|
||||
|
||||
$actionLinks = [];
|
||||
if(Task::canCreate()){
|
||||
$actionLinks[] = ['label' => trans('texts.new_task'), 'url' => '/tasks/create/'.$client->public_id];
|
||||
$actionLinks[] = ['label' => trans('texts.new_task'), 'url' => URL::to('/tasks/create/'.$client->public_id)];
|
||||
}
|
||||
if (Utils::isPro() && Invoice::canCreate()) {
|
||||
$actionLinks[] = ['label' => trans('texts.new_quote'), 'url' => '/quotes/create/'.$client->public_id];
|
||||
$actionLinks[] = ['label' => trans('texts.new_quote'), 'url' => URL::to('/quotes/create/'.$client->public_id)];
|
||||
}
|
||||
|
||||
if(!empty($actionLinks)){
|
||||
@ -123,15 +123,15 @@ class ClientController extends BaseController
|
||||
}
|
||||
|
||||
if(Payment::canCreate()){
|
||||
$actionLinks[] = ['label' => trans('texts.enter_payment'), 'url' => '/payments/create/'.$client->public_id];
|
||||
$actionLinks[] = ['label' => trans('texts.enter_payment'), 'url' => URL::to('/payments/create/'.$client->public_id)];
|
||||
}
|
||||
|
||||
if(Credit::canCreate()){
|
||||
$actionLinks[] = ['label' => trans('texts.enter_credit'), 'url' => '/credits/create/'.$client->public_id];
|
||||
$actionLinks[] = ['label' => trans('texts.enter_credit'), 'url' => URL::to('/credits/create/'.$client->public_id)];
|
||||
}
|
||||
|
||||
if(Expense::canCreate()){
|
||||
$actionLinks[] = ['label' => trans('texts.enter_expense'), 'url' => '/expenses/create/0/'.$client->public_id];
|
||||
$actionLinks[] = ['label' => trans('texts.enter_expense'), 'url' => URL::to('/expenses/create/0/'.$client->public_id)];
|
||||
}
|
||||
|
||||
$data = array(
|
||||
|
@ -105,6 +105,7 @@ class DashboardController extends BaseController
|
||||
->where('contacts.deleted_at', '=', null)
|
||||
->where('invoices.is_recurring', '=', false)
|
||||
//->where('invoices.is_quote', '=', false)
|
||||
->where('invoices.quote_invoice_id', '=', null)
|
||||
->where('invoices.balance', '>', 0)
|
||||
->where('invoices.is_deleted', '=', false)
|
||||
->where('invoices.deleted_at', '=', null)
|
||||
@ -129,6 +130,7 @@ class DashboardController extends BaseController
|
||||
->where('invoices.deleted_at', '=', null)
|
||||
->where('invoices.is_recurring', '=', false)
|
||||
//->where('invoices.is_quote', '=', false)
|
||||
->where('invoices.quote_invoice_id', '=', null)
|
||||
->where('invoices.balance', '>', 0)
|
||||
->where('invoices.is_deleted', '=', false)
|
||||
->where('contacts.is_primary', '=', true)
|
||||
|
@ -460,6 +460,8 @@ class PaymentController extends BaseController
|
||||
$ref = $response->getData()['m_payment_id'];
|
||||
} elseif ($accountGateway->gateway_id == GATEWAY_GOCARDLESS) {
|
||||
$ref = $response->getData()['signature'];
|
||||
} elseif ($accountGateway->gateway_id == GATEWAY_CYBERSOURCE) {
|
||||
$ref = $response->getData()['transaction_uuid'];
|
||||
} else {
|
||||
$ref = $response->getTransactionReference();
|
||||
}
|
||||
@ -551,7 +553,15 @@ class PaymentController extends BaseController
|
||||
}
|
||||
|
||||
try {
|
||||
if (method_exists($gateway, 'completePurchase')
|
||||
if ($accountGateway->isGateway(GATEWAY_CYBERSOURCE)) {
|
||||
if (Input::get('decision') == 'ACCEPT') {
|
||||
$payment = $this->paymentService->createPayment($invitation, $accountGateway, $token, $payerId);
|
||||
Session::flash('message', trans('texts.applied_payment'));
|
||||
} else {
|
||||
Session::flash('error', Input::get('message'));
|
||||
}
|
||||
return Redirect::to($invitation->getLink());
|
||||
} elseif (method_exists($gateway, 'completePurchase')
|
||||
&& !$accountGateway->isGateway(GATEWAY_TWO_CHECKOUT)
|
||||
&& !$accountGateway->isGateway(GATEWAY_CHECKOUT_COM)) {
|
||||
$details = $this->paymentService->getPaymentDetails($invitation, $accountGateway);
|
||||
@ -572,11 +582,9 @@ class PaymentController extends BaseController
|
||||
} else {
|
||||
$payment = $this->paymentService->createPayment($invitation, $accountGateway, $token, $payerId);
|
||||
Session::flash('message', trans('texts.applied_payment'));
|
||||
|
||||
return Redirect::to($invitation->getLink());
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
|
||||
$this->error('Offsite-uncaught', false, $accountGateway, $e);
|
||||
return Redirect::to($invitation->getLink());
|
||||
}
|
||||
|
@ -123,8 +123,8 @@ class PublicClientController extends BaseController
|
||||
'showApprove' => $showApprove,
|
||||
'showBreadcrumbs' => false,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'hideHeader' => $account->isNinjaAccount(),
|
||||
'hideDashboard' => !$account->enable_client_portal,
|
||||
'hideHeader' => $account->isNinjaAccount() || !$account->enable_client_portal,
|
||||
'hideDashboard' => !$account->enable_client_portal_dashboard,
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
@ -212,7 +212,7 @@ class PublicClientController extends BaseController
|
||||
$client = $invoice->client;
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
|
||||
if (!$account->enable_client_portal) {
|
||||
if (!$account->enable_client_portal || !$account->enable_client_portal_dashboard) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
@ -221,6 +221,7 @@ class PublicClientController extends BaseController
|
||||
'account' => $account,
|
||||
'client' => $client,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
];
|
||||
@ -261,13 +262,19 @@ class PublicClientController extends BaseController
|
||||
if (!$invitation = $this->getInvitation()) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$account = $invitation->account;
|
||||
|
||||
if (!$account->enable_client_portal) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
|
||||
$data = [
|
||||
'color' => $color,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'hideDashboard' => !$account->enable_client_portal,
|
||||
'hideDashboard' => !$account->enable_client_portal_dashboard,
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
@ -295,12 +302,16 @@ class PublicClientController extends BaseController
|
||||
return $this->returnError();
|
||||
}
|
||||
$account = $invitation->account;
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
|
||||
|
||||
if (!$account->enable_client_portal) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
$data = [
|
||||
'color' => $color,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'hideDashboard' => !$account->enable_client_portal,
|
||||
'hideDashboard' => !$account->enable_client_portal_dashboard,
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
@ -333,13 +344,18 @@ class PublicClientController extends BaseController
|
||||
if (!$invitation = $this->getInvitation()) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$account = $invitation->account;
|
||||
|
||||
if (!$account->enable_client_portal) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
|
||||
$data = [
|
||||
'color' => $color,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'hideDashboard' => !$account->enable_client_portal,
|
||||
'hideDashboard' => !$account->enable_client_portal_dashboard,
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
@ -366,13 +382,18 @@ class PublicClientController extends BaseController
|
||||
if (!$invitation = $this->getInvitation()) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$account = $invitation->account;
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
|
||||
|
||||
if (!$account->enable_client_portal) {
|
||||
return $this->returnError();
|
||||
}
|
||||
|
||||
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
|
||||
$data = [
|
||||
'color' => $color,
|
||||
'hideLogo' => $account->isWhiteLabel(),
|
||||
'hideDashboard' => !$account->enable_client_portal,
|
||||
'hideDashboard' => !$account->enable_client_portal_dashboard,
|
||||
'showDocuments' => $account->isPro(),
|
||||
'clientViewCSS' => $account->clientViewCSS(),
|
||||
'clientFontUrl' => $account->getFontsUrl(),
|
||||
|
@ -7,7 +7,7 @@ use Response;
|
||||
use App\Models\Invoice;
|
||||
use App\Ninja\Repositories\InvoiceRepository;
|
||||
use App\Http\Controllers\BaseAPIController;
|
||||
use App\Ninja\Transformers\QuoteTransformer;
|
||||
use App\Ninja\Transformers\InvoiceTransformer;
|
||||
|
||||
class QuoteApiController extends BaseAPIController
|
||||
{
|
||||
@ -53,7 +53,7 @@ class QuoteApiController extends BaseAPIController
|
||||
|
||||
$invoices = $invoices->orderBy('created_at', 'desc')->paginate();
|
||||
|
||||
$transformer = new QuoteTransformer(\Auth::user()->account, Input::get('serializer'));
|
||||
$transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer'));
|
||||
$paginator = $paginator->paginate();
|
||||
|
||||
$data = $this->createCollection($invoices, $transformer, 'quotes', $paginator);
|
||||
|
@ -107,7 +107,7 @@ class VendorController extends BaseController
|
||||
Utils::trackViewed($vendor->getDisplayName(), 'vendor');
|
||||
|
||||
$actionLinks = [
|
||||
['label' => trans('texts.new_vendor'), 'url' => '/vendors/create/' . $vendor->public_id]
|
||||
['label' => trans('texts.new_vendor'), 'url' => URL::to('/vendors/create/' . $vendor->public_id)]
|
||||
];
|
||||
|
||||
$data = array(
|
||||
|
@ -6,6 +6,7 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
|
||||
class VerifyCsrfToken extends BaseVerifier {
|
||||
|
||||
private $openRoutes = [
|
||||
'complete',
|
||||
'signup/register',
|
||||
'api/v1/*',
|
||||
'api/v1/login',
|
||||
|
@ -42,7 +42,7 @@ Route::group(['middleware' => 'auth:client'], function() {
|
||||
Route::get('approve/{invitation_key}', 'QuoteController@approve');
|
||||
Route::get('payment/{invitation_key}/{payment_type?}', 'PaymentController@show_payment');
|
||||
Route::post('payment/{invitation_key}', 'PaymentController@do_payment');
|
||||
Route::get('complete', 'PaymentController@offsite_payment');
|
||||
Route::match(['GET', 'POST'], 'complete', 'PaymentController@offsite_payment');
|
||||
Route::get('client/quotes', 'PublicClientController@quoteIndex');
|
||||
Route::get('client/invoices', 'PublicClientController@invoiceIndex');
|
||||
Route::get('client/documents', 'PublicClientController@documentIndex');
|
||||
@ -79,8 +79,8 @@ Route::post('/signup', array('as' => 'signup', 'uses' => 'Auth\AuthController@po
|
||||
Route::get('/login', array('as' => 'login', 'uses' => 'Auth\AuthController@getLoginWrapper'));
|
||||
Route::post('/login', array('as' => 'login', 'uses' => 'Auth\AuthController@postLoginWrapper'));
|
||||
Route::get('/logout', array('as' => 'logout', 'uses' => 'Auth\AuthController@getLogoutWrapper'));
|
||||
Route::get('/forgot', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@getEmail'));
|
||||
Route::post('/forgot', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@postEmail'));
|
||||
Route::get('/recover_password', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@getEmail'));
|
||||
Route::post('/recover_password', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@postEmail'));
|
||||
Route::get('/password/reset/{token}', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@getReset'));
|
||||
Route::post('/password/reset', array('as' => 'forgot', 'uses' => 'Auth\PasswordController@postReset'));
|
||||
Route::get('/user/confirm/{code}', 'UserController@confirm');
|
||||
@ -89,8 +89,8 @@ Route::get('/user/confirm/{code}', 'UserController@confirm');
|
||||
Route::get('/client/login', array('as' => 'login', 'uses' => 'ClientAuth\AuthController@getLogin'));
|
||||
Route::post('/client/login', array('as' => 'login', 'uses' => 'ClientAuth\AuthController@postLogin'));
|
||||
Route::get('/client/logout', array('as' => 'logout', 'uses' => 'ClientAuth\AuthController@getLogout'));
|
||||
Route::get('/client/forgot', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@getEmail'));
|
||||
Route::post('/client/forgot', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@postEmail'));
|
||||
Route::get('/client/recover_password', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@getEmail'));
|
||||
Route::post('/client/recover_password', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@postEmail'));
|
||||
Route::get('/client/password/reset/{invitation_key}/{token}', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@getReset'));
|
||||
Route::post('/client/password/reset', array('as' => 'forgot', 'uses' => 'ClientAuth\PasswordController@postReset'));
|
||||
|
||||
@ -535,6 +535,7 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
define('GATEWAY_BITPAY', 42);
|
||||
define('GATEWAY_DWOLLA', 43);
|
||||
define('GATEWAY_CHECKOUT_COM', 47);
|
||||
define('GATEWAY_CYBERSOURCE', 49);
|
||||
|
||||
define('EVENT_CREATE_CLIENT', 1);
|
||||
define('EVENT_CREATE_INVOICE', 2);
|
||||
|
@ -6,9 +6,9 @@ use Session;
|
||||
use DateTime;
|
||||
use Event;
|
||||
use Cache;
|
||||
use Document;
|
||||
use App;
|
||||
use File;
|
||||
use App\Models\Document;
|
||||
use App\Events\UserSettingsChanged;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
@ -426,7 +426,7 @@ class Account extends Eloquent
|
||||
return $disk->get($this->logo);
|
||||
}
|
||||
|
||||
public function getLogoURL()
|
||||
public function getLogoURL($cachebuster = false)
|
||||
{
|
||||
if(!$this->hasLogo()){
|
||||
return null;
|
||||
@ -438,12 +438,17 @@ class Account extends Eloquent
|
||||
if($adapter instanceof \League\Flysystem\Adapter\Local) {
|
||||
// Stored locally
|
||||
$logo_url = str_replace(public_path(), url('/'), $adapter->applyPathPrefix($this->logo), $count);
|
||||
|
||||
if ($cachebuster) {
|
||||
$logo_url .= '?no_cache='.time();
|
||||
}
|
||||
|
||||
if($count == 1){
|
||||
return str_replace(DIRECTORY_SEPARATOR, '/', $logo_url);
|
||||
}
|
||||
}
|
||||
|
||||
Document::getDirectFileUrl($this->logo, $this->getDisk());
|
||||
return Document::getDirectFileUrl($this->logo, $this->getLogoDisk());
|
||||
}
|
||||
|
||||
public function getToken($name)
|
||||
|
@ -146,7 +146,7 @@ class Client extends EntityModel
|
||||
|
||||
public function addContact($data, $isPrimary = false)
|
||||
{
|
||||
$publicId = isset($data['public_id']) ? $data['public_id'] : false;
|
||||
$publicId = isset($data['public_id']) ? $data['public_id'] : (isset($data['id']) ? $data['id'] : false);
|
||||
|
||||
if ($publicId && $publicId != '-1') {
|
||||
$contact = Contact::scope($publicId)->firstOrFail();
|
||||
|
@ -29,7 +29,9 @@ class Invitation extends EntityModel
|
||||
return $this->belongsTo('App\Models\Account');
|
||||
}
|
||||
|
||||
public function getLink($type = 'view')
|
||||
// If we're getting the link for PhantomJS to generate the PDF
|
||||
// we need to make sure it's served from our site
|
||||
public function getLink($type = 'view', $forceOnsite = false)
|
||||
{
|
||||
if (!$this->account) {
|
||||
$this->load('account');
|
||||
@ -39,7 +41,7 @@ class Invitation extends EntityModel
|
||||
$iframe_url = $this->account->iframe_url;
|
||||
|
||||
if ($this->account->isPro()) {
|
||||
if ($iframe_url) {
|
||||
if ($iframe_url && !$forceOnsite) {
|
||||
return "{$iframe_url}?{$this->invitation_key}";
|
||||
} elseif ($this->account->subdomain) {
|
||||
$url = Utils::replaceSubdomain($url, $this->account->subdomain);
|
||||
|
@ -789,7 +789,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
}
|
||||
|
||||
$invitation = $this->invitations[0];
|
||||
$link = $invitation->getLink();
|
||||
$link = $invitation->getLink('view', true);
|
||||
$key = env('PHANTOMJS_CLOUD_KEY');
|
||||
$curl = curl_init();
|
||||
|
||||
|
@ -554,14 +554,13 @@ class InvoiceRepository extends BaseRepository
|
||||
}
|
||||
}
|
||||
$clone->invoice_number = $invoiceNumber ?: $account->getNextInvoiceNumber($clone);
|
||||
$clone->invoice_date = date_create()->format('Y-m-d');
|
||||
|
||||
foreach ([
|
||||
'client_id',
|
||||
'discount',
|
||||
'is_amount_discount',
|
||||
'invoice_date',
|
||||
'po_number',
|
||||
'due_date',
|
||||
'is_recurring',
|
||||
'frequency_id',
|
||||
'start_date',
|
||||
|
@ -74,6 +74,7 @@ class PaymentService extends BaseService
|
||||
|
||||
if ($input) {
|
||||
$data = self::convertInputForOmnipay($input);
|
||||
$data['email'] = $invitation->contact->email;
|
||||
Session::put($key, $data);
|
||||
} elseif (Session::get($key)) {
|
||||
$data = Session::get($key);
|
||||
|
23
database/seeds/UpdateSeeder.php
Normal file
23
database/seeds/UpdateSeeder.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
class UpdateSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$this->command->info('Running UpdateSeeder...');
|
||||
|
||||
$this->call('PaymentLibrariesSeeder');
|
||||
$this->call('FontsSeeder');
|
||||
$this->call('BanksSeeder');
|
||||
$this->call('InvoiceStatusSeeder');
|
||||
$this->call('CurrenciesSeeder');
|
||||
$this->call('DateFormatsSeeder');
|
||||
$this->call('InvoiceDesignsSeeder');
|
||||
$this->call('PaymentTermsSeeder');
|
||||
}
|
||||
}
|
@ -14,6 +14,6 @@
|
||||
RewriteRule ^ index.php [L]
|
||||
|
||||
# In case of running InvoiceNinja in a Subdomain like invoiceninja.example.com,
|
||||
# you have to enablel the following line:
|
||||
# you have to enable the following line:
|
||||
# RewriteBase /
|
||||
</IfModule>
|
||||
|
@ -30484,6 +30484,11 @@ function calculateAmounts(invoice) {
|
||||
var hasTaxes = false;
|
||||
var taxes = {};
|
||||
invoice.has_product_key = false;
|
||||
|
||||
// Bold designs currently breaks w/o the product column
|
||||
if (invoice.invoice_design_id == 2) {
|
||||
invoice.has_product_key = true;
|
||||
}
|
||||
|
||||
// sum line item
|
||||
for (var i=0; i<invoice.invoice_items.length; i++) {
|
||||
|
13
public/css/built.css
vendored
13
public/css/built.css
vendored
@ -2532,15 +2532,20 @@ font-weight: bold;
|
||||
}
|
||||
|
||||
.navbar,
|
||||
.panel-default,
|
||||
ul.dropdown-menu,
|
||||
.twitter-typeahead .tt-menu,
|
||||
canvas {
|
||||
.twitter-typeahead .tt-menu {
|
||||
x-moz-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
x-webkit-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
}
|
||||
|
||||
.panel-default,
|
||||
canvas {
|
||||
border: 1px solid;
|
||||
border-color: #e5e6e9 #dfe0e4 #d0d1d5;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.navbar .active > a {
|
||||
background-color: #09334f !important;
|
||||
background-image: none;
|
||||
@ -3201,7 +3206,7 @@ div.panel-body div.panel-body {
|
||||
}
|
||||
|
||||
.invoice-table #document-upload{
|
||||
max-width:560px;
|
||||
width:500px;
|
||||
}
|
||||
|
||||
#document-upload .dropzone{
|
||||
|
13
public/css/style.css
vendored
13
public/css/style.css
vendored
@ -403,15 +403,20 @@ font-weight: bold;
|
||||
}
|
||||
|
||||
.navbar,
|
||||
.panel-default,
|
||||
ul.dropdown-menu,
|
||||
.twitter-typeahead .tt-menu,
|
||||
canvas {
|
||||
.twitter-typeahead .tt-menu {
|
||||
x-moz-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
x-webkit-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
|
||||
}
|
||||
|
||||
.panel-default,
|
||||
canvas {
|
||||
border: 1px solid;
|
||||
border-color: #e5e6e9 #dfe0e4 #d0d1d5;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.navbar .active > a {
|
||||
background-color: #09334f !important;
|
||||
background-image: none;
|
||||
@ -1072,7 +1077,7 @@ div.panel-body div.panel-body {
|
||||
}
|
||||
|
||||
.invoice-table #document-upload{
|
||||
max-width:560px;
|
||||
width:500px;
|
||||
}
|
||||
|
||||
#document-upload .dropzone{
|
||||
|
@ -1,5 +1,3 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
/* Copyright 2012 Mozilla Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -25,9 +23,10 @@ if (typeof PDFJS === 'undefined') {
|
||||
}
|
||||
|
||||
// Checking if the typed arrays are supported
|
||||
// Support: iOS<6.0 (subarray), IE<10, Android<4.0
|
||||
(function checkTypedArrayCompatibility() {
|
||||
if (typeof Uint8Array !== 'undefined') {
|
||||
// some mobile versions do not support subarray (e.g. safari 5 / iOS)
|
||||
// Support: iOS<6.0
|
||||
if (typeof Uint8Array.prototype.subarray === 'undefined') {
|
||||
Uint8Array.prototype.subarray = function subarray(start, end) {
|
||||
return new Uint8Array(this.slice(start, end));
|
||||
@ -37,10 +36,10 @@ if (typeof PDFJS === 'undefined') {
|
||||
};
|
||||
}
|
||||
|
||||
// some mobile version might not support Float64Array
|
||||
if (typeof Float64Array === 'undefined')
|
||||
// Support: Android<4.1
|
||||
if (typeof Float64Array === 'undefined') {
|
||||
window.Float64Array = Float32Array;
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -49,23 +48,26 @@ if (typeof PDFJS === 'undefined') {
|
||||
}
|
||||
|
||||
function setArrayOffset(array, offset) {
|
||||
if (arguments.length < 2)
|
||||
if (arguments.length < 2) {
|
||||
offset = 0;
|
||||
for (var i = 0, n = array.length; i < n; ++i, ++offset)
|
||||
}
|
||||
for (var i = 0, n = array.length; i < n; ++i, ++offset) {
|
||||
this[offset] = array[i] & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
function TypedArray(arg1) {
|
||||
var result;
|
||||
var result, i, n;
|
||||
if (typeof arg1 === 'number') {
|
||||
result = [];
|
||||
for (var i = 0; i < arg1; ++i)
|
||||
for (i = 0; i < arg1; ++i) {
|
||||
result[i] = 0;
|
||||
}
|
||||
} else if ('slice' in arg1) {
|
||||
result = arg1.slice(0);
|
||||
} else {
|
||||
result = [];
|
||||
for (var i = 0, n = arg1.length; i < n; ++i) {
|
||||
for (i = 0, n = arg1.length; i < n; ++i) {
|
||||
result[i] = arg1[i];
|
||||
}
|
||||
}
|
||||
@ -75,13 +77,14 @@ if (typeof PDFJS === 'undefined') {
|
||||
result.byteLength = result.length;
|
||||
result.set = setArrayOffset;
|
||||
|
||||
if (typeof arg1 === 'object' && arg1.buffer)
|
||||
if (typeof arg1 === 'object' && arg1.buffer) {
|
||||
result.buffer = arg1.buffer;
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
window.Uint8Array = TypedArray;
|
||||
window.Int8Array = TypedArray;
|
||||
|
||||
// we don't need support for set, byteLength for 32-bit array
|
||||
// so we can use the TypedArray as well
|
||||
@ -93,25 +96,15 @@ if (typeof PDFJS === 'undefined') {
|
||||
})();
|
||||
|
||||
// URL = URL || webkitURL
|
||||
// Support: Safari<7, Android 4.2+
|
||||
(function normalizeURLObject() {
|
||||
if (!window.URL) {
|
||||
window.URL = window.webkitURL;
|
||||
}
|
||||
})();
|
||||
|
||||
// Object.create() ?
|
||||
(function checkObjectCreateCompatibility() {
|
||||
if (typeof Object.create !== 'undefined')
|
||||
return;
|
||||
|
||||
Object.create = function objectCreate(proto) {
|
||||
function Constructor() {}
|
||||
Constructor.prototype = proto;
|
||||
return new Constructor();
|
||||
};
|
||||
})();
|
||||
|
||||
// Object.defineProperty() ?
|
||||
// Object.defineProperty()?
|
||||
// Support: Android<4.0, Safari<5.1
|
||||
(function checkObjectDefinePropertyCompatibility() {
|
||||
if (typeof Object.defineProperty !== 'undefined') {
|
||||
var definePropertyPossible = true;
|
||||
@ -127,15 +120,19 @@ if (typeof PDFJS === 'undefined') {
|
||||
} catch (e) {
|
||||
definePropertyPossible = false;
|
||||
}
|
||||
if (definePropertyPossible) return;
|
||||
if (definePropertyPossible) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty = function objectDefineProperty(obj, name, def) {
|
||||
delete obj[name];
|
||||
if ('get' in def)
|
||||
if ('get' in def) {
|
||||
obj.__defineGetter__(name, def['get']);
|
||||
if ('set' in def)
|
||||
}
|
||||
if ('set' in def) {
|
||||
obj.__defineSetter__(name, def['set']);
|
||||
}
|
||||
if ('value' in def) {
|
||||
obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
|
||||
this.__defineGetter__(name, function objectDefinePropertyGetter() {
|
||||
@ -148,105 +145,77 @@ if (typeof PDFJS === 'undefined') {
|
||||
};
|
||||
})();
|
||||
|
||||
// Object.keys() ?
|
||||
(function checkObjectKeysCompatibility() {
|
||||
if (typeof Object.keys !== 'undefined')
|
||||
return;
|
||||
|
||||
Object.keys = function objectKeys(obj) {
|
||||
var result = [];
|
||||
for (var i in obj) {
|
||||
if (obj.hasOwnProperty(i))
|
||||
result.push(i);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
|
||||
// No readAsArrayBuffer ?
|
||||
(function checkFileReaderReadAsArrayBuffer() {
|
||||
if (typeof FileReader === 'undefined')
|
||||
return; // FileReader is not implemented
|
||||
var frPrototype = FileReader.prototype;
|
||||
// Older versions of Firefox might not have readAsArrayBuffer
|
||||
if ('readAsArrayBuffer' in frPrototype)
|
||||
return; // readAsArrayBuffer is implemented
|
||||
Object.defineProperty(frPrototype, 'readAsArrayBuffer', {
|
||||
value: function fileReaderReadAsArrayBuffer(blob) {
|
||||
var fileReader = new FileReader();
|
||||
var originalReader = this;
|
||||
fileReader.onload = function fileReaderOnload(evt) {
|
||||
var data = evt.target.result;
|
||||
var buffer = new ArrayBuffer(data.length);
|
||||
var uint8Array = new Uint8Array(buffer);
|
||||
|
||||
for (var i = 0, ii = data.length; i < ii; i++)
|
||||
uint8Array[i] = data.charCodeAt(i);
|
||||
|
||||
Object.defineProperty(originalReader, 'result', {
|
||||
value: buffer,
|
||||
enumerable: true,
|
||||
writable: false,
|
||||
configurable: true
|
||||
});
|
||||
|
||||
var event = document.createEvent('HTMLEvents');
|
||||
event.initEvent('load', false, false);
|
||||
originalReader.dispatchEvent(event);
|
||||
};
|
||||
fileReader.readAsBinaryString(blob);
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// No XMLHttpRequest.response ?
|
||||
// No XMLHttpRequest#response?
|
||||
// Support: IE<11, Android <4.0
|
||||
(function checkXMLHttpRequestResponseCompatibility() {
|
||||
var xhrPrototype = XMLHttpRequest.prototype;
|
||||
if (!('overrideMimeType' in xhrPrototype)) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
if (!('overrideMimeType' in xhr)) {
|
||||
// IE10 might have response, but not overrideMimeType
|
||||
// Support: IE10
|
||||
Object.defineProperty(xhrPrototype, 'overrideMimeType', {
|
||||
value: function xmlHttpRequestOverrideMimeType(mimeType) {}
|
||||
});
|
||||
}
|
||||
if ('response' in xhrPrototype ||
|
||||
'mozResponseArrayBuffer' in xhrPrototype ||
|
||||
'mozResponse' in xhrPrototype ||
|
||||
'responseArrayBuffer' in xhrPrototype)
|
||||
if ('responseType' in xhr) {
|
||||
return;
|
||||
// IE9 ?
|
||||
}
|
||||
|
||||
// The worker will be using XHR, so we can save time and disable worker.
|
||||
PDFJS.disableWorker = true;
|
||||
|
||||
Object.defineProperty(xhrPrototype, 'responseType', {
|
||||
get: function xmlHttpRequestGetResponseType() {
|
||||
return this._responseType || 'text';
|
||||
},
|
||||
set: function xmlHttpRequestSetResponseType(value) {
|
||||
if (value === 'text' || value === 'arraybuffer') {
|
||||
this._responseType = value;
|
||||
if (value === 'arraybuffer' &&
|
||||
typeof this.overrideMimeType === 'function') {
|
||||
this.overrideMimeType('text/plain; charset=x-user-defined');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Support: IE9
|
||||
if (typeof VBArray !== 'undefined') {
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
get: function xmlHttpRequestResponseGet() {
|
||||
return new Uint8Array(new VBArray(this.responseBody).toArray());
|
||||
if (this.responseType === 'arraybuffer') {
|
||||
return new Uint8Array(new VBArray(this.responseBody).toArray());
|
||||
} else {
|
||||
return this.responseText;
|
||||
}
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// other browsers
|
||||
function responseTypeSetter() {
|
||||
// will be only called to set "arraybuffer"
|
||||
this.overrideMimeType('text/plain; charset=x-user-defined');
|
||||
}
|
||||
if (typeof xhrPrototype.overrideMimeType === 'function') {
|
||||
Object.defineProperty(xhrPrototype, 'responseType',
|
||||
{ set: responseTypeSetter });
|
||||
}
|
||||
function responseGetter() {
|
||||
var text = this.responseText;
|
||||
var i, n = text.length;
|
||||
var result = new Uint8Array(n);
|
||||
for (i = 0; i < n; ++i)
|
||||
result[i] = text.charCodeAt(i) & 0xFF;
|
||||
return result;
|
||||
}
|
||||
Object.defineProperty(xhrPrototype, 'response', { get: responseGetter });
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
get: function xmlHttpRequestResponseGet() {
|
||||
if (this.responseType !== 'arraybuffer') {
|
||||
return this.responseText;
|
||||
}
|
||||
var text = this.responseText;
|
||||
var i, n = text.length;
|
||||
var result = new Uint8Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
result[i] = text.charCodeAt(i) & 0xFF;
|
||||
}
|
||||
return result.buffer;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// window.btoa (base64 encode function) ?
|
||||
// Support: IE<10
|
||||
(function checkWindowBtoaCompatibility() {
|
||||
if ('btoa' in window)
|
||||
if ('btoa' in window) {
|
||||
return;
|
||||
}
|
||||
|
||||
var digits =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
@ -268,17 +237,21 @@ if (typeof PDFJS === 'undefined') {
|
||||
};
|
||||
})();
|
||||
|
||||
// window.atob (base64 encode function) ?
|
||||
// window.atob (base64 encode function)?
|
||||
// Support: IE<10
|
||||
(function checkWindowAtobCompatibility() {
|
||||
if ('atob' in window)
|
||||
if ('atob' in window) {
|
||||
return;
|
||||
}
|
||||
|
||||
// https://github.com/davidchambers/Base64.js
|
||||
var digits =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
window.atob = function (input) {
|
||||
input = input.replace(/=+$/, '');
|
||||
if (input.length % 4 == 1) throw new Error('bad atob input');
|
||||
if (input.length % 4 === 1) {
|
||||
throw new Error('bad atob input');
|
||||
}
|
||||
for (
|
||||
// initialize result and counters
|
||||
var bc = 0, bs, buffer, idx = 0, output = '';
|
||||
@ -298,15 +271,17 @@ if (typeof PDFJS === 'undefined') {
|
||||
};
|
||||
})();
|
||||
|
||||
// Function.prototype.bind ?
|
||||
// Function.prototype.bind?
|
||||
// Support: Android<4.0, iOS<6.0
|
||||
(function checkFunctionPrototypeBindCompatibility() {
|
||||
if (typeof Function.prototype.bind !== 'undefined')
|
||||
if (typeof Function.prototype.bind !== 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
Function.prototype.bind = function functionPrototypeBind(obj) {
|
||||
var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
|
||||
var bound = function functionPrototypeBindBound() {
|
||||
var args = Array.prototype.concat.apply(headArgs, arguments);
|
||||
var args = headArgs.concat(Array.prototype.slice.call(arguments));
|
||||
return fn.apply(obj, args);
|
||||
};
|
||||
return bound;
|
||||
@ -314,23 +289,29 @@ if (typeof PDFJS === 'undefined') {
|
||||
})();
|
||||
|
||||
// HTMLElement dataset property
|
||||
// Support: IE<11, Safari<5.1, Android<4.0
|
||||
(function checkDatasetProperty() {
|
||||
var div = document.createElement('div');
|
||||
if ('dataset' in div)
|
||||
if ('dataset' in div) {
|
||||
return; // dataset property exists
|
||||
}
|
||||
|
||||
Object.defineProperty(HTMLElement.prototype, 'dataset', {
|
||||
get: function() {
|
||||
if (this._dataset)
|
||||
if (this._dataset) {
|
||||
return this._dataset;
|
||||
}
|
||||
|
||||
var dataset = {};
|
||||
for (var j = 0, jj = this.attributes.length; j < jj; j++) {
|
||||
var attribute = this.attributes[j];
|
||||
if (attribute.name.substring(0, 5) != 'data-')
|
||||
if (attribute.name.substring(0, 5) !== 'data-') {
|
||||
continue;
|
||||
}
|
||||
var key = attribute.name.substring(5).replace(/\-([a-z])/g,
|
||||
function(all, ch) { return ch.toUpperCase(); });
|
||||
function(all, ch) {
|
||||
return ch.toUpperCase();
|
||||
});
|
||||
dataset[key] = attribute.value;
|
||||
}
|
||||
|
||||
@ -346,20 +327,26 @@ if (typeof PDFJS === 'undefined') {
|
||||
})();
|
||||
|
||||
// HTMLElement classList property
|
||||
// Support: IE<10, Android<4.0, iOS<5.0
|
||||
(function checkClassListProperty() {
|
||||
var div = document.createElement('div');
|
||||
if ('classList' in div)
|
||||
if ('classList' in div) {
|
||||
return; // classList property exists
|
||||
}
|
||||
|
||||
function changeList(element, itemName, add, remove) {
|
||||
var s = element.className || '';
|
||||
var list = s.split(/\s+/g);
|
||||
if (list[0] === '') list.shift();
|
||||
if (list[0] === '') {
|
||||
list.shift();
|
||||
}
|
||||
var index = list.indexOf(itemName);
|
||||
if (index < 0 && add)
|
||||
if (index < 0 && add) {
|
||||
list.push(itemName);
|
||||
if (index >= 0 && remove)
|
||||
}
|
||||
if (index >= 0 && remove) {
|
||||
list.splice(index, 1);
|
||||
}
|
||||
element.className = list.join(' ');
|
||||
return (index >= 0);
|
||||
}
|
||||
@ -381,8 +368,9 @@ if (typeof PDFJS === 'undefined') {
|
||||
|
||||
Object.defineProperty(HTMLElement.prototype, 'classList', {
|
||||
get: function() {
|
||||
if (this._classList)
|
||||
if (this._classList) {
|
||||
return this._classList;
|
||||
}
|
||||
|
||||
var classList = Object.create(classListPrototype, {
|
||||
element: {
|
||||
@ -403,6 +391,9 @@ if (typeof PDFJS === 'undefined') {
|
||||
})();
|
||||
|
||||
// Check console compatibility
|
||||
// In older IE versions the console object is not available
|
||||
// unless console is open.
|
||||
// Support: IE<10
|
||||
(function checkConsoleCompatibility() {
|
||||
if (!('console' in window)) {
|
||||
window.console = {
|
||||
@ -425,6 +416,7 @@ if (typeof PDFJS === 'undefined') {
|
||||
})();
|
||||
|
||||
// Check onclick compatibility in Opera
|
||||
// Support: Opera<15
|
||||
(function checkOnClickCompatibility() {
|
||||
// workaround for reported Opera bug DSK-354448:
|
||||
// onclick fires on disabled buttons with opaque content
|
||||
@ -436,30 +428,34 @@ if (typeof PDFJS === 'undefined') {
|
||||
function isDisabled(node) {
|
||||
return node.disabled || (node.parentNode && isDisabled(node.parentNode));
|
||||
}
|
||||
if (navigator.userAgent.indexOf('Opera') != -1) {
|
||||
if (navigator.userAgent.indexOf('Opera') !== -1) {
|
||||
// use browser detection since we cannot feature-check this bug
|
||||
document.addEventListener('click', ignoreIfTargetDisabled, true);
|
||||
}
|
||||
})();
|
||||
|
||||
// Checks if possible to use URL.createObjectURL()
|
||||
// Support: IE
|
||||
(function checkOnBlobSupport() {
|
||||
// sometimes IE loosing the data created with createObjectURL(), see #3977
|
||||
if (navigator.userAgent.indexOf('Trident') >= 0) {
|
||||
PDFJS.disableCreateObjectURL = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Checks if navigator.language is supported
|
||||
(function checkNavigatorLanguage() {
|
||||
if ('language' in navigator)
|
||||
if ('language' in navigator) {
|
||||
return;
|
||||
Object.defineProperty(navigator, 'language', {
|
||||
get: function navigatorLanguage() {
|
||||
var language = navigator.userLanguage || 'en-US';
|
||||
return language.substring(0, 2).toLowerCase() +
|
||||
language.substring(2).toUpperCase();
|
||||
},
|
||||
enumerable: true
|
||||
});
|
||||
}
|
||||
PDFJS.locale = navigator.userLanguage || 'en-US';
|
||||
})();
|
||||
|
||||
(function checkRangeRequests() {
|
||||
// Safari has issues with cached range requests see:
|
||||
// https://github.com/mozilla/pdf.js/issues/3260
|
||||
// Last tested with version 6.0.4.
|
||||
// Support: Safari 6.0+
|
||||
var isSafari = Object.prototype.toString.call(
|
||||
window.HTMLElement).indexOf('Constructor') > 0;
|
||||
|
||||
@ -467,17 +463,131 @@ if (typeof PDFJS === 'undefined') {
|
||||
// https://github.com/mozilla/pdf.js/issues/3381.
|
||||
// Make sure that we only match webkit-based Android browsers,
|
||||
// since Firefox/Fennec works as expected.
|
||||
// Support: Android<3.0
|
||||
var regex = /Android\s[0-2][^\d]/;
|
||||
var isOldAndroid = regex.test(navigator.userAgent);
|
||||
|
||||
if (isSafari || isOldAndroid) {
|
||||
// Range requests are broken in Chrome 39 and 40, https://crbug.com/442318
|
||||
var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent);
|
||||
|
||||
if (isSafari || isOldAndroid || isChromeWithRangeBug) {
|
||||
PDFJS.disableRange = true;
|
||||
PDFJS.disableStream = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Check if the browser supports manipulation of the history.
|
||||
// Support: IE<10, Android<4.2
|
||||
(function checkHistoryManipulation() {
|
||||
if (!window.history.pushState) {
|
||||
// Android 2.x has so buggy pushState support that it was removed in
|
||||
// Android 3.0 and restored as late as in Android 4.2.
|
||||
// Support: Android 2.x
|
||||
if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {
|
||||
PDFJS.disableHistory = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Support: IE<11, Chrome<21, Android<4.4, Safari<6
|
||||
(function checkSetPresenceInImageData() {
|
||||
// IE < 11 will use window.CanvasPixelArray which lacks set function.
|
||||
if (window.CanvasPixelArray) {
|
||||
if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
|
||||
window.CanvasPixelArray.prototype.set = function(arr) {
|
||||
for (var i = 0, ii = this.length; i < ii; i++) {
|
||||
this[i] = arr[i];
|
||||
}
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
|
||||
// Because we cannot feature detect it, we rely on user agent parsing.
|
||||
var polyfill = false, versionMatch;
|
||||
if (navigator.userAgent.indexOf('Chrom') >= 0) {
|
||||
versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
|
||||
// Chrome < 21 lacks the set function.
|
||||
polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
|
||||
} else if (navigator.userAgent.indexOf('Android') >= 0) {
|
||||
// Android < 4.4 lacks the set function.
|
||||
// Android >= 4.4 will contain Chrome in the user agent,
|
||||
// thus pass the Chrome check above and not reach this block.
|
||||
polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent);
|
||||
} else if (navigator.userAgent.indexOf('Safari') >= 0) {
|
||||
versionMatch = navigator.userAgent.
|
||||
match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
|
||||
// Safari < 6 lacks the set function.
|
||||
polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
|
||||
}
|
||||
|
||||
if (polyfill) {
|
||||
var contextPrototype = window.CanvasRenderingContext2D.prototype;
|
||||
var createImageData = contextPrototype.createImageData;
|
||||
contextPrototype.createImageData = function(w, h) {
|
||||
var imageData = createImageData.call(this, w, h);
|
||||
imageData.data.set = function(arr) {
|
||||
for (var i = 0, ii = this.length; i < ii; i++) {
|
||||
this[i] = arr[i];
|
||||
}
|
||||
};
|
||||
return imageData;
|
||||
};
|
||||
// this closure will be kept referenced, so clear its vars
|
||||
contextPrototype = null;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
// Support: IE<10, Android<4.0, iOS
|
||||
(function checkRequestAnimationFrame() {
|
||||
function fakeRequestAnimationFrame(callback) {
|
||||
window.setTimeout(callback, 20);
|
||||
}
|
||||
|
||||
var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
|
||||
if (isIOS) {
|
||||
// requestAnimationFrame on iOS is broken, replacing with fake one.
|
||||
window.requestAnimationFrame = fakeRequestAnimationFrame;
|
||||
return;
|
||||
}
|
||||
if ('requestAnimationFrame' in window) {
|
||||
return;
|
||||
}
|
||||
window.requestAnimationFrame =
|
||||
window.mozRequestAnimationFrame ||
|
||||
window.webkitRequestAnimationFrame ||
|
||||
fakeRequestAnimationFrame;
|
||||
})();
|
||||
|
||||
(function checkCanvasSizeLimitation() {
|
||||
var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
|
||||
var isAndroid = /Android/g.test(navigator.userAgent);
|
||||
if (isIOS || isAndroid) {
|
||||
// 5MP
|
||||
PDFJS.maxCanvasPixels = 5242880;
|
||||
}
|
||||
})();
|
||||
|
||||
// Disable fullscreen support for certain problematic configurations.
|
||||
// Support: IE11+ (when embedded).
|
||||
(function checkFullscreenSupport() {
|
||||
var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 &&
|
||||
window.parent !== window);
|
||||
if (isEmbeddedIE) {
|
||||
PDFJS.disableFullscreen = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Provides document.currentScript support
|
||||
// Support: IE, Chrome<29.
|
||||
(function checkCurrentScript() {
|
||||
if ('currentScript' in document) {
|
||||
return;
|
||||
}
|
||||
Object.defineProperty(document, 'currentScript', {
|
||||
get: function () {
|
||||
var scripts = document.getElementsByTagName('script');
|
||||
return scripts[scripts.length - 1];
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
})();
|
@ -590,6 +590,11 @@ function calculateAmounts(invoice) {
|
||||
var hasTaxes = false;
|
||||
var taxes = {};
|
||||
invoice.has_product_key = false;
|
||||
|
||||
// Bold designs currently breaks w/o the product column
|
||||
if (invoice.invoice_design_id == 2) {
|
||||
invoice.has_product_key = true;
|
||||
}
|
||||
|
||||
// sum line item
|
||||
for (var i=0; i<invoice.invoice_items.length; i++) {
|
||||
|
File diff suppressed because one or more lines are too long
@ -8,10 +8,6 @@
|
||||
[![Build Status](https://travis-ci.org/invoiceninja/invoiceninja.svg?branch=develop)](https://travis-ci.org/invoiceninja/invoiceninja)
|
||||
[![Join the chat at https://gitter.im/hillelcoren/invoice-ninja](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/hillelcoren/invoice-ninja?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
Note: we've recently updated this branch to Laravel 5.2. If you're upgrading here are some things to note
|
||||
* Make sure to run composer install
|
||||
* If there are any strings with spaces in your .env file you'll need to enclose them in quotes to prevent error class log not found.
|
||||
|
||||
### Affiliates Programs
|
||||
* Referral program (we pay you): $100 per signup paid over 3 years - [Learn more](https://www.invoiceninja.com/referral-program/)
|
||||
* White-label reseller (you pay us): 10% of revenue with a $100 sign up fee
|
||||
|
@ -1049,8 +1049,6 @@ $LANG = array(
|
||||
'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',
|
||||
@ -1123,6 +1121,12 @@ $LANG = array(
|
||||
'documents' => 'Documents',
|
||||
'document_date' => 'Document Date',
|
||||
'document_size' => 'Size',
|
||||
|
||||
'enable_client_portal' => 'Client Portal',
|
||||
'enable_client_portal_help' => 'Show/hide the client portal.',
|
||||
'enable_client_portal_dashboard' => 'Dashboard',
|
||||
'enable_client_portal_dashboard_help' => 'Show/hide the dashboard page in the client portal.',
|
||||
|
||||
);
|
||||
|
||||
return $LANG;
|
||||
|
@ -30,7 +30,7 @@ return array(
|
||||
'invoice' => 'Fattura',
|
||||
'client' => 'Cliente',
|
||||
'invoice_date' => 'Data Fattura',
|
||||
'due_date' => 'Scadenza Fattura',
|
||||
'due_date' => 'Scadenza',
|
||||
'invoice_number' => 'Numero Fattura',
|
||||
'invoice_number_short' => 'Fattura #', /* Fattura N° */
|
||||
'po_number' => 'Numero d\'ordine d\'acquisto',
|
||||
@ -45,8 +45,8 @@ return array(
|
||||
'quantity' => 'Quantità',
|
||||
'line_total' => 'Totale Riga',
|
||||
'subtotal' => 'Subtotale',
|
||||
'paid_to_date' => 'Pagato in Data',
|
||||
'balance_due' => 'Saldo Dovuto',
|
||||
'paid_to_date' => 'Pagato a oggi',
|
||||
'balance_due' => 'Totale',
|
||||
'invoice_design_id' => 'Stile',
|
||||
'terms' => 'Condizioni',
|
||||
'your_invoice' => 'Tua Fattura',
|
||||
@ -67,7 +67,7 @@ return array(
|
||||
'clone_invoice' => 'Duplica Fattura',
|
||||
'archive_invoice' => 'Archivia Fattura',
|
||||
'delete_invoice' => 'Elimina Fattura',
|
||||
'email_invoice' => 'Manda Fattura', /* Spedisci Fattura */
|
||||
'email_invoice' => 'Invia Fattura', /* Spedisci Fattura */
|
||||
'enter_payment' => 'Inserisci Pagamento',
|
||||
'tax_rates' => 'Aliquote Fiscali', /* ^^Unsure^^ */
|
||||
'rate' => 'Aliquota', /* ^^Unsure^^ */
|
||||
@ -104,12 +104,12 @@ return array(
|
||||
// recurring invoices
|
||||
'recurring_invoices' => 'Fatture ricorrenti',
|
||||
'recurring_help' => '<p>Invia automaticamente al cliente le stesse fatture settimanalmente, bimestralmente, mensilmente, trimestralmente o annualmente. </p>
|
||||
<p>Usa :MESE, :TRIMESRE o :ANNO per date dinamiche. Funziona anche con la matematica di base, ad esempio :MESE-1.</p>
|
||||
<p>Usa :MONTH, :QUARTER o :YEAR per date dinamiche. Funziona anche con la matematica di base, ad esempio :MONTH-1.</p>
|
||||
<p>Esempi di variabili di fattura dinamiche:</p>
|
||||
<ul>
|
||||
<li>"Iscrizione palestra per il mese di :MESE" => "Iscrizione palestra per il mese di Luglio"</li>
|
||||
<li>":ANNO+1 iscrizione annuale" => "Anno d\'iscrizione 2015"</li>
|
||||
<li>"Pagamento fermo a :TRIMESTRE+1" => "Pagamento fermo al 2° trimestre"</li>
|
||||
<li>"Iscrizione palestra per il mese di :MONTH" => "Iscrizione palestra per il mese di Luglio"</li>
|
||||
<li>":YEAR+1 iscrizione annuale" => "Anno d\'iscrizione 2015"</li>
|
||||
<li>"Pagamento fermo a :QUARTER+1" => "Pagamento fermo al 2° trimestre"</li>
|
||||
</ul>', /* ^^Variables translated in case you'll need it for front end^^ */
|
||||
|
||||
// dashboard
|
||||
@ -118,7 +118,7 @@ return array(
|
||||
'billed_clients' => 'Clienti fatturati',
|
||||
'active_client' => 'cliente attivo',
|
||||
'active_clients' => 'clienti attivi',
|
||||
'invoices_past_due' => 'Fatture Insolute', /* Insoluti */
|
||||
'invoices_past_due' => 'Fatture Scadute', /* Insoluti */
|
||||
'upcoming_invoices' => 'Prossime fatture',
|
||||
'average_invoice' => 'Fattura media',
|
||||
|
||||
@ -140,7 +140,7 @@ return array(
|
||||
'contact' => 'Contatto',
|
||||
'date_created' => 'Data di Creazione',
|
||||
'last_login' => 'Ultimo Accesso',
|
||||
'balance' => 'Saldo',
|
||||
'balance' => 'Bilancio',
|
||||
'action' => 'Azione',
|
||||
'status' => 'Stato',
|
||||
'invoice_total' => 'Totale Fattura',
|
||||
@ -169,7 +169,7 @@ return array(
|
||||
'activity' => 'Attività',
|
||||
'date' => 'Data',
|
||||
'message' => 'Messaggio',
|
||||
'adjustment' => 'Correzione',
|
||||
'adjustment' => 'Variazione',
|
||||
'are_you_sure' => 'Sei sicuro?',
|
||||
|
||||
// payment pages
|
||||
@ -337,7 +337,7 @@ return array(
|
||||
'archived_product' => 'Prodotto archiviato con successo',
|
||||
'pro_plan_custom_fields' => ':link to enable custom fields by joining the Pro Plan',
|
||||
|
||||
'advanced_settings' => 'Advanced Settings',
|
||||
'advanced_settings' => 'Impostazioni Avanzate',
|
||||
'pro_plan_advanced_settings' => ':link to enable the advanced settings by joining the Pro Plan',
|
||||
'invoice_design' => 'Invoice Design',
|
||||
'specify_colors' => 'Specify colors',
|
||||
@ -456,11 +456,11 @@ return array(
|
||||
'sent' => 'sent',
|
||||
'timesheets' => 'Timesheets',
|
||||
|
||||
'payment_title' => 'Enter Your Billing Address and Credit Card information',
|
||||
'payment_title' => 'Inserisci il tuo indirizzo di fatturazione e i dati della tua carta di credito',
|
||||
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
|
||||
'payment_footer1' => '*Billing address must match address associated with credit card.',
|
||||
'payment_footer1' => '*L\'indirizzo di fatturazione deve corrispondere all\'indirizzo associato alla carta di credito.',
|
||||
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
|
||||
'vat_number' => 'Vat Number',
|
||||
'vat_number' => 'Partita IVA',
|
||||
'id_number' => 'ID Number',
|
||||
|
||||
'white_label_link' => 'White label',
|
||||
@ -503,30 +503,30 @@ return array(
|
||||
'payment_email' => 'Payment Email',
|
||||
'quote_email' => 'Quote Email',
|
||||
'reset_all' => 'Reset All',
|
||||
'approve' => 'Approve',
|
||||
'approve' => 'Approva',
|
||||
|
||||
'token_billing_type_id' => 'Token Billing',
|
||||
'token_billing_help' => 'Enables you to store credit cards with your gateway, and charge them at a later date.',
|
||||
'token_billing_1' => 'Disabled',
|
||||
'token_billing_1' => 'Disabilitato',
|
||||
'token_billing_2' => 'Opt-in - checkbox is shown but not selected',
|
||||
'token_billing_3' => 'Opt-out - checkbox is shown and selected',
|
||||
'token_billing_4' => 'Always',
|
||||
'token_billing_checkbox' => 'Store credit card details',
|
||||
'view_in_stripe' => 'View in Stripe',
|
||||
'use_card_on_file' => 'Use card on file',
|
||||
'edit_payment_details' => 'Edit payment details',
|
||||
'token_billing' => 'Save card details',
|
||||
'token_billing_secure' => 'The data is stored securely by :stripe_link',
|
||||
'token_billing_4' => 'Sempre',
|
||||
'token_billing_checkbox' => 'Salva dettagli carta di credito',
|
||||
'view_in_stripe' => 'Vedi transazione in Stripe',
|
||||
'use_card_on_file' => 'Carta di credito salvata',
|
||||
'edit_payment_details' => 'Modifica dettagli pagamento',
|
||||
'token_billing' => 'Salva carta di credito',
|
||||
'token_billing_secure' => 'I dati sono memorizzati su piattaforma sicura mediante :stripe_link',
|
||||
|
||||
'support' => 'Support',
|
||||
'contact_information' => 'Contact information',
|
||||
'contact_information' => 'Informazioni di contatto',
|
||||
'256_encryption' => '256-Bit Encryption',
|
||||
'amount_due' => 'Amount due',
|
||||
'billing_address' => 'Billing address',
|
||||
'billing_method' => 'Billing method',
|
||||
'order_overview' => 'Order overview',
|
||||
'match_address' => '*Address must match address associated with credit card.',
|
||||
'click_once' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
|
||||
'amount_due' => 'Saldo dovuto',
|
||||
'billing_address' => 'Indirizzo di fatturazione',
|
||||
'billing_method' => 'Metodo di pagamento',
|
||||
'order_overview' => 'Riepilogo ordine',
|
||||
'match_address' => '*L\'indirizzo deve corrispondere con quello associato alla carta di credito.',
|
||||
'click_once' => '*Per favore clicca "PAGA ADESSO" solo una volta - la transazione può impiegare sino a 1 minuto per essere completata.',
|
||||
|
||||
'default_invoice_footer' => 'Set default invoice footer',
|
||||
'invoice_footer' => 'Invoice footer',
|
||||
@ -550,7 +550,7 @@ return array(
|
||||
'created_gateway' => 'Successfully created gateway',
|
||||
'deleted_gateway' => 'Successfully deleted gateway',
|
||||
'pay_with_paypal' => 'PayPal',
|
||||
'pay_with_card' => 'Credit card',
|
||||
'pay_with_card' => 'Carta di credito',
|
||||
|
||||
'change_password' => 'Change password',
|
||||
'current_password' => 'Current password',
|
||||
@ -579,12 +579,12 @@ return array(
|
||||
'confirmation_resent' => 'The confirmation email was resent',
|
||||
|
||||
'gateway_help_42' => ':link to sign up for BitPay.<br/>Note: use a Legacy API Key, not an API token.',
|
||||
'payment_type_credit_card' => 'Credit card',
|
||||
'payment_type_credit_card' => 'Carta di credito',
|
||||
'payment_type_paypal' => 'PayPal',
|
||||
'payment_type_bitcoin' => 'Bitcoin',
|
||||
'knowledge_base' => 'Knowledge Base',
|
||||
'partial' => 'Partial',
|
||||
'partial_remaining' => ':partial of :balance',
|
||||
'partial_remaining' => ':partial di :balance',
|
||||
|
||||
'more_fields' => 'More Fields',
|
||||
'less_fields' => 'Less Fields',
|
||||
@ -614,40 +614,40 @@ return array(
|
||||
'export' => 'Export',
|
||||
'documentation' => 'Documentation',
|
||||
'zapier' => 'Zapier',
|
||||
'recurring' => 'Recurring',
|
||||
'last_invoice_sent' => 'Last invoice sent :date',
|
||||
'recurring' => 'Ricorrenti',
|
||||
'last_invoice_sent' => 'Ultima fattura inviata :date',
|
||||
|
||||
'processed_updates' => 'Successfully completed update',
|
||||
'tasks' => 'Tasks',
|
||||
'new_task' => 'New Task',
|
||||
'start_time' => 'Start Time',
|
||||
'tasks' => 'Task',
|
||||
'new_task' => 'Nuovo Task',
|
||||
'start_time' => 'Tempo di inizio',
|
||||
'created_task' => 'Successfully created task',
|
||||
'updated_task' => 'Successfully updated task',
|
||||
'edit_task' => 'Edit Task',
|
||||
'archive_task' => 'Archive Task',
|
||||
'restore_task' => 'Restore Task',
|
||||
'delete_task' => 'Delete Task',
|
||||
'stop_task' => 'Stop Task',
|
||||
'time' => 'Time',
|
||||
'start' => 'Start',
|
||||
'stop' => 'Stop',
|
||||
'now' => 'Now',
|
||||
'edit_task' => 'Modifica il Task',
|
||||
'archive_task' => 'Archivia il Task',
|
||||
'restore_task' => 'Ripristina il Task',
|
||||
'delete_task' => 'Cancella il Task',
|
||||
'stop_task' => 'Ferma il Task',
|
||||
'time' => 'Tempo',
|
||||
'start' => 'Inizia',
|
||||
'stop' => 'Ferma',
|
||||
'now' => 'Adesso',
|
||||
'timer' => 'Timer',
|
||||
'manual' => 'Manual',
|
||||
'date_and_time' => 'Date & Time',
|
||||
'second' => 'second',
|
||||
'seconds' => 'seconds',
|
||||
'minute' => 'minute',
|
||||
'minutes' => 'minutes',
|
||||
'hour' => 'hour',
|
||||
'hours' => 'hours',
|
||||
'task_details' => 'Task Details',
|
||||
'duration' => 'Duration',
|
||||
'end_time' => 'End Time',
|
||||
'end' => 'End',
|
||||
'invoiced' => 'Invoiced',
|
||||
'logged' => 'Logged',
|
||||
'running' => 'Running',
|
||||
'manual' => 'Manuale',
|
||||
'date_and_time' => 'Data e ora',
|
||||
'second' => 'secondo',
|
||||
'seconds' => 'secondi',
|
||||
'minute' => 'minuto',
|
||||
'minutes' => 'minuti',
|
||||
'hour' => 'ora',
|
||||
'hours' => 'ore',
|
||||
'task_details' => 'Dettagli Task',
|
||||
'duration' => 'Durata',
|
||||
'end_time' => 'Tempo di fine',
|
||||
'end' => 'Fine',
|
||||
'invoiced' => 'Fatturato',
|
||||
'logged' => 'Loggato',
|
||||
'running' => 'In corso',
|
||||
'task_error_multiple_clients' => 'The tasks can\'t belong to different clients',
|
||||
'task_error_running' => 'Please stop running tasks first',
|
||||
'task_error_invoiced' => 'Tasks have already been invoiced',
|
||||
@ -656,9 +656,9 @@ return array(
|
||||
'archived_tasks' => 'Successfully archived :count tasks',
|
||||
'deleted_task' => 'Successfully deleted task',
|
||||
'deleted_tasks' => 'Successfully deleted :count tasks',
|
||||
'create_task' => 'Create Task',
|
||||
'create_task' => 'Crea Task',
|
||||
'stopped_task' => 'Successfully stopped task',
|
||||
'invoice_task' => 'Invoice Task',
|
||||
'invoice_task' => 'Fattura il Task',
|
||||
'invoice_labels' => 'Invoice Labels',
|
||||
'prefix' => 'Prefix',
|
||||
'counter' => 'Counter',
|
||||
@ -666,7 +666,7 @@ return array(
|
||||
'payment_type_dwolla' => 'Dwolla',
|
||||
'gateway_help_43' => ':link to sign up for Dwolla.',
|
||||
'partial_value' => 'Must be greater than zero and less than the total',
|
||||
'more_actions' => 'More Actions',
|
||||
'more_actions' => 'Altre Azioni',
|
||||
|
||||
|
||||
'pro_plan_title' => 'NINJA PRO',
|
||||
@ -680,12 +680,12 @@ return array(
|
||||
'pro_plan_feature7' => 'Customize Invoice Field Titles & Numbering',
|
||||
'pro_plan_feature8' => 'Option to Attach PDFs to Client Emails',
|
||||
|
||||
'resume' => 'Resume',
|
||||
'break_duration' => 'Break',
|
||||
'edit_details' => 'Edit Details',
|
||||
'resume' => 'Riprendi',
|
||||
'break_duration' => 'Interrompi',
|
||||
'edit_details' => 'Modifica dettagli',
|
||||
'work' => 'Work',
|
||||
'timezone_unset' => 'Please :link to set your timezone',
|
||||
'click_here' => 'click here',
|
||||
'click_here' => 'clicca qui',
|
||||
|
||||
'email_receipt' => 'Email payment receipt to the client',
|
||||
'created_payment_emailed_client' => 'Successfully created payment and emailed client',
|
||||
@ -736,8 +736,8 @@ return array(
|
||||
'total_revenue' => 'Total Revenue',
|
||||
|
||||
'current_user' => 'Current User',
|
||||
'new_recurring_invoice' => 'New Recurring Invoice',
|
||||
'recurring_invoice' => 'Recurring Invoice',
|
||||
'new_recurring_invoice' => 'Nuova Fattura Ricorrente',
|
||||
'recurring_invoice' => 'Fattura ricorrente',
|
||||
'recurring_too_soon' => 'It\'s too soon to create the next recurring invoice, it\'s scheduled for :date',
|
||||
'created_by_invoice' => 'Created by :invoice',
|
||||
'primary_user' => 'Primary User',
|
||||
@ -746,17 +746,17 @@ return array(
|
||||
<p>To access a child property using dot notation. For example to show the client name you could use <code>$client.name</code>.</p>
|
||||
<p>If you need help figuring something out post a question to our <a href="https://www.invoiceninja.com/forums/forum/support/" target="_blank">support forum</a>.</p>',
|
||||
|
||||
'invoice_due_date' => 'Due Date',
|
||||
'quote_due_date' => 'Valid Until',
|
||||
'valid_until' => 'Valid Until',
|
||||
'invoice_due_date' => 'Scadenza fattura',
|
||||
'quote_due_date' => 'Validità preventivo',
|
||||
'valid_until' => 'Valido fino a',
|
||||
'reset_terms' => 'Reset terms',
|
||||
'reset_footer' => 'Reset footer',
|
||||
'invoices_sent' => ':count invoice sent|:count invoices sent',
|
||||
'status_draft' => 'Draft',
|
||||
'status_sent' => 'Sent',
|
||||
'status_viewed' => 'Viewed',
|
||||
'status_partial' => 'Partial',
|
||||
'status_paid' => 'Paid',
|
||||
'status_draft' => 'Bozza',
|
||||
'status_sent' => 'Spedito',
|
||||
'status_viewed' => 'Visto',
|
||||
'status_partial' => 'Parziale',
|
||||
'status_paid' => 'Pagato',
|
||||
'show_line_item_tax' => 'Display <b>line item taxes</b> inline',
|
||||
|
||||
'iframe_url' => 'Website',
|
||||
@ -785,15 +785,15 @@ return array(
|
||||
|
||||
'page_expire' => 'This page will expire soon, :click_here to keep working',
|
||||
'upcoming_quotes' => 'Upcoming Quotes',
|
||||
'expired_quotes' => 'Expired Quotes',
|
||||
'expired_quotes' => 'Preventivi Scaduti',
|
||||
|
||||
'sign_up_using' => 'Sign up using',
|
||||
'invalid_credentials' => 'These credentials do not match our records',
|
||||
'show_all_options' => 'Show all options',
|
||||
'user_details' => 'User Details',
|
||||
'invalid_credentials' => 'Queste credenziali non corrispondono alle nostre registrazioni',
|
||||
'show_all_options' => 'Mostra tutte le opzioni',
|
||||
'user_details' => 'Dettagli Utente',
|
||||
'oneclick_login' => 'One-Click Login',
|
||||
'disable' => 'Disable',
|
||||
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||
'disable' => 'Disabilita',
|
||||
'invoice_quote_number' => 'Numerazione Fatture e Preventivi',
|
||||
'invoice_charges' => 'Invoice Charges',
|
||||
|
||||
'invitation_status' => [
|
||||
@ -807,10 +807,10 @@ return array(
|
||||
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
|
||||
|
||||
'custom_invoice_link' => 'Custom Invoice Link',
|
||||
'total_invoiced' => 'Total Invoiced',
|
||||
'open_balance' => 'Open Balance',
|
||||
'total_invoiced' => 'Fatturato totale',
|
||||
'open_balance' => 'Da saldare',
|
||||
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
|
||||
'basic_settings' => 'Basic Settings',
|
||||
'basic_settings' => 'Impostazioni Base',
|
||||
'pro' => 'Pro',
|
||||
'gateways' => 'Payment Gateways',
|
||||
|
||||
@ -821,7 +821,7 @@ return array(
|
||||
'oneclick_login_help' => 'Connect an account to login without a password',
|
||||
'referral_code_help' => 'Earn money by sharing our app online',
|
||||
|
||||
'enable_with_stripe' => 'Enable | Requires Stripe',
|
||||
'enable_with_stripe' => 'Abilita | Richiede Stripe',
|
||||
'tax_settings' => 'Tax Settings',
|
||||
'create_tax_rate' => 'Add Tax Rate',
|
||||
'updated_tax_rate' => 'Successfully updated tax rate',
|
||||
@ -845,8 +845,8 @@ return array(
|
||||
'activity_1' => ':user created client :client',
|
||||
'activity_2' => ':user archived client :client',
|
||||
'activity_3' => ':user deleted client :client',
|
||||
'activity_4' => ':user created invoice :invoice',
|
||||
'activity_5' => ':user updated invoice :invoice',
|
||||
'activity_4' => ':user ha creato la fattura :invoice',
|
||||
'activity_5' => ':user ha aggiornato la fattura :invoice',
|
||||
'activity_6' => ':user emailed invoice :invoice to :contact',
|
||||
'activity_7' => ':contact viewed invoice :invoice',
|
||||
'activity_8' => ':user archived invoice :invoice',
|
||||
@ -883,7 +883,7 @@ return array(
|
||||
'quote_footer' => 'Quote Footer',
|
||||
'free' => 'Free',
|
||||
|
||||
'quote_is_approved' => 'This quote is approved',
|
||||
'quote_is_approved' => 'Questo preventivo è stato approvato.',
|
||||
'apply_credit' => 'Apply Credit',
|
||||
'system_settings' => 'System Settings',
|
||||
'archive_token' => 'Archive Token',
|
||||
@ -944,7 +944,7 @@ return array(
|
||||
'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process',
|
||||
|
||||
'email_design' => 'Email Design',
|
||||
'due_by' => 'Due by :date',
|
||||
'due_by' => 'Scadenza :date',
|
||||
'enable_email_markup' => 'Enable Markup',
|
||||
'enable_email_markup_help' => 'Make it easier for your clients to pay you by adding schema.org markup to your emails.',
|
||||
'template_help_title' => 'Templates Help',
|
||||
@ -986,10 +986,10 @@ return array(
|
||||
'white_label_purchase_link' => 'Purchase a white label license',
|
||||
|
||||
// Expense / vendor
|
||||
'expense' => 'Expense',
|
||||
'expenses' => 'Expenses',
|
||||
'new_expense' => 'Enter Expense',
|
||||
'enter_expense' => 'Enter Expense',
|
||||
'expense' => 'Spesa',
|
||||
'expenses' => 'Spese',
|
||||
'new_expense' => 'Inserisci Spesa',
|
||||
'enter_expense' => 'Inserisci Spesa',
|
||||
'vendors' => 'Vendors',
|
||||
'new_vendor' => 'New Vendor',
|
||||
'payment_terms_net' => 'Net',
|
||||
@ -1077,11 +1077,11 @@ return array(
|
||||
'quote_message_button' => 'To view your quote for :amount, click the button below.',
|
||||
'payment_message_button' => 'Thank you for your payment of :amount.',
|
||||
'payment_type_direct_debit' => 'Direct Debit',
|
||||
'bank_accounts' => 'Bank Accounts',
|
||||
'add_bank_account' => 'Add Bank Account',
|
||||
'bank_accounts' => 'Conti corrente',
|
||||
'add_bank_account' => 'Nuovo conto corrente',
|
||||
'setup_account' => 'Setup Account',
|
||||
'import_expenses' => 'Import Expenses',
|
||||
'bank_id' => 'bank',
|
||||
'import_expenses' => 'Importa Spese',
|
||||
'bank_id' => 'banca',
|
||||
'integration_type' => 'Integration Type',
|
||||
'updated_bank_account' => 'Successfully updated bank account',
|
||||
'edit_bank_account' => 'Edit Bank Account',
|
||||
@ -1172,7 +1172,7 @@ return array(
|
||||
'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',
|
||||
'partial_due' => 'Da versare (parziale)',
|
||||
'restore_vendor' => 'Restore Vendor',
|
||||
'restored_vendor' => 'Successfully restored vendor',
|
||||
'restored_expense' => 'Successfully restored expense',
|
||||
@ -1195,4 +1195,4 @@ return array(
|
||||
'november' => 'November',
|
||||
'december' => 'December',
|
||||
|
||||
);
|
||||
);
|
||||
|
@ -10,15 +10,15 @@ return array(
|
||||
'address' => 'Adres',
|
||||
'address1' => 'Straat',
|
||||
'address2' => 'Bus/Suite',
|
||||
'city' => 'Gemeente',
|
||||
'city' => 'Plaats',
|
||||
'state' => 'Staat/Provincie',
|
||||
'postal_code' => 'Postcode',
|
||||
'country_id' => 'Land',
|
||||
'contacts' => 'Contacten',
|
||||
'contacts' => 'Contactpersonen',
|
||||
'first_name' => 'Voornaam',
|
||||
'last_name' => 'Achternaam',
|
||||
'phone' => 'Telefoon',
|
||||
'email' => 'E-mail',
|
||||
'email' => 'E-mailadres',
|
||||
'additional_info' => 'Extra informatie',
|
||||
'payment_terms' => 'Betalingsvoorwaarden',
|
||||
'currency_id' => 'Munteenheid',
|
||||
@ -35,7 +35,7 @@ return array(
|
||||
'invoice_number_short' => 'Factuur #',
|
||||
'po_number' => 'Bestelnummer',
|
||||
'po_number_short' => 'Bestel #',
|
||||
'frequency_id' => 'Hoe vaak',
|
||||
'frequency_id' => 'Frequentie',
|
||||
'discount' => 'Korting',
|
||||
'taxes' => 'Belastingen',
|
||||
'tax' => 'Belasting',
|
||||
@ -52,9 +52,9 @@ return array(
|
||||
'your_invoice' => 'Jouw factuur',
|
||||
|
||||
'remove_contact' => 'Verwijder contact',
|
||||
'add_contact' => 'Voeg contact toe',
|
||||
'add_contact' => 'Contact toevoegen',
|
||||
'create_new_client' => 'Maak nieuwe klant',
|
||||
'edit_client_details' => 'Pas klantdetails aan',
|
||||
'edit_client_details' => 'Klantdetails aanpassen',
|
||||
'enable' => 'Activeer',
|
||||
'learn_more' => 'Meer te weten komen',
|
||||
'manage_rates' => 'Beheer prijzen',
|
||||
@ -63,12 +63,12 @@ return array(
|
||||
'save_as_default_terms' => 'Opslaan als standaard voorwaarden',
|
||||
'download_pdf' => 'Download PDF',
|
||||
'pay_now' => 'Betaal nu',
|
||||
'save_invoice' => 'Sla factuur op',
|
||||
'save_invoice' => 'Factuur opslaan',
|
||||
'clone_invoice' => 'Kopieer factuur',
|
||||
'archive_invoice' => 'Archiveer factuur',
|
||||
'delete_invoice' => 'Verwijder factuur',
|
||||
'email_invoice' => 'E-mail factuur',
|
||||
'enter_payment' => 'Betaling ingeven',
|
||||
'enter_payment' => 'Betaling invoeren',
|
||||
'tax_rates' => 'BTW-tarief',
|
||||
'rate' => 'Tarief',
|
||||
'settings' => 'Instellingen',
|
||||
@ -176,21 +176,21 @@ return array(
|
||||
'amount' => 'Bedrag',
|
||||
|
||||
// account/company pages
|
||||
'work_email' => 'E-mail',
|
||||
'work_email' => 'E-mailadres',
|
||||
'language_id' => 'Taal',
|
||||
'timezone_id' => 'Tijdszone',
|
||||
'date_format_id' => 'Datum formaat',
|
||||
'datetime_format_id' => 'Datum/Tijd formaat',
|
||||
'users' => 'Gebruikers',
|
||||
'localization' => 'Localisatie',
|
||||
'remove_logo' => 'Verwijder logo',
|
||||
'remove_logo' => 'Logo verwijderen',
|
||||
'logo_help' => 'Ondersteund: JPEG, GIF en PNG',
|
||||
'payment_gateway' => 'Betalingsmiddel',
|
||||
'gateway_id' => 'Leverancier',
|
||||
'email_notifications' => 'E-mailmeldingen',
|
||||
'email_sent' => 'E-mail me wanneer een factuur is <b>verzonden</b>',
|
||||
'email_viewed' => 'E-mail me wanneer een factuur is <b>bekeken</b>',
|
||||
'email_paid' => 'E-mail me wanneer een factuur is <b>betaald</b>',
|
||||
'email_sent' => 'E-mail mij wanneer een factuur is <b>verzonden</b>',
|
||||
'email_viewed' => 'E-mail mij wanneer een factuur is <b>bekeken</b>',
|
||||
'email_paid' => 'E-mail mij wanneer een factuur is <b>betaald</b>',
|
||||
'site_updates' => 'Site Aanpassingen',
|
||||
'custom_messages' => 'Aangepaste berichten',
|
||||
'default_invoice_terms' => 'Stel standaard factuurvoorwaarden in',
|
||||
@ -310,10 +310,10 @@ return array(
|
||||
'close' => 'Sluiten',
|
||||
|
||||
'pro_plan_product' => 'Pro Plan',
|
||||
'pro_plan_description' => 'Één jaar abbonnement op het InvoiceNinja Pro Plan.',
|
||||
'pro_plan_description' => 'Eén jaar abbonnement op het InvoiceNinja Pro Plan.',
|
||||
'pro_plan_success' => 'Bedankt voor het aanmelden! Zodra uw factuur betaald is zal uw Pro Plan lidmaatschap beginnen.',
|
||||
|
||||
'unsaved_changes' => 'U hebt niet bewaarde wijzigingen',
|
||||
'unsaved_changes' => 'U hebt niet opgeslagen wijzigingen',
|
||||
'custom_fields' => 'Aangepaste velden',
|
||||
'company_fields' => 'Velden Bedrijf',
|
||||
'client_fields' => 'Velden Klant',
|
||||
@ -366,7 +366,7 @@ return array(
|
||||
'archive_quote' => 'Archiveer offerte',
|
||||
'delete_quote' => 'Verwijder offerte',
|
||||
'save_quote' => 'Bewaar offerte',
|
||||
'email_quote' => 'Email offerte',
|
||||
'email_quote' => 'E-mail offerte',
|
||||
'clone_quote' => 'Kloon offerte',
|
||||
'convert_to_invoice' => 'Zet om naar factuur',
|
||||
'view_invoice' => 'Bekijk factuur',
|
||||
@ -404,10 +404,10 @@ return array(
|
||||
'charge_taxes' => 'BTW berekenen',
|
||||
'user_management' => 'Gebruikersbeheer',
|
||||
'add_user' => 'Nieuwe gebruiker',
|
||||
'send_invite' => 'Verstuur uitnodiging',
|
||||
'send_invite' => 'Uitnodiging versturen',
|
||||
'sent_invite' => 'Uitnodiging succesvol verzonden',
|
||||
'updated_user' => 'Gebruiker succesvol aangepast',
|
||||
'invitation_message' => 'U bent uigenodigd door :invitor. ',
|
||||
'invitation_message' => 'U bent uitgenodigd door :invitor. ',
|
||||
'register_to_add_user' => 'Meld u aan om een gebruiker toe te voegen',
|
||||
'user_state' => 'Status',
|
||||
'edit_user' => 'Bewerk gebruiker',
|
||||
@ -417,11 +417,11 @@ return array(
|
||||
'deleted_user' => 'Gebruiker succesvol verwijderd',
|
||||
'limit_users' => 'Sorry, dit zou de limiet van '.MAX_NUM_USERS.' gebruikers overschrijden',
|
||||
|
||||
'confirm_email_invoice' => 'Weet u zeker dat u deze factuur wilt mailen?',
|
||||
'confirm_email_quote' => 'Weet u zeker dat u deze offerte wilt mailen?',
|
||||
'confirm_recurring_email_invoice' => 'Terugkeren (herhalen) staat aan, weet u zeker dat u deze factuur wilt mailen?',
|
||||
'confirm_email_invoice' => 'Weet u zeker dat u deze factuur wilt e-mailen?',
|
||||
'confirm_email_quote' => 'Weet u zeker dat u deze offerte wilt e-mailen?',
|
||||
'confirm_recurring_email_invoice' => 'Terugkeren (herhalen) staat aan, weet u zeker dat u deze factuur wilt e-mailen?',
|
||||
|
||||
'cancel_account' => 'Zeg Account Op',
|
||||
'cancel_account' => 'Account opzeggen',
|
||||
'cancel_account_message' => 'Waarschuwing: Dit zal al uw data verwijderen. Er is geen manier om dit ongedaan te maken',
|
||||
'go_back' => 'Ga Terug',
|
||||
|
||||
@ -457,10 +457,10 @@ return array(
|
||||
'sent' => 'verzonden',
|
||||
'timesheets' => 'Timesheets',
|
||||
|
||||
'payment_title' => 'Geef uw betalingsadres en kredietkaartgegevens op',
|
||||
'payment_cvv' => '*Dit is de code van 3-4 tekens op de achterkant van uw kaart',
|
||||
'payment_title' => 'Geef uw betalingsadres en creditcardgegevens op',
|
||||
'payment_cvv' => '*Dit is de code van 3 of 4 tekens op de achterkant van uw kaart',
|
||||
'payment_footer1' => '*Betalingsadres moet overeenkomen met het adres dat aan uw kaart gekoppeld is.',
|
||||
'payment_footer2' => '*Klik alstublieft slechts 1 keer op "PAY NOW" - verwerking kan tot 1 minuut duren.',
|
||||
'payment_footer2' => '*Klik alstublieft slechts één keer op "PAY NOW" - verwerking kan tot 1 minuut duren.',
|
||||
'vat_number' => 'BTW-nummer',
|
||||
'id_number' => 'Identificatienummer',
|
||||
|
||||
@ -498,20 +498,20 @@ return array(
|
||||
'restore_user' => 'Herstel gebruiker',
|
||||
'restored_user' => 'Gebruiker succesvol hersteld',
|
||||
'show_deleted_users' => 'Toon verwijderde gebruikers',
|
||||
'email_templates' => 'Emailsjablonen',
|
||||
'invoice_email' => 'Factuuremail',
|
||||
'payment_email' => 'Betalingsemail',
|
||||
'quote_email' => 'Offerte-email',
|
||||
'email_templates' => 'E-mailsjablonen',
|
||||
'invoice_email' => 'Factuur-e-mail',
|
||||
'payment_email' => 'Betalings-e-mail',
|
||||
'quote_email' => 'Offerte-e-mail',
|
||||
'reset_all' => 'Reset alles',
|
||||
'approve' => 'Goedkeuren',
|
||||
|
||||
'token_billing_type_id' => 'Betalingstoken',
|
||||
'token_billing_help' => 'Stelt u in staat om kredietkaart gegevens bij uw gateway op te slaan en ze later te gebruiken.',
|
||||
'token_billing_help' => 'Stelt u in staat om creditcard gegevens bij uw gateway op te slaan en ze later te gebruiken.',
|
||||
'token_billing_1' => 'Inactief',
|
||||
'token_billing_2' => 'Opt-in - checkbox is getoond maar niet geselecteerd',
|
||||
'token_billing_3' => 'Opt-out - checkbox is getoond en geselecteerd',
|
||||
'token_billing_4' => 'Altijd',
|
||||
'token_billing_checkbox' => 'Sla kredietkaart gegevens op',
|
||||
'token_billing_checkbox' => 'Sla carditcard gegevens op',
|
||||
'view_in_stripe' => 'In Stripe bekijken',
|
||||
'use_card_on_file' => 'Gebruik opgeslagen kaart',
|
||||
'edit_payment_details' => 'Betalingsdetails aanpassen',
|
||||
@ -525,7 +525,7 @@ return array(
|
||||
'billing_address' => 'Factuuradres',
|
||||
'billing_method' => 'Betaalmethode',
|
||||
'order_overview' => 'Orderoverzicht',
|
||||
'match_address' => '*Addres moet overeenkomen met adres van kredietkaart.',
|
||||
'match_address' => '*Adres moet overeenkomen met adres van creditcard.',
|
||||
'click_once' => '*Klik alstublieft maar één keer; het kan een minuut duren om de betaling te verwerken.',
|
||||
|
||||
'default_invoice_footer' => 'Stel standaard factuurfooter in',
|
||||
@ -550,7 +550,7 @@ return array(
|
||||
'created_gateway' => 'Gateway succesvol aangemaakt',
|
||||
'deleted_gateway' => 'Gateway succesvol verwijderd',
|
||||
'pay_with_paypal' => 'PayPal',
|
||||
'pay_with_card' => 'Kredietkaart',
|
||||
'pay_with_card' => 'Creditcard',
|
||||
|
||||
'change_password' => 'Verander wachtwoord',
|
||||
'current_password' => 'Huidig wachtwoord',
|
||||
@ -572,17 +572,17 @@ return array(
|
||||
'set_password' => 'Stel wachtwoord in',
|
||||
'converted' => 'Omgezet',
|
||||
|
||||
'email_approved' => 'Email me wanneer een offerte is <b>goedgekeurd</b>',
|
||||
'email_approved' => 'Email mij wanneer een offerte is <b>goedgekeurd</b>',
|
||||
'notification_quote_approved_subject' => 'Offerte :invoice is goedgekeurd door :client',
|
||||
'notification_quote_approved' => ':client heeft offerte :invoice goedgekeurd voor :amount.',
|
||||
'resend_confirmation' => 'Verstuurd bevestingsmail opnieuw',
|
||||
'confirmation_resent' => 'De bevestigingsmail is opnieuw verstuurd',
|
||||
|
||||
'gateway_help_42' => ':link om te registreren voor BitPay.<br/>Opmerking: gebruik een Legacy API Key, niet een API token.',
|
||||
'payment_type_credit_card' => 'Kredietkaart',
|
||||
'payment_type_credit_card' => 'Creditcard',
|
||||
'payment_type_paypal' => 'PayPal',
|
||||
'payment_type_bitcoin' => 'Bitcoin',
|
||||
'knowledge_base' => 'Kennis databank',
|
||||
'knowledge_base' => 'Kennisbank',
|
||||
'partial' => 'Gedeeld',
|
||||
'partial_remaining' => ':partial / :balance',
|
||||
|
||||
@ -591,11 +591,11 @@ return array(
|
||||
'client_name' => 'Klantnaam',
|
||||
'pdf_settings' => 'PDF-instellingen',
|
||||
'product_settings' => 'Productinstellingen',
|
||||
'auto_wrap' => 'Automatisch lijn afbreken',
|
||||
'auto_wrap' => 'Automatisch regel afbreken',
|
||||
'duplicate_post' => 'Opgelet: de volgende pagina is twee keer doorgestuurd. De tweede verzending is genegeerd.',
|
||||
'view_documentation' => 'Bekijk documentatie',
|
||||
'app_title' => 'Gratis Open-Source Online Facturatie',
|
||||
'app_description' => 'Invoice Ninja is een gratis, open-source oplossing voor het aanmkaen en versturen van facturen aan klanten. Met Invoice Ninja, kun je gemakkelijk mooie facturen aanmaken en verzenden van om het even welk toestel met internettoegang. Je klanten kunnen je facturen afdrukken, downloaden als pdf bestanden en je zelfs online betalen vanuit het systeem.',
|
||||
'app_description' => 'Invoice Ninja is een gratis, open-source oplossing voor het maken en versturen van facturen aan klanten. Met Invoice Ninja, kun je gemakkelijk mooie facturen maken en verzenden vanaf elk apparaat met internettoegang. Je klanten kunnen je facturen afdrukken, downloaden als pdf bestand en je zelfs online betalen vanuit het systeem.',
|
||||
|
||||
'rows' => 'rijen',
|
||||
'www' => 'www',
|
||||
@ -635,7 +635,7 @@ return array(
|
||||
'timer' => 'Timer',
|
||||
'manual' => 'Manueel',
|
||||
'date_and_time' => 'Datum en tijd',
|
||||
'second' => 'second',
|
||||
'second' => 'seconde',
|
||||
'seconds' => 'seconden',
|
||||
'minute' => 'minuut',
|
||||
'minutes' => 'minuten',
|
||||
@ -670,9 +670,9 @@ return array(
|
||||
|
||||
'pro_plan_title' => 'NINJA PRO',
|
||||
'pro_plan_call_to_action' => 'Nu upgraden!',
|
||||
'pro_plan_feature1' => 'Maak ongelimiteerd klanten aan',
|
||||
'pro_plan_feature1' => 'Ongelimiteerd klanten aanmaken',
|
||||
'pro_plan_feature2' => 'Toegang tot 10 mooie factuur ontwerpen',
|
||||
'pro_plan_feature3' => 'Aangepaste URLs - "YourBrand.InvoiceNinja.com"',
|
||||
'pro_plan_feature3' => 'Aangepaste URLs - "UwMerk.InvoiceNinja.com"',
|
||||
'pro_plan_feature4' => 'Verwijder "Aangemaakt door Invoice Ninja"',
|
||||
'pro_plan_feature5' => 'Multi-user toegang & Activeit Tracking',
|
||||
'pro_plan_feature6' => 'Maak offertes & Pro-forma facturen aan',
|
||||
@ -696,14 +696,14 @@ return array(
|
||||
'login' => 'Login',
|
||||
'or' => 'of',
|
||||
|
||||
'email_error' => 'Er was een probleem om de email te verzenden',
|
||||
'confirm_recurring_timing' => 'Opmerking: emails worden aan het begin van het uur verzonden.',
|
||||
'old_browser' => 'Gebruik a.u.b. een <a href="'.OUTDATE_BROWSER_URL.'" target="_blank">nieuwere browser</a>',
|
||||
'email_error' => 'Er was een probleem met versturen van de e-mail',
|
||||
'confirm_recurring_timing' => 'Opmerking: e-mails worden aan het begin van het uur verzonden.',
|
||||
'old_browser' => 'Gebruik a.u.b. een <a href="'.OUTDATE_BROWSER_URL.'" target="_blank">moderne browser</a>',
|
||||
'payment_terms_help' => 'Stel de standaard factuurvervaldatum in',
|
||||
'unlink_account' => 'Koppel account los',
|
||||
'unlink' => 'Koppel los',
|
||||
'show_address' => 'Toon Adres',
|
||||
'show_address_help' => 'Verplicht de klant om zijn factuur adres op te geven',
|
||||
'show_address_help' => 'Verplicht de klant om zijn factuuradres op te geven',
|
||||
'update_address' => 'Adres aanpassen',
|
||||
'update_address_help' => 'Pas het adres van de klant aan met de ingevulde gegevens',
|
||||
'times' => 'Tijden',
|
||||
@ -718,7 +718,7 @@ return array(
|
||||
'font_size' => 'Tekstgrootte',
|
||||
'primary_color' => 'Primaire kleur',
|
||||
'secondary_color' => 'Secundaire kleur',
|
||||
'customize_design' => 'Pas design aan',
|
||||
'customize_design' => 'Pas ontwerp aan',
|
||||
|
||||
'content' => 'Inhoud',
|
||||
'styles' => 'Stijlen',
|
||||
@ -740,9 +740,9 @@ return array(
|
||||
'created_by_invoice' => 'Aangemaakt door :invoice',
|
||||
'primary_user' => 'Primaire gebruiker',
|
||||
'help' => 'Help',
|
||||
'customize_help' => '<p>We gebruiken <a href="http://pdfmake.org/" target="_blank">pdfmake</a> om de factuur ontwerpen declaratief te definieren. De pdfmake <a href="http://pdfmake.org/playground.html" target="_blank">playground</a> is een interessante manier om de library in actie te zien.</p>
|
||||
<p>Gebruik dot notatie om een "kind eigenschap" te gebruiken. Bijvoorbeeld voor de klant naam te tonen gebruik je <code>$client.name</code>.</p>
|
||||
<p>Als je ergens hulp bij nodig hebt, post dan een vraag op ons <a href="https://www.invoiceninja.com/forums/forum/support/" target="_blank">support forum</a>.</p>',
|
||||
'customize_help' => '<p>We gebruiken <a href="http://pdfmake.org/" target="_blank">pdfmake</a> om de factuurontwerpen declaratief te definieren. De pdfmake <a href="http://pdfmake.org/playground.html" target="_blank">playground</a> is een interessante manier om de library in actie te zien.</p>
|
||||
<p>Gebruik puntnotatie om een "dochter eigenschap" te gebruiken. Bijvoorbeeld: om de naam van een klant te tonen gebruik je <code>$client.name</code>.</p>
|
||||
<p>Als je ergens hulp bij nodig hebt, stel dan een vraag op ons <a href="https://www.invoiceninja.com/forums/forum/support/" target="_blank">support forum</a>.</p>',
|
||||
|
||||
'invoice_due_date' => 'Vervaldatum',
|
||||
'quote_due_date' => 'Geldig tot',
|
||||
@ -763,11 +763,11 @@ return array(
|
||||
'iframe_url_help2' => 'U kunt de functionaliteit testen door te klikken op \'Bekijk als ontvanger\' bij een factuur.',
|
||||
|
||||
'auto_bill' => 'Automatische incasso',
|
||||
'military_time' => '24 uurs tijd',
|
||||
'military_time' => '24-uurs klok',
|
||||
'last_sent' => 'Laatst verstuurd',
|
||||
|
||||
'reminder_emails' => 'Herinneringse-mails',
|
||||
'templates_and_reminders' => 'Templates en herinneringen',
|
||||
'reminder_emails' => 'Herinnerings-e-mails',
|
||||
'templates_and_reminders' => 'Sjablonen en herinneringen',
|
||||
'subject' => 'Onderwerp',
|
||||
'body' => 'Tekst',
|
||||
'first_reminder' => 'Eerste herinnering',
|
||||
@ -787,17 +787,17 @@ return array(
|
||||
'expired_quotes' => 'Verlopen offertes',
|
||||
|
||||
'sign_up_using' => 'Meld u aan met',
|
||||
'invalid_credentials' => 'Deze credentials zijn niet bij ons bekend',
|
||||
'invalid_credentials' => 'Deze inloggegevens zijn niet bij ons bekend',
|
||||
'show_all_options' => 'Alle opties tonen',
|
||||
'user_details' => 'Gebruiker gegevens',
|
||||
'oneclick_login' => 'One-Click Login',
|
||||
'disable' => 'Uitzetten',
|
||||
'invoice_quote_number' => 'Factuur en offerte nummers',
|
||||
'invoice_charges' => 'Facturatie kosten',
|
||||
'invoice_quote_number' => 'Factuur- en offertenummers',
|
||||
'invoice_charges' => 'Facturatiekosten',
|
||||
|
||||
'invitation_status' => [
|
||||
'sent' => 'Email verstuurd',
|
||||
'opened' => 'Email geopend',
|
||||
'sent' => 'E-mail verstuurd',
|
||||
'opened' => 'E-mail geopend',
|
||||
'viewed' => 'Factuur bekeken',
|
||||
],
|
||||
'notification_invoice_bounced' => 'We konden factuur :invoice niet afleveren bij :contact.',
|
||||
@ -808,7 +808,7 @@ return array(
|
||||
'custom_invoice_link' => 'Eigen factuurlink',
|
||||
'total_invoiced' => 'Totaal gefactureerd',
|
||||
'open_balance' => 'Openstaand bedrag',
|
||||
'verify_email' => 'Klik alstublieft op de link in de accountbevestigingse-mail om uw e-mailadres te bevestigen.',
|
||||
'verify_email' => 'Klik alstublieft op de link in de accountbevestigings-e-mail om uw e-mailadres te bevestigen.',
|
||||
'basic_settings' => 'Basisinstellingen',
|
||||
'pro' => 'Pro',
|
||||
'gateways' => 'Betalingsverwerkers',
|
||||
@ -817,7 +817,7 @@ return array(
|
||||
'next_send_on' => 'Verstuur volgende: :date',
|
||||
'no_longer_running' => 'Deze factuur is niet ingepland',
|
||||
'general_settings' => 'Algemene instellingen',
|
||||
'customize' => 'Pas aan',
|
||||
'customize' => 'Aanpassen',
|
||||
'oneclick_login_help' => 'Verbind een account om zonder wachtwoord in te kunnen loggen',
|
||||
'referral_code_help' => 'Verdien geld door onze applicatie online te delen',
|
||||
|
||||
@ -842,39 +842,39 @@ return array(
|
||||
'quote_counter' => 'Offerteteller',
|
||||
'type' => 'Type',
|
||||
|
||||
'activity_1' => ':user created client :client',
|
||||
'activity_2' => ':user archived client :client',
|
||||
'activity_3' => ':user deleted client :client',
|
||||
'activity_4' => ':user created invoice :invoice',
|
||||
'activity_5' => ':user updated invoice :invoice',
|
||||
'activity_6' => ':user emailed invoice :invoice to :contact',
|
||||
'activity_7' => ':contact viewed invoice :invoice',
|
||||
'activity_8' => ':user archived invoice :invoice',
|
||||
'activity_9' => ':user deleted invoice :invoice',
|
||||
'activity_10' => ':contact entered payment :payment for :invoice',
|
||||
'activity_11' => ':user updated payment :payment',
|
||||
'activity_12' => ':user archived payment :payment',
|
||||
'activity_13' => ':user deleted payment :payment',
|
||||
'activity_14' => ':user entered :credit credit',
|
||||
'activity_15' => ':user updated :credit credit',
|
||||
'activity_16' => ':user archived :credit credit',
|
||||
'activity_17' => ':user deleted :credit credit',
|
||||
'activity_18' => ':user created quote :quote',
|
||||
'activity_19' => ':user updated quote :quote',
|
||||
'activity_20' => ':user emailed quote :quote to :contact',
|
||||
'activity_21' => ':contact viewed quote :quote',
|
||||
'activity_22' => ':user archived quote :quote',
|
||||
'activity_23' => ':user deleted quote :quote',
|
||||
'activity_24' => ':user restored quote :quote',
|
||||
'activity_25' => ':user restored invoice :invoice',
|
||||
'activity_26' => ':user restored client :client',
|
||||
'activity_27' => ':user restored payment :payment',
|
||||
'activity_28' => ':user restored :credit credit',
|
||||
'activity_29' => ':contact approved quote :quote',
|
||||
'activity_1' => ':user heeft klant :client aangemaakt',
|
||||
'activity_2' => ':user heeft klant :client gearchiveerd',
|
||||
'activity_3' => ':user heeft klant :client verwijderd',
|
||||
'activity_4' => ':user heeft factuur :invoice aangemaakt',
|
||||
'activity_5' => ':user heeft factuur :invoice bijgewerkt',
|
||||
'activity_6' => ':user heeft factuur :invoice verstuurd naar :contact',
|
||||
'activity_7' => ':contact heeft factuur :invoice bekeken',
|
||||
'activity_8' => ':user heeft factuur :invoice gearchiveerd',
|
||||
'activity_9' => ':user heeft factuur :invoice verwijderd',
|
||||
'activity_10' => ':contact heeft betaling :payment ingevoerd voor factuur :invoice',
|
||||
'activity_11' => ':user heeft betaling :payment bijgewerkt',
|
||||
'activity_12' => ':user heeft betaling :payment gearchiveerd',
|
||||
'activity_13' => ':user heeft betaling :payment verwijderd',
|
||||
'activity_14' => ':user heeft :credit krediet ingevoerd',
|
||||
'activity_15' => ':user heeft :credit krediet bijgewerkt',
|
||||
'activity_16' => ':user heeft :credit krediet gearchiveerd',
|
||||
'activity_17' => ':user heeft :credit krediet verwijderd',
|
||||
'activity_18' => ':user heeft offerte :quote aangemaakt',
|
||||
'activity_19' => ':user heeft offerte :quote bijgewerkt',
|
||||
'activity_20' => ':user heeft offerte :quote verstuurd naar :contact',
|
||||
'activity_21' => ':contact heeft offerte :quote bekeken',
|
||||
'activity_22' => ':user heeft offerte :quote gearchiveerd',
|
||||
'activity_23' => ':user heeft offerte :quote verwijderd',
|
||||
'activity_24' => ':user heeft offerte :quote hersteld',
|
||||
'activity_25' => ':user heeft factuur :invoice hersteld',
|
||||
'activity_26' => ':user heeft klant :client hersteld',
|
||||
'activity_27' => ':user heeft betaling :payment hersteld',
|
||||
'activity_28' => ':user heeft :credit krediet hersteld',
|
||||
'activity_29' => ':contact heeft offerte :quote goedgekeurd',
|
||||
|
||||
'payment' => 'Betaling',
|
||||
'system' => 'Systeem',
|
||||
'signature' => 'Emailondertekening',
|
||||
'signature' => 'E-mailhandtekening',
|
||||
'default_messages' => 'Standaardberichten',
|
||||
'quote_terms' => 'Offertevoorwaarden',
|
||||
'default_quote_terms' => 'Standaard offertevoorwaarden',
|
||||
@ -884,7 +884,7 @@ return array(
|
||||
'free' => 'Gratis',
|
||||
|
||||
'quote_is_approved' => 'Deze offerte is geaccordeerd',
|
||||
'apply_credit' => 'Apply Credit',
|
||||
'apply_credit' => 'Krediet gebruiken',
|
||||
'system_settings' => 'Systeeminstellingen',
|
||||
'archive_token' => 'Archiveer token',
|
||||
'archived_token' => 'Token succesvol gearchiveerd',
|
||||
@ -910,289 +910,286 @@ return array(
|
||||
'country' => 'Land',
|
||||
'include' => 'Voeg in',
|
||||
|
||||
'logo_too_large' => 'Your logo is :size, for better PDF performance we suggest uploading an image file less than 200KB',
|
||||
'import_freshbooks' => 'Import From FreshBooks',
|
||||
'logo_too_large' => 'Je logo is :size groot, voor betere PDF prestaties raden we je aan om een afbeelding kleiner dan 200KB te uploaden.',
|
||||
'import_freshbooks' => 'Importeren van FreshBooks',
|
||||
'import_data' => 'Importeer data',
|
||||
'source' => 'Bron',
|
||||
'csv' => 'CSV',
|
||||
'client_file' => 'Klantbestand',
|
||||
'client_file' => 'Klantenbestand',
|
||||
'invoice_file' => 'Factuurbestand',
|
||||
'task_file' => 'Urenbestand',
|
||||
'no_mapper' => 'No valid mapping for file',
|
||||
'invalid_csv_header' => 'Invalid CSV Header',
|
||||
'no_mapper' => 'Geen geldige mapping voor bestand',
|
||||
'invalid_csv_header' => 'Ongeldige CSV kop',
|
||||
|
||||
'email_errors' => [
|
||||
'inactive_client' => 'Emails can not be sent to inactive clients',
|
||||
'inactive_contact' => 'Emails can not be sent to inactive contacts',
|
||||
'inactive_invoice' => 'Emails can not be sent to inactive invoices',
|
||||
'user_unregistered' => 'Please register your account to send emails',
|
||||
'user_unconfirmed' => 'Please confirm your account to send emails',
|
||||
'invalid_contact_email' => 'Invalid contact email',
|
||||
'inactive_client' => 'E-mails kunnen niet worden verstuurd naar inactieve klanten',
|
||||
'inactive_contact' => 'E-mails kunnen niet worden verstuurd naar inactieve contactpersonen',
|
||||
'inactive_invoice' => 'E-mails kunnen niet worden verstuurd naar inactieve facturen',
|
||||
'user_unregistered' => 'Registreer een account om e-mails te kunnen versturen',
|
||||
'user_unconfirmed' => 'Bevestig uw account om e-mails te kunnen versturen',
|
||||
'invalid_contact_email' => 'Ongeldig e-mailadres van contactpersoon',
|
||||
],
|
||||
|
||||
'client_portal' => 'Klantportaal',
|
||||
'client_portal' => 'Klantenportaal',
|
||||
'admin' => 'Admin',
|
||||
'disabled' => 'Uitgeschakeld',
|
||||
'show_archived_users' => 'Toon gearchiveerde gebruikers',
|
||||
'notes' => 'Notities',
|
||||
'invoice_will_create' => 'klant zal worden aangemaakt',
|
||||
'invoices_will_create' => 'factuur zal worden aangemaakt',
|
||||
'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
|
||||
'failed_to_import' => 'De volgende regels konden niet worden geïmporteerd, ze bestaan al of missen verplichte velden.',
|
||||
|
||||
'publishable_key' => 'Publishable Key',
|
||||
'secret_key' => 'Secret Key',
|
||||
'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process',
|
||||
|
||||
'email_design' => 'Email Design',
|
||||
'due_by' => 'Due by :date',
|
||||
'enable_email_markup' => 'Enable Markup',
|
||||
'enable_email_markup_help' => 'Make it easier for your clients to pay you by adding schema.org markup to your emails.',
|
||||
'template_help_title' => 'Templates Help',
|
||||
'template_help_1' => 'Available variables:',
|
||||
'email_design_id' => 'Email Style',
|
||||
'email_design_help' => 'Make your emails look more professional with HTML layouts',
|
||||
'plain' => 'Plain',
|
||||
'light' => 'Light',
|
||||
'dark' => 'Dark',
|
||||
'email_design' => 'E-mail Ontwerp',
|
||||
'due_by' => 'Vervaldatum :date',
|
||||
'enable_email_markup' => 'Opmaak inschakelen',
|
||||
'enable_email_markup_help' => 'Maak het gemakkelijker voor uw klanten om te betalen door scherma.org opmaak toe te voegen aan uw e-mails.',
|
||||
'template_help_title' => 'Hulp bij sjablonen',
|
||||
'template_help_1' => 'Beschikbare variabelen:',
|
||||
'email_design_id' => 'E-mail stijl',
|
||||
'email_design_help' => 'Geef uw e-mails een professionele uitstraling met HTML ontwerpen',
|
||||
'plain' => 'Platte tekst',
|
||||
'light' => 'Licht',
|
||||
'dark' => 'Donker',
|
||||
|
||||
'industry_help' => 'Used to provide comparisons against the averages of companies of similar size and industry.',
|
||||
'subdomain_help' => 'Customize the invoice link subdomain or display the invoice on your own website.',
|
||||
'invoice_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the invoice number.',
|
||||
'quote_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the quote number.',
|
||||
'custom_client_fields_helps' => 'Add a text input to the client create/edit page and display the label and value on the PDF.',
|
||||
'custom_account_fields_helps' => 'Add a label and value to the company details section of the PDF.',
|
||||
'custom_invoice_fields_helps' => 'Add a text input to the invoice create/edit page and display the label and value on the PDF.',
|
||||
'custom_invoice_charges_helps' => 'Add a text input to the invoice create/edit page and include the charge in the invoice subtotals.',
|
||||
'color_help' => 'Note: the primary color is also used in the client portal and custom email designs.',
|
||||
'industry_help' => 'Wordt gebruikt om een vergelijking te kunnen maken met de gemiddelden van andere bedrijven uit dezelfde sector en van dezelfde grootte.',
|
||||
'subdomain_help' => 'Pas het factuur link subdomein aan of toon de factuur op uw eigen website.',
|
||||
'invoice_number_help' => 'Kies een voorvoegsel of gebruik een patroon om het factuurnummer dynamisch te genereren.',
|
||||
'quote_number_help' => 'Kies een voorvoegsel of gebruik een patroon om het offertenummer dynamisch te genereren.',
|
||||
'custom_client_fields_helps' => 'Plaatst een tekstveld op de klanten aanmaak-/bewerkpagina en toont het gekozen label op de PDF.',
|
||||
'custom_account_fields_helps' => 'Plaatst een tekstveld op de bedrijven aanmaak-/bewerkpagina en toont het gekozen label op de PDF.',
|
||||
'custom_invoice_fields_helps' => 'Plaatst een tekstveld op de factuur aanmaak-/bewerkpagina en toont het gekozen label op de PDF.',
|
||||
'custom_invoice_charges_helps' => 'Plaatst een tekstveld op de factuur aanmaak-/bewerkpagina en verwerkt de facturatiekosten in het subtotaal.',
|
||||
'color_help' => 'Opmerking: de primaire kleur wordt ook gebruikt in het klantenportaal en in aangepaste e-mailontwerpen.',
|
||||
|
||||
'token_expired' => 'Validation token was expired. Please try again.',
|
||||
'invoice_link' => 'Invoice Link',
|
||||
'button_confirmation_message' => 'Click to confirm your email address.',
|
||||
'confirm' => 'Confirm',
|
||||
'email_preferences' => 'Email Preferences',
|
||||
'created_invoices' => 'Successfully created :count invoice(s)',
|
||||
'next_invoice_number' => 'The next invoice number is :number.',
|
||||
'next_quote_number' => 'The next quote number is :number.',
|
||||
'token_expired' => 'De validatie token is verlopen. Probeer het opnieuw.',
|
||||
'invoice_link' => 'Factuur Link',
|
||||
'button_confirmation_message' => 'Klik om uw e-mailadres te bevestigen.',
|
||||
'confirm' => 'Bevestigen',
|
||||
'email_preferences' => 'E-mailvoorkeuren',
|
||||
'created_invoices' => ':count facturen succesvol aangemaakt', //TODO: Implement pluralization?
|
||||
'next_invoice_number' => 'Het volgende factuurnummer is :number.',
|
||||
'next_quote_number' => 'Het volgende offertenummer is :number.',
|
||||
|
||||
'days_before' => 'days before',
|
||||
'days_after' => 'days after',
|
||||
'field_due_date' => 'due date',
|
||||
'field_invoice_date' => 'invoice date',
|
||||
'schedule' => 'Schedule',
|
||||
'email_designs' => 'Email Designs',
|
||||
'assigned_when_sent' => 'Assigned when sent',
|
||||
'days_before' => 'dagen voor',
|
||||
'days_after' => 'dagen na',
|
||||
'field_due_date' => 'vervaldatum',
|
||||
'field_invoice_date' => 'factuurdatum',
|
||||
'schedule' => 'Schema',
|
||||
'email_designs' => 'E-mail Ontwerpen',
|
||||
'assigned_when_sent' => 'Toegwezen zodra verzonden',
|
||||
|
||||
'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.',
|
||||
'white_label_purchase_link' => 'Purchase a white label license',
|
||||
'white_label_custom_css' => ':link voor $'.WHITE_LABEL_PRICE.' om eigen opmaak te gebruiken en ons project te ondersteunen.',
|
||||
'white_label_purchase_link' => 'Koop een whitelabel licentie',
|
||||
|
||||
// Expense / vendor
|
||||
'expense' => 'Expense',
|
||||
'expenses' => 'Expenses',
|
||||
'new_expense' => 'Enter Expense',
|
||||
'enter_expense' => 'Enter Expense',
|
||||
'vendors' => 'Vendors',
|
||||
'new_vendor' => 'New Vendor',
|
||||
'payment_terms_net' => 'Net',
|
||||
'vendor' => 'Vendor',
|
||||
'edit_vendor' => 'Edit Vendor',
|
||||
'archive_vendor' => 'Archive Vendor',
|
||||
'delete_vendor' => 'Delete Vendor',
|
||||
'view_vendor' => 'View Vendor',
|
||||
'deleted_expense' => 'Successfully deleted expense',
|
||||
'archived_expense' => 'Successfully archived expense',
|
||||
'deleted_expenses' => 'Successfully deleted expenses',
|
||||
'archived_expenses' => 'Successfully archived expenses',
|
||||
'expense' => 'Uitgave',
|
||||
'expenses' => 'Uitgaven',
|
||||
'new_expense' => 'Nieuwe uitgave',
|
||||
'enter_expense' => 'Uitgave invoeren',
|
||||
'vendors' => 'Verkopers',
|
||||
'new_vendor' => 'Nieuwe verkoper',
|
||||
'payment_terms_net' => 'Betaaltermijn',
|
||||
'vendor' => 'Verkoper',
|
||||
'edit_vendor' => 'Bewerk verkoper',
|
||||
'archive_vendor' => 'Archiveer verkoper',
|
||||
'delete_vendor' => 'Verwijder verkoper',
|
||||
'view_vendor' => 'Bekijk verkoper',
|
||||
'deleted_expense' => 'Uitgave succesvol verwijderd',
|
||||
'archived_expense' => 'Uitgave succesvol gearchiveerd',
|
||||
'deleted_expenses' => 'Uitgaven succesvol verwijderd',
|
||||
'archived_expenses' => 'Uitgaven succesvol gearchiveerd',
|
||||
|
||||
// Expenses
|
||||
'expense_amount' => 'Expense Amount',
|
||||
'expense_balance' => 'Expense Balance',
|
||||
'expense_date' => 'Expense Date',
|
||||
'expense_should_be_invoiced' => 'Should this expense be invoiced?',
|
||||
'public_notes' => 'Public Notes',
|
||||
'invoice_amount' => 'Invoice Amount',
|
||||
'exchange_rate' => 'Exchange Rate',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
'should_be_invoiced' => 'Should be invoiced',
|
||||
'view_expense' => 'View expense # :expense',
|
||||
'edit_expense' => 'Edit Expense',
|
||||
'archive_expense' => 'Archive Expense',
|
||||
'delete_expense' => 'Delete Expense',
|
||||
'view_expense_num' => 'Expense # :expense',
|
||||
'updated_expense' => 'Successfully updated expense',
|
||||
'created_expense' => 'Successfully created expense',
|
||||
'enter_expense' => 'Enter Expense',
|
||||
'view' => 'View',
|
||||
'restore_expense' => 'Restore Expense',
|
||||
'invoice_expense' => 'Invoice Expense',
|
||||
'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients',
|
||||
'expense_error_invoiced' => 'Expense has already been invoiced',
|
||||
'convert_currency' => 'Convert currency',
|
||||
'expense_amount' => 'Uitgave bedrag',
|
||||
'expense_balance' => 'Uitgave saldo',
|
||||
'expense_date' => 'Uitgave datum',
|
||||
'expense_should_be_invoiced' => 'Moet deze uitgave worden gefactureerd?',
|
||||
'public_notes' => 'Publieke opmerkingen',
|
||||
'invoice_amount' => 'Factuurbedrag',
|
||||
'exchange_rate' => 'Wisselkoers',
|
||||
'yes' => 'Ja',
|
||||
'no' => 'Nee',
|
||||
'should_be_invoiced' => 'Moet worden gefactureerd',
|
||||
'view_expense' => 'Bekijk uitgave #:expense',
|
||||
'edit_expense' => 'Bewerk uitgave',
|
||||
'archive_expense' => 'Archiveer uitgave',
|
||||
'delete_expense' => 'Verwijder uitgave',
|
||||
'view_expense_num' => 'Uitgave #:expense',
|
||||
'updated_expense' => 'Uitgave succesvol bijgewerkt',
|
||||
'created_expense' => 'Uitgave succesvol aangemaakt',
|
||||
'enter_expense' => 'Uitgave invoeren',
|
||||
'view' => 'Bekijken',
|
||||
'restore_expense' => 'Herstel uitgave',
|
||||
'invoice_expense' => 'Factuur uitgave',
|
||||
'expense_error_multiple_clients' => 'De uitgaven kunnen niet bij verschillende klanten horen',
|
||||
'expense_error_invoiced' => 'Uitgave is al gefactureerd',
|
||||
'convert_currency' => 'Valuta omrekenen',
|
||||
|
||||
// Payment terms
|
||||
'num_days' => 'Number of days',
|
||||
'create_payment_term' => 'Create Payment Term',
|
||||
'edit_payment_terms' => 'Edit Payment Term',
|
||||
'edit_payment_term' => 'Edit Payment Term',
|
||||
'archive_payment_term' => 'Archive Payment Term',
|
||||
'num_days' => 'Aantal dagen',
|
||||
'create_payment_term' => 'Betalingstermijn aanmaken',
|
||||
'edit_payment_terms' => 'Bewerk betalingstermijnen',
|
||||
'edit_payment_term' => 'Bewerk betalingstermijn',
|
||||
'archive_payment_term' => 'Archiveer betalingstermijn',
|
||||
|
||||
// recurring due dates
|
||||
'recurring_due_dates' => 'Recurring Invoice Due Dates',
|
||||
'recurring_due_date_help' => '<p>Automatically sets a due date for the invoice.</p>
|
||||
<p>Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.</p>
|
||||
<p>Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.</p>
|
||||
<p>For example:</p>
|
||||
'recurring_due_dates' => 'Vervaldatums van terugkerende facturen',
|
||||
'recurring_due_date_help' => '<p>Stelt automatisch een vervaldatum in voor de factuur.</p>
|
||||
<p>Facturen die maandelijks of jaarlijks terugkeren en ingesteld zijn om te vervallen op of voor de datum waarop ze gemaakt zijn zullen de volgende maand vervallen. Facturen die ingesteld zijn te vervallen op de 29e of 30e van een maand die deze dag niet heeft zullen vervallen op de laatste dag van die maand.</p>
|
||||
<p>Facturen die wekelijks terugkeren en ingesteld zijn om te vervallen op de dag van de week dat ze gemaakt zijn zullen de volgende week vervallen.</p>
|
||||
<p>Bijvoorbeeld:</p>
|
||||
<ul>
|
||||
<li>Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.</li>
|
||||
<li>Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month.
|
||||
</li>
|
||||
<li>Today is the 15th, due date is the 15th day of the month. The due date will be the 15th day of <strong>next</strong> month.
|
||||
</li>
|
||||
<li>Today is the Friday, due date is the 1st Friday after. The due date will be next Friday, not today.
|
||||
</li>
|
||||
<li>Vandaag is het de 15e, de vervaldatum is ingesteld op de eerste dag van de maand. De vervaldatum zal de eerste dag van de volgende maand zijn.</li>
|
||||
<li>Vandaag is het de 15e, de vervaldatum is ingesteld op de laatste dag van de maand. De vervaldatum zal de laatste dag van deze maand zijn.</li>
|
||||
<li>Vandaag is het de 15e, de vervaldatum is ingesteld op de 15e dag van de maand. De vervaldatum zal de 15e dag van de <strong>volgende</strong> maand zijn.</li>
|
||||
<li>Vandaag is het vrijdag, de vervaldatum is ingesteld op de 1e vrijdag erna. De vervaldatum zal volgende week vrijdag zijn, niet vandaag.</li>
|
||||
</ul>',
|
||||
'due' => 'Due',
|
||||
'next_due_on' => 'Due Next: :date',
|
||||
'use_client_terms' => 'Use client terms',
|
||||
'day_of_month' => ':ordinal day of month',
|
||||
'last_day_of_month' => 'Last day of month',
|
||||
'day_of_week_after' => ':ordinal :day after',
|
||||
'sunday' => 'Sunday',
|
||||
'monday' => 'Monday',
|
||||
'tuesday' => 'Tuesday',
|
||||
'wednesday' => 'Wednesday',
|
||||
'thursday' => 'Thursday',
|
||||
'friday' => 'Friday',
|
||||
'saturday' => 'Saturday',
|
||||
'due' => 'Vervaldatum',
|
||||
'next_due_on' => 'Vervaldatum volgende: :date',
|
||||
'use_client_terms' => 'Gebruik betalingsvoorwaarden klant',
|
||||
'day_of_month' => ':ordinal dag van de maand',
|
||||
'last_day_of_month' => 'Laatste dag van de maand',
|
||||
'day_of_week_after' => ':ordinal :day erna',
|
||||
'sunday' => 'Zondag',
|
||||
'monday' => 'Maandag',
|
||||
'tuesday' => 'Dinsdag',
|
||||
'wednesday' => 'Woensdag',
|
||||
'thursday' => 'Donderdag',
|
||||
'friday' => 'Vrijdag',
|
||||
'saturday' => 'Zaterdag',
|
||||
|
||||
// Fonts
|
||||
'header_font_id' => 'Header Font',
|
||||
'body_font_id' => 'Body Font',
|
||||
'color_font_help' => 'Note: the primary color and fonts are also used in the client portal and custom email designs.',
|
||||
'header_font_id' => 'Header lettertype',
|
||||
'body_font_id' => 'Body lettertype',
|
||||
'color_font_help' => 'Opmerking: de primaire kleuren en lettertypen wordt ook gebruikt in het klantenportaal en in aangepaste e-mailontwerpen.',
|
||||
|
||||
'live_preview' => 'Live Preview',
|
||||
'invalid_mail_config' => 'Unable to send email, please check that the mail settings are correct.',
|
||||
'live_preview' => 'Live Voorbeeld',
|
||||
'invalid_mail_config' => 'Kon de e-mail niet verzenden, controleer of de e-mailinstellingen kloppen.',
|
||||
|
||||
'invoice_message_button' => 'To view your invoice for :amount, click the button below.',
|
||||
'quote_message_button' => 'To view your quote for :amount, click the button below.',
|
||||
'payment_message_button' => 'Thank you for your payment of :amount.',
|
||||
'payment_type_direct_debit' => 'Direct Debit',
|
||||
'bank_accounts' => 'Bank Accounts',
|
||||
'add_bank_account' => 'Add Bank Account',
|
||||
'setup_account' => 'Setup Account',
|
||||
'import_expenses' => 'Import Expenses',
|
||||
'bank_id' => 'bank',
|
||||
'integration_type' => 'Integration Type',
|
||||
'updated_bank_account' => 'Successfully updated bank account',
|
||||
'edit_bank_account' => 'Edit Bank Account',
|
||||
'archive_bank_account' => 'Archive Bank Account',
|
||||
'archived_bank_account' => 'Successfully archived bank account',
|
||||
'created_bank_account' => 'Successfully created bank account',
|
||||
'validate_bank_account' => 'Validate Bank Account',
|
||||
'bank_accounts_help' => 'Connect a bank account to automatically import expenses and create vendors. Supports American Express and <a href="'.OFX_HOME_URL.'" target="_blank">400+ US banks.</a>',
|
||||
'bank_password_help' => 'Note: your password is transmitted securely and never stored on our servers.',
|
||||
'bank_password_warning' => 'Warning: your password may be transmitted in plain text, consider enabling HTTPS.',
|
||||
'username' => 'Username',
|
||||
'account_number' => 'Account Number',
|
||||
'account_name' => 'Account Name',
|
||||
'bank_account_error' => 'Failed to retreive account details, please check your credentials.',
|
||||
'status_approved' => 'Approved',
|
||||
'quote_settings' => 'Quote Settings',
|
||||
'auto_convert_quote' => 'Auto convert quote',
|
||||
'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved by a client.',
|
||||
'validate' => 'Validate',
|
||||
'info' => 'Info',
|
||||
'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)',
|
||||
'invoice_message_button' => 'Klik op de onderstaande link om uw factuur van :amount te bekijken.',
|
||||
'quote_message_button' => 'Klik op de onderstaande link om uw offerte van :amount te bekijken.',
|
||||
'payment_message_button' => 'Bedankt voor uw betaling van :amount.',
|
||||
'payment_type_direct_debit' => 'Automatisch incasso',
|
||||
'bank_accounts' => 'Bankrekeningen',
|
||||
'add_bank_account' => 'Bankrekening toevoegen',
|
||||
'setup_account' => 'Rekening instellen',
|
||||
'import_expenses' => 'Uitgaven importeren',
|
||||
'bank_id' => 'Bank',
|
||||
'integration_type' => 'Integratie Type',
|
||||
'updated_bank_account' => 'Bankrekening succesvol bijgewerkt',
|
||||
'edit_bank_account' => 'Bewerk bankrekening',
|
||||
'archive_bank_account' => 'Archiveer bankrekening',
|
||||
'archived_bank_account' => 'Bankrekening succesvol gearchiveerd',
|
||||
'created_bank_account' => 'Bankrekening succesvol toegevoegd',
|
||||
'validate_bank_account' => 'Bankrekening valideren',
|
||||
'bank_accounts_help' => 'Koppel een bankrekening om automatisch uitgaven en leveranciers te importeren. Ondersteund American Express en <a href="'.OFX_HOME_URL.'" target="_blank">400+ banken uit de VS.</a>',
|
||||
'bank_password_help' => 'Opmerking: uw wachtwoord wordt beveiligd verstuurd en wordt nooit op onze servers opgeslagen.',
|
||||
'bank_password_warning' => 'Waarschuwing: uw wachtwoord wordt mogelijk als leesbare tekst verzonden, overweeg HTTPS in te schakelen.',
|
||||
'username' => 'Gebruikersnaam',
|
||||
'account_number' => 'Rekeningnummer',
|
||||
'account_name' => 'Rekeninghouder',
|
||||
'bank_account_error' => 'Het ophalen van rekeninggegevens is mislukt, controleer uw inloggegevens.',
|
||||
'status_approved' => 'Goedgekeurd',
|
||||
'quote_settings' => 'Offerte instellingen',
|
||||
'auto_convert_quote' => 'Offerte automatisch omzetten',
|
||||
'auto_convert_quote_help' => 'Zet een offerte automatisch om in een factuur zodra deze door een klant wordt goedgekeurd.',
|
||||
'validate' => 'Valideren',
|
||||
'info' => 'Informatie',
|
||||
'imported_expenses' => 'Er zijn succesvol :count_vendors leverancier(s) en :count_expenses uitgaven aangemaakt.',
|
||||
|
||||
'iframe_url_help3' => 'Note: if you plan on accepting credit cards details we strongly recommend enabling HTTPS on your site.',
|
||||
'expense_error_multiple_currencies' => 'The expenses can\'t have different currencies.',
|
||||
'expense_error_mismatch_currencies' => 'The client\'s currency does not match the expense currency.',
|
||||
'iframe_url_help3' => 'Opmerking: als u van plan bent om creditcard betalingen te accepteren raden wij u dringend aan om HTTPS in te schakelen op uw website.',
|
||||
'expense_error_multiple_currencies' => 'De uitgaven kunnen geen verschillende munteenheden hebben.',
|
||||
'expense_error_mismatch_currencies' => 'De munteenheid van de klant komt niet overeen met de munteenheid van de uitgave.',
|
||||
'trello_roadmap' => 'Trello Roadmap',
|
||||
'header_footer' => 'Header/Footer',
|
||||
'first_page' => 'first page',
|
||||
'all_pages' => 'all pages',
|
||||
'last_page' => 'last page',
|
||||
'all_pages_header' => 'Show header on',
|
||||
'all_pages_footer' => 'Show footer on',
|
||||
'invoice_currency' => 'Invoice Currency',
|
||||
'enable_https' => 'We strongly recommend using HTTPS to accept credit card details online.',
|
||||
'quote_issued_to' => 'Quote issued to',
|
||||
'show_currency_code' => 'Currency Code',
|
||||
'trial_message' => 'Your account will receive a free two week trial of our pro plan.',
|
||||
'trial_footer' => 'Your free trial lasts :count more days, :link to upgrade now.',
|
||||
'trial_footer_last_day' => 'This is the last day of your free trial, :link to upgrade now.',
|
||||
'trial_call_to_action' => 'Start Free Trial',
|
||||
'trial_success' => 'Successfully enabled two week free pro plan trial',
|
||||
'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.',
|
||||
'first_page' => 'eerste pagina',
|
||||
'all_pages' => 'alle pagina\'s',
|
||||
'last_page' => 'laatste pagina',
|
||||
'all_pages_header' => 'Toon header op',
|
||||
'all_pages_footer' => 'Toon footer op',
|
||||
'invoice_currency' => 'Factuur valuta',
|
||||
'enable_https' => 'We raden u dringend aan om HTTPS te gebruiken om creditcard informatie digitaal te accepteren.',
|
||||
'quote_issued_to' => 'Offerte uitgeschreven voor',
|
||||
'show_currency_code' => 'Valutacode',
|
||||
'trial_message' => 'Uw account zal een gratis twee weken durende probeerversie van ons pro plan krijgen.',
|
||||
'trial_footer' => 'Uw gratis probeerversie duurt nog :count dagen, :link om direct te upgraden.',
|
||||
'trial_footer_last_day' => 'Dit is de laatste dag van uw gratis probeerversie, :link om direct te upgraden.',
|
||||
'trial_call_to_action' => 'Start gratis probeerversie',
|
||||
'trial_success' => 'De gratis twee weken durende probeerversie van het pro plan is succesvol geactiveerd.',
|
||||
'overdue' => 'Verlopen',
|
||||
'white_label_text' => 'Koop een één jaar geldige white label licentie van $'.WHITE_LABEL_PRICE.' om de Invoice Ninja logo\'s in het klantenportaal te verbergen en ons project te ondersteunen.',
|
||||
|
||||
'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 /',
|
||||
'navigation' => 'Navigatie',
|
||||
'list_invoices' => 'Toon Facturen',
|
||||
'list_clients' => 'Toon Klanten',
|
||||
'list_quotes' => 'Toon Offertes',
|
||||
'list_tasks' => 'Toon Taken',
|
||||
'list_expenses' => 'Toon Uitgaven',
|
||||
'list_recurring_invoices' => 'Toon Terugkerende Facturen',
|
||||
'list_payments' => 'Toon Betalingen',
|
||||
'list_credits' => 'Toon Kredieten',
|
||||
'tax_name' => 'Belasting naam',
|
||||
'report_settings' => 'Rapport instellingen',
|
||||
'search_hotkey' => 'Snelkoppeling 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\'.',
|
||||
'new_user' => 'Nieuwe Gebruiker',
|
||||
'new_product' => 'Nieuw Product',
|
||||
'new_tax_rate' => 'Nieuw BTW-tarief',
|
||||
'invoiced_amount' => 'Gefactureerd bedrag',
|
||||
'invoice_item_fields' => 'Factuurregels',
|
||||
'custom_invoice_item_fields_help' => 'Voeg een veld toe bij het aanmaken van een factuurregel en toon het label met de waarde op de PDF.',
|
||||
'recurring_invoice_number' => 'Nummer terugkerende factuur',
|
||||
'recurring_invoice_number_prefix_help' => 'Kies een voorvoegsel voor het factuurnummer van terugkerende facturen. De standaard is: \'R\'.',
|
||||
'enable_client_portal' => 'Dashboard',
|
||||
'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
|
||||
'enable_client_portal_help' => 'Toon/verberg de dashboard pagina in het klantenportaal.',
|
||||
|
||||
// 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.',
|
||||
'enable_portal_password'=>'Facturen beveiligen met een wachtwoord',
|
||||
'enable_portal_password_help'=>'Geeft u de mogelijkheid om een wachtwoord in te stellen voor elke contactpersoon. Als er een wachtwoord is ingesteld moet de contactpersoon het wachtwoord invoeren voordat deze facturen kan bekijken.',
|
||||
'send_portal_password'=>'Wachtwoord automatisch genereren',
|
||||
'send_portal_password_help'=>'Als er geen wachtwoord is ingesteld zal deze automatisch worden gegenereerd en verzonden bij de eerste factuur.',
|
||||
|
||||
'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.',
|
||||
'expired' => 'Verlopen',
|
||||
'invalid_card_number' => 'Het creditcardnummer is niet geldig.',
|
||||
'invalid_expiry' => 'De verloopdatum is niet geldig.',
|
||||
'invalid_cvv' => 'Het CVV-nummer is niet geldig.',
|
||||
'cost' => 'Kosten',
|
||||
'create_invoice_for_sample' => 'Opmerking: maak uw eerste factuur om hier een voorbeeld te zien.',
|
||||
|
||||
// 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',
|
||||
'owner' => 'Eigenaar',
|
||||
'administrator' => 'Beheerder',
|
||||
'administrator_help' => 'Geef gebruiker de toestemming om andere gebruikers te beheren, instellingen te wijzigen en alle regels te bewerken.',
|
||||
'user_create_all' => 'Aanmaken van klanten, facturen, enz.',
|
||||
'user_view_all' => 'Bekijken van klanten, facturen, enz.',
|
||||
'user_edit_all' => 'Bewerken van alle klanten, facturen, enz.',
|
||||
'gateway_help_20' => ':link om aan te melden voor Sage Pay.',
|
||||
'gateway_help_21' => ':link om aan te melden voor Sage Pay.',
|
||||
'partial_due' => 'Gedeeltelijke vervaldatum',
|
||||
'restore_vendor' => 'Leverancier herstellen',
|
||||
'restored_vendor' => 'Leverancier succesvol hersteld',
|
||||
'restored_expense' => 'Uitgave succesvol hersteld',
|
||||
'permissions' => 'Rechten',
|
||||
'create_all_help' => 'Gebruiker toestemming geven om nieuwe regels aan te maken en te bewerken',
|
||||
'view_all_help' => 'Gebruiker toestemming geven om regels te bekijken die hij niet heeft gemaakt',
|
||||
'edit_all_help' => 'Gebruiker toestemming geven om regels te bewerken die hij niet heeft gemaakt',
|
||||
'view_payment' => 'Betaling bekijken',
|
||||
|
||||
'january' => 'January',
|
||||
'february' => 'February',
|
||||
'march' => 'March',
|
||||
'april' => 'April',
|
||||
'may' => 'May',
|
||||
'june' => 'June',
|
||||
'july' => 'July',
|
||||
'august' => 'August',
|
||||
'september' => 'September',
|
||||
'october' => 'October',
|
||||
'november' => 'November',
|
||||
'december' => 'December',
|
||||
'january' => 'januari',
|
||||
'february' => 'februari',
|
||||
'march' => 'maart',
|
||||
'april' => 'april',
|
||||
'may' => 'mei',
|
||||
'june' => 'juni',
|
||||
'july' => 'juli',
|
||||
'august' => 'augustus',
|
||||
'september' => 'september',
|
||||
'october' => 'oktober',
|
||||
'november' => 'november',
|
||||
'december' => 'december',
|
||||
|
||||
);
|
@ -17,14 +17,14 @@ return array(
|
||||
"active_url" => ":attribute is geen geldige URL.",
|
||||
"after" => ":attribute moet een datum na :date zijn.",
|
||||
"alpha" => ":attribute mag alleen letters bevatten.",
|
||||
"alpha_dash" => ":attribute mag alleen letters, nummers, onderstreep(_) en strepen(-) bevatten.",
|
||||
"alpha_dash" => ":attribute mag alleen letters, nummers, lage streep (_) en liggende streep (-) bevatten.",
|
||||
"alpha_num" => ":attribute mag alleen letters en nummers bevatten.",
|
||||
"array" => ":attribute moet geselecteerde elementen bevatten.",
|
||||
"before" => ":attribute moet een datum voor :date zijn.",
|
||||
"between" => array(
|
||||
"numeric" => ":attribute moet tussen :min en :max zijn.",
|
||||
"file" => ":attribute moet tussen :min en :max kilobytes zijn.",
|
||||
"string" => ":attribute moet tussen :min en :max karakters zijn.",
|
||||
"string" => ":attribute moet tussen :min en :max tekens zijn.",
|
||||
"array" => ":attribute moet tussen :min en :max items bevatten.",
|
||||
),
|
||||
"confirmed" => ":attribute bevestiging komt niet overeen.",
|
||||
@ -47,14 +47,14 @@ return array(
|
||||
"max" => array(
|
||||
"numeric" => ":attribute moet minder dan :max zijn.",
|
||||
"file" => ":attribute moet minder dan :max kilobytes zijn.",
|
||||
"string" => ":attribute moet minder dan :max karakters zijn.",
|
||||
"string" => ":attribute moet minder dan :max tekens zijn.",
|
||||
"array" => ":attribute mag maximaal :max items bevatten.",
|
||||
),
|
||||
"mimes" => ":attribute moet een bestand zijn van het bestandstype :values.",
|
||||
"min" => array(
|
||||
"numeric" => ":attribute moet minimaal :min zijn.",
|
||||
"file" => ":attribute moet minimaal :min kilobytes zijn.",
|
||||
"string" => ":attribute moet minimaal :min karakters zijn.",
|
||||
"string" => ":attribute moet minimaal :min tekens zijn.",
|
||||
"array" => ":attribute moet minimaal :min items bevatten.",
|
||||
),
|
||||
"not_in" => "Het geselecteerde :attribute is ongeldig.",
|
||||
@ -70,7 +70,7 @@ return array(
|
||||
"size" => array(
|
||||
"numeric" => ":attribute moet :size zijn.",
|
||||
"file" => ":attribute moet :size kilobyte zijn.",
|
||||
"string" => ":attribute moet :size karakters lang zijn.",
|
||||
"string" => ":attribute moet :size tekens lang zijn.",
|
||||
"array" => ":attribute moet :size items bevatten.",
|
||||
),
|
||||
"unique" => ":attribute is al in gebruik.",
|
||||
@ -81,7 +81,7 @@ return array(
|
||||
"notmasked" => "De waarden zijn verborgen",
|
||||
"less_than" => 'Het :attribute moet minder zijn dan :value',
|
||||
"has_counter" => 'De waarde moet {$counter} bevatten',
|
||||
"valid_contacts" => "Alle contacten moeten een e-mailadres of een naam hebben",
|
||||
"valid_contacts" => "Alle contactpersonen moeten een e-mailadres of een naam hebben",
|
||||
"valid_invoice_items" => "De factuur overschrijd het maximale aantal",
|
||||
|
||||
/*
|
||||
|
@ -13,6 +13,7 @@
|
||||
->addClass('warn-on-exit') !!}
|
||||
|
||||
{!! Former::populateField('enable_client_portal', intval($account->enable_client_portal)) !!}
|
||||
{!! Former::populateField('enable_client_portal_dashboard', intval($account->enable_client_portal_dashboard)) !!}
|
||||
{!! Former::populateField('client_view_css', $client_view_css) !!}
|
||||
{!! Former::populateField('enable_portal_password', intval($enable_portal_password)) !!}
|
||||
{!! Former::populateField('send_portal_password', intval($send_portal_password)) !!}
|
||||
@ -39,6 +40,11 @@
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_help')) !!}
|
||||
</div>
|
||||
<div class="col-md-10 col-md-offset-1">
|
||||
{!! Former::checkbox('enable_client_portal_dashboard')
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_dashboard_help')) !!}
|
||||
</div>
|
||||
<div class="col-md-10 col-md-offset-1">
|
||||
{!! Former::checkbox('enable_portal_password')
|
||||
->text(trans('texts.enable_portal_password'))
|
||||
|
@ -51,8 +51,8 @@
|
||||
<div class="form-group">
|
||||
<div class="col-lg-4 col-sm-4"></div>
|
||||
<div class="col-lg-8 col-sm-8">
|
||||
<a href="{{ $account->getLogoUrl().'?no_cache='.time() }}" target="_blank">
|
||||
{!! HTML::image($account->getLogoUrl().'?no_cache='.time(), 'Logo', ['max-width' => 200]) !!}
|
||||
<a href="{{ $account->getLogoUrl(true) }}" target="_blank">
|
||||
{!! HTML::image($account->getLogoUrl(true), 'Logo', ['style' => 'max-width:300px']) !!}
|
||||
</a>
|
||||
<a href="#" onclick="deleteLogo()">{{ trans('texts.remove_logo') }}</a>
|
||||
</div>
|
||||
|
@ -105,7 +105,7 @@
|
||||
@endif
|
||||
|
||||
<p class="link">
|
||||
{!! link_to('/forgot', trans('texts.forgot_password')) !!}
|
||||
{!! link_to('/recover_password', trans('texts.recover_password')) !!}
|
||||
{!! link_to(NINJA_WEB_URL.'/knowledgebase/', trans('texts.knowledge_base'), ['target' => '_blank', 'class' => 'pull-right']) !!}
|
||||
</p>
|
||||
|
||||
|
@ -53,7 +53,7 @@
|
||||
@section('body')
|
||||
<div class="container">
|
||||
|
||||
{!! Former::open('forgot')->rules(['email' => 'required|email'])->addClass('form-signin') !!}
|
||||
{!! Former::open('recover_password')->rules(['email' => 'required|email'])->addClass('form-signin') !!}
|
||||
<div class="modal-header">
|
||||
<img src="{{ asset('images/icon-login.png') }}" />
|
||||
<h4>Invoice Ninja | {{ trans('texts.password_recovery') }}</h4></div>
|
||||
|
@ -89,7 +89,7 @@
|
||||
->large()->submit()->block() !!}</p>
|
||||
|
||||
<p class="link">
|
||||
{!! link_to('/client/forgot', trans('texts.forgot_password')) !!}
|
||||
{!! link_to('/client/recover_password', trans('texts.recover_password')) !!}
|
||||
</p>
|
||||
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
||||
@section('body')
|
||||
<div class="container">
|
||||
|
||||
{!! Former::open('client/forgot')->addClass('form-signin') !!}
|
||||
{!! Former::open('client/recover_password')->addClass('form-signin') !!}
|
||||
<div class="modal-header">
|
||||
@if (!isset($hideLogo) || !$hideLogo)
|
||||
<a href="{{ NINJA_WEB_URL }}" target="_blank">
|
||||
|
@ -22,6 +22,12 @@
|
||||
width: 50%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#scrollable-dropdown-menu .tt-menu {
|
||||
max-height: 150px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
</style>
|
||||
@stop
|
||||
|
||||
@ -221,7 +227,9 @@
|
||||
$parent.invoice_items().length > 1" class="fa fa-sort"></i>
|
||||
</td>
|
||||
<td>
|
||||
<input id="product_key" type="text" data-bind="typeahead: product_key, items: $root.products, key: 'product_key', valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][product_key]'}" class="form-control invoice-item handled"/>
|
||||
<div id="scrollable-dropdown-menu">
|
||||
<input id="product_key" type="text" data-bind="typeahead: product_key, items: $root.products, key: 'product_key', valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][product_key]'}" class="form-control invoice-item handled"/>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<textarea data-bind="value: wrapped_notes, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][notes]'}"
|
||||
@ -296,11 +304,11 @@
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="notes" style="padding-bottom:44px">
|
||||
{!! Former::textarea('public_notes')->data_bind("value: wrapped_notes, valueUpdate: 'afterkeydown'")
|
||||
->label(null)->style('resize: none; min-width: 450px;')->rows(3) !!}
|
||||
->label(null)->style('resize: none; width: 500px;')->rows(4) !!}
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="terms">
|
||||
{!! Former::textarea('terms')->data_bind("value:wrapped_terms, placeholder: terms_placeholder, valueUpdate: 'afterkeydown'")
|
||||
->label(false)->style('resize: none; min-width: 450px')->rows(3)
|
||||
->label(false)->style('resize: none; width: 500px')->rows(4)
|
||||
->help('<div class="checkbox">
|
||||
<label>
|
||||
<input name="set_default_terms" type="checkbox" style="width: 24px" data-bind="checked: set_default_terms"/>'.trans('texts.save_as_default_terms').'
|
||||
@ -312,7 +320,7 @@
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="footer">
|
||||
{!! Former::textarea('invoice_footer')->data_bind("value:wrapped_footer, placeholder: footer_placeholder, valueUpdate: 'afterkeydown'")
|
||||
->label(false)->style('resize: none; min-width: 450px')->rows(3)
|
||||
->label(false)->style('resize: none; width: 500px')->rows(4)
|
||||
->help('<div class="checkbox">
|
||||
<label>
|
||||
<input name="set_default_footer" type="checkbox" style="width: 24px" data-bind="checked: set_default_footer"/>'.trans('texts.save_as_default_footer').'
|
||||
|
@ -98,7 +98,13 @@ function ViewModel(data) {
|
||||
|
||||
var isValid = true;
|
||||
$('input.client-email').each(function(item, value) {
|
||||
var $email = $(value);
|
||||
var email = $(value).val();
|
||||
|
||||
// Trim whitespace
|
||||
email = (email || '').trim();
|
||||
$email.val(email);
|
||||
|
||||
if (!firstName && (!email || !isValidEmailAddress(email))) {
|
||||
isValid = false;
|
||||
}
|
||||
@ -826,6 +832,7 @@ ko.bindingHandlers.typeahead = {
|
||||
{
|
||||
name: 'data',
|
||||
display: allBindings.key,
|
||||
limit: 50,
|
||||
source: searchData(allBindings.items, allBindings.key)
|
||||
}).on('typeahead:select', function(element, datum, name) {
|
||||
@if (Auth::user()->account->fill_products)
|
||||
|
@ -51,6 +51,8 @@
|
||||
} else {
|
||||
logError(errorMsg);
|
||||
}
|
||||
|
||||
trackEvent('/error', errorMsg);
|
||||
} catch(err) {}
|
||||
|
||||
return false;
|
||||
|
@ -51,12 +51,6 @@
|
||||
"paddingBottom": "$amount:14"
|
||||
}
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
},
|
||||
{
|
||||
"columns": [
|
||||
{
|
||||
@ -78,7 +72,13 @@
|
||||
"paddingBottom": "$amount:4"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
}
|
||||
],
|
||||
"footer":
|
||||
[
|
||||
|
@ -69,12 +69,6 @@
|
||||
"paddingBottom": "$amount:14"
|
||||
}
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
},
|
||||
{
|
||||
"columns": [
|
||||
"$notesAndTerms",
|
||||
@ -93,6 +87,12 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
}
|
||||
],
|
||||
"defaultStyle": {
|
||||
|
@ -56,12 +56,6 @@
|
||||
"paddingTop": "$amount:8",
|
||||
"paddingBottom": "$amount:8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
},
|
||||
{
|
||||
"columns": [
|
||||
@ -83,6 +77,12 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stack": [
|
||||
"$invoiceDocuments"
|
||||
],
|
||||
"style": "invoiceDocuments"
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
|
@ -1,4 +1,4 @@
|
||||
<?php //[STAMP] 5d3610ae822b6990504d5dce501c103b
|
||||
<?php //[STAMP] a3cf36879dbbec28f15389e7d8d325a2
|
||||
namespace _generated;
|
||||
|
||||
// This class was automatically generated by build task
|
||||
@ -2664,6 +2664,28 @@ trait AcceptanceTesterActions
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* [!] Method is generated. Documentation taken from corresponding module.
|
||||
*
|
||||
* Move to the middle of the given element matched by the given locator.
|
||||
* Extra shift, calculated from the top-left corner of the element, can be set by passing $offsetX and $offsetY parameters.
|
||||
*
|
||||
* ``` php
|
||||
* <?php
|
||||
* $I->scrollTo(['css' => '.checkout'], 20, 50);
|
||||
* ?>
|
||||
* ```
|
||||
*
|
||||
* @param $selector
|
||||
* @param int $offsetX
|
||||
* @param int $offsetY
|
||||
* @see \Codeception\Module\WebDriver::scrollTo()
|
||||
*/
|
||||
public function scrollTo($selector, $offsetX = null, $offsetY = null) {
|
||||
return $this->getScenario()->runStep(new \Codeception\Step\Action('scrollTo', func_get_args()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* [!] Method is generated. Documentation taken from corresponding module.
|
||||
*
|
||||
|
@ -73,12 +73,12 @@ class TaxRatesCest
|
||||
$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->selectOption('#taxRateSelect1', $invoiceTaxName . ' ' . floatval($invoiceTaxRate) . '%');
|
||||
$I->wait(2);
|
||||
$I->wait(3);
|
||||
|
||||
// check total is right before saving
|
||||
$I->see("\${$total}");
|
||||
$I->click('Save');
|
||||
$I->wait(1);
|
||||
$I->wait(2);
|
||||
$I->see($clientEmail);
|
||||
|
||||
// check total is right after saving
|
||||
|
Loading…
Reference in New Issue
Block a user