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