Improved settings navigation

This commit is contained in:
Hillel Coren 2015-10-14 17:15:39 +03:00
parent d3550903f4
commit 831c81a4b9
59 changed files with 2312 additions and 1986 deletions

View File

@ -37,11 +37,11 @@ class SendRecurringInvoices extends Command
$this->info(count($invoices).' recurring invoice(s) found'); $this->info(count($invoices).' recurring invoice(s) found');
foreach ($invoices as $recurInvoice) { foreach ($invoices as $recurInvoice) {
$recurInvoice->account->loadLocalizationSettings($recurInvoice->client);
$this->info('Processing Invoice '.$recurInvoice->id.' - Should send '.($recurInvoice->shouldSendToday() ? 'YES' : 'NO')); $this->info('Processing Invoice '.$recurInvoice->id.' - Should send '.($recurInvoice->shouldSendToday() ? 'YES' : 'NO'));
$invoice = $this->invoiceRepo->createRecurringInvoice($recurInvoice); $invoice = $this->invoiceRepo->createRecurringInvoice($recurInvoice);
if ($invoice && !$invoice->isPaid()) { if ($invoice && !$invoice->isPaid()) {
$recurInvoice->account->loadLocalizationSettings($invoice->client);
$this->mailer->sendInvoice($invoice); $this->mailer->sendInvoice($invoice);
} }
} }

View File

@ -15,7 +15,6 @@ use Cache;
use Response; use Response;
use parseCSV; use parseCSV;
use Request; use Request;
use App\Models\Affiliate; use App\Models\Affiliate;
use App\Models\License; use App\Models\License;
use App\Models\User; use App\Models\User;
@ -129,9 +128,9 @@ class AccountController extends BaseController
Session::put("show_trash:{$entityType}", $visible == 'true'); Session::put("show_trash:{$entityType}", $visible == 'true');
if ($entityType == 'user') { if ($entityType == 'user') {
return Redirect::to('company/'.ACCOUNT_ADVANCED_SETTINGS.'/'.ACCOUNT_USER_MANAGEMENT); return Redirect::to('settings/'.ACCOUNT_USER_MANAGEMENT);
} elseif ($entityType == 'token') { } elseif ($entityType == 'token') {
return Redirect::to('company/'.ACCOUNT_ADVANCED_SETTINGS.'/'.ACCOUNT_TOKEN_MANAGEMENT); return Redirect::to('settings/'.ACCOUNT_API_TOKENS);
} else { } else {
return Redirect::to("{$entityType}s"); return Redirect::to("{$entityType}s");
} }
@ -143,167 +142,212 @@ class AccountController extends BaseController
return Response::json($data); return Response::json($data);
} }
public function showSection($section = ACCOUNT_DETAILS, $subSection = false) public function showSection($section = false)
{ {
if ($section == ACCOUNT_DETAILS) { if (!$section) {
return Redirect::to('/settings/' . ACCOUNT_COMPANY_DETAILS, 301);
}
$oauthLoginUrls = []; if ($section == ACCOUNT_COMPANY_DETAILS) {
foreach (AuthService::$providers as $provider) { return self::showCompanyDetails();
$oauthLoginUrls[] = ['label' => $provider, 'url' => '/auth/' . strtolower($provider)]; } elseif ($section == ACCOUNT_USER_DETAILS) {
} return self::showUserDetails();
} elseif ($section == ACCOUNT_LOCALIZATION) {
$data = [ return self::showLocalization();
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
'countries' => Cache::get('countries'),
'sizes' => Cache::get('sizes'),
'industries' => Cache::get('industries'),
'timezones' => Cache::get('timezones'),
'dateFormats' => Cache::get('dateFormats'),
'datetimeFormats' => Cache::get('datetimeFormats'),
'currencies' => Cache::get('currencies'),
'languages' => Cache::get('languages'),
'title' => trans('texts.company_details'),
'user' => Auth::user(),
'oauthProviderName' => AuthService::getProviderName(Auth::user()->oauth_provider_id),
'oauthLoginUrls' => $oauthLoginUrls,
];
return View::make('accounts.details', $data);
} elseif ($section == ACCOUNT_PAYMENTS) { } elseif ($section == ACCOUNT_PAYMENTS) {
return self::showOnlinePayments();
$account = Auth::user()->account;
$account->load('account_gateways');
$count = count($account->account_gateways);
if ($count == 0) {
return Redirect::to('gateways/create');
} else {
return View::make('accounts.payments', [
'showAdd' => $count < count(Gateway::$paymentTypes),
'title' => trans('texts.online_payments')
]);
}
} elseif ($section == ACCOUNT_NOTIFICATIONS) {
$data = [
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
'title' => trans('texts.notifications'),
];
return View::make('accounts.notifications', $data);
} elseif ($section == ACCOUNT_IMPORT_EXPORT) { } elseif ($section == ACCOUNT_IMPORT_EXPORT) {
return View::make('accounts.import_export', ['title' => trans('texts.import_export')]); return View::make('accounts.import_export', ['title' => trans('texts.import_export')]);
} elseif ($section == ACCOUNT_ADVANCED_SETTINGS) { } elseif ($section == ACCOUNT_INVOICE_DESIGN || $section == ACCOUNT_CUSTOMIZE_DESIGN) {
$account = Auth::user()->account->load('country'); return self::showInvoiceDesign($section);
} elseif ($section === ACCOUNT_TEMPLATES_AND_REMINDERS) {
return self::showTemplates();
} elseif ($section === ACCOUNT_PRODUCTS) {
return self::showProducts();
} else {
$data = [ $data = [
'account' => $account, 'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
'feature' => $subSection, 'title' => trans("texts.{$section}"),
'title' => trans('texts.invoice_settings'), 'section' => $section
]; ];
return View::make("accounts.{$section}", $data);
if ($subSection == ACCOUNT_INVOICE_DESIGN
|| $subSection == ACCOUNT_CUSTOMIZE_DESIGN) {
$invoice = new stdClass();
$client = new stdClass();
$contact = new stdClass();
$invoiceItem = new stdClass();
$client->name = 'Sample Client';
$client->address1 = '';
$client->city = '';
$client->state = '';
$client->postal_code = '';
$client->work_phone = '';
$client->work_email = '';
$invoice->invoice_number = $account->getNextInvoiceNumber();
$invoice->invoice_date = Utils::fromSqlDate(date('Y-m-d'));
$invoice->account = json_decode($account->toJson());
$invoice->amount = $invoice->balance = 100;
$invoice->terms = trim($account->invoice_terms);
$invoice->invoice_footer = trim($account->invoice_footer);
$contact->email = 'contact@gmail.com';
$client->contacts = [$contact];
$invoiceItem->cost = 100;
$invoiceItem->qty = 1;
$invoiceItem->notes = 'Notes';
$invoiceItem->product_key = 'Item';
$invoice->client = $client;
$invoice->invoice_items = [$invoiceItem];
$data['account'] = $account;
$data['invoice'] = $invoice;
$data['invoiceLabels'] = json_decode($account->invoice_labels) ?: [];
$data['title'] = trans('texts.invoice_design');
$data['invoiceDesigns'] = InvoiceDesign::getDesigns();
$design = false;
foreach ($data['invoiceDesigns'] as $item) {
if ($item->id == $account->invoice_design_id) {
$design = $item->javascript;
break;
}
}
if ($subSection == ACCOUNT_CUSTOMIZE_DESIGN) {
$data['customDesign'] = ($account->custom_design && !$design) ? $account->custom_design : $design;
}
} else if ($subSection == ACCOUNT_TEMPLATES_AND_REMINDERS) {
$data['templates'] = [];
$data['defaultTemplates'] = [];
foreach ([ENTITY_INVOICE, ENTITY_QUOTE, ENTITY_PAYMENT, REMINDER1, REMINDER2, REMINDER3] as $type) {
$data['templates'][$type] = [
'subject' => $account->getEmailSubject($type),
'template' => $account->getEmailTemplate($type),
];
$data['defaultTemplates'][$type] = [
'subject' => $account->getDefaultEmailSubject($type),
'template' => $account->getDefaultEmailTemplate($type),
];
}
$data['emailFooter'] = $account->getEmailFooter();
$data['title'] = trans('texts.email_templates');
} else if ($subSection == ACCOUNT_USER_MANAGEMENT) {
$data['title'] = trans('texts.users_and_tokens');
}
return View::make("accounts.{$subSection}", $data);
} elseif ($section == ACCOUNT_PRODUCTS) {
$data = [
'account' => Auth::user()->account,
'title' => trans('texts.product_library'),
];
return View::make('accounts.products', $data);
} }
} }
public function doSection($section = ACCOUNT_DETAILS, $subSection = false) private function showCompanyDetails()
{ {
if ($section == ACCOUNT_DETAILS) { $data = [
return AccountController::saveDetails(); 'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
} elseif ($section == ACCOUNT_IMPORT_EXPORT) { 'countries' => Cache::get('countries'),
return AccountController::importFile(); 'sizes' => Cache::get('sizes'),
} elseif ($section == ACCOUNT_MAP) { 'industries' => Cache::get('industries'),
return AccountController::mapFile(); 'title' => trans('texts.company_details'),
} elseif ($section == ACCOUNT_NOTIFICATIONS) { ];
return AccountController::saveNotifications();
} elseif ($section == ACCOUNT_EXPORT) { return View::make('accounts.details', $data);
return AccountController::export(); }
} elseif ($section == ACCOUNT_ADVANCED_SETTINGS) {
if ($subSection == ACCOUNT_INVOICE_SETTINGS) { private function showUserDetails()
return AccountController::saveInvoiceSettings(); {
} elseif ($subSection == ACCOUNT_INVOICE_DESIGN) { $oauthLoginUrls = [];
return AccountController::saveInvoiceDesign(); foreach (AuthService::$providers as $provider) {
} elseif ($subSection == ACCOUNT_CUSTOMIZE_DESIGN) { $oauthLoginUrls[] = ['label' => $provider, 'url' => '/auth/' . strtolower($provider)];
return AccountController::saveCustomizeDesign(); }
} elseif ($subSection == ACCOUNT_TEMPLATES_AND_REMINDERS) {
return AccountController::saveEmailTemplates(); $data = [
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
'title' => trans('texts.user_details'),
'user' => Auth::user(),
'oauthProviderName' => AuthService::getProviderName(Auth::user()->oauth_provider_id),
'oauthLoginUrls' => $oauthLoginUrls,
];
return View::make('accounts.user_details', $data);
}
private function showLocalization()
{
$data = [
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
'timezones' => Cache::get('timezones'),
'dateFormats' => Cache::get('dateFormats'),
'datetimeFormats' => Cache::get('datetimeFormats'),
'currencies' => Cache::get('currencies'),
'languages' => Cache::get('languages'),
'title' => trans('texts.localization'),
];
return View::make('accounts.localization', $data);
}
private function showOnlinePayments()
{
$account = Auth::user()->account;
$account->load('account_gateways');
$count = count($account->account_gateways);
if ($count == 0) {
return Redirect::to('gateways/create');
} else {
return View::make('accounts.payments', [
'showAdd' => $count < count(Gateway::$paymentTypes),
'title' => trans('texts.online_payments')
]);
}
}
private function showProducts()
{
$data = [
'account' => Auth::user()->account,
'title' => trans('texts.product_library'),
];
return View::make('accounts.products', $data);
}
private function showInvoiceDesign($section)
{
$account = Auth::user()->account->load('country');
$invoice = new stdClass();
$client = new stdClass();
$contact = new stdClass();
$invoiceItem = new stdClass();
$client->name = 'Sample Client';
$client->address1 = '';
$client->city = '';
$client->state = '';
$client->postal_code = '';
$client->work_phone = '';
$client->work_email = '';
$invoice->invoice_number = $account->getNextInvoiceNumber();
$invoice->invoice_date = Utils::fromSqlDate(date('Y-m-d'));
$invoice->account = json_decode($account->toJson());
$invoice->amount = $invoice->balance = 100;
$invoice->terms = trim($account->invoice_terms);
$invoice->invoice_footer = trim($account->invoice_footer);
$contact->email = 'contact@gmail.com';
$client->contacts = [$contact];
$invoiceItem->cost = 100;
$invoiceItem->qty = 1;
$invoiceItem->notes = 'Notes';
$invoiceItem->product_key = 'Item';
$invoice->client = $client;
$invoice->invoice_items = [$invoiceItem];
$data['account'] = $account;
$data['invoice'] = $invoice;
$data['invoiceLabels'] = json_decode($account->invoice_labels) ?: [];
$data['title'] = trans('texts.invoice_design');
$data['invoiceDesigns'] = InvoiceDesign::getDesigns();
$data['section'] = $section;
$design = false;
foreach ($data['invoiceDesigns'] as $item) {
if ($item->id == $account->invoice_design_id) {
$design = $item->javascript;
break;
} }
} elseif ($section == ACCOUNT_PRODUCTS) { }
if ($section == ACCOUNT_CUSTOMIZE_DESIGN) {
$data['customDesign'] = ($account->custom_design && !$design) ? $account->custom_design : $design;
}
return View::make("accounts.{$section}", $data);
}
private function showTemplates()
{
$account = Auth::user()->account->load('country');
$data['account'] = $account;
$data['templates'] = [];
$data['defaultTemplates'] = [];
foreach ([ENTITY_INVOICE, ENTITY_QUOTE, ENTITY_PAYMENT, REMINDER1, REMINDER2, REMINDER3] as $type) {
$data['templates'][$type] = [
'subject' => $account->getEmailSubject($type),
'template' => $account->getEmailTemplate($type),
];
$data['defaultTemplates'][$type] = [
'subject' => $account->getDefaultEmailSubject($type),
'template' => $account->getDefaultEmailTemplate($type),
];
}
$data['emailFooter'] = $account->getEmailFooter();
$data['title'] = trans('texts.email_templates');
return View::make('accounts.templates_and_reminders', $data);
}
public function doSection($section = ACCOUNT_COMPANY_DETAILS)
{
if ($section === ACCOUNT_COMPANY_DETAILS) {
return AccountController::saveDetails();
} elseif ($section === ACCOUNT_USER_DETAILS) {
return AccountController::saveUserDetails();
} elseif ($section === ACCOUNT_LOCALIZATION) {
return AccountController::saveLocalization();
} elseif ($section === ACCOUNT_IMPORT_EXPORT) {
return AccountController::importFile();
} elseif ($section === ACCOUNT_MAP) {
return AccountController::mapFile();
} elseif ($section === ACCOUNT_NOTIFICATIONS) {
return AccountController::saveNotifications();
} elseif ($section === ACCOUNT_EXPORT) {
return AccountController::export();
} elseif ($section === ACCOUNT_INVOICE_SETTINGS) {
return AccountController::saveInvoiceSettings();
} elseif ($section === ACCOUNT_INVOICE_DESIGN) {
return AccountController::saveInvoiceDesign();
} elseif ($section === ACCOUNT_CUSTOMIZE_DESIGN) {
return AccountController::saveCustomizeDesign();
} elseif ($section === ACCOUNT_TEMPLATES_AND_REMINDERS) {
return AccountController::saveEmailTemplates();
} elseif ($section === ACCOUNT_PRODUCTS) {
return AccountController::saveProducts(); return AccountController::saveProducts();
} }
} }
@ -318,7 +362,7 @@ class AccountController extends BaseController
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
} }
return Redirect::to('company/advanced_settings/customize_design'); return Redirect::to('settings/' . ACCOUNT_CUSTOMIZE_DESIGN);
} }
private function saveEmailTemplates() private function saveEmailTemplates()
@ -351,7 +395,7 @@ class AccountController extends BaseController
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
} }
return Redirect::to('company/advanced_settings/templates_and_reminders'); return Redirect::to('settings/' . ACCOUNT_TEMPLATES_AND_REMINDERS);
} }
private function saveProducts() private function saveProducts()
@ -363,7 +407,7 @@ class AccountController extends BaseController
$account->save(); $account->save();
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/products'); return Redirect::to('settings/' . ACCOUNT_PRODUCTS);
} }
private function saveInvoiceSettings() private function saveInvoiceSettings()
@ -386,7 +430,7 @@ class AccountController extends BaseController
$validator = Validator::make(Input::all(), $rules); $validator = Validator::make(Input::all(), $rules);
if ($validator->fails()) { if ($validator->fails()) {
return Redirect::to('company/details') return Redirect::to('settings/' . ACCOUNT_INVOICE_SETTINGS)
->withErrors($validator) ->withErrors($validator)
->withInput(); ->withInput();
} else { } else {
@ -420,8 +464,7 @@ class AccountController extends BaseController
if (!$account->share_counter && $account->invoice_number_prefix == $account->quote_number_prefix) { if (!$account->share_counter && $account->invoice_number_prefix == $account->quote_number_prefix) {
Session::flash('error', trans('texts.invalid_counter')); Session::flash('error', trans('texts.invalid_counter'));
return Redirect::to('settings/' . ACCOUNT_INVOICE_SETTINGS)->withInput();
return Redirect::to('company/advanced_settings/invoice_settings')->withInput();
} else { } else {
$account->save(); $account->save();
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
@ -429,7 +472,7 @@ class AccountController extends BaseController
} }
} }
return Redirect::to('company/advanced_settings/invoice_settings'); return Redirect::to('settings/' . ACCOUNT_INVOICE_SETTINGS);
} }
private function saveInvoiceDesign() private function saveInvoiceDesign()
@ -457,7 +500,7 @@ class AccountController extends BaseController
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
} }
return Redirect::to('company/advanced_settings/invoice_design'); return Redirect::to('settings/' . ACCOUNT_INVOICE_DESIGN);
} }
private function export() private function export()
@ -568,7 +611,7 @@ class AccountController extends BaseController
if ($file == null) { if ($file == null) {
Session::flash('error', trans('texts.select_file')); Session::flash('error', trans('texts.select_file'));
return Redirect::to('company/import_export'); return Redirect::to('settings/' . ACCOUNT_IMPORT_EXPORT);
} }
$name = $file->getRealPath(); $name = $file->getRealPath();
@ -582,7 +625,7 @@ class AccountController extends BaseController
$message = trans('texts.limit_clients', ['count' => Auth::user()->getMaxNumClients()]); $message = trans('texts.limit_clients', ['count' => Auth::user()->getMaxNumClients()]);
Session::flash('error', $message); Session::flash('error', $message);
return Redirect::to('company/import_export'); return Redirect::to('settings/' . ACCOUNT_IMPORT_EXPORT);
} }
Session::put('data', $csv->data); Session::put('data', $csv->data);
@ -680,7 +723,7 @@ class AccountController extends BaseController
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/notifications'); return Redirect::to('settings/' . ACCOUNT_NOTIFICATIONS);
} }
private function saveDetails() private function saveDetails()
@ -690,16 +733,10 @@ class AccountController extends BaseController
'logo' => 'sometimes|max:1024|mimes:jpeg,gif,png', 'logo' => 'sometimes|max:1024|mimes:jpeg,gif,png',
); );
$user = Auth::user()->account->users()->orderBy('id')->first();
if (Auth::user()->id === $user->id) {
$rules['email'] = 'email|required|unique:users,email,'.$user->id.',id';
}
$validator = Validator::make(Input::all(), $rules); $validator = Validator::make(Input::all(), $rules);
if ($validator->fails()) { if ($validator->fails()) {
return Redirect::to('company/details') return Redirect::to('settings/' . ACCOUNT_COMPANY_DETAILS)
->withErrors($validator) ->withErrors($validator)
->withInput(); ->withInput();
} else { } else {
@ -717,29 +754,7 @@ class AccountController extends BaseController
$account->country_id = Input::get('country_id') ? Input::get('country_id') : null; $account->country_id = Input::get('country_id') ? Input::get('country_id') : null;
$account->size_id = Input::get('size_id') ? Input::get('size_id') : null; $account->size_id = Input::get('size_id') ? Input::get('size_id') : null;
$account->industry_id = Input::get('industry_id') ? Input::get('industry_id') : null; $account->industry_id = Input::get('industry_id') ? Input::get('industry_id') : null;
$account->timezone_id = Input::get('timezone_id') ? Input::get('timezone_id') : null;
$account->date_format_id = Input::get('date_format_id') ? Input::get('date_format_id') : null;
$account->datetime_format_id = Input::get('datetime_format_id') ? Input::get('datetime_format_id') : null;
$account->currency_id = Input::get('currency_id') ? Input::get('currency_id') : 1; // US Dollar
$account->language_id = Input::get('language_id') ? Input::get('language_id') : 1; // English
$account->military_time = Input::get('military_time') ? true : false;
$account->save(); $account->save();
$user = Auth::user();
$user->first_name = trim(Input::get('first_name'));
$user->last_name = trim(Input::get('last_name'));
$user->username = trim(Input::get('email'));
$user->email = trim(strtolower(Input::get('email')));
$user->phone = trim(Input::get('phone'));
if (Utils::isNinja()) {
if (Input::get('referral_code') && !$user->referral_code) {
$user->referral_code = $this->accountRepo->getReferralCode();
}
}
if (Utils::isNinjaDev()) {
$user->dark_mode = Input::get('dark_mode') ? true : false;
}
$user->save();
/* Logo image file */ /* Logo image file */
if ($file = Input::file('logo')) { if ($file = Input::file('logo')) {
@ -770,10 +785,61 @@ class AccountController extends BaseController
Event::fire(new UserSettingsChanged()); Event::fire(new UserSettingsChanged());
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/details'); return Redirect::to('settings/' . ACCOUNT_COMPANY_DETAILS);
} }
} }
private function saveUserDetails()
{
$user = Auth::user();
$rules = ['email' => 'email|required|unique:users,email,'.$user->id.',id'];
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails()) {
return Redirect::to('settings/' . ACCOUNT_USER_DETAILS)
->withErrors($validator)
->withInput();
} else {
$user->first_name = trim(Input::get('first_name'));
$user->last_name = trim(Input::get('last_name'));
$user->username = trim(Input::get('email'));
$user->email = trim(strtolower(Input::get('email')));
$user->phone = trim(Input::get('phone'));
if (Utils::isNinja()) {
if (Input::get('referral_code') && !$user->referral_code) {
$user->referral_code = $this->accountRepo->getReferralCode();
}
}
if (Utils::isNinjaDev()) {
$user->dark_mode = Input::get('dark_mode') ? true : false;
}
$user->save();
Event::fire(new UserSettingsChanged());
Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('settings/' . ACCOUNT_USER_DETAILS);
}
}
private function saveLocalization()
{
$account = Auth::user()->account;
$account->timezone_id = Input::get('timezone_id') ? Input::get('timezone_id') : null;
$account->date_format_id = Input::get('date_format_id') ? Input::get('date_format_id') : null;
$account->datetime_format_id = Input::get('datetime_format_id') ? Input::get('datetime_format_id') : null;
$account->currency_id = Input::get('currency_id') ? Input::get('currency_id') : 1; // US Dollar
$account->language_id = Input::get('language_id') ? Input::get('language_id') : 1; // English
$account->military_time = Input::get('military_time') ? true : false;
$account->save();
Event::fire(new UserSettingsChanged());
Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('settings/' . ACCOUNT_LOCALIZATION);
}
public function removeLogo() public function removeLogo()
{ {
File::delete('logo/'.Auth::user()->account->account_key.'.jpg'); File::delete('logo/'.Auth::user()->account->account_key.'.jpg');
@ -781,7 +847,7 @@ class AccountController extends BaseController
Session::flash('message', trans('texts.removed_logo')); Session::flash('message', trans('texts.removed_logo'));
return Redirect::to('company/details'); return Redirect::to('settings/' . ACCOUNT_COMPANY_DETAILS);
} }
public function checkEmail() public function checkEmail()
@ -879,6 +945,26 @@ class AccountController extends BaseController
$user = Auth::user(); $user = Auth::user();
$this->userMailer->sendConfirmation($user); $this->userMailer->sendConfirmation($user);
return Redirect::to('/company/details')->with('message', trans('texts.confirmation_resent')); return Redirect::to('/settings/' . ACCOUNT_COMPANY_DETAILS)->with('message', trans('texts.confirmation_resent'));
}
public function redirectLegacy($section, $subSection = false)
{
if ($section === 'details') {
$section = ACCOUNT_COMPANY_DETAILS;
} elseif ($section === 'payments') {
$section = ACCOUNT_PAYMENTS;
} elseif ($section === 'advanced_settings') {
$section = $subSection;
if ($section === 'token_management') {
$section = ACCOUNT_API_TOKENS;
}
}
if (!in_array($section, array_merge(Account::$basicSettings, Account::$advancedSettings))) {
$section = ACCOUNT_COMPANY_DETAILS;
}
return Redirect::to("/settings/$section/", 301);
} }
} }

View File

@ -159,7 +159,6 @@ class AccountGatewayController extends BaseController
'gateways' => $gateways, 'gateways' => $gateways,
'creditCardTypes' => $creditCards, 'creditCardTypes' => $creditCards,
'tokenBillingOptions' => $tokenBillingOptions, 'tokenBillingOptions' => $tokenBillingOptions,
'showBreadcrumbs' => false,
'countGateways' => count($currentGateways) 'countGateways' => count($currentGateways)
]; ];
} }
@ -173,7 +172,7 @@ class AccountGatewayController extends BaseController
Session::flash('message', trans('texts.deleted_gateway')); Session::flash('message', trans('texts.deleted_gateway'));
return Redirect::to('company/payments'); return Redirect::to('settings/' . ACCOUNT_PAYMENTS);
} }
/** /**

View File

@ -61,7 +61,7 @@ class AuthController extends Controller {
$this->accountRepo->unlinkUserFromOauth(Auth::user()); $this->accountRepo->unlinkUserFromOauth(Auth::user());
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
return redirect()->to('/company/details'); return redirect()->to('/settings/' . ACCOUNT_COMPANY_DETAILS);
} }
public function getLoginWrapper() public function getLoginWrapper()

View File

@ -45,7 +45,6 @@ class ProductController extends BaseController
public function edit($publicId) public function edit($publicId)
{ {
$data = [ $data = [
'showBreadcrumbs' => false,
'product' => Product::scope($publicId)->firstOrFail(), 'product' => Product::scope($publicId)->firstOrFail(),
'method' => 'PUT', 'method' => 'PUT',
'url' => 'products/'.$publicId, 'url' => 'products/'.$publicId,
@ -58,12 +57,11 @@ class ProductController extends BaseController
public function create() public function create()
{ {
$data = [ $data = [
'showBreadcrumbs' => false, 'product' => null,
'product' => null, 'method' => 'POST',
'method' => 'POST', 'url' => 'products',
'url' => 'products', 'title' => trans('texts.create_product'),
'title' => trans('texts.create_product'), ];
];
return View::make('accounts.product', $data); return View::make('accounts.product', $data);
} }
@ -94,7 +92,7 @@ class ProductController extends BaseController
$message = $productPublicId ? trans('texts.updated_product') : trans('texts.created_product'); $message = $productPublicId ? trans('texts.updated_product') : trans('texts.created_product');
Session::flash('message', $message); Session::flash('message', $message);
return Redirect::to('company/products'); return Redirect::to('settings/' . ACCOUNT_PRODUCTS);
} }
public function archive($publicId) public function archive($publicId)
@ -104,6 +102,6 @@ class ProductController extends BaseController
Session::flash('message', trans('texts.archived_product')); Session::flash('message', trans('texts.archived_product'));
return Redirect::to('company/products'); return Redirect::to('settings/' . ACCOUNT_PRODUCTS);
} }
} }

View File

@ -33,7 +33,6 @@ class ReportController extends BaseController
} }
$data = [ $data = [
'feature' => ACCOUNT_DATA_VISUALIZATIONS,
'clients' => $clients, 'clients' => $clients,
'message' => $message, 'message' => $message,
]; ];
@ -276,7 +275,6 @@ class ReportController extends BaseController
'startDate' => $startDate->format(Session::get(SESSION_DATE_FORMAT)), 'startDate' => $startDate->format(Session::get(SESSION_DATE_FORMAT)),
'endDate' => $endDate->format(Session::get(SESSION_DATE_FORMAT)), 'endDate' => $endDate->format(Session::get(SESSION_DATE_FORMAT)),
'groupBy' => $groupBy, 'groupBy' => $groupBy,
'feature' => ACCOUNT_CHART_BUILDER,
'displayData' => $displayData, 'displayData' => $displayData,
'columns' => $columns, 'columns' => $columns,
'reportTotals' => $reportTotals, 'reportTotals' => $reportTotals,

View File

@ -67,7 +67,6 @@ class TokenController extends BaseController
->where('public_id', '=', $publicId)->firstOrFail(); ->where('public_id', '=', $publicId)->firstOrFail();
$data = [ $data = [
'showBreadcrumbs' => false,
'token' => $token, 'token' => $token,
'method' => 'PUT', 'method' => 'PUT',
'url' => 'tokens/'.$publicId, 'url' => 'tokens/'.$publicId,
@ -94,12 +93,10 @@ class TokenController extends BaseController
public function create() public function create()
{ {
$data = [ $data = [
'showBreadcrumbs' => false,
'token' => null, 'token' => null,
'method' => 'POST', 'method' => 'POST',
'url' => 'tokens', 'url' => 'tokens',
'title' => trans('texts.add_token'), 'title' => trans('texts.add_token'),
'feature' => 'tokens',
]; ];
return View::make('accounts.token', $data); return View::make('accounts.token', $data);
@ -115,7 +112,7 @@ class TokenController extends BaseController
Session::flash('message', trans('texts.deleted_token')); Session::flash('message', trans('texts.deleted_token'));
return Redirect::to('company/advanced_settings/token_management'); return Redirect::to('settings/' . ACCOUNT_API_TOKENS);
} }
/** /**
@ -163,7 +160,7 @@ class TokenController extends BaseController
Session::flash('message', $message); Session::flash('message', $message);
} }
return Redirect::to('company/advanced_settings/token_management'); return Redirect::to('settings/' . ACCOUNT_API_TOKENS);
} }
} }

View File

@ -106,7 +106,6 @@ class UserController extends BaseController
->where('public_id', '=', $publicId)->firstOrFail(); ->where('public_id', '=', $publicId)->firstOrFail();
$data = [ $data = [
'showBreadcrumbs' => false,
'user' => $user, 'user' => $user,
'method' => 'PUT', 'method' => 'PUT',
'url' => 'users/'.$publicId, 'url' => 'users/'.$publicId,
@ -134,24 +133,22 @@ class UserController extends BaseController
{ {
if (!Auth::user()->registered) { if (!Auth::user()->registered) {
Session::flash('error', trans('texts.register_to_add_user')); Session::flash('error', trans('texts.register_to_add_user'));
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }
if (!Auth::user()->confirmed) { if (!Auth::user()->confirmed) {
Session::flash('error', trans('texts.confirmation_required')); Session::flash('error', trans('texts.confirmation_required'));
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }
if (Utils::isNinja()) { if (Utils::isNinja()) {
$count = User::where('account_id', '=', Auth::user()->account_id)->count(); $count = User::where('account_id', '=', Auth::user()->account_id)->count();
if ($count >= MAX_NUM_USERS) { if ($count >= MAX_NUM_USERS) {
Session::flash('error', trans('texts.limit_users')); Session::flash('error', trans('texts.limit_users'));
return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
return Redirect::to('company/advanced_settings/user_management');
} }
} }
$data = [ $data = [
'showBreadcrumbs' => false,
'user' => null, 'user' => null,
'method' => 'POST', 'method' => 'POST',
'url' => 'users', 'url' => 'users',
@ -171,7 +168,7 @@ class UserController extends BaseController
Session::flash('message', trans('texts.deleted_user')); Session::flash('message', trans('texts.deleted_user'));
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }
public function restoreUser($userPublicId) public function restoreUser($userPublicId)
@ -184,7 +181,7 @@ class UserController extends BaseController
Session::flash('message', trans('texts.restored_user')); Session::flash('message', trans('texts.restored_user'));
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }
/** /**
@ -247,7 +244,7 @@ class UserController extends BaseController
Session::flash('message', $message); Session::flash('message', $message);
} }
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }
public function sendConfirmation($userPublicId) public function sendConfirmation($userPublicId)
@ -258,7 +255,7 @@ class UserController extends BaseController
$this->userMailer->sendConfirmation($user, Auth::user()); $this->userMailer->sendConfirmation($user, Auth::user());
Session::flash('message', trans('texts.sent_invite')); Session::flash('message', trans('texts.sent_invite'));
return Redirect::to('company/advanced_settings/user_management'); return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
} }

View File

@ -121,14 +121,16 @@ Route::group(['middleware' => 'auth'], function() {
Route::resource('products', 'ProductController'); Route::resource('products', 'ProductController');
Route::get('products/{product_id}/archive', 'ProductController@archive'); Route::get('products/{product_id}/archive', 'ProductController@archive');
Route::get('company/advanced_settings/data_visualizations', 'ReportController@d3'); Route::get('company/{section}/{subSection?}', 'AccountController@redirectLegacy');
Route::get('company/advanced_settings/charts_and_reports', 'ReportController@showReports'); Route::get('settings/data_visualizations', 'ReportController@d3');
Route::post('company/advanced_settings/charts_and_reports', 'ReportController@showReports'); Route::get('settings/charts_and_reports', 'ReportController@showReports');
Route::post('settings/charts_and_reports', 'ReportController@showReports');
Route::post('company/cancel_account', 'AccountController@cancelAccount'); Route::post('settings/cancel_account', 'AccountController@cancelAccount');
Route::get('settings/{section?}', 'AccountController@showSection');
Route::post('settings/{section?}', 'AccountController@doSection');
Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData')); Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData'));
Route::get('company/{section?}/{sub_section?}', 'AccountController@showSection');
Route::post('company/{section?}/{sub_section?}', 'AccountController@doSection');
Route::post('user/setTheme', 'UserController@setTheme'); Route::post('user/setTheme', 'UserController@setTheme');
Route::post('remove_logo', 'AccountController@removeLogo'); Route::post('remove_logo', 'AccountController@removeLogo');
Route::post('account/go_pro', 'AccountController@enableProPlan'); Route::post('account/go_pro', 'AccountController@enableProPlan');
@ -183,7 +185,6 @@ Route::group(['middleware' => 'auth'], function() {
Route::post('credits/bulk', 'CreditController@bulk'); Route::post('credits/bulk', 'CreditController@bulk');
get('/resend_confirmation', 'AccountController@resendConfirmation'); get('/resend_confirmation', 'AccountController@resendConfirmation');
//Route::resource('timesheets', 'TimesheetController');
}); });
// Route group for API // Route group for API
@ -253,21 +254,26 @@ if (!defined('CONTACT_EMAIL')) {
define('PERSON_CONTACT', 'contact'); define('PERSON_CONTACT', 'contact');
define('PERSON_USER', 'user'); define('PERSON_USER', 'user');
define('ACCOUNT_DETAILS', 'details'); define('BASIC_SETTINGS', 'basic_settings');
define('ADVANCED_SETTINGS', 'advanced_settings');
define('ACCOUNT_COMPANY_DETAILS', 'company_details');
define('ACCOUNT_USER_DETAILS', 'user_details');
define('ACCOUNT_LOCALIZATION', 'localization');
define('ACCOUNT_NOTIFICATIONS', 'notifications'); define('ACCOUNT_NOTIFICATIONS', 'notifications');
define('ACCOUNT_IMPORT_EXPORT', 'import_export'); define('ACCOUNT_IMPORT_EXPORT', 'import_export');
define('ACCOUNT_PAYMENTS', 'payments'); define('ACCOUNT_PAYMENTS', 'online_payments');
define('ACCOUNT_MAP', 'import_map'); define('ACCOUNT_MAP', 'import_map');
define('ACCOUNT_EXPORT', 'export'); define('ACCOUNT_EXPORT', 'export');
define('ACCOUNT_PRODUCTS', 'products'); define('ACCOUNT_PRODUCTS', 'products');
define('ACCOUNT_ADVANCED_SETTINGS', 'advanced_settings'); define('ACCOUNT_ADVANCED_SETTINGS', 'advanced_settings');
define('ACCOUNT_INVOICE_SETTINGS', 'invoice_settings'); define('ACCOUNT_INVOICE_SETTINGS', 'invoice_settings');
define('ACCOUNT_INVOICE_DESIGN', 'invoice_design'); define('ACCOUNT_INVOICE_DESIGN', 'invoice_design');
define('ACCOUNT_CHART_BUILDER', 'chart_builder'); define('ACCOUNT_CHARTS_AND_REPORTS', 'charts_and_reports');
define('ACCOUNT_USER_MANAGEMENT', 'user_management'); define('ACCOUNT_USER_MANAGEMENT', 'user_management');
define('ACCOUNT_DATA_VISUALIZATIONS', 'data_visualizations'); define('ACCOUNT_DATA_VISUALIZATIONS', 'data_visualizations');
define('ACCOUNT_TEMPLATES_AND_REMINDERS', 'templates_and_reminders'); define('ACCOUNT_TEMPLATES_AND_REMINDERS', 'templates_and_reminders');
define('ACCOUNT_TOKEN_MANAGEMENT', 'token_management'); define('ACCOUNT_API_TOKENS', 'api_tokens');
define('ACCOUNT_CUSTOMIZE_DESIGN', 'customize_design'); define('ACCOUNT_CUSTOMIZE_DESIGN', 'customize_design');

View File

@ -15,6 +15,26 @@ class Account extends Eloquent
protected $dates = ['deleted_at']; protected $dates = ['deleted_at'];
protected $hidden = ['ip']; protected $hidden = ['ip'];
public static $basicSettings = [
ACCOUNT_COMPANY_DETAILS,
ACCOUNT_USER_DETAILS,
ACCOUNT_LOCALIZATION,
ACCOUNT_PAYMENTS,
ACCOUNT_PRODUCTS,
ACCOUNT_NOTIFICATIONS,
ACCOUNT_IMPORT_EXPORT,
];
public static $advancedSettings = [
ACCOUNT_INVOICE_DESIGN,
ACCOUNT_INVOICE_SETTINGS,
ACCOUNT_TEMPLATES_AND_REMINDERS,
ACCOUNT_CHARTS_AND_REPORTS,
ACCOUNT_DATA_VISUALIZATIONS,
ACCOUNT_USER_MANAGEMENT,
ACCOUNT_API_TOKENS,
];
/* /*
protected $casts = [ protected $casts = [
'invoice_settings' => 'object', 'invoice_settings' => 'object',

View File

@ -145,7 +145,6 @@ class ContactMailer extends Mailer
$subject = $this->processVariables($emailSubject, $variables); $subject = $this->processVariables($emailSubject, $variables);
$data['invoice_id'] = $payment->invoice->id; $data['invoice_id'] = $payment->invoice->id;
$invoice->updateCachedPDF();
if ($user->email && $contact->email) { if ($user->email && $contact->email) {
$this->sendTo($contact->email, $user->email, $accountName, $subject, $view, $data); $this->sendTo($contact->email, $user->email, $accountName, $subject, $view, $data);

View File

@ -49,7 +49,7 @@ class AuthService
Session::flash('warning', trans('texts.success_message')); Session::flash('warning', trans('texts.success_message'));
} else { } else {
Session::flash('message', trans('texts.updated_settings')); Session::flash('message', trans('texts.updated_settings'));
return redirect()->to('/company/details'); return redirect()->to('/settings/' . ACCOUNT_COMPANY_DETAILS);
} }
} else { } else {
Session::flash('error', $result); Session::flash('error', $result);

10
public/css/built.css vendored
View File

@ -3340,4 +3340,14 @@ ul.user-accounts a:hover div.remove {
.tooltip-inner { .tooltip-inner {
text-align:left; text-align:left;
width: 350px; width: 350px;
}
.list-group-item.selected:before {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 2px;
content: "";
background-color: #e37329;
} }

View File

@ -866,11 +866,11 @@ body {
} }
/* Hide bootstrap sort header icons */ /* Hide bootstrap sort header icons */
table.data-table thead .sorting:after { content: '' !important } table.table thead .sorting:after { content: '' !important }
table.data-table thead .sorting_asc:after { content: '' !important } table.table thead .sorting_asc:after { content: '' !important }
table.data-table thead .sorting_desc:after { content: '' !important} table.table thead .sorting_desc:after { content: '' !important }
table.data-table thead .sorting_asc_disabled:after { content: '' !important } table.table thead .sorting_asc_disabled:after { content: '' !important }
table.data-table thead .sorting_desc_disabled:after { content: '' !important } table.table thead .sorting_desc_disabled:after { content: '' !important }
.dataTables_length { .dataTables_length {
padding-left: 20px; padding-left: 20px;

11
public/css/style.css vendored
View File

@ -990,4 +990,15 @@ ul.user-accounts a:hover div.remove {
.tooltip-inner { .tooltip-inner {
text-align:left; text-align:left;
width: 350px; width: 350px;
}
/* Show selected section in settings nav */
.list-group-item.selected:before {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 2px;
content: "";
background-color: #e37329;
} }

File diff suppressed because it is too large Load Diff

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Sehr geehrte/r :name,', 'email_salutation' => 'Sehr geehrte/r :name,',
'email_signature' => 'Mit freundlichen Grüßen,', 'email_signature' => 'Mit freundlichen Grüßen,',
'email_from' => 'Das InvoiceNinja Team', 'email_from' => 'Das InvoiceNinja Team',
'user_email_footer' => 'Um deine E-Mail-Benachrichtigungen anzupassen besuche bitte '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Um deine E-Mail-Benachrichtigungen anzupassen besuche bitte '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Um deine Kundenrechnung anzuschauen, klicke auf den folgenden Link:', 'invoice_link_message' => 'Um deine Kundenrechnung anzuschauen, klicke auf den folgenden Link:',
'notification_invoice_paid_subject' => 'Die Rechnung :invoice wurde von :client bezahlt.', 'notification_invoice_paid_subject' => 'Die Rechnung :invoice wurde von :client bezahlt.',
'notification_invoice_sent_subject' => 'Die Rechnung :invoice wurde an :client versendet.', 'notification_invoice_sent_subject' => 'Die Rechnung :invoice wurde an :client versendet.',
@ -817,6 +817,10 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Dear :name,', 'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,', 'email_signature' => 'Regards,',
'email_from' => 'The Invoice Ninja Team', 'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/company/notifications', 'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:', 'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client', 'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_invoice_sent_subject' => 'Invoice :invoice was sent to :client', 'notification_invoice_sent_subject' => 'Invoice :invoice was sent to :client',
@ -557,7 +557,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' => 'Credit Card',
'change_password' => 'Change password', 'change_password' => 'Change password',
'current_password' => 'Current password', 'current_password' => 'Current password',
@ -587,7 +587,7 @@ 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' => 'Credit Card',
'payment_type_paypal' => 'PayPal', 'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin', 'payment_type_bitcoin' => 'Bitcoin',
'knowledge_base' => 'Knowledge Base', 'knowledge_base' => 'Knowledge Base',
@ -818,6 +818,9 @@ return array(
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'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',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -256,7 +256,7 @@ return array(
'email_salutation' => 'Estimado :name,', 'email_salutation' => 'Estimado :name,',
'email_signature' => 'Un saludo cordial,', 'email_signature' => 'Un saludo cordial,',
'email_from' => 'El equipo de Invoice Ninja ', 'email_from' => 'El equipo de Invoice Ninja ',
'user_email_footer' => 'Para ajustar la configuración de las notificaciones de tu correo, visita '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Para ajustar la configuración de las notificaciones de tu correo, visita '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Para visualizar la factura de cliente, haz clic en el enlace abajo:', 'invoice_link_message' => 'Para visualizar la factura de cliente, haz clic en el enlace abajo:',
'notification_invoice_paid_subject' => 'La factura :invoice ha sido pagada por el cliente :client', 'notification_invoice_paid_subject' => 'La factura :invoice ha sido pagada por el cliente :client',
'notification_invoice_sent_subject' => 'La factura :invoice ha sido enviada a el cliente :client', 'notification_invoice_sent_subject' => 'La factura :invoice ha sido enviada a el cliente :client',
@ -795,6 +795,10 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -1,477 +1,476 @@
<?php <?php
return array( return array(
// client // client
'organization' => 'Empresa', 'organization' => 'Empresa',
'name' => 'Nombre de Empresa', 'name' => 'Nombre de Empresa',
'website' => 'Sitio Web', 'website' => 'Sitio Web',
'work_phone' => 'Teléfono', 'work_phone' => 'Teléfono',
'address' => 'Dirección', 'address' => 'Dirección',
'address1' => 'Calle', 'address1' => 'Calle',
'address2' => 'Bloq/Pta', 'address2' => 'Bloq/Pta',
'city' => 'Ciudad', 'city' => 'Ciudad',
'state' => 'Provincia', 'state' => 'Provincia',
'postal_code' => 'Código Postal', 'postal_code' => 'Código Postal',
'country_id' => 'País', 'country_id' => 'País',
'contacts' => 'Contactos', 'contacts' => 'Contactos',
'first_name' => 'Nombres', 'first_name' => 'Nombres',
'last_name' => 'Apellidos', 'last_name' => 'Apellidos',
'phone' => 'Teléfono', 'phone' => 'Teléfono',
'email' => 'Email', 'email' => 'Email',
'additional_info' => 'Información adicional', 'additional_info' => 'Información adicional',
'payment_terms' => 'Plazos de pago', // 'payment_terms' => 'Plazos de pago', //
'currency_id' => 'Divisa', 'currency_id' => 'Divisa',
'size_id' => 'Tamaño', 'size_id' => 'Tamaño',
'industry_id' => 'Industria', 'industry_id' => 'Industria',
'private_notes' => 'Notas Privadas', 'private_notes' => 'Notas Privadas',
// invoice // invoice
'invoice' => 'Factura', 'invoice' => 'Factura',
'client' => 'Cliente', 'client' => 'Cliente',
'invoice_date' => 'Fecha de factura', 'invoice_date' => 'Fecha de factura',
'due_date' => 'Fecha de pago', 'due_date' => 'Fecha de pago',
'invoice_number' => 'Número de Factura', 'invoice_number' => 'Número de Factura',
'invoice_number_short' => 'Factura Nº', 'invoice_number_short' => 'Factura Nº',
'po_number' => 'Apartado de correo', 'po_number' => 'Apartado de correo',
'po_number_short' => 'Apdo.', 'po_number_short' => 'Apdo.',
'frequency_id' => 'Frecuencia', 'frequency_id' => 'Frecuencia',
'discount' => 'Descuento', 'discount' => 'Descuento',
'taxes' => 'Impuestos', 'taxes' => 'Impuestos',
'tax' => 'IVA', 'tax' => 'IVA',
'item' => 'Concepto', 'item' => 'Concepto',
'description' => 'Descripción', 'description' => 'Descripción',
'unit_cost' => 'Coste unitario', 'unit_cost' => 'Coste unitario',
'quantity' => 'Cantidad', 'quantity' => 'Cantidad',
'line_total' => 'Total', 'line_total' => 'Total',
'subtotal' => 'Subtotal', 'subtotal' => 'Subtotal',
'paid_to_date' => 'Pagado', 'paid_to_date' => 'Pagado',
'balance_due' => 'Pendiente', 'balance_due' => 'Pendiente',
'invoice_design_id' => 'Diseño', 'invoice_design_id' => 'Diseño',
'terms' => 'Términos', 'terms' => 'Términos',
'your_invoice' => 'Tu factura', 'your_invoice' => 'Tu factura',
'remove_contact' => 'Eliminar contacto', 'remove_contact' => 'Eliminar contacto',
'add_contact' => 'Añadir contacto', 'add_contact' => 'Añadir contacto',
'create_new_client' => 'Crear nuevo cliente', 'create_new_client' => 'Crear nuevo cliente',
'edit_client_details' => 'Editar detalles del cliente', 'edit_client_details' => 'Editar detalles del cliente',
'enable' => 'Activar', 'enable' => 'Activar',
'learn_more' => 'Saber más', 'learn_more' => 'Saber más',
'manage_rates' => 'Gestionar tarifas', 'manage_rates' => 'Gestionar tarifas',
'note_to_client' => 'Nota para el cliente', 'note_to_client' => 'Nota para el cliente',
'invoice_terms' => 'Términos de facturación', 'invoice_terms' => 'Términos de facturación',
'save_as_default_terms' => 'Guardar como términos por defecto', 'save_as_default_terms' => 'Guardar como términos por defecto',
'download_pdf' => 'Descargar PDF', 'download_pdf' => 'Descargar PDF',
'pay_now' => 'Pagar Ahora', 'pay_now' => 'Pagar Ahora',
'save_invoice' => 'Guardar factura', 'save_invoice' => 'Guardar factura',
'clone_invoice' => 'Clonar factura', 'clone_invoice' => 'Clonar factura',
'archive_invoice' => 'Archivar factura', 'archive_invoice' => 'Archivar factura',
'delete_invoice' => 'Eliminar factura', 'delete_invoice' => 'Eliminar factura',
'email_invoice' => 'Enviar factura por email', 'email_invoice' => 'Enviar factura por email',
'enter_payment' => 'Agregar pago', 'enter_payment' => 'Agregar pago',
'tax_rates' => 'Tasas de impuesto', 'tax_rates' => 'Tasas de impuesto',
'rate' => 'Tasas', 'rate' => 'Tasas',
'settings' => 'Configuración', 'settings' => 'Configuración',
'enable_invoice_tax' => 'Activar impuesto <b>para la factura</b>', 'enable_invoice_tax' => 'Activar impuesto <b>para la factura</b>',
'enable_line_item_tax' => 'Activar impuesto <b>por concepto</b>', 'enable_line_item_tax' => 'Activar impuesto <b>por concepto</b>',
// navigation // navigation
'dashboard' => 'Inicio', 'dashboard' => 'Inicio',
'clients' => 'Clientes', 'clients' => 'Clientes',
'invoices' => 'Facturas', 'invoices' => 'Facturas',
'payments' => 'Pagos', 'payments' => 'Pagos',
'credits' => 'Créditos', 'credits' => 'Créditos',
'history' => 'Historial', 'history' => 'Historial',
'search' => 'Búsqueda', 'search' => 'Búsqueda',
'sign_up' => 'Registrarse', 'sign_up' => 'Registrarse',
'guest' => 'Invitado', 'guest' => 'Invitado',
'company_details' => 'Detalles de la Empresa', 'company_details' => 'Detalles de la Empresa',
'online_payments' => 'Pagos en Linea', 'online_payments' => 'Pagos en Linea',
'notifications' => 'Notificaciones', 'notifications' => 'Notificaciones',
'import_export' => 'Importar/Exportar', 'import_export' => 'Importar/Exportar',
'done' => 'Hecho', 'done' => 'Hecho',
'save' => 'Guardar', 'save' => 'Guardar',
'create' => 'Crear', 'create' => 'Crear',
'upload' => 'Subir', 'upload' => 'Subir',
'import' => 'Importar', 'import' => 'Importar',
'download' => 'Descargar', 'download' => 'Descargar',
'cancel' => 'Cancelar', 'cancel' => 'Cancelar',
'close' => 'Cerrar', 'close' => 'Cerrar',
'provide_email' => 'Por favor facilita una dirección de correo válida.', 'provide_email' => 'Por favor facilita una dirección de correo válida.',
'powered_by' => 'Creado por', 'powered_by' => 'Creado por',
'no_items' => 'No hay datos', 'no_items' => 'No hay datos',
// recurring invoices // recurring invoices
'recurring_invoices' => 'Facturas recurrentes', 'recurring_invoices' => 'Facturas recurrentes',
'recurring_help' => '<p>Enviar facturas automáticamente a clientes semanalmente, bi-mensualmente, mensualmente, trimestral o anualmente. </p> 'recurring_help' => '<p>Enviar facturas automáticamente a clientes semanalmente, bi-mensualmente, mensualmente, trimestral o anualmente. </p>
<p>Uso :MONTH, :QUARTER or :YEAR para fechas dinámicas. Matemáticas básicas también funcionan bien. Por ejemplo: :MONTH-1.</p> <p>Uso :MONTH, :QUARTER or :YEAR para fechas dinámicas. Matemáticas básicas también funcionan bien. Por ejemplo: :MONTH-1.</p>
<p>Ejemplos de variables dinámicas de factura:</p> <p>Ejemplos de variables dinámicas de factura:</p>
<ul> <ul>
<li>"Afiliación de gimnasio para el mes de:MONTH" => Afiliación de gimnasio para el mes de julio"</li> <li>"Afiliación de gimnasio para el mes de:MONTH" => Afiliación de gimnasio para el mes de julio"</li>
<li>":YEAR+1 suscripción anual" => "2015 suscripción anual"</li> <li>":YEAR+1 suscripción anual" => "2015 suscripción anual"</li>
<li>"Retainer payment for :QUARTER+1" => "Pago anticipo de pagos para T2"</li> <li>"Retainer payment for :QUARTER+1" => "Pago anticipo de pagos para T2"</li>
</ul>', </ul>',
// dashboard // dashboard
'in_total_revenue' => 'Ingreso Total', 'in_total_revenue' => 'Ingreso Total',
'billed_client' => 'Cliente Facturado', 'billed_client' => 'Cliente Facturado',
'billed_clients' => 'Clientes Facturados', 'billed_clients' => 'Clientes Facturados',
'active_client' => 'Cliente Activo', 'active_client' => 'Cliente Activo',
'active_clients' => 'Clientes Activos', 'active_clients' => 'Clientes Activos',
'invoices_past_due' => 'Facturas Vencidas', 'invoices_past_due' => 'Facturas Vencidas',
'upcoming_invoices' => 'Próximas Facturas', 'upcoming_invoices' => 'Próximas Facturas',
'average_invoice' => 'Promedio de Facturación', 'average_invoice' => 'Promedio de Facturación',
// list pages // list pages
'archive' => 'Archivar', 'archive' => 'Archivar',
'delete' => 'Eliminar', 'delete' => 'Eliminar',
'archive_client' => 'Archivar Cliente', 'archive_client' => 'Archivar Cliente',
'delete_client' => 'Eliminar Cliente', 'delete_client' => 'Eliminar Cliente',
'archive_payment' => 'Archivar Pago', 'archive_payment' => 'Archivar Pago',
'delete_payment' => 'Eliminar Pago', 'delete_payment' => 'Eliminar Pago',
'archive_credit' => 'Archivar Crédito', 'archive_credit' => 'Archivar Crédito',
'delete_credit' => 'Eliminar Crédito', 'delete_credit' => 'Eliminar Crédito',
'show_archived_deleted' => 'Mostrar archivados o eliminados en ', 'show_archived_deleted' => 'Mostrar archivados o eliminados en ',
'filter' => 'Filtrar', 'filter' => 'Filtrar',
'new_client' => 'Nuevo Cliente', 'new_client' => 'Nuevo Cliente',
'new_invoice' => 'Nueva Factura', 'new_invoice' => 'Nueva Factura',
'new_payment' => 'Nuevo Pago', 'new_payment' => 'Nuevo Pago',
'new_credit' => 'Nuevo Crédito', 'new_credit' => 'Nuevo Crédito',
'contact' => 'Contacto', 'contact' => 'Contacto',
'date_created' => 'Fecha de Creación', 'date_created' => 'Fecha de Creación',
'last_login' => 'Último Acceso', 'last_login' => 'Último Acceso',
'balance' => 'Balance', 'balance' => 'Balance',
'action' => 'Acción', 'action' => 'Acción',
'status' => 'Estado', 'status' => 'Estado',
'invoice_total' => 'Total Facturado', 'invoice_total' => 'Total Facturado',
'frequency' => 'Frequencia', 'frequency' => 'Frequencia',
'start_date' => 'Fecha de Inicio', 'start_date' => 'Fecha de Inicio',
'end_date' => 'Fecha de Finalización', 'end_date' => 'Fecha de Finalización',
'transaction_reference' => 'Referencia de Transacción', 'transaction_reference' => 'Referencia de Transacción',
'method' => 'Método', 'method' => 'Método',
'payment_amount' => 'Valor del Pago', 'payment_amount' => 'Valor del Pago',
'payment_date' => 'Fecha de Pago', 'payment_date' => 'Fecha de Pago',
'credit_amount' => 'Cantidad de Crédito', 'credit_amount' => 'Cantidad de Crédito',
'credit_balance' => 'Balance de Crédito', 'credit_balance' => 'Balance de Crédito',
'credit_date' => 'Fecha de Crédito', 'credit_date' => 'Fecha de Crédito',
'empty_table' => 'Tabla vacía', 'empty_table' => 'Tabla vacía',
'select' => 'Seleccionar', 'select' => 'Seleccionar',
'edit_client' => 'Editar Cliente', 'edit_client' => 'Editar Cliente',
'edit_invoice' => 'Editar Factura', 'edit_invoice' => 'Editar Factura',
// client view page // client view page
'create_invoice' => 'Crear Factura', 'create_invoice' => 'Crear Factura',
'Create Invoice' => 'Crear Factura', 'Create Invoice' => 'Crear Factura',
'enter_credit' => 'Agregar Crédito', 'enter_credit' => 'Agregar Crédito',
'last_logged_in' => 'Último inicio de sesión', 'last_logged_in' => 'Último inicio de sesión',
'details' => 'Detalles', 'details' => 'Detalles',
'standing' => 'Situación', // 'standing' => 'Situación', //
'credit' => 'Crédito', 'credit' => 'Crédito',
'activity' => 'Actividad', 'activity' => 'Actividad',
'date' => 'Fecha', 'date' => 'Fecha',
'message' => 'Mensaje', 'message' => 'Mensaje',
'adjustment' => 'Ajustes', 'adjustment' => 'Ajustes',
'are_you_sure' => '¿Está Seguro?', 'are_you_sure' => '¿Está Seguro?',
// payment pages // payment pages
'payment_type_id' => 'Tipo de pago', 'payment_type_id' => 'Tipo de pago',
'amount' => 'Cantidad', 'amount' => 'Cantidad',
// Nuevo texto extraido - New text extracted
'Recommended Gateway' => 'Pasarelas Recomendadas',//
'Accepted Credit Cards' => 'Tarjetas de Credito Permitidas',//
'Payment Gateway' => 'Pasarelas de Pago',//
'Select Gateway' => 'Seleccione Pasarela',//
'Enable' => 'Activo',//
'Api Login Id' => 'Introduzca Api Id',//
'Transaction Key' => 'Clave de Transacción',//
'Create an account' => 'Crear cuenta nueva',//
'Other Options' => 'Otras Opciones',//
// account/company pages // Nuevo texto extraido - New text extracted
'work_email' => 'Correo electrónico de la empresa', 'Recommended Gateway' => 'Pasarelas Recomendadas',//
'language_id' => 'Idioma', 'Accepted Credit Cards' => 'Tarjetas de Credito Permitidas',//
'timezone_id' => 'Zona horaria', 'Payment Gateway' => 'Pasarelas de Pago',//
'date_format_id' => 'Formato de fecha', 'Select Gateway' => 'Seleccione Pasarela',//
'datetime_format_id' => 'Format de fecha/hora', 'Enable' => 'Activo',//
'users' => 'Usuarios', 'Api Login Id' => 'Introduzca Api Id',//
'localization' => 'Localización', 'Transaction Key' => 'Clave de Transacción',//
'remove_logo' => 'Eliminar logo', 'Create an account' => 'Crear cuenta nueva',//
'logo_help' => 'Formatos aceptados: JPEG, GIF y PNG', 'Other Options' => 'Otras Opciones',//
'payment_gateway' => 'Pasarela de pago',
'gateway_id' => 'Proveedor',
'email_notifications' => 'Notificaciones de email',
'email_sent' => 'Avísame por email cuando una factura <b>se envía</b>',
'email_viewed' => 'Avísame por email cuando una factura <b>se visualiza</b>',
'email_paid' => 'Avísame por email cuando una factura <b>se paga</b>',
'site_updates' => 'Actualizaciones del sitio',
'custom_messages' => 'Mensajes a medida',
'default_invoice_terms' => 'Configurar términos de factura por defecto',
'default_email_footer' => 'Configurar firma de email por defecto',
'import_clients' => 'Importar datos del cliente',
'csv_file' => 'Seleccionar archivo CSV',
'export_clients' => 'Exportar datos del cliente',
'select_file' => 'Seleccionar archivo',
'first_row_headers' => 'Usar la primera fila como encabezados',
'column' => 'Columna',
'sample' => 'Ejemplo',
'import_to' => 'Importar a',
'client_will_create' => 'cliente se creará',
'clients_will_create' => 'clientes se crearan',
// application messages // account/company pages
'created_client' => 'cliente creado con éxito', 'work_email' => 'Correo electrónico de la empresa',
'created_clients' => ':count clientes creados con éxito', 'language_id' => 'Idioma',
'updated_settings' => 'Configuración actualizada con éxito', 'timezone_id' => 'Zona horaria',
'removed_logo' => 'Logo eliminado con éxito', 'date_format_id' => 'Formato de fecha',
'sent_message' => 'Mensaje enviado con éxito', 'datetime_format_id' => 'Format de fecha/hora',
'invoice_error' => 'Seleccionar cliente y corregir errores.', 'users' => 'Usuarios',
'limit_clients' => 'Lo sentimos, se ha pasado del límite de :count clientes', 'localization' => 'Localización',
'payment_error' => 'Ha habido un error en el proceso de tu pago. Inténtalo de nuevo más tarde.', 'remove_logo' => 'Eliminar logo',
'registration_required' => 'Inscríbete para enviar una factura', 'logo_help' => 'Formatos aceptados: JPEG, GIF y PNG',
'confirmation_required' => 'Por favor confirma tu dirección de correo electrónico', 'payment_gateway' => 'Pasarela de pago',
'gateway_id' => 'Proveedor',
'email_notifications' => 'Notificaciones de email',
'email_sent' => 'Avísame por email cuando una factura <b>se envía</b>',
'email_viewed' => 'Avísame por email cuando una factura <b>se visualiza</b>',
'email_paid' => 'Avísame por email cuando una factura <b>se paga</b>',
'site_updates' => 'Actualizaciones del sitio',
'custom_messages' => 'Mensajes a medida',
'default_invoice_terms' => 'Configurar términos de factura por defecto',
'default_email_footer' => 'Configurar firma de email por defecto',
'import_clients' => 'Importar datos del cliente',
'csv_file' => 'Seleccionar archivo CSV',
'export_clients' => 'Exportar datos del cliente',
'select_file' => 'Seleccionar archivo',
'first_row_headers' => 'Usar la primera fila como encabezados',
'column' => 'Columna',
'sample' => 'Ejemplo',
'import_to' => 'Importar a',
'client_will_create' => 'cliente se creará',
'clients_will_create' => 'clientes se crearan',
'updated_client' => 'Cliente actualizado con éxito', // application messages
'created_client' => 'Cliente creado con éxito', 'created_client' => 'cliente creado con éxito',
'archived_client' => 'Cliente archivado con éxito', 'created_clients' => ':count clientes creados con éxito',
'archived_clients' => ':count clientes archivados con éxito', 'updated_settings' => 'Configuración actualizada con éxito',
'deleted_client' => 'Cliente eliminado con éxito', 'removed_logo' => 'Logo eliminado con éxito',
'deleted_clients' => ':count clientes eliminados con éxito', 'sent_message' => 'Mensaje enviado con éxito',
'invoice_error' => 'Seleccionar cliente y corregir errores.',
'limit_clients' => 'Lo sentimos, se ha pasado del límite de :count clientes',
'payment_error' => 'Ha habido un error en el proceso de tu pago. Inténtalo de nuevo más tarde.',
'registration_required' => 'Inscríbete para enviar una factura',
'confirmation_required' => 'Por favor confirma tu dirección de correo electrónico',
'updated_invoice' => 'Factura actualizada con éxito', 'updated_client' => 'Cliente actualizado con éxito',
'created_invoice' => 'Factura creada con éxito', 'created_client' => 'Cliente creado con éxito',
'cloned_invoice' => 'Factura clonada con éxito', 'archived_client' => 'Cliente archivado con éxito',
'emailed_invoice' => 'Factura enviada con éxito', 'archived_clients' => ':count clientes archivados con éxito',
'and_created_client' => 'y cliente creado ', 'deleted_client' => 'Cliente eliminado con éxito',
'archived_invoice' => 'Factura archivada con éxito', 'deleted_clients' => ':count clientes eliminados con éxito',
'archived_invoices' => ':count facturas archivados con éxito',
'deleted_invoice' => 'Factura eliminada con éxito',
'deleted_invoices' => ':count facturas eliminadas con éxito',
'created_payment' => 'Pago creado con éxito', 'updated_invoice' => 'Factura actualizada con éxito',
'archived_payment' => 'Pago archivado con éxito', 'created_invoice' => 'Factura creada con éxito',
'archived_payments' => ':count pagos archivados con éxito', 'cloned_invoice' => 'Factura clonada con éxito',
'deleted_payment' => 'Pago eliminado con éxito', 'emailed_invoice' => 'Factura enviada con éxito',
'deleted_payments' => ':count pagos eliminados con éxito', 'and_created_client' => 'y cliente creado ',
'applied_payment' => 'Pago aplicado con éxito', 'archived_invoice' => 'Factura archivada con éxito',
'archived_invoices' => ':count facturas archivados con éxito',
'deleted_invoice' => 'Factura eliminada con éxito',
'deleted_invoices' => ':count facturas eliminadas con éxito',
'created_credit' => 'Crédito creado con éxito', 'created_payment' => 'Pago creado con éxito',
'archived_credit' => 'Crédito archivado con éxito', 'archived_payment' => 'Pago archivado con éxito',
'archived_credits' => ':count creditos archivados con éxito', 'archived_payments' => ':count pagos archivados con éxito',
'deleted_credit' => 'Créditos eliminados con éxito', 'deleted_payment' => 'Pago eliminado con éxito',
'deleted_credits' => ':count creditos eliminados con éxito', 'deleted_payments' => ':count pagos eliminados con éxito',
'applied_payment' => 'Pago aplicado con éxito',
// Emails 'created_credit' => 'Crédito creado con éxito',
'confirmation_subject' => 'Corfimación de tu cuenta en Invoice Ninja', 'archived_credit' => 'Crédito archivado con éxito',
'confirmation_header' => 'Confirmación de Cuenta', 'archived_credits' => ':count creditos archivados con éxito',
'confirmation_message' => 'Por favor, haz clic en el enlace abajo para confirmar tu cuenta.', 'deleted_credit' => 'Créditos eliminados con éxito',
'invoice_subject' => 'Nueva factura :invoice de :account', 'deleted_credits' => ':count creditos eliminados con éxito',
'invoice_message' => 'Para visualizar tu factura por el valor de :amount, haz click en el enlace de abajo.',
'payment_subject' => 'Pago recibido',
'payment_message' => 'Gracias por su pago de :amount.',
'email_salutation' => 'Estimado :name,',
'email_signature' => 'Un cordial saludo,',
'email_from' => 'El equipo de Invoice Ninja ',
'user_email_footer' => 'Para ajustar la configuración de las notificaciones de tu email, visita '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'Para visualizar la factura de cliente, haz clic en el enlace de abajo:',
'notification_invoice_paid_subject' => 'La factura :invoice ha sido pagada por el cliente :client',
'notification_invoice_sent_subject' => 'La factura :invoice ha sido enviada a el cliente :client',
'notification_invoice_viewed_subject' => 'La factura :invoice ha sido visualizado por el cliente:client',
'notification_invoice_paid' => 'Un pago por importe de :amount ha sido realizado por el cliente :client correspondiente a la factura :invoice.',
'notification_invoice_sent' => 'La factura :invoice por importe de :amount fue enviada al cliente :cliente.',
'notification_invoice_viewed' => 'La factura :invoice por importe de :amount fue visualizada por el cliente :client.',
'reset_password' => 'Puedes reconfigurar la contraseña de tu cuenta haciendo clic en el siguiente enlace:',
'reset_password_footer' => 'Si no has solicitado un cambio de contraseña, por favor contactate con nosostros: ' . CONTACT_EMAIL,
// Payment page // Emails
'secure_payment' => 'Pago seguro', 'confirmation_subject' => 'Corfimación de tu cuenta en Invoice Ninja',
'card_number' => 'Número de tarjeta', 'confirmation_header' => 'Confirmación de Cuenta',
'expiration_month' => 'Mes de caducidad', 'confirmation_message' => 'Por favor, haz clic en el enlace abajo para confirmar tu cuenta.',
'expiration_year' => 'Año de caducidad', 'invoice_subject' => 'Nueva factura :invoice de :account',
'cvv' => 'CVV', 'invoice_message' => 'Para visualizar tu factura por el valor de :amount, haz click en el enlace de abajo.',
'payment_subject' => 'Pago recibido',
'payment_message' => 'Gracias por su pago de :amount.',
'email_salutation' => 'Estimado :name,',
'email_signature' => 'Un cordial saludo,',
'email_from' => 'El equipo de Invoice Ninja ',
'user_email_footer' => 'Para ajustar la configuración de las notificaciones de tu email, visita '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Para visualizar la factura de cliente, haz clic en el enlace de abajo:',
'notification_invoice_paid_subject' => 'La factura :invoice ha sido pagada por el cliente :client',
'notification_invoice_sent_subject' => 'La factura :invoice ha sido enviada a el cliente :client',
'notification_invoice_viewed_subject' => 'La factura :invoice ha sido visualizado por el cliente:client',
'notification_invoice_paid' => 'Un pago por importe de :amount ha sido realizado por el cliente :client correspondiente a la factura :invoice.',
'notification_invoice_sent' => 'La factura :invoice por importe de :amount fue enviada al cliente :cliente.',
'notification_invoice_viewed' => 'La factura :invoice por importe de :amount fue visualizada por el cliente :client.',
'reset_password' => 'Puedes reconfigurar la contraseña de tu cuenta haciendo clic en el siguiente enlace:',
'reset_password_footer' => 'Si no has solicitado un cambio de contraseña, por favor contactate con nosostros: '.CONTACT_EMAIL,
// Security alerts // Payment page
'confide' => array( 'secure_payment' => 'Pago seguro',
'too_many_attempts' => 'Demasiados intentos fallidos. Inténtalo de nuevo en un par de minutos.', 'card_number' => 'Número de tarjeta',
'wrong_credentials' => 'Contraseña o email incorrecto.', 'expiration_month' => 'Mes de caducidad',
'confirmation' => '¡Tu cuenta se ha confirmado!', 'expiration_year' => 'Año de caducidad',
'wrong_confirmation' => 'Código de confirmación incorrecto.', 'cvv' => 'CVV',
'password_forgot' => 'La información sobre el cambio de tu contraseña se ha enviado a tu dirección de correo electrónico.',
'password_reset' => 'Tu contraseña se ha cambiado con éxito.',
'wrong_password_reset' => 'Contraseña no válida. Inténtalo de nuevo',
),
// Pro Plan // Security alerts
'pro_plan' => [ 'confide' => array(
'remove_logo' => ':link haz click para eliminar el logo de Invoice Ninja', 'too_many_attempts' => 'Demasiados intentos fallidos. Inténtalo de nuevo en un par de minutos.',
'remove_logo_link' => 'Haz click aquí', 'wrong_credentials' => 'Contraseña o email incorrecto.',
], 'confirmation' => '¡Tu cuenta se ha confirmado!',
'logout' => 'Cerrar sesión', 'wrong_confirmation' => 'Código de confirmación incorrecto.',
'sign_up_to_save' => 'Registrate para guardar tu trabajo', 'password_forgot' => 'La información sobre el cambio de tu contraseña se ha enviado a tu dirección de correo electrónico.',
'agree_to_terms' =>'Estoy de acuerdo con los términos de Invoice Ninja :terms', 'password_reset' => 'Tu contraseña se ha cambiado con éxito.',
'terms_of_service' => 'Términos de servicio', 'wrong_password_reset' => 'Contraseña no válida. Inténtalo de nuevo',
'email_taken' => 'Esta dirección de correo electrónico ya se ha registrado', ),
'working' => 'Procesando',
'success' => 'Éxito',
'success_message' => 'Te has registrado con éxito. Por favor, haz clic en el enlace del correo de confirmación para verificar tu dirección de correo electrónico.',
'erase_data' => 'Esta acción eliminará todos tus datos de forma permanente.',
'password' => 'Contraseña',
'pro_plan_product' => 'Plan Pro', // Pro Plan
'pro_plan_description' => 'Un año de inscripción al Plan Pro de Invoice Ninja.', 'pro_plan' => [
'pro_plan_success' => '¡Gracias por unirte a Invoice Ninja! Al realizar el pago de tu factura, se iniciara tu PLAN PRO.', 'remove_logo' => ':link haz click para eliminar el logo de Invoice Ninja',
'unsaved_changes' => 'Tienes cambios no guardados', 'remove_logo_link' => 'Haz click aquí',
'custom_fields' => 'Campos a medida', ],
'company_fields' => 'Campos de la empresa', 'logout' => 'Cerrar sesión',
'client_fields' => 'Campos del cliente', 'sign_up_to_save' => 'Registrate para guardar tu trabajo',
'field_label' => 'Etiqueta del campo', 'agree_to_terms' => 'Estoy de acuerdo con los términos de Invoice Ninja :terms',
'field_value' => 'Valor del campo', 'terms_of_service' => 'Términos de servicio',
'edit' => 'Editar', 'email_taken' => 'Esta dirección de correo electrónico ya se ha registrado',
'view_as_recipient' => 'Ver como destinitario', 'working' => 'Procesando',
'success' => 'Éxito',
'success_message' => 'Te has registrado con éxito. Por favor, haz clic en el enlace del correo de confirmación para verificar tu dirección de correo electrónico.',
'erase_data' => 'Esta acción eliminará todos tus datos de forma permanente.',
'password' => 'Contraseña',
// product management 'pro_plan_product' => 'Plan Pro',
'product_library' => 'Inventario de productos', 'pro_plan_description' => 'Un año de inscripción al Plan Pro de Invoice Ninja.',
'product' => 'Producto', 'pro_plan_success' => '¡Gracias por unirte a Invoice Ninja! Al realizar el pago de tu factura, se iniciara tu PLAN PRO.',
'products' => 'Productos', 'unsaved_changes' => 'Tienes cambios no guardados',
'fill_products' => 'Auto-rellenar productos', 'custom_fields' => 'Campos a medida',
'fill_products_help' => 'Seleccionar un producto automáticamente <b>configurará la descripción y coste</b>', 'company_fields' => 'Campos de la empresa',
'update_products' => 'Auto-actualizar productos', 'client_fields' => 'Campos del cliente',
'update_products_help' => 'Actualizar una factura automáticamente <b>actualizará los productos</b>', 'field_label' => 'Etiqueta del campo',
'create_product' => 'Crear Producto', 'field_value' => 'Valor del campo',
'edit_product' => 'Editar Producto', 'edit' => 'Editar',
'archive_product' => 'Archivar Producto', 'view_as_recipient' => 'Ver como destinitario',
'updated_product' => 'Producto actualizado con éxito',
'created_product' => 'Producto creado con éxito',
'archived_product' => 'Producto archivado con éxito',
'pro_plan_custom_fields' => ':link haz click para para activar campos a medida',
'advanced_settings' => 'Configuración Avanzada',
'pro_plan_advanced_settings' => ':link haz click para para activar la configuración avanzada',
'invoice_design' => 'Diseño de factura',
'specify_colors' => 'Especificar colores',
'specify_colors_label' => 'Seleccionar los colores para usar en las facturas',
'chart_builder' => 'Constructor de graficos',
'ninja_email_footer' => 'Usa :site para facturar a tus clientes y recibir pagos de forma gratuita!',
'go_pro' => 'Hazte Pro',
// Quotes // product management
'quote' => 'Presupuesto', 'product_library' => 'Inventario de productos',
'quotes' => 'Presupuestos', 'product' => 'Producto',
'quote_number' => 'Numero de Presupuesto', 'products' => 'Productos',
'quote_number_short' => 'Presupuesto Nº ', 'fill_products' => 'Auto-rellenar productos',
'quote_date' => 'Fecha Presupuesto', 'fill_products_help' => 'Seleccionar un producto automáticamente <b>configurará la descripción y coste</b>',
'quote_total' => 'Total Presupuestado', 'update_products' => 'Auto-actualizar productos',
'your_quote' => 'Su Presupuesto', 'update_products_help' => 'Actualizar una factura automáticamente <b>actualizará los productos</b>',
'total' => 'Total', 'create_product' => 'Crear Producto',
'clone' => 'Clonar', 'edit_product' => 'Editar Producto',
'archive_product' => 'Archivar Producto',
'updated_product' => 'Producto actualizado con éxito',
'created_product' => 'Producto creado con éxito',
'archived_product' => 'Producto archivado con éxito',
'pro_plan_custom_fields' => ':link haz click para para activar campos a medida',
'advanced_settings' => 'Configuración Avanzada',
'pro_plan_advanced_settings' => ':link haz click para para activar la configuración avanzada',
'invoice_design' => 'Diseño de factura',
'specify_colors' => 'Especificar colores',
'specify_colors_label' => 'Seleccionar los colores para usar en las facturas',
'chart_builder' => 'Constructor de graficos',
'ninja_email_footer' => 'Usa :site para facturar a tus clientes y recibir pagos de forma gratuita!',
'go_pro' => 'Hazte Pro',
'new_quote' => 'Nuevo Presupuesto', // Quotes
'create_quote' => 'Crear Presupuesto', 'quote' => 'Presupuesto',
'edit_quote' => 'Editar Presupuesto', 'quotes' => 'Presupuestos',
'archive_quote' => 'Archivar Presupuesto', 'quote_number' => 'Numero de Presupuesto',
'delete_quote' => 'Eliminar Presupuesto', 'quote_number_short' => 'Presupuesto Nº ',
'save_quote' => 'Guardar Presupuesto', 'quote_date' => 'Fecha Presupuesto',
'email_quote' => 'Enviar Presupuesto', 'quote_total' => 'Total Presupuestado',
'clone_quote' => 'Clonar Presupuesto', 'your_quote' => 'Su Presupuesto',
'convert_to_invoice' => 'Convertir a Factura', 'total' => 'Total',
'view_invoice' => 'Ver Factura', 'clone' => 'Clonar',
'view_quote' => 'Ver Presupuesto',
'view_client' => 'Ver Cliente',
'updated_quote' => 'Presupuesto actualizado con éxito', 'new_quote' => 'Nuevo Presupuesto',
'created_quote' => 'Presupuesto creado con éxito', 'create_quote' => 'Crear Presupuesto',
'cloned_quote' => 'Presupuesto clonado con éxito', 'edit_quote' => 'Editar Presupuesto',
'emailed_quote' => 'Presupuesto enviado con éxito', 'archive_quote' => 'Archivar Presupuesto',
'archived_quote' => 'Presupuesto archivado con éxito', 'delete_quote' => 'Eliminar Presupuesto',
'archived_quotes' => ':count Presupuestos archivados con exito', 'save_quote' => 'Guardar Presupuesto',
'deleted_quote' => 'Presupuesto eliminado con éxito', 'email_quote' => 'Enviar Presupuesto',
'deleted_quotes' => ':count Presupuestos eliminados con exito', 'clone_quote' => 'Clonar Presupuesto',
'converted_to_invoice' => 'Presupuesto convertido a factura con éxito', 'convert_to_invoice' => 'Convertir a Factura',
'view_invoice' => 'Ver Factura',
'view_quote' => 'Ver Presupuesto',
'view_client' => 'Ver Cliente',
'quote_subject' => 'Nuevo Presupuesto de :account', 'updated_quote' => 'Presupuesto actualizado con éxito',
'quote_message' => 'Para ver el presupuesto por un importe de :amount, haga click en el enlace de abajo.', 'created_quote' => 'Presupuesto creado con éxito',
'quote_link_message' => 'Para ver su presupuesto haga click en el enlace de abajo:', 'cloned_quote' => 'Presupuesto clonado con éxito',
'notification_quote_sent_subject' => 'El presupuesto :invoice enviado al cliente :client', 'emailed_quote' => 'Presupuesto enviado con éxito',
'notification_quote_viewed_subject' => 'El presupuesto :invoice fue visto por el cliente :client', 'archived_quote' => 'Presupuesto archivado con éxito',
'notification_quote_sent' => 'El presupuesto :invoice por un valor de :amount, ha sido enviado al cliente :client.', 'archived_quotes' => ':count Presupuestos archivados con exito',
'notification_quote_viewed' => 'El presupuesto :invoice por un valor de :amount ha sido visto por el cliente :client.', 'deleted_quote' => 'Presupuesto eliminado con éxito',
'session_expired' => 'Su sesión ha caducado.', 'deleted_quotes' => ':count Presupuestos eliminados con exito',
'invoice_fields' => 'Campos de Factura', 'converted_to_invoice' => 'Presupuesto convertido a factura con éxito',
'invoice_options' => 'Opciones de Factura',
'hide_quantity' => 'Ocultar Cantidad',
'hide_quantity_help' => 'Si las cantidades de tus partidas siempre son 1, entonces puedes organizar tus facturas mejor al no mostrar este campo.',
'hide_paid_to_date' => 'Ocultar valor pagado a la fecha',
'hide_paid_to_date_help' => 'Solo mostrar la opción “Pagado a la fecha” en sus facturas cuando se ha recibido un pago.',
'charge_taxes' => 'Cargar Impuestos',
'user_management' => 'Gestión de Usuario',
'add_user' => 'Añadir Usuario',
'send_invite' => 'Enviar Invitación', //Context for its use
'sent_invite' => 'Invitación enviada con éxito',
'updated_user' => 'Usario actualizado con éxito',
'invitation_message' => ':invitor te ha invitado a unirte a su cuenta en G-Factura.',
'register_to_add_user' => 'Regístrate para añadir usarios',
'user_state' => 'Estado',
'edit_user' => 'Editar Usario',
'delete_user' => 'Eliminar Usario',
'active' => 'Activo',
'pending' => 'Pendiente',
'deleted_user' => 'Usario eliminado con éxito',
'limit_users' => 'Lo sentimos, esta acción excederá el límite de ' . MAX_NUM_USERS . ' usarios',
'confirm_email_invoice' => '¿Estás seguro que quieres enviar esta factura?',
'confirm_email_quote' => '¿Estás seguro que quieres enviar este presupuesto?',
'confirm_recurring_email_invoice' => 'Se ha marcado esta factura como recurrente, estás seguro que quieres enviar esta factura?',
'cancel_account' => 'Cancelar Cuenta',
'cancel_account_message' => 'AVISO: Esta acción eliminará todos tus datos de forma permanente.',
'go_back' => 'Atrás',
'data_visualizations' => 'Visualización de Datos',
'sample_data' => 'Datos de Ejemplo',
'hide' => 'Ocultar',
'new_version_available' => 'Una nueva versión de :releases_link disponible. Estás utilizando la versión :user_version, la última versión es :latest_version',
'invoice_settings' => 'Configuración de Facturas',
'invoice_number_prefix' => 'Prefijo de Facturación',
'invoice_number_counter' => 'Numeración de Facturación',
'quote_number_prefix' => 'Prejijo de Presupuesto',
'quote_number_counter' => 'Numeración de Presupuestos',
'share_invoice_counter' => 'Compartir la numeración para presupuesto y facturación',
'invoice_issued_to' => 'Factura emitida a',
'invalid_counter' => 'Para evitar posibles conflictos, por favor crea un prefijo de facturación y de presupuesto.',
'mark_sent' => 'Marcar como enviado',
'quote_subject' => 'Nuevo Presupuesto de :account',
'quote_message' => 'Para ver el presupuesto por un importe de :amount, haga click en el enlace de abajo.',
'quote_link_message' => 'Para ver su presupuesto haga click en el enlace de abajo:',
'notification_quote_sent_subject' => 'El presupuesto :invoice enviado al cliente :client',
'notification_quote_viewed_subject' => 'El presupuesto :invoice fue visto por el cliente :client',
'notification_quote_sent' => 'El presupuesto :invoice por un valor de :amount, ha sido enviado al cliente :client.',
'notification_quote_viewed' => 'El presupuesto :invoice por un valor de :amount ha sido visto por el cliente :client.',
'session_expired' => 'Su sesión ha caducado.',
'invoice_fields' => 'Campos de Factura',
'invoice_options' => 'Opciones de Factura',
'hide_quantity' => 'Ocultar Cantidad',
'hide_quantity_help' => 'Si las cantidades de tus partidas siempre son 1, entonces puedes organizar tus facturas mejor al no mostrar este campo.',
'hide_paid_to_date' => 'Ocultar valor pagado a la fecha',
'hide_paid_to_date_help' => 'Solo mostrar la opción “Pagado a la fecha” en sus facturas cuando se ha recibido un pago.',
'charge_taxes' => 'Cargar Impuestos',
'user_management' => 'Gestión de Usuario',
'add_user' => 'Añadir Usuario',
'send_invite' => 'Enviar Invitación', //Context for its use
'sent_invite' => 'Invitación enviada con éxito',
'updated_user' => 'Usario actualizado con éxito',
'invitation_message' => ':invitor te ha invitado a unirte a su cuenta en G-Factura.',
'register_to_add_user' => 'Regístrate para añadir usarios',
'user_state' => 'Estado',
'edit_user' => 'Editar Usario',
'delete_user' => 'Eliminar Usario',
'active' => 'Activo',
'pending' => 'Pendiente',
'deleted_user' => 'Usario eliminado con éxito',
'limit_users' => 'Lo sentimos, esta acción excederá el límite de '.MAX_NUM_USERS.' usarios',
'confirm_email_invoice' => '¿Estás seguro que quieres enviar esta factura?',
'confirm_email_quote' => '¿Estás seguro que quieres enviar este presupuesto?',
'confirm_recurring_email_invoice' => 'Se ha marcado esta factura como recurrente, estás seguro que quieres enviar esta factura?',
'cancel_account' => 'Cancelar Cuenta',
'cancel_account_message' => 'AVISO: Esta acción eliminará todos tus datos de forma permanente.',
'go_back' => 'Atrás',
'data_visualizations' => 'Visualización de Datos',
'sample_data' => 'Datos de Ejemplo',
'hide' => 'Ocultar',
'new_version_available' => 'Una nueva versión de :releases_link disponible. Estás utilizando la versión :user_version, la última versión es :latest_version',
'invoice_settings' => 'Configuración de Facturas',
'invoice_number_prefix' => 'Prefijo de Facturación',
'invoice_number_counter' => 'Numeración de Facturación',
'quote_number_prefix' => 'Prejijo de Presupuesto',
'quote_number_counter' => 'Numeración de Presupuestos',
'share_invoice_counter' => 'Compartir la numeración para presupuesto y facturación',
'invoice_issued_to' => 'Factura emitida a',
'invalid_counter' => 'Para evitar posibles conflictos, por favor crea un prefijo de facturación y de presupuesto.',
'mark_sent' => 'Marcar como enviado',
'gateway_help_1' => ':link para registrarse en Authorize.net.', 'gateway_help_1' => ':link para registrarse en Authorize.net.',
'gateway_help_2' => ':link para registrarse en Authorize.net.', 'gateway_help_2' => ':link para registrarse en Authorize.net.',
'gateway_help_17' => ':link para obtener su firma API de PayPal.', 'gateway_help_17' => ':link para obtener su firma API de PayPal.',
'gateway_help_23' => 'Nota: utilizar su clave de API secreta, no es su clave de API publica.', 'gateway_help_23' => 'Nota: utilizar su clave de API secreta, no es su clave de API publica.',
'gateway_help_27' => ':link para registrarse en TwoCheckout.', 'gateway_help_27' => ':link para registrarse en TwoCheckout.',
'more_designs' => 'Más diseños', 'more_designs' => 'Más diseños',
'more_designs_title' => 'Diseños adicionales para factura', 'more_designs_title' => 'Diseños adicionales para factura',
'more_designs_cloud_header' => 'Pase a Pro para añadir más diseños de facturas', 'more_designs_cloud_header' => 'Pase a Pro para añadir más diseños de facturas',
'more_designs_cloud_text' => '', 'more_designs_cloud_text' => '',
'more_designs_self_host_header' => 'Obtenga 6 diseños más para facturas por sólo '.INVOICE_DESIGNS_PRICE, // comprobar 'more_designs_self_host_header' => 'Obtenga 6 diseños más para facturas por sólo '.INVOICE_DESIGNS_PRICE, // comprobar
'more_designs_self_host_text' => '', 'more_designs_self_host_text' => '',
'buy' => 'Comprar', 'buy' => 'Comprar',
'bought_designs' => 'Añadidos con exito los diseños de factura', 'bought_designs' => 'Añadidos con exito los diseños de factura',
'sent' => 'Enviado', 'sent' => 'Enviado',
'timesheets' => 'Parte de Horas', 'timesheets' => 'Parte de Horas',
'payment_title' => 'Introduzca su dirección de facturación y la infomración de su tarjeta de crédito', 'payment_title' => 'Introduzca su dirección de facturación y la infomración de su tarjeta de crédito',
'payment_cvv' => '*los tres últimos dígitos de la parte posterior de su tarjeta', 'payment_cvv' => '*los tres últimos dígitos de la parte posterior de su tarjeta',
'payment_footer1' => '*La dirección de facturación debe coincidir con la de la tarjeta de crédito.', 'payment_footer1' => '*La dirección de facturación debe coincidir con la de la tarjeta de crédito.',
'payment_footer2' => '*Por favor, haga clic en "Pagar ahora" sólo una vez - esta operación puede tardar hasta 1 minuto en procesarse.', 'payment_footer2' => '*Por favor, haga clic en "Pagar ahora" sólo una vez - esta operación puede tardar hasta 1 minuto en procesarse.',
'vat_number' => 'NIF/CIF', 'vat_number' => 'NIF/CIF',
'id_number' => 'Número de Identificación', 'id_number' => 'Número de Identificación',
'white_label_link' => 'Marca Blanca" ', 'white_label_link' => 'Marca Blanca" ',
'white_label_text' => 'Obtener una licencia de marca blanca por'.WHITE_LABEL_PRICE.' para quitar la marca Invoice Ninja de la parte superior de las páginas del cliente.', // comprobar 'white_label_text' => 'Obtener una licencia de marca blanca por'.WHITE_LABEL_PRICE.' para quitar la marca Invoice Ninja de la parte superior de las páginas del cliente.', // comprobar
'white_label_link' => 'Marca Blanca" ', 'white_label_link' => 'Marca Blanca" ',
'bought_white_label' => 'Se ha conseguido con exito la licencia de Marca Blanca', 'bought_white_label' => 'Se ha conseguido con exito la licencia de Marca Blanca',
'white_labeled' => 'Marca Blanca', 'white_labeled' => 'Marca Blanca',
'restore' => 'Restaurar', 'restore' => 'Restaurar',
'restore_invoice' => 'Restaurar Factura', 'restore_invoice' => 'Restaurar Factura',
'restore_quote' => 'Restaurar Presupuesto', 'restore_quote' => 'Restaurar Presupuesto',
'restore_client' => 'Restaurar Cliente', 'restore_client' => 'Restaurar Cliente',
'restore_credit' => 'Restaurar Pendiente', 'restore_credit' => 'Restaurar Pendiente',
'restore_payment' => 'Restaurar Pago', 'restore_payment' => 'Restaurar Pago',
'restored_invoice' => 'Factura restaurada con éxito', 'restored_invoice' => 'Factura restaurada con éxito',
@ -479,7 +478,7 @@ return array(
'restored_client' => 'Cliente restaurada con éxito', 'restored_client' => 'Cliente restaurada con éxito',
'restored_payment' => 'Pago restaurada con éxito', 'restored_payment' => 'Pago restaurada con éxito',
'restored_credit' => 'Pendiente restaurada con éxito', 'restored_credit' => 'Pendiente restaurada con éxito',
'reason_for_canceling' => 'Ayudenos a mejorar nuestro sitio diciendonos porque se va, Gracias', 'reason_for_canceling' => 'Ayudenos a mejorar nuestro sitio diciendonos porque se va, Gracias',
'discount_percent' => 'Porcentaje', 'discount_percent' => 'Porcentaje',
'discount_amount' => 'Cantidad', 'discount_amount' => 'Cantidad',
@ -503,7 +502,7 @@ return array(
'payment_email' => 'Email de Pagos', 'payment_email' => 'Email de Pagos',
'quote_email' => 'Email de Presupuestos', 'quote_email' => 'Email de Presupuestos',
'reset_all' => 'Restablecer Todos', 'reset_all' => 'Restablecer Todos',
'approve' => 'Aprobar', 'approve' => 'Aprobar',
'token_billing_type_id' => 'Token Billing', //¿? 'token_billing_type_id' => 'Token Billing', //¿?
'token_billing_help' => 'Permite almacenar tarjetas de crédito para posteriormente realizarles el cobro.', 'token_billing_help' => 'Permite almacenar tarjetas de crédito para posteriormente realizarles el cobro.',
@ -604,7 +603,7 @@ return array(
'view_documentation' => 'View Documentation', 'view_documentation' => 'View Documentation',
'app_title' => 'Free Open-Source Online Invoicing', 'app_title' => 'Free Open-Source Online Invoicing',
'app_description' => 'Invoice Ninja is a free, open-source solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', 'app_description' => 'Invoice Ninja is a free, open-source solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
'rows' => 'rows', 'rows' => 'rows',
'www' => 'www', 'www' => 'www',
'logo' => 'Logo', 'logo' => 'Logo',
@ -750,9 +749,9 @@ return array(
'primary_user' => 'Primary User', 'primary_user' => 'Primary User',
'help' => 'Help', 'help' => 'Help',
'customize_help' => '<p>We use <a href="http://pdfmake.org/" target="_blank">pdfmake</a> to define the invoice designs declaratively. The pdfmake <a href="http://pdfmake.org/playground.html" target="_blank">playground</a> provide\'s a great way to see the library in action.</p> 'customize_help' => '<p>We use <a href="http://pdfmake.org/" target="_blank">pdfmake</a> to define the invoice designs declaratively. The pdfmake <a href="http://pdfmake.org/playground.html" target="_blank">playground</a> provide\'s a great way to see the library in action.</p>
<p>You can access any invoice field by adding <code>Value</code> to the end. For example <code>$invoiceNumberValue</code> displays the invoice number.</p> <p>You can access any invoice field by adding <code>Value</code> to the end. For example <code>$invoiceNumberValue</code> displays the invoice number.</p>
<p>To access a child property using dot notation. For example to show the client name you could use <code>$client.nameValue</code>.</p> <p>To access a child property using dot notation. For example to show the client name you could use <code>$client.nameValue</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' => 'Due Date',
'quote_due_date' => 'Valid Until', 'quote_due_date' => 'Valid Until',
@ -766,7 +765,7 @@ return array(
'status_partial' => 'Partial', 'status_partial' => 'Partial',
'status_paid' => 'Paid', 'status_paid' => 'Paid',
'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',
'iframe_url_help1' => 'Copy the following code to a page on your site.', 'iframe_url_help1' => 'Copy the following code to a page on your site.',
'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.', 'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.',
@ -805,9 +804,9 @@ return array(
'invoice_charges' => 'Invoice Charges', 'invoice_charges' => 'Invoice Charges',
'invitation_status' => [ 'invitation_status' => [
'sent' => 'Email Sent', 'sent' => 'Email Sent',
'opened' => 'Email Openend', 'opened' => 'Email Openend',
'viewed' => 'Invoice Viewed', 'viewed' => 'Invoice Viewed',
], ],
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.', 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice', 'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
@ -817,6 +816,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
);
);

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Cher :name,', 'email_salutation' => 'Cher :name,',
'email_signature' => 'Cordialement,', 'email_signature' => 'Cordialement,',
'email_from' => 'L\'équipe Invoice Ninja', 'email_from' => 'L\'équipe Invoice Ninja',
'user_email_footer' => 'Pour modifier vos paramètres de notification par courriel, veuillez visiter '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Pour modifier vos paramètres de notification par courriel, veuillez visiter '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Pour voir la facture de votre client cliquez sur le lien ci-après :', 'invoice_link_message' => 'Pour voir la facture de votre client cliquez sur le lien ci-après :',
'notification_invoice_paid_subject' => 'La facture :invoice a été payée par le client :client', 'notification_invoice_paid_subject' => 'La facture :invoice a été payée par le client :client',
'notification_invoice_sent_subject' => 'La facture :invoice a été envoyée au client :client', 'notification_invoice_sent_subject' => 'La facture :invoice a été envoyée au client :client',
@ -809,6 +809,10 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Cher :name,', 'email_salutation' => 'Cher :name,',
'email_signature' => 'Cordialement,', 'email_signature' => 'Cordialement,',
'email_from' => 'L\'équipe InvoiceNinja', 'email_from' => 'L\'équipe InvoiceNinja',
'user_email_footer' => 'Pour modifier vos paramètres de notification par courriel, veuillez visiter '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Pour modifier vos paramètres de notification par courriel, veuillez visiter '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Pour voir la facture de votre client cliquez sur le lien ci-après :', 'invoice_link_message' => 'Pour voir la facture de votre client cliquez sur le lien ci-après :',
'notification_invoice_paid_subject' => 'La facture :invoice a été payée par le client :client', 'notification_invoice_paid_subject' => 'La facture :invoice a été payée par le client :client',
'notification_invoice_sent_subject' => 'La facture :invoice a été envoyée au client :client', 'notification_invoice_sent_subject' => 'La facture :invoice a été envoyée au client :client',
@ -810,6 +810,10 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Caro :name,', 'email_salutation' => 'Caro :name,',
'email_signature' => 'Distinti saluti,', 'email_signature' => 'Distinti saluti,',
'email_from' => 'Il Team di InvoiceNinja', 'email_from' => 'Il Team di InvoiceNinja',
'user_email_footer' => 'Per modificare le impostazioni di notifiche via email per favore accedi a: '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Per modificare le impostazioni di notifiche via email per favore accedi a: '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Per visualizzare la tua fattura del cliente clicca sul link qui sotto:', 'invoice_link_message' => 'Per visualizzare la tua fattura del cliente clicca sul link qui sotto:',
'notification_invoice_paid_subject' => 'La fattura :invoice è stata pagata da :client', 'notification_invoice_paid_subject' => 'La fattura :invoice è stata pagata da :client',
'notification_invoice_sent_subject' => 'La fattura :invoice è stata inviata a :client', 'notification_invoice_sent_subject' => 'La fattura :invoice è stata inviata a :client',
@ -812,5 +812,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Dear :name,', 'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,', 'email_signature' => 'Regards,',
'email_from' => 'The Invoice Ninja Team', 'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/company/notifications', 'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:', 'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client', 'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_invoice_sent_subject' => 'Invoice :invoice was sent to :client', 'notification_invoice_sent_subject' => 'Invoice :invoice was sent to :client',
@ -819,6 +819,10 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Kj&#230;re :name,', 'email_salutation' => 'Kj&#230;re :name,',
'email_signature' => 'Med vennlig hilsen,', 'email_signature' => 'Med vennlig hilsen,',
'email_from' => 'The Invoice Ninja Team', 'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'For &#229; justere varslingsinnstillingene vennligst bes&#248;k '.SITE_URL.'/company/notifications', 'user_email_footer' => 'For &#229; justere varslingsinnstillingene vennligst bes&#248;k '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Hvis du vil se din klientfaktura klikk p&#229; linken under:', 'invoice_link_message' => 'Hvis du vil se din klientfaktura klikk p&#229; linken under:',
'notification_invoice_paid_subject' => 'Faktura :invoice betalt av :client', 'notification_invoice_paid_subject' => 'Faktura :invoice betalt av :client',
'notification_invoice_sent_subject' => 'Faktura :invoice sendt til :client', 'notification_invoice_sent_subject' => 'Faktura :invoice sendt til :client',
@ -817,5 +817,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -260,7 +260,7 @@ return array(
'email_salutation' => 'Beste :name,', 'email_salutation' => 'Beste :name,',
'email_signature' => 'Met vriendelijke groeten,', 'email_signature' => 'Met vriendelijke groeten,',
'email_from' => 'Het InvoiceNinja Team', 'email_from' => 'Het InvoiceNinja Team',
'user_email_footer' => 'Ga alstublieft naar '.SITE_URL.'/company/notifications om je e-mail notificatie instellingen aan te passen ', 'user_email_footer' => 'Ga alstublieft naar '.SITE_URL.'/settings/notifications om je e-mail notificatie instellingen aan te passen ',
'invoice_link_message' => 'Klik op volgende link om de Factuur van je klant te bekijken:', 'invoice_link_message' => 'Klik op volgende link om de Factuur van je klant te bekijken:',
'notification_invoice_paid_subject' => 'Factuur :invoice is betaald door :client', 'notification_invoice_paid_subject' => 'Factuur :invoice is betaald door :client',
'notification_invoice_sent_subject' => 'Factuur :invoice is gezonden door :client', 'notification_invoice_sent_subject' => 'Factuur :invoice is gezonden door :client',
@ -812,5 +812,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -258,7 +258,7 @@ return array(
'email_salutation' => 'Caro :name,', 'email_salutation' => 'Caro :name,',
'email_signature' => 'Até mais,', 'email_signature' => 'Até mais,',
'email_from' => 'Equipe InvoiceNinja', 'email_from' => 'Equipe InvoiceNinja',
'user_email_footer' => 'Para ajustar suas configurações de notificações de email acesse '.SITE_URL.'/company/notifications', 'user_email_footer' => 'Para ajustar suas configurações de notificações de email acesse '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'Para visualizar a fatura do seu cliente clique no link abaixo:', 'invoice_link_message' => 'Para visualizar a fatura do seu cliente clique no link abaixo:',
'notification_invoice_paid_subject' => 'Fatura :invoice foi pago por :client', 'notification_invoice_paid_subject' => 'Fatura :invoice foi pago por :client',
'notification_invoice_sent_subject' => 'Fatura :invoice foi enviado por :client', 'notification_invoice_sent_subject' => 'Fatura :invoice foi enviado por :client',
@ -812,5 +812,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -262,7 +262,7 @@ return array(
'email_salutation' => 'Hej :name,', 'email_salutation' => 'Hej :name,',
'email_signature' => 'Vänliga hälsningar,', 'email_signature' => 'Vänliga hälsningar,',
'email_from' => 'Invoice Ninja teamet', 'email_from' => 'Invoice Ninja teamet',
'user_email_footer' => 'För att anpassa dina e-post notifieringar gå till '.SITE_URL.'/company/notifications', 'user_email_footer' => 'För att anpassa dina e-post notifieringar gå till '.SITE_URL.'/settings/notifications',
'invoice_link_message' => 'För att se din kundfaktura klicka på länken nedan:', 'invoice_link_message' => 'För att se din kundfaktura klicka på länken nedan:',
'notification_invoice_paid_subject' => 'Faktura :invoice är betald av :client', 'notification_invoice_paid_subject' => 'Faktura :invoice är betald av :client',
'notification_invoice_sent_subject' => 'Faktura :invoice är skickad till :client', 'notification_invoice_sent_subject' => 'Faktura :invoice är skickad till :client',
@ -815,5 +815,9 @@ return array(
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
'open_balance' => 'Open Balance', 'open_balance' => 'Open Balance',
'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.',
'basic_settings' => 'Basic Settings',
'pro' => 'Pro',
'gateways' => 'Payment Gateways',
); );

View File

@ -1,9 +1,11 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
{!! Former::open($url)->method($method)->rule()->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!} @include('accounts.nav', ['selected' => ACCOUNT_PAYMENTS])
{!! Former::open($url)->method($method)->rule()->addClass('warn-on-exit') !!}
{!! Former::populate($account) !!} {!! Former::populate($account) !!}
@ -106,7 +108,7 @@
<p/>&nbsp;<p/> <p/>&nbsp;<p/>
{!! Former::actions( {!! Former::actions(
$countGateways > 0 ? Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/company/payments'))->appendIcon(Icon::create('remove-circle')) : false, $countGateways > 0 ? Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/settings/online_payments'))->appendIcon(Icon::create('remove-circle')) : false,
Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))) !!} Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))) !!}
{!! Former::close() !!} {!! Former::close() !!}

View File

@ -0,0 +1,72 @@
@extends('header')
@section('content')
@parent
@include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true])
{!! Former::open('tokens/delete')->addClass('user-form') !!}
<div style="display:none">
{!! Former::text('tokenPublicId') !!}
</div>
{!! Former::close() !!}
<div class="pull-right">
{!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/knowledgebase/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!}
@if (Utils::isNinja())
{!! Button::normal(trans('texts.zapier'))->asLinkTo(ZAPIER_URL)->withAttributes(['target' => '_blank']) !!}
@endif
@if (Utils::isPro())
{!! Button::primary(trans('texts.add_token'))->asLinkTo(URL::to('/tokens/create'))->appendIcon(Icon::create('plus-sign')) !!}
@endif
</div>
<!--
<label for="trashed" style="font-weight:normal; margin-left: 10px;">
<input id="trashed" type="checkbox" onclick="setTrashVisible()"
{!! Session::get('show_trash:token') ? 'checked' : ''!!}/> {!! trans('texts.show_deleted_tokens')!!}
</label>
-->
{!! Datatable::table()
->addColumn(
trans('texts.name'),
trans('texts.token'),
trans('texts.action'))
->setUrl(url('api/tokens/'))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
->setOptions('bAutoWidth', false)
->setOptions('aoColumns', [[ "sWidth"=> "40%" ], [ "sWidth"=> "40%" ], ["sWidth"=> "20%"]])
->setOptions('aoColumnDefs', [['bSortable'=>false, 'aTargets'=>[2]]])
->render('datatable') !!}
<script>
window.onDatatableReady = function() {
$('tbody tr').mouseover(function() {
$(this).closest('tr').find('.tr-action').css('visibility','visible');
}).mouseout(function() {
$dropdown = $(this).closest('tr').find('.tr-action');
if (!$dropdown.hasClass('open')) {
$dropdown.css('visibility','hidden');
}
});
}
function setTrashVisible() {
var checked = $('#trashed').is(':checked');
window.location = '{!! URL::to('view_archive/token') !!}' + (checked ? '/true' : '/false');
}
function deleteToken(id) {
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
return;
}
$('#tokenPublicId').val(id);
$('form.user-form').submit();
}
</script>
@stop

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -27,9 +27,8 @@
@stop @stop
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_INVOICE_DESIGN, 'advanced' => true])
<script> <script>
@ -155,7 +154,7 @@
{!! Former::select('invoice_design_id')->style('display:inline;width:120px')->fromQuery($invoiceDesigns, 'name', 'id')->onchange('onSelectChange()')->raw() !!} {!! Former::select('invoice_design_id')->style('display:inline;width:120px')->fromQuery($invoiceDesigns, 'name', 'id')->onchange('onSelectChange()')->raw() !!}
<div class="pull-right"> <div class="pull-right">
{!! Button::normal(trans('texts.help'))->withAttributes(['onclick' => 'showHelp()'])->appendIcon(Icon::create('question-sign')) !!} {!! Button::normal(trans('texts.help'))->withAttributes(['onclick' => 'showHelp()'])->appendIcon(Icon::create('question-sign')) !!}
{!! Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/company/advanced_settings/invoice_design'))->appendIcon(Icon::create('remove-circle')) !!} {!! Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/settings/invoice_design'))->appendIcon(Icon::create('remove-circle')) !!}
@if (Auth::user()->isPro()) @if (Auth::user()->isPro())
{!! Button::success(trans('texts.save'))->withAttributes(['onclick' => 'submitForm()'])->appendIcon(Icon::create('floppy-disk')) !!} {!! Button::success(trans('texts.save'))->withAttributes(['onclick' => 'submitForm()'])->appendIcon(Icon::create('floppy-disk')) !!}
@endif @endif

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@ -13,21 +13,14 @@
{!! Former::open_for_files()->addClass('warn-on-exit')->rules(array( {!! Former::open_for_files()->addClass('warn-on-exit')->rules(array(
'name' => 'required', 'name' => 'required',
'email' => 'email|required'
)) !!} )) !!}
{{ Former::populate($account) }} {{ Former::populate($account) }}
{{ Former::populateField('military_time', intval($account->military_time)) }}
{{ Former::populateField('first_name', $user->first_name) }} @include('accounts.nav', ['selected' => ACCOUNT_COMPANY_DETAILS])
{{ Former::populateField('last_name', $user->last_name) }}
{{ Former::populateField('email', $user->email) }}
{{ Former::populateField('phone', $user->phone) }}
@if (Utils::isNinjaDev())
{{ Former::populateField('dark_mode', intval($user->dark_mode)) }}
@endif
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
@ -72,133 +65,13 @@
</div> </div>
</div> </div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.user_details') !!}</h3>
</div>
<div class="panel-body">
{!! Former::text('first_name') !!}
{!! Former::text('last_name') !!}
{!! Former::text('email') !!}
{!! Former::text('phone') !!}
@if (Utils::isNinja())
{!! Former::plaintext('oneclick_login')->value(
$user->oauth_provider_id ?
$oauthProviderName . ' - ' . link_to('#', trans('texts.disable'), ['onclick' => 'disableSocialLogin()']) :
DropdownButton::primary(trans('texts.enable'))->withContents($oauthLoginUrls)->small()
) !!}
@endif
@if (Utils::isNinja() && $user->confirmed)
@if ($user->referral_code)
{!! Former::plaintext('referral_code')
->value($user->referral_code . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
@else
{!! Former::checkbox('referral_code')
->text(trans('texts.enable') . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
@endif
@endif
@if (false && Utils::isNinjaDev())
{!! Former::checkbox('dark_mode')->text(trans('texts.dark_mode_help')) !!}
@endif
@if (Utils::isNinja())
<br/>
@if (Auth::user()->confirmed)
{!! Former::actions( Button::primary(trans('texts.change_password'))->small()->withAttributes(['onclick'=>'showChangePassword()'])) !!}
@elseif (Auth::user()->registered)
{!! Former::actions( Button::primary(trans('texts.resend_confirmation'))->asLinkTo(URL::to('/resend_confirmation'))->small() ) !!}
@endif
@endif
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.localization') !!}</h3>
</div>
<div class="panel-body">
{!! Former::select('currency_id')->addOption('','')
->fromQuery($currencies, 'name', 'id') !!}
{!! Former::select('language_id')->addOption('','')
->fromQuery($languages, 'name', 'id') !!}
{!! Former::select('timezone_id')->addOption('','')
->fromQuery($timezones, 'location', 'id') !!}
{!! Former::select('date_format_id')->addOption('','')
->fromQuery($dateFormats, 'label', 'id') !!}
{!! Former::select('datetime_format_id')->addOption('','')
->fromQuery($datetimeFormats, 'label', 'id') !!}
{!! Former::checkbox('military_time')->text(trans('texts.enable')) !!}
</div>
</div>
</div>
</div> </div>
<center> <center>
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!} {!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!}
</center> </center>
<div class="modal fade" id="passwordModal" tabindex="-1" role="dialog" aria-labelledby="passwordModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="passwordModalLabel">{{ trans('texts.change_password') }}</h4>
</div>
<div style="background-color: #fff" id="changePasswordDiv" onkeyup="validateChangePassword()" onclick="validateChangePassword()" onkeydown="checkForEnter(event)">
&nbsp;
{!! Former::password('current_password')->style('width:300px') !!}
{!! Former::password('newer_password')->style('width:300px')->label(trans('texts.new_password')) !!}
{!! Former::password('confirm_password')->style('width:300px') !!}
&nbsp;
<br/>
<center>
<div id="changePasswordError"></div>
</center>
<br/>
</div>
<div style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="working">
<h3>{{ trans('texts.working') }}...</h3>
<div class="progress progress-striped active">
<div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"></div>
</div>
</div>
<div style="background-color: #fff; padding-right:20px;padding-left:20px; display:none" id="successDiv">
<br/>
<h3>{{ trans('texts.success') }}</h3>
{{ trans('texts.updated_password') }}
<br/>
&nbsp;
<br/>
</div>
<div class="modal-footer" style="margin-top: 0px" id="changePasswordFooter">
<button type="button" class="btn btn-default" id="cancelChangePasswordButton" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-success" onclick="submitChangePassword()" id="changePasswordButton" disabled>
{{ trans('texts.save') }}
<i class="glyphicon glyphicon-floppy-disk"></i>
</button>
</div>
</div>
</div>
</div>
{!! Former::close() !!} {!! Former::close() !!}
{!! Form::open(['url' => 'remove_logo', 'class' => 'removeLogoForm']) !!} {!! Form::open(['url' => 'remove_logo', 'class' => 'removeLogoForm']) !!}
@ -209,21 +82,6 @@
$(function() { $(function() {
$('#country_id').combobox(); $('#country_id').combobox();
$('#passwordModal').on('hidden.bs.modal', function () {
$(['current_password', 'newer_password', 'confirm_password']).each(function(i, field) {
var $input = $('form #'+field);
$input.val('');
$input.closest('div.form-group').removeClass('has-success');
});
$('#changePasswordButton').prop('disabled', true);
})
$('#passwordModal').on('shown.bs.modal', function () {
$('#current_password').focus();
})
localStorage.setItem('auth_provider', '{{ strtolower($oauthProviderName) }}');
}); });
function deleteLogo() { function deleteLogo() {
@ -232,84 +90,6 @@
} }
} }
function showChangePassword() {
$('#passwordModal').modal('show');
}
function checkForEnter(event)
{
if (event.keyCode === 13){
event.preventDefault();
return false;
}
}
function validateChangePassword(showError)
{
var isFormValid = true;
$(['current_password', 'newer_password', 'confirm_password']).each(function(i, field) {
var $input = $('form #'+field),
val = $.trim($input.val());
var isValid = val && val.length >= 6;
if (isValid && field == 'confirm_password') {
isValid = val == $.trim($('#newer_password').val());
}
if (isValid) {
$input.closest('div.form-group').removeClass('has-error').addClass('has-success');
} else {
isFormValid = false;
$input.closest('div.form-group').removeClass('has-success');
if (showError) {
$input.closest('div.form-group').addClass('has-error');
}
}
});
$('#changePasswordButton').prop('disabled', !isFormValid);
return isFormValid;
}
function submitChangePassword()
{
if (!validateChangePassword(true)) {
return;
}
$('#changePasswordDiv, #changePasswordFooter').hide();
$('#working').show();
$.ajax({
type: 'POST',
url: '{{ URL::to('/users/change_password') }}',
data: 'current_password=' + encodeURIComponent($('form #current_password').val()) +
'&new_password=' + encodeURIComponent($('form #newer_password').val()) +
'&confirm_password=' + encodeURIComponent($('form #confirm_password').val()),
success: function(result) {
if (result == 'success') {
NINJA.formIsChanged = false;
$('#changePasswordButton').hide();
$('#successDiv').show();
$('#cancelChangePasswordButton').html('{{ trans('texts.close') }}');
} else {
$('#changePasswordError').html(result);
$('#changePasswordDiv').show();
}
$('#changePasswordFooter').show();
$('#working').hide();
}
});
}
function disableSocialLogin() {
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
return;
}
window.location = '{{ URL::to('/auth_unlink') }}';
}
</script> </script>
@stop @stop

View File

@ -1,7 +1,8 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav', ['selected' => ACCOUNT_IMPORT_EXPORT])
{{ Former::open()->addClass('col-md-9 col-md-offset-1') }} {{ Former::open()->addClass('col-md-9 col-md-offset-1') }}
{{ Former::legend('Export Client Data') }} {{ Former::legend('Export Client Data') }}

View File

@ -1,9 +1,11 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
{!! Former::open_for_files('company/import_map')->addClass('col-md-8 col-md-offset-2') !!} @include('accounts.nav', ['selected' => ACCOUNT_IMPORT_EXPORT])
{!! Former::open_for_files('settings/' . ACCOUNT_MAP) !!}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.import_clients') !!}</h3> <h3 class="panel-title">{!! trans('texts.import_clients') !!}</h3>
@ -16,7 +18,7 @@
{!! Former::close() !!} {!! Former::close() !!}
{!! Former::open('company/export')->addClass('col-md-8 col-md-offset-2') !!} {!! Former::open('settings/' . ACCOUNT_EXPORT) !!}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.export_clients') !!}</h3> <h3 class="panel-title">{!! trans('texts.export_clients') !!}</h3>
@ -28,7 +30,7 @@
{!! Former::close() !!} {!! Former::close() !!}
{!! Former::open('company/cancel_account')->addClass('col-md-8 col-md-offset-2 cancel-account') !!} {!! Former::open('settings/cancel_account')->addClass('cancel-account') !!}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.cancel_account') !!}</h3> <h3 class="panel-title">{!! trans('texts.cancel_account') !!}</h3>

View File

@ -1,9 +1,11 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
{!! Former::open('company/import_export')->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!} @include('accounts.nav', ['selected' => ACCOUNT_IMPORT_EXPORT])
{!! Former::open('settings/' . ACCOUNT_IMPORT_EXPORT)->addClass('warn-on-exit') !!}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
@ -46,7 +48,7 @@
{!! Former::actions( {!! Former::actions(
Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/company/import_export'))->appendIcon(Icon::create('remove-circle')), Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/settings/import_export'))->appendIcon(Icon::create('remove-circle')),
Button::success(trans('texts.import'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))) !!} Button::success(trans('texts.import'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))) !!}
{!! Former::close() !!} {!! Former::close() !!}

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -12,7 +12,7 @@
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_INVOICE_DESIGN, 'advanced' => true])
<script> <script>
var invoiceDesigns = {!! $invoiceDesigns !!}; var invoiceDesigns = {!! $invoiceDesigns !!};
@ -105,7 +105,7 @@
{!! Former::text('secondary_color') !!} {!! Former::text('secondary_color') !!}
{!! Former::actions( {!! Former::actions(
Button::primary(trans('texts.customize_design'))->small()->asLinkTo(URL::to('/company/advanced_settings/customize_design')) Button::primary(trans('texts.customize_design'))->small()->asLinkTo(URL::to('/settings/customize_design'))
) !!} ) !!}
</div> </div>

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -18,9 +18,9 @@
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_INVOICE_SETTINGS, 'advanced' => true])
{!! Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!} {!! Former::open()->addClass('warn-on-exit') !!}
{{ Former::populate($account) }} {{ Former::populate($account) }}
{{ Former::populateField('custom_invoice_taxes1', intval($account->custom_invoice_taxes1)) }} {{ Former::populateField('custom_invoice_taxes1', intval($account->custom_invoice_taxes1)) }}
{{ Former::populateField('custom_invoice_taxes2', intval($account->custom_invoice_taxes2)) }} {{ Former::populateField('custom_invoice_taxes2', intval($account->custom_invoice_taxes2)) }}

View File

@ -0,0 +1,45 @@
@extends('header')
@section('content')
@parent
{!! Former::open_for_files()->addClass('warn-on-exit') !!}
{{ Former::populate($account) }}
@include('accounts.nav', ['selected' => ACCOUNT_LOCALIZATION])
<div class="row">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.localization') !!}</h3>
</div>
<div class="panel-body">
{!! Former::select('currency_id')->addOption('','')
->fromQuery($currencies, 'name', 'id') !!}
{!! Former::select('language_id')->addOption('','')
->fromQuery($languages, 'name', 'id') !!}
{!! Former::select('timezone_id')->addOption('','')
->fromQuery($timezones, 'location', 'id') !!}
{!! Former::select('date_format_id')->addOption('','')
->fromQuery($dateFormats, 'label', 'id') !!}
{!! Former::select('datetime_format_id')->addOption('','')
->fromQuery($datetimeFormats, 'label', 'id') !!}
{!! Former::checkbox('military_time')->text(trans('texts.enable')) !!}
</div>
</div>
</div>
<center>
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!}
</center>
{!! Former::close() !!}
@stop
@section('onReady')
$('#currency_id').focus();
@stop

View File

@ -1,16 +1,33 @@
@extends('header') @if (!Utils::isPro() && isset($advanced) && $advanced)
<div class="alert alert-warning" style="font-size:larger;">
<center>
{!! trans('texts.pro_plan_advanced_settings', ['link'=>'<a href="#" onclick="showProPlan(\''.$selected.'\')">'.trans('texts.pro_plan.remove_logo_link').'</a>']) !!}
</center>
</div>
@endif
@section('content') <div class="row">
<ul class="nav nav-tabs nav nav-justified"> <div class="col-md-3">
{!! HTML::nav_link('company/details', 'company_details') !!} @foreach([
{!! HTML::nav_link('company/payments', 'online_payments', 'gateways') !!} BASIC_SETTINGS => \App\Models\Account::$basicSettings,
{!! HTML::nav_link('company/products', 'product_library') !!} ADVANCED_SETTINGS => \App\Models\Account::$advancedSettings,
{!! HTML::nav_link('company/notifications', 'notifications') !!} ] as $type => $settings)
{!! HTML::nav_link('company/import_export', 'import_export', 'company/import_map') !!} <div class="panel panel-default">
{!! HTML::nav_link('company/advanced_settings/invoice_design', 'advanced_settings', '*/advanced_settings/*') !!} <div class="panel-heading" style="color:white">
</ul> {{ trans("texts.{$type}") }}
@if ($type == ADVANCED_SETTINGS && !Utils::isPro())
<sup>{{ strtoupper(trans('texts.pro')) }}</sup>
@endif
</div>
<div class="list-group">
@foreach ($settings as $section)
<a href="{{ URL::to("settings/{$section}") }}" class="list-group-item {{ $selected === $section ? 'selected' : '' }}"
style="width:100%;text-align:left">{{ trans("texts.{$section}") }}</a>
@endforeach
</div>
</div>
@endforeach
</div>
<br/> <div class="col-md-9">
@stop

View File

@ -1,9 +1,11 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
{!! Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!} @include('accounts.nav', ['selected' => ACCOUNT_NOTIFICATIONS])
{!! Former::open()->addClass('warn-on-exit') !!}
{{ Former::populate($account) }} {{ Former::populate($account) }}
{{ Former::populateField('notify_sent', intval(Auth::user()->notify_sent)) }} {{ Former::populateField('notify_sent', intval(Auth::user()->notify_sent)) }}
{{ Former::populateField('notify_viewed', intval(Auth::user()->notify_viewed)) }} {{ Former::populateField('notify_viewed', intval(Auth::user()->notify_viewed)) }}

View File

@ -1,7 +1,8 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav', ['selected' => ACCOUNT_PAYMENTS])
{!! Former::open('gateways/delete')->addClass('user-form') !!} {!! Former::open('gateways/delete')->addClass('user-form') !!}

View File

@ -1,11 +1,13 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav', ['selected' => ACCOUNT_PRODUCTS])
{!! Former::open($url)->method($method) {!! Former::open($url)->method($method)
->rules(['product_key' => 'required|max:255']) ->rules(['product_key' => 'required|max:255'])
->addClass('col-md-8 col-md-offset-2 warn-on-exit') !!} ->addClass('warn-on-exit') !!}
<div class="panel panel-default"> <div class="panel panel-default">
@ -27,7 +29,7 @@
</div> </div>
{!! Former::actions( {!! Former::actions(
Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/company/products'))->appendIcon(Icon::create('remove-circle')), Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/settings/products'))->appendIcon(Icon::create('remove-circle')),
Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))
) !!} ) !!}

View File

@ -1,8 +1,10 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav', ['selected' => ACCOUNT_PRODUCTS])
{!! Former::open()->addClass('warn-on-exit') !!} {!! Former::open()->addClass('warn-on-exit') !!}
{{ Former::populateField('fill_products', intval($account->fill_products)) }} {{ Former::populateField('fill_products', intval($account->fill_products)) }}
{{ Former::populateField('update_products', intval($account->update_products)) }} {{ Former::populateField('update_products', intval($account->update_products)) }}

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -13,9 +13,9 @@
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_TEMPLATES_AND_REMINDERS, 'advanced' => true])
{!! Former::vertical_open()->addClass('col-md-10 col-md-offset-1 warn-on-exit') !!} {!! Former::vertical_open()->addClass('warn-on-exit') !!}
{!! Former::populate($account) !!} {!! Former::populate($account) !!}
@foreach ([ENTITY_INVOICE, ENTITY_QUOTE, ENTITY_PAYMENT, REMINDER1, REMINDER2, REMINDER3] as $type) @foreach ([ENTITY_INVOICE, ENTITY_QUOTE, ENTITY_PAYMENT, REMINDER1, REMINDER2, REMINDER3] as $type)

View File

@ -1,10 +1,10 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS])
{!! Former::open($url)->method($method)->addClass('col-md-8 col-md-offset-2 warn-on-exit')->rules(array( {!! Former::open($url)->method($method)->addClass('warn-on-exit')->rules(array(
'name' => 'required', 'name' => 'required',
)); !!} )); !!}
@ -25,7 +25,7 @@
@if (Auth::user()->isPro()) @if (Auth::user()->isPro())
{!! Former::actions( {!! Former::actions(
Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/company/advanced_settings/token_management'))->appendIcon(Icon::create('remove-circle'))->large(), Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/settings/token_management'))->appendIcon(Icon::create('remove-circle'))->large(),
Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk'))
) !!} ) !!}
@else @else

View File

@ -1,8 +1,8 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true])
{!! Former::open('tokens/delete')->addClass('user-form') !!} {!! Former::open('tokens/delete')->addClass('user-form') !!}

View File

@ -0,0 +1,223 @@
@extends('header')
@section('content')
@parent
{!! Former::open_for_files()->addClass('warn-on-exit')->rules(array(
'email' => 'email|required'
)) !!}
{{ Former::populate($account) }}
{{ Former::populateField('military_time', intval($account->military_time)) }}
{{ Former::populateField('first_name', $user->first_name) }}
{{ Former::populateField('last_name', $user->last_name) }}
{{ Former::populateField('email', $user->email) }}
{{ Former::populateField('phone', $user->phone) }}
@if (Utils::isNinjaDev())
{{ Former::populateField('dark_mode', intval($user->dark_mode)) }}
@endif
@include('accounts.nav', ['selected' => ACCOUNT_USER_DETAILS])
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.user_details') !!}</h3>
</div>
<div class="panel-body">
{!! Former::text('first_name') !!}
{!! Former::text('last_name') !!}
{!! Former::text('email') !!}
{!! Former::text('phone') !!}
@if (Utils::isNinja())
{!! Former::plaintext('oneclick_login')->value(
$user->oauth_provider_id ?
$oauthProviderName . ' - ' . link_to('#', trans('texts.disable'), ['onclick' => 'disableSocialLogin()']) :
DropdownButton::primary(trans('texts.enable'))->withContents($oauthLoginUrls)->small()
) !!}
@endif
@if (Utils::isNinja() && $user->confirmed)
@if ($user->referral_code)
{!! Former::plaintext('referral_code')
->value($user->referral_code . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
@else
{!! Former::checkbox('referral_code')
->text(trans('texts.enable') . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
@endif
@endif
@if (false && Utils::isNinjaDev())
{!! Former::checkbox('dark_mode')->text(trans('texts.dark_mode_help')) !!}
@endif
@if (Utils::isNinja())
<br/>
@if (Auth::user()->confirmed)
{!! Former::actions( Button::primary(trans('texts.change_password'))->small()->withAttributes(['onclick'=>'showChangePassword()'])) !!}
@elseif (Auth::user()->registered)
{!! Former::actions( Button::primary(trans('texts.resend_confirmation'))->asLinkTo(URL::to('/resend_confirmation'))->small() ) !!}
@endif
@endif
</div>
</div>
</div>
<center>
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!}
</center>
</div>
<div class="modal fade" id="passwordModal" tabindex="-1" role="dialog" aria-labelledby="passwordModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="passwordModalLabel">{{ trans('texts.change_password') }}</h4>
</div>
<div style="background-color: #fff" id="changePasswordDiv" onkeyup="validateChangePassword()" onclick="validateChangePassword()" onkeydown="checkForEnter(event)">
&nbsp;
{!! Former::password('current_password')->style('width:300px') !!}
{!! Former::password('newer_password')->style('width:300px')->label(trans('texts.new_password')) !!}
{!! Former::password('confirm_password')->style('width:300px') !!}
&nbsp;
<br/>
<center>
<div id="changePasswordError"></div>
</center>
<br/>
</div>
<div style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="working">
<h3>{{ trans('texts.working') }}...</h3>
<div class="progress progress-striped active">
<div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"></div>
</div>
</div>
<div style="background-color: #fff; padding-right:20px;padding-left:20px; display:none" id="successDiv">
<br/>
<h3>{{ trans('texts.success') }}</h3>
{{ trans('texts.updated_password') }}
<br/>
&nbsp;
<br/>
</div>
<div class="modal-footer" style="margin-top: 0px" id="changePasswordFooter">
<button type="button" class="btn btn-default" id="cancelChangePasswordButton" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-success" onclick="submitChangePassword()" id="changePasswordButton" disabled>
{{ trans('texts.save') }}
<i class="glyphicon glyphicon-floppy-disk"></i>
</button>
</div>
</div>
</div>
</div>
{!! Former::close() !!}
<script type="text/javascript">
$(function() {
$('#passwordModal').on('hidden.bs.modal', function () {
$(['current_password', 'newer_password', 'confirm_password']).each(function(i, field) {
var $input = $('form #'+field);
$input.val('');
$input.closest('div.form-group').removeClass('has-success');
});
$('#changePasswordButton').prop('disabled', true);
})
$('#passwordModal').on('shown.bs.modal', function () {
$('#current_password').focus();
})
localStorage.setItem('auth_provider', '{{ strtolower($oauthProviderName) }}');
});
function showChangePassword() {
$('#passwordModal').modal('show');
}
function validateChangePassword(showError)
{
var isFormValid = true;
$(['current_password', 'newer_password', 'confirm_password']).each(function(i, field) {
var $input = $('form #'+field),
val = $.trim($input.val());
var isValid = val && val.length >= 6;
if (isValid && field == 'confirm_password') {
isValid = val == $.trim($('#newer_password').val());
}
if (isValid) {
$input.closest('div.form-group').removeClass('has-error').addClass('has-success');
} else {
isFormValid = false;
$input.closest('div.form-group').removeClass('has-success');
if (showError) {
$input.closest('div.form-group').addClass('has-error');
}
}
});
$('#changePasswordButton').prop('disabled', !isFormValid);
return isFormValid;
}
function submitChangePassword()
{
if (!validateChangePassword(true)) {
return;
}
$('#changePasswordDiv, #changePasswordFooter').hide();
$('#working').show();
$.ajax({
type: 'POST',
url: '{{ URL::to('/users/change_password') }}',
data: 'current_password=' + encodeURIComponent($('form #current_password').val()) +
'&new_password=' + encodeURIComponent($('form #newer_password').val()) +
'&confirm_password=' + encodeURIComponent($('form #confirm_password').val()),
success: function(result) {
if (result == 'success') {
NINJA.formIsChanged = false;
$('#changePasswordButton').hide();
$('#successDiv').show();
$('#cancelChangePasswordButton').html('{{ trans('texts.close') }}');
} else {
$('#changePasswordError').html(result);
$('#changePasswordDiv').show();
}
$('#changePasswordFooter').show();
$('#working').hide();
}
});
}
function disableSocialLogin() {
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
return;
}
window.location = '{{ URL::to('/auth_unlink') }}';
}
</script>
@stop
@section('onReady')
$('#first_name').focus();
@stop

View File

@ -1,8 +1,8 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_USER_MANAGEMENT, 'advanced' => true])
{!! Former::open('users/delete')->addClass('user-form') !!} {!! Former::open('users/delete')->addClass('user-form') !!}
@ -13,7 +13,6 @@
<div class="pull-right"> <div class="pull-right">
{!! Button::normal(trans('texts.api_tokens'))->asLinkTo(URL::to('/company/advanced_settings/token_management'))->appendIcon(Icon::create('cloud')) !!}
@if (Utils::isPro()) @if (Utils::isPro())
{!! Button::primary(trans('texts.add_user'))->asLinkTo(URL::to('/users/create'))->appendIcon(Icon::create('plus-sign')) !!} {!! Button::primary(trans('texts.add_user'))->asLinkTo(URL::to('/users/create'))->appendIcon(Icon::create('plus-sign')) !!}
@endif @endif

View File

@ -12,11 +12,11 @@
</div> </div>
<div class="in-bold"> <div class="in-bold">
@if (count($paidToDate)) @if (count($paidToDate))
@foreach ($paidToDate as $item) @foreach ($paidToDate as $item)
{{ Utils::formatMoney($item->value, $item->currency_id) }}<br/> {{ Utils::formatMoney($item->value, $item->currency_id) }}<br/>
@endforeach @endforeach
@else @else
{{ Utils::formatMoney(0) }} {{ Utils::formatMoney(0) }}
@endif @endif
</div> </div>
</div> </div>
@ -31,11 +31,11 @@
</div> </div>
<div class="in-bold"> <div class="in-bold">
@if (count($averageInvoice)) @if (count($averageInvoice))
@foreach ($averageInvoice as $item) @foreach ($averageInvoice as $item)
{{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}<br/> {{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}<br/>
@endforeach @endforeach
@else @else
{{ Utils::formatMoney(0) }} {{ Utils::formatMoney(0) }}
@endif @endif
</div> </div>
</div> </div>
@ -50,11 +50,11 @@
</div> </div>
<div class="in-bold"> <div class="in-bold">
@if (count($balances)) @if (count($balances))
@foreach ($balances as $item) @foreach ($balances as $item)
{{ Utils::formatMoney($item->value, $item->currency_id) }}<br/> {{ Utils::formatMoney($item->value, $item->currency_id) }}<br/>
@endforeach @endforeach
@else @else
{{ Utils::formatMoney(0) }} {{ Utils::formatMoney(0) }}
@endif @endif
</div> </div>
</div> </div>

View File

@ -438,12 +438,10 @@
<span class="glyphicon glyphicon-cog" title="{{ trans('texts.settings') }}"/> <span class="glyphicon glyphicon-cog" title="{{ trans('texts.settings') }}"/>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li>{!! link_to('company/details', uctrans('texts.company_details')) !!}</li> @foreach (\App\Models\Account::$basicSettings as $setting)
<li>{!! link_to('company/payments', uctrans('texts.online_payments')) !!}</li> <li>{!! link_to('settings/' . $setting, uctrans("texts.{$setting}")) !!}</li>
<li>{!! link_to('company/products', uctrans('texts.product_library')) !!}</li> @endforeach
<li>{!! link_to('company/notifications', uctrans('texts.notifications')) !!}</li> <li><a href="{{ url('settings/' . ACCOUNT_INVOICE_DESIGN) }}">{!! uctrans('texts.advanced_settings') . Utils::getProLabel(ACCOUNT_ADVANCED_SETTINGS) !!}</a></li>
<li>{!! link_to('company/import_export', uctrans('texts.import_export')) !!}</li>
<li><a href="{{ url('company/advanced_settings/invoice_design') }}">{!! uctrans('texts.advanced_settings') . Utils::getProLabel(ACCOUNT_ADVANCED_SETTINGS) !!}</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -667,6 +665,7 @@
{{-- Per our license, please do not remove or modify this section. --}} {{-- Per our license, please do not remove or modify this section. --}}
@if (!Utils::isNinjaProd()) @if (!Utils::isNinjaProd())
</div>
<p>&nbsp;</p> <p>&nbsp;</p>
<div class="container"> <div class="container">
{{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/?utm_source=powered_by" target="_blank">InvoiceNinja.com</a> - {{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/?utm_source=powered_by" target="_blank">InvoiceNinja.com</a> -

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -8,152 +8,143 @@
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_CHARTS_AND_REPORTS, 'advanced' => true])
{!! Button::primary(trans('texts.data_visualizations')) {!! Former::open()->rules(['start_date' => 'required', 'end_date' => 'required'])->addClass('warn-on-exit') !!}
->asLinkTo(URL::to('/company/advanced_settings/data_visualizations'))
->withAttributes(['class' => 'pull-right'])
->appendIcon(Icon::create('globe')) !!}
<p>&nbsp;</p> <div style="display:none">
<p>&nbsp;</p> {!! Former::text('action') !!}
</div>
{!! Former::populateField('start_date', $startDate) !!}
{!! Former::populateField('end_date', $endDate) !!}
{!! Former::populateField('enable_report', intval($enableReport)) !!}
{!! Former::populateField('enable_chart', intval($enableChart)) !!}
<div class="row"> <div class="row">
<div class="col-lg-4"> <div class="col-lg-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.settings') !!}</h3> <h3 class="panel-title">{!! trans('texts.settings') !!}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="row">
<div class="col-md-6">
{!! Former::text('start_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))
->addGroupClass('start_date')
->append('<i class="glyphicon glyphicon-calendar" onclick="toggleDatePicker(\'start_date\')"></i>') !!}
{!! Former::text('end_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))
->addGroupClass('end_date')
->append('<i class="glyphicon glyphicon-calendar" onclick="toggleDatePicker(\'end_date\')"></i>') !!}
<p>&nbsp;</p>
{!! Former::actions(
Button::primary(trans('texts.export'))->withAttributes(array('onclick' => 'onExportClick()'))->appendIcon(Icon::create('export')),
Button::success(trans('texts.run'))->withAttributes(array('id' => 'submitButton'))->submit()->appendIcon(Icon::create('play'))
) !!}
@if (!Auth::user()->isPro())
<script>
$(function() {
$('form.warn-on-exit').find('input, select, button').prop('disabled', true);
});
</script>
@endif
{!! Former::open()->rules(['start_date' => 'required', 'end_date' => 'required'])->addClass('warn-on-exit') !!} </div>
<div class="col-md-6">
<div style="display:none"> {!! Former::checkbox('enable_report')->text(trans('texts.enable')) !!}
{!! Former::text('action') !!} {!! Former::select('report_type')->options($reportTypes, $reportType)->label(trans('texts.group_by')) !!}
</div> <p>&nbsp;</p>
{!! Former::checkbox('enable_chart')->text(trans('texts.enable')) !!}
{!! Former::populateField('start_date', $startDate) !!} {!! Former::select('group_by')->options($dateTypes, $groupBy) !!}
{!! Former::populateField('end_date', $endDate) !!} {!! Former::select('chart_type')->options($chartTypes, $chartType) !!}
{!! Former::populateField('enable_report', intval($enableReport)) !!}
{!! Former::populateField('enable_chart', intval($enableChart)) !!}
{!! Former::text('start_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))
->addGroupClass('start_date')
->append('<i class="glyphicon glyphicon-calendar" onclick="toggleDatePicker(\'start_date\')"></i>') !!}
{!! Former::text('end_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))
->addGroupClass('end_date')
->append('<i class="glyphicon glyphicon-calendar" onclick="toggleDatePicker(\'end_date\')"></i>') !!}
<p>&nbsp;</p>
{!! Former::checkbox('enable_report')->text(trans('texts.enable')) !!}
{!! Former::select('report_type')->options($reportTypes, $reportType)->label(trans('texts.group_by')) !!}
<p>&nbsp;</p>
{!! Former::checkbox('enable_chart')->text(trans('texts.enable')) !!}
{!! Former::select('group_by')->options($dateTypes, $groupBy) !!}
{!! Former::select('chart_type')->options($chartTypes, $chartType) !!}
<p>&nbsp;</p>
@if (Auth::user()->isPro())
{!! Former::actions(
Button::primary(trans('texts.export'))->withAttributes(array('onclick' => 'onExportClick()'))->appendIcon(Icon::create('export')),
Button::success(trans('texts.run'))->withAttributes(array('id' => 'submitButton'))->submit()->appendIcon(Icon::create('play'))
) !!}
@else
<script>
$(function() {
$('form.warn-on-exit').find('input, select').prop('disabled', true);
});
</script>
@endif
{!! Former::close() !!}
{!! Former::close() !!}
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-8"> </div>
@if ($enableReport)
@if ($enableReport) <div class="panel panel-default">
<div class="panel panel-default"> <div class="panel-body">
<div class="panel-body"> <table class="table table-striped invoice-table">
<table class="table table-striped invoice-table"> <thead>
<thead> <tr>
<tr> @foreach ($columns as $column)
@foreach ($columns as $column) <th>
<th> {{ trans("texts.{$column}") }}
{{ trans("texts.{$column}") }} </th>
</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach ($displayData as $record)
<tr>
@foreach ($record as $field)
<td>
{!! $field !!}
</td>
@endforeach
</tr>
@endforeach @endforeach
</tbody> </tr>
<tfoot> </thead>
<tbody>
@foreach ($displayData as $record)
<tr> <tr>
<td><b>{{ trans('texts.totals') }}</b></td> @foreach ($record as $field)
@if (!$reportType) <td>
<td></td> {!! $field !!}
<td></td> </td>
@endif @endforeach
<td> </tr>
@foreach ($reportTotals['amount'] as $currencyId => $total) @endforeach
<b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/> </tbody>
@endforeach <tfoot>
</td> <tr>
<td> <td><b>{{ trans('texts.totals') }}</b></td>
@foreach ($reportTotals['paid'] as $currencyId => $total) @if (!$reportType)
<b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/> <td></td>
@endforeach <td></td>
</td> @endif
<td> <td>
@foreach ($reportTotals['balance'] as $currencyId => $total) @foreach ($reportTotals['amount'] as $currencyId => $total)
<b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/> <b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/>
@endforeach @endforeach
</td> </td>
</tr> <td>
</tfoot> @foreach ($reportTotals['paid'] as $currencyId => $total)
</table> <b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/>
@endforeach
</td>
<td>
@foreach ($reportTotals['balance'] as $currencyId => $total)
<b>{{ Utils::formatMoney($total, $currencyId) }}</b><br/>
@endforeach
</td>
</tr>
</tfoot>
</table>
</div>
</div>
@endif
@if ($enableChart)
<div class="panel panel-default">
<div class="panel-body">
<canvas id="monthly-reports" width="700" height="400"></canvas>
<p>&nbsp;</p>
<div style="padding-bottom:8px">
<div style="float:left; height:22px; width:60px; background-color:rgba(78,205,196,.5); border: 1px solid rgba(78,205,196,1)"></div>
<div style="vertical-align: middle">&nbsp;Invoices</div>
</div>
<div style="padding-bottom:8px; clear:both">
<div style="float:left; height:22px; width:60px; background-color:rgba(255,107,107,.5); border: 1px solid rgba(255,107,107,1)"></div>
<div style="vertical-align: middle">&nbsp;Payments</div>
</div> </div>
</div> <div style="clear:both">
@endif <div style="float:left; height:22px; width:60px; background-color:rgba(199,244,100,.5); border: 1px solid rgba(199,244,100,1)"></div>
<div style="vertical-align: middle">&nbsp;Credits</div>
@if ($enableChart)
<div class="panel panel-default">
<div class="panel-body">
<canvas id="monthly-reports" width="700" height="400"></canvas>
<p>&nbsp;</p>
<div style="padding-bottom:8px">
<div style="float:left; height:22px; width:60px; background-color:rgba(78,205,196,.5); border: 1px solid rgba(78,205,196,1)"></div>
<div style="vertical-align: middle">&nbsp;Invoices</div>
</div>
<div style="padding-bottom:8px; clear:both">
<div style="float:left; height:22px; width:60px; background-color:rgba(255,107,107,.5); border: 1px solid rgba(255,107,107,1)"></div>
<div style="vertical-align: middle">&nbsp;Payments</div>
</div>
<div style="clear:both">
<div style="float:left; height:22px; width:60px; background-color:rgba(199,244,100,.5); border: 1px solid rgba(199,244,100,1)"></div>
<div style="vertical-align: middle">&nbsp;Credits</div>
</div>
</div> </div>
</div>
@endif
</div> </div>
</div>
@endif
</div> </div>

View File

@ -1,4 +1,4 @@
@extends('accounts.nav') @extends('header')
@section('head') @section('head')
@parent @parent
@ -30,7 +30,7 @@
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_DATA_VISUALIZATIONS, 'advanced' => true])
<div id="tooltip" class="hidden"> <div id="tooltip" class="hidden">
<p> <p>
@ -121,22 +121,10 @@
product.displayAge = product.values.age; product.displayAge = product.values.age;
}); });
/*
_.each(clients, function(client) {
_.each(client.invoices, function(invoice) {
_.each(invoice.invoice_items, function(invoice_item) {
delete invoice_item.invoice;
});
});
});
*/
//console.log(JSON.stringify(clients)); //console.log(JSON.stringify(clients));
//console.log(JSON.stringify(invoices)); //console.log(JSON.stringify(invoices));
//console.log(JSON.stringify(products)); //console.log(JSON.stringify(products));
var arc = d3.svg.arc() var arc = d3.svg.arc()
.innerRadius(function(d) { return d.r - 2 }) .innerRadius(function(d) { return d.r - 2 })
.outerRadius(function(d) { return d.r - 8 }) .outerRadius(function(d) { return d.r - 8 })
@ -149,7 +137,7 @@
.endAngle(2 * Math.PI); .endAngle(2 * Math.PI);
var diameter = 1050, var diameter = 900,
format = d3.format(",d"); format = d3.format(",d");
//color = d3.scale.category10(); //color = d3.scale.category10();
@ -164,14 +152,14 @@
.padding(12); .padding(12);
var svg = d3.select(".svg-div").append("svg") var svg = d3.select(".svg-div").append("svg")
.attr("width", "1142px") .attr("width", "100%")
.attr("height", "1142px") .attr("height", "1142px")
.attr("class", "bubble"); .attr("class", "bubble");
svg.append("rect") svg.append("rect")
.attr("stroke-width", "1") .attr("stroke-width", "1")
.attr("stroke", "rgb(150,150,150)") .attr("stroke", "rgb(150,150,150)")
.attr("width", "100%") .attr("width", "99%")
.attr("height", "100%") .attr("height", "100%")
.attr("fill", "white"); .attr("fill", "white");
@ -187,7 +175,6 @@
var selection = svg.selectAll(".node") var selection = svg.selectAll(".node")
.data(data, function(d) { return d.displayName; }); .data(data, function(d) { return d.displayName; });
//.data(data);
var node = selection.enter().append("g") var node = selection.enter().append("g")
.attr("class", "node") .attr("class", "node")
@ -198,9 +185,10 @@
if (!visibleTooltip || visibleTooltip != d.displayName) { if (!visibleTooltip || visibleTooltip != d.displayName) {
d3.select("#tooltip") d3.select("#tooltip")
.classed("hidden", false) .classed("hidden", false)
.style("left", d3.event.pageX + "px") .style("left", (d3.event.offsetX + 40) + "px")
.style("top", d3.event.pageY + "px"); .style("top", (d3.event.offsetY + 40) + "px");
visibleTooltip = d.displayName; visibleTooltip = d.displayName;
//console.log(d3.event);
} }
d3.select("#tooltipTitle").text(truncate(d.displayName, 18)); d3.select("#tooltipTitle").text(truncate(d.displayName, 18));
@ -280,7 +268,7 @@
return -1; return -1;
} }
var jsDate = convertToJsDate(invoice.created_at) || new Date().getTime(); var jsDate = convertToJsDate(invoice.created_at) || new Date().getTime();
return parseInt((new Date().getTime() - convertToJsDate(invoice.created_at)) / (1000*60*60*24)); return parseInt((new Date().getTime() - convertToJsDate(invoice.created_at)) / (1000*60*60*24));
} }
function convertToJsDate(isoDate) { function convertToJsDate(isoDate) {

View File

@ -45,7 +45,7 @@
@if (Auth::user()->account->timezone_id) @if (Auth::user()->account->timezone_id)
{{ $timezone }} {{ $timezone }}
@else @else
{!! link_to('/company/details?focus=timezone_id', $timezone, ['target' => '_blank']) !!} {!! link_to('/settings/company_details?focus=timezone_id', $timezone, ['target' => '_blank']) !!}
@endif @endif
<p/> <p/>

View File

@ -2,7 +2,7 @@
@if (isset($user_id) && $user_id != Auth::user()->id) @if (isset($user_id) && $user_id != Auth::user()->id)
<a href="{{ URL::to("/switch_account/{$user_id}") }}"> <a href="{{ URL::to("/switch_account/{$user_id}") }}">
@else @else
<a href="{{ URL::to("/company/details") }}"> <a href="{{ URL::to("/settings/company_details") }}">
@endif @endif
@if (file_exists($logo_path)) @if (file_exists($logo_path))

View File

@ -1,10 +1,10 @@
@extends('accounts.nav') @extends('header')
@section('content') @section('content')
@parent @parent
@include('accounts.nav_advanced') @include('accounts.nav', ['selected' => ACCOUNT_USER_MANAGEMENT])
{!! Former::open($url)->method($method)->addClass('col-md-8 col-md-offset-2 warn-on-exit')->rules(array( {!! Former::open($url)->method($method)->addClass('warn-on-exit')->rules(array(
'first_name' => 'required', 'first_name' => 'required',
'last_name' => 'required', 'last_name' => 'required',
'email' => 'required|email', 'email' => 'required|email',
@ -28,7 +28,7 @@
</div> </div>
{!! Former::actions( {!! Former::actions(
Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/company/advanced_settings/user_management'))->appendIcon(Icon::create('remove-circle'))->large(), Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/settings/user_management'))->appendIcon(Icon::create('remove-circle'))->large(),
Button::success(trans($user && $user->confirmed ? 'texts.save' : 'texts.send_invite'))->submit()->large()->appendIcon(Icon::create($user && $user->confirmed ? 'floppy-disk' : 'send')) Button::success(trans($user && $user->confirmed ? 'texts.save' : 'texts.send_invite'))->submit()->large()->appendIcon(Icon::create($user && $user->confirmed ? 'floppy-disk' : 'send'))
)!!} )!!}

View File

@ -52,31 +52,31 @@ $I->see('Payments', 'li');
$I->see('Create'); $I->see('Create');
// Settings pages // Settings pages
$I->amOnPage('/company/details'); $I->amOnPage('/settings/company_details');
$I->see('Details'); $I->see('Details');
$I->amOnPage('/gateways/create'); $I->amOnPage('/gateways/create');
$I->see('Add Gateway'); $I->see('Add Gateway');
$I->amOnPage('/company/products'); $I->amOnPage('/settings/products');
$I->see('Product Settings'); $I->see('Product Settings');
$I->amOnPage('/company/import_export'); $I->amOnPage('/settings/import_export');
$I->see('Import'); $I->see('Import');
$I->amOnPage('/company/advanced_settings/invoice_settings'); $I->amOnPage('/settings/invoice_settings');
$I->see('Invoice Fields'); $I->see('Invoice Fields');
$I->amOnPage('/company/advanced_settings/invoice_design'); $I->amOnPage('/settings/invoice_design');
$I->see('Invoice Design'); $I->see('Invoice Design');
$I->amOnPage('/company/advanced_settings/templates_and_reminders'); $I->amOnPage('/settings/templates_and_reminders');
$I->see('Invoice Email'); $I->see('Invoice Email');
$I->amOnPage('/company/advanced_settings/charts_and_reports'); $I->amOnPage('/settings/charts_and_reports');
$I->see('Data Visualizations'); $I->see('Data Visualizations');
$I->amOnPage('/company/advanced_settings/user_management'); $I->amOnPage('/settings/user_management');
$I->see('Add User'); $I->see('Add User');
//try to logout //try to logout

View File

@ -24,7 +24,7 @@ class InvoiceDesignCest
{ {
$I->wantTo('Design my invoice'); $I->wantTo('Design my invoice');
$I->amOnPage('/company/advanced_settings/invoice_design'); $I->amOnPage('/settings/invoice_design');
$I->click('select#invoice_design_id'); $I->click('select#invoice_design_id');
$I->click('select#invoice_design_id option:nth-child(2)'); $I->click('select#invoice_design_id option:nth-child(2)');

View File

@ -24,7 +24,7 @@ class OnlinePaymentCest
// set gateway info // set gateway info
$I->wantTo('create a gateway'); $I->wantTo('create a gateway');
$I->amOnPage('/company/payments'); $I->amOnPage('/settings/online_payments');
if (strpos($I->grabFromCurrentUrl(), 'create') !== false) { if (strpos($I->grabFromCurrentUrl(), 'create') !== false) {
$I->fillField(['name' =>'23_apiKey'], Fixtures::get('gateway_key')); $I->fillField(['name' =>'23_apiKey'], Fixtures::get('gateway_key'));

View File

@ -14,10 +14,11 @@ class SettingsCest
$this->faker = Factory::create(); $this->faker = Factory::create();
} }
/*
public function companyDetails(FunctionalTester $I) public function companyDetails(FunctionalTester $I)
{ {
$I->wantTo('update the company details'); $I->wantTo('update the company details');
$I->amOnPage('/company/details'); $I->amOnPage('/settings/company_details');
$name = $this->faker->company; $name = $this->faker->company;
@ -29,20 +30,50 @@ class SettingsCest
$I->fillField(['name' => 'city'], $this->faker->city); $I->fillField(['name' => 'city'], $this->faker->city);
$I->fillField(['name' => 'state'], $this->faker->state); $I->fillField(['name' => 'state'], $this->faker->state);
$I->fillField(['name' => 'postal_code'], $this->faker->postcode); $I->fillField(['name' => 'postal_code'], $this->faker->postcode);
$I->fillField(['name' => 'first_name'], $this->faker->firstName);
$I->fillField(['name' => 'last_name'], $this->faker->lastName);
$I->fillField(['name' => 'phone'], $this->faker->phoneNumber);
$I->click('Save'); $I->click('Save');
$I->seeResponseCodeIs(200); $I->seeResponseCodeIs(200);
$I->seeRecord('accounts', array('name' => $name)); $I->seeRecord('accounts', array('name' => $name));
} }
*/
public function userDetails(FunctionalTester $I)
{
$I->wantTo('update the user details');
$I->amOnPage('/settings/user_details');
$firstName = $this->faker->firstName;
$I->fillField(['name' => 'first_name'], $firstName);
$I->fillField(['name' => 'last_name'], $this->faker->lastName);
$I->fillField(['name' => 'phone'], $this->faker->phoneNumber);
$I->click('Save');
$I->seeResponseCodeIs(200);
$I->seeRecord('users', array('first_name' => $firstName));
}
/*
public function localization(FunctionalTester $I)
{
$I->wantTo('update the localization');
$I->amOnPage('/settings/localization');
$name = $this->faker->company;
$I->fillField(['name' => 'name'], $name);
$I->click('Save');
$I->seeResponseCodeIs(200);
$I->seeRecord('accounts', array('name' => $name));
}
*/
public function productSettings(FunctionalTester $I) public function productSettings(FunctionalTester $I)
{ {
$I->wantTo('update the product settings'); $I->wantTo('update the product settings');
$I->amOnPage('/company/products'); $I->amOnPage('/settings/products');
$I->click('Save'); $I->click('Save');
@ -84,7 +115,7 @@ class SettingsCest
public function updateNotifications(FunctionalTester $I) public function updateNotifications(FunctionalTester $I)
{ {
$I->wantTo('update notification settings'); $I->wantTo('update notification settings');
$I->amOnPage('/company/notifications'); $I->amOnPage('/settings/notifications');
$terms = $this->faker->text(80); $terms = $this->faker->text(80);
@ -99,7 +130,7 @@ class SettingsCest
public function updateInvoiceDesign(FunctionalTester $I) public function updateInvoiceDesign(FunctionalTester $I)
{ {
$I->wantTo('update invoice design'); $I->wantTo('update invoice design');
$I->amOnPage('/company/advanced_settings/invoice_design'); $I->amOnPage('/settings/invoice_design');
$color = $this->faker->hexcolor; $color = $this->faker->hexcolor;
@ -114,7 +145,7 @@ class SettingsCest
public function updateInvoiceSettings(FunctionalTester $I) public function updateInvoiceSettings(FunctionalTester $I)
{ {
$I->wantTo('update invoice settings'); $I->wantTo('update invoice settings');
$I->amOnPage('/company/advanced_settings/invoice_settings'); $I->amOnPage('/settings/invoice_settings');
$label = $this->faker->text(10); $label = $this->faker->text(10);
@ -131,7 +162,7 @@ class SettingsCest
public function updateEmailTemplates(FunctionalTester $I) public function updateEmailTemplates(FunctionalTester $I)
{ {
$I->wantTo('update email templates'); $I->wantTo('update email templates');
$I->amOnPage('/company/advanced_settings/templates_and_reminders'); $I->amOnPage('/settings/templates_and_reminders');
$string = $this->faker->text(100); $string = $this->faker->text(100);
@ -145,7 +176,7 @@ class SettingsCest
public function runReport(FunctionalTester $I) public function runReport(FunctionalTester $I)
{ {
$I->wantTo('run the report'); $I->wantTo('run the report');
$I->amOnPage('/company/advanced_settings/charts_and_reports'); $I->amOnPage('/settings/charts_and_reports');
$I->click('Run'); $I->click('Run');
$I->seeResponseCodeIs(200); $I->seeResponseCodeIs(200);