merged from parent

This commit is contained in:
blkmutt 2014-04-06 11:47:22 -04:00
commit 3c99bebae9
74 changed files with 3302 additions and 1302 deletions

1
.gitignore vendored
View File

@ -4,7 +4,6 @@
/app/config/ubuntu
/app/config/packages/anahkiasen/rocketeer/
/app/storage
/public/logo
/public/build
/public/vendor
/bootstrap/compiled.php

View File

@ -6,12 +6,13 @@
Most online invoicing sites are expensive. They shouldn't be. The aim of this project is to provide a free, open-source alternative. Additionally, the hope is the codebase will serve as a sample site for Laravel as well as other JavaScript technologies.
The high level instructions for setting up the site are below but there's also a [setup guide](http://hillelcoren.com/invoice-ninja/laravel-ubuntu-virtualbox/). For discussion of the code please use the [Google Group](https://groups.google.com/d/forum/invoiceninja).
The high level instructions for setting up the site are below but there's also a [setup guide](http://hillelcoren.com/invoice-ninja/laravel-ubuntu-virtualbox/). If you'd like to translate the site please use [caouecs/Laravel4-long](https://github.com/caouecs/Laravel4-lang) for the starter files.
For updates follow [@invoiceninja](https://twitter.com/invoiceninja) or join the [Facebook Group](https://www.facebook.com/invoiceninja).
For updates follow [@invoiceninja](https://twitter.com/invoiceninja) or join the [Facebook Group](https://www.facebook.com/invoiceninja). For discussion of the code please use the [Google Group](https://groups.google.com/d/forum/invoiceninja).
Site design by [kantorp-wegl.in](http://kantorp-wegl.in/)
### Features
* Core application built using Laravel 4.1
* Invoice PDF generation directly in the browser

View File

@ -61,6 +61,84 @@ class AccountController extends \BaseController {
return Redirect::to('invoices/create');
}
public function enableProPlan()
{
if (Auth::user()->isPro())
{
return Redirect::to('/dashboard');
}
$account = Auth::user()->account;
$ninjaAccount = $this->getNinjaAccount();
$ninjaClient = $this->getNinjaClient($ninjaAccount);
}
private function getNinjaAccount()
{
$account = Account::whereAccountKey(NINJA_ACCOUNT_KEY)->first();
if ($account)
{
return $account;
}
else
{
$account = new Account();
$account->name = 'Invoice Ninja';
$account->work_email = 'contact@invoiceninja.com';
$account->work_phone = '(800) 763-1948';
$account->account_key = NINJA_ACCOUNT_KEY;
$account->save();
$random = str_random(RANDOM_KEY_LENGTH);
$user = new User();
$user->email = 'contact@invoiceninja.com';
$user->password = $random;
$user->password_confirmation = $random;
$user->username = $random;
$user->notify_sent = false;
$user->notify_paid = false;
$account->users()->save($user);
}
return $account;
}
private function getNinjaClient($ninjaAccount)
{
$client = Client::whereAccountId($ninjaAccount->id)->wherePublicId(Auth::user()->account_id)->first();
if ($client)
{
return $client;
}
else
{
$client = new Client;
$client->public_id = Auth::user()->account_id;
$client->user_id = $ninjaAccount->users()->first()->id;
foreach (['name', 'address1', 'address2', 'city', 'state', 'postal_code', 'country_id', 'work_phone'] as $field)
{
$client->$field = Auth::user()->account->$field;
}
$ninjaAccount->clients()->save($client);
$contact = new Contact;
$contact->user_id = $ninjaAccount->users()->first()->id;
$contact->is_primary = true;
foreach (['first_name', 'last_name', 'email', 'phone'] as $field)
{
$contact->$field = Auth::user()->$field;
}
$client->contacts()->save($contact);
}
}
public function setTrashVisible($entityType, $visible)
{
Session::put('show_trash', $visible == 'true');
@ -191,30 +269,26 @@ class AccountController extends \BaseController {
private function export()
{
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv");
header("Content-Disposition:attachment;filename=export.csv");
$output = fopen('php://output','w') or Utils::fatalError();
header('Content-Type:application/csv');
header('Content-Disposition:attachment;filename=export.csv');
$clients = Client::where('account_id','=',Auth::user()->account_id)->get();
$clients = Client::scope()->get();
AccountController::exportData($output, $clients->toArray());
$contacts = DB::table('contacts')->whereIn('client_id', function($query){
$query->select('client_id')->from('clients')->where('account_id','=',Auth::user()->account_id);
})->get();
AccountController::exportData($output, Utils::toArray($contacts));
$invoices = Invoice::where('account_id','=',Auth::user()->account_id)->get();
AccountController::exportData($output, $invoices->toArray());
$contacts = Contact::scope()->get();
AccountController::exportData($output, $contacts->toArray());
$invoiceItems = DB::table('invoice_items')->whereIn('invoice_id', function($query){
$query->select('invoice_id')->from('invoices')->where('account_id','=',Auth::user()->account_id);
})->get();
AccountController::exportData($output, Utils::toArray($invoiceItems));
$invoices = Invoice::scope()->get();
AccountController::exportData($output, $invoices->toArray());
$payments = Payment::where('account_id','=',Auth::user()->account_id)->get();
$invoiceItems = InvoiceItem::scope()->get();
AccountController::exportData($output, $invoiceItems->toArray());
$payments = Payment::scope()->get();
AccountController::exportData($output, $payments->toArray());
$credits = Credit::where('account_id','=',Auth::user()->account_id)->get();
$credits = Credit::scope()->get();
AccountController::exportData($output, $credits->toArray());
fclose($output);
@ -331,14 +405,21 @@ class AccountController extends \BaseController {
Activity::createClient($client);
}
$message = Utils::pluralize('Successfully created ? client', $count);
$message = Utils::pluralize('created_client', $count);
Session::flash('message', $message);
return Redirect::to('clients');
}
private function mapFile()
{
{
$file = Input::file('file');
if ($file == null)
{
Session::flash('error', trans('texts.select_file'));
return Redirect::to('company/import_export');
}
$name = $file->getRealPath();
require_once(app_path().'/includes/parsecsv.lib.php');
@ -348,7 +429,8 @@ class AccountController extends \BaseController {
if (count($csv->data) + Client::scope()->count() > MAX_NUM_CLIENTS)
{
Session::flash('error', "Sorry, this wll exceed the limit of " . MAX_NUM_CLIENTS . " clients");
$message = Utils::pluralize('limit_clients', MAX_NUM_CLIENTS);
Session::flash('error', $message);
return Redirect::to('company/import_export');
}
@ -452,7 +534,7 @@ class AccountController extends \BaseController {
$user->notify_paid = Input::get('notify_paid');
$user->save();
Session::flash('message', 'Successfully updated settings');
Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/notifications');
}
@ -515,7 +597,7 @@ class AccountController extends \BaseController {
$account->account_gateways()->save($accountGateway);
}
Session::flash('message', 'Successfully updated settings');
Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/payments');
}
}
@ -574,7 +656,7 @@ class AccountController extends \BaseController {
Event::fire('user.refresh');
Session::flash('message', 'Successfully updated details');
Session::flash('message', trans('texts.updated_settings'));
return Redirect::to('company/details');
}
}
@ -583,7 +665,7 @@ class AccountController extends \BaseController {
File::delete('logo/' . Auth::user()->account->account_key . '.jpg');
Session::flash('message', 'Successfully removed logo');
Session::flash('message', trans('texts.removed_logo'));
return Redirect::to('company/details');
}

View File

@ -229,17 +229,16 @@ class ClientController extends \BaseController {
if ($publicId)
{
Session::flash('message', 'Successfully updated client');
Session::flash('message', trans('texts.updated_client'));
}
else
{
Activity::createClient($client);
Session::flash('message', 'Successfully created client');
Session::flash('message', trans('texts.created_client'));
}
return Redirect::to('clients/' . $client->public_id);
}
}
public function bulk()
@ -248,7 +247,7 @@ class ClientController extends \BaseController {
$ids = Input::get('id') ? Input::get('id') : Input::get('ids');
$count = $this->clientRepo->bulk($ids, $action);
$message = Utils::pluralize('Successfully '.$action.'d ? client', $count);
$message = Utils::pluralize($action.'d_client', $count);
Session::flash('message', $message);
return Redirect::to('clients');

View File

@ -121,7 +121,7 @@ class CreditController extends \BaseController {
{
$this->creditRepo->save($publicId, Input::all());
$message = $publicId ? 'Successfully updated credit' : 'Successfully created credit';
$message = trans('texts.created_credit');
Session::flash('message', $message);
return Redirect::to('clients/' . Input::get('client'));
}
@ -135,7 +135,7 @@ class CreditController extends \BaseController {
if ($count > 0)
{
$message = Utils::pluralize('Successfully '.$action.'d ? credit', $count);
$message = Utils::pluralize($action.'d_credit', $count);
Session::flash('message', $message);
}

View File

@ -33,6 +33,15 @@ class HomeController extends BaseController {
{
return View::make('public.terms');
}
public function showFaq()
{
return View::make('public.faq');
}
public function showFeatures()
{
return View::make('public.features');
}
public function doContactUs()
{
@ -46,9 +55,10 @@ class HomeController extends BaseController {
'text' => $message
];
$this->mailer->sendTo(CONTACT_EMAIL, CONTACT_EMAIL, CONTACT_NAME, 'Invoice Ninja Feedback', 'contact', $data);
$this->mailer->sendTo(CONTACT_EMAIL, CONTACT_EMAIL, CONTACT_NAME, 'Invoice Ninja Feedback', 'contact', $data);
Session::flash('message', 'Successfully sent message');
$message = trans('texts.sent_message');
Session::flash('message', $message);
return Redirect::to('/contact');
}

View File

@ -132,8 +132,11 @@ class InvoiceController extends \BaseController {
return View::make('invoices.deleted');
}
Activity::viewInvoice($invitation);
Event::fire('invoice.viewed', $invoice);
if (!Auth::check() || Auth::user()->account_id != $invoice->account_id)
{
Activity::viewInvoice($invitation);
Event::fire('invoice.viewed', $invoice);
}
$client->account->loadLocalizationSettings();
@ -207,12 +210,6 @@ class InvoiceController extends \BaseController {
public static function getViewModel()
{
// Temporary fix to let users know to re-upload their logos for higher res
if (Auth::user()->account->getLogoHeight() == 80)
{
Session::flash('warning', "We've increased the logo resolution in the PDF. Please re-upload your logo to take advantage of it.");
}
return [
'account' => Auth::user()->account,
'products' => Product::scope()->orderBy('id')->get(array('product_key','notes','cost','qty')),
@ -262,7 +259,7 @@ class InvoiceController extends \BaseController {
if ($errors = $this->invoiceRepo->getErrors($invoice))
{
Session::flash('error', 'Please make sure to select a client and correct any errors');
Session::flash('error', trans('texts.invoice_error'));
return Redirect::to('invoices/create')
->withInput()->withErrors($errors);
@ -314,12 +311,12 @@ class InvoiceController extends \BaseController {
}
}
$message = '';
$message = trans($publicId ? 'texts.updated_invoice' : 'texts.created_invoice');
if ($input->invoice->client->public_id == '-1')
{
$message = ' and created client';
$url = URL::to('clients/' . $client->public_id);
$message = $message . ' ' . trans('texts.and_created_client');
$url = URL::to('clients/' . $client->public_id);
Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT, $url);
}
@ -332,25 +329,18 @@ class InvoiceController extends \BaseController {
if (Auth::user()->confirmed)
{
$this->mailer->sendInvoice($invoice);
Session::flash('message', 'Successfully emailed invoice'.$message);
Session::flash('message', $message);
}
else
{
Session::flash('message', 'Successfully saved invoice'.$message);
if (Auth::user()->registered)
{
Session::flash('error', 'Please confirm your email address');
}
else
{
Session::flash('error', 'Please sign up to email an invoice');
}
$errorMessage = trans(Auth::user()->registered ? 'texts.confirmation_required' : 'texts.registration_required');
Session::flash('error', $errorMessage);
Session::flash('message', $message);
}
}
else
{
Session::flash('message', 'Successfully saved invoice'.$message);
Session::flash('message', $message);
}
$url = 'invoices/' . $invoice->public_id . '/edit';
@ -431,7 +421,7 @@ class InvoiceController extends \BaseController {
$clone->invoice_items()->save($cloneItem);
}
Session::flash('message', 'Successfully cloned invoice');
Session::flash('message', trans('texts.cloned_invoice'));
return Redirect::to('invoices/' . $clone->public_id);
}
}

View File

@ -327,7 +327,7 @@ class PaymentController extends \BaseController
Event::fire('invoice.paid', $payment);
Session::flash('message', 'Successfully applied payment');
Session::flash('message', trans('texts.applied_payment'));
return Redirect::to('view/' . $payment->invitation->invitation_key);
}
else if ($response->isRedirect())
@ -362,7 +362,7 @@ class PaymentController extends \BaseController
Event::fire('invoice.paid', $payment);
Session::flash('message', 'Successfully applied payment');
Session::flash('message', trans('texts.applied_payment'));
return Redirect::to('view/' . $payment->invitation->invitation_key);
}
else
@ -374,7 +374,9 @@ class PaymentController extends \BaseController
}
catch (\Exception $e)
{
Session::flash('error', $e->getMessage());
$errorMessage = trans('texts.payment_error');
Session::flash('error', $errorMessage);
Utils::logError($e->getMessage());
return Redirect::to('payment/' . $invitationKey)
->withInput();
}
@ -431,19 +433,23 @@ class PaymentController extends \BaseController
Event::fire('invoice.paid', $payment);
Session::flash('message', 'Successfully applied payment');
Session::flash('message', trans('texts.applied_payment'));
return Redirect::to('view/' . $invitation->invitation_key);
}
else
{
Session::flash('error', $response->getMessage());
return Utils::fatalError('Sorry, there was an error processing your payment. Please try again later.<p>', $response->getMessage());
$errorMessage = trans('texts.payment_error') . "\n\n" . $response->getMessage();
Session::flash('error', $errorMessage);
Utils::logError($errorMessage);
return Redirect::to('view/' . $invitation->invitation_key);
}
}
catch (\Exception $e)
{
Session::flash('error', $e->getMessage());
return Utils::fatalError('Sorry, there was an error processing your payment. Please try again later.<p>', $e);
$errorMessage = trans('texts.payment_error');
Session::flash('error', $errorMessage);
Utils::logError($errorMessage . "\n\n" . $e->getMessage());
return Redirect::to('view/' . $invitation->invitation_key);
}
}
@ -471,8 +477,7 @@ class PaymentController extends \BaseController
{
$this->paymentRepo->save($publicId, Input::all());
$message = $publicId ? 'Successfully updated payment' : 'Successfully created payment';
Session::flash('message', $message);
Session::flash('message', trans('texts.created_payment'));
return Redirect::to('clients/' . Input::get('client'));
}
}
@ -485,11 +490,10 @@ class PaymentController extends \BaseController
if ($count > 0)
{
$message = Utils::pluralize('Successfully '.$action.'d ? payment', $count);
$message = Utils::pluralize($action.'d_payment', $count);
Session::flash('message', $message);
}
return Redirect::to('payments');
}
}

View File

@ -26,9 +26,9 @@ class UserController extends BaseController {
$user->force_pdfjs = true;
$user->save();
Session::flash('message', 'Successfully updated PDF settings');
Session::flash('message', trans('texts.confide.updated_settings'));
return Redirect::to('/invoices/create');
return Redirect::to('/dashboard');
}
/**
@ -86,6 +86,7 @@ class UserController extends BaseController {
if( Confide::user() )
{
Event::fire('user.login');
Session::reflash();
$invoice = Invoice::scope()->orderBy('id', 'desc')->first();
@ -95,7 +96,7 @@ class UserController extends BaseController {
}
else
{
return Redirect::to('/invoices/create');
return Redirect::to('/dashboard');
}
}
else
@ -137,7 +138,7 @@ class UserController extends BaseController {
// Check if there was too many login attempts
if( Confide::isThrottled( $input ) )
{
$err_msg = Lang::get('confide::confide.alerts.too_many_attempts');
$err_msg = trans('texts.confide.too_many_attempts');
}
/*
elseif( $user->checkUserExists( $input ) and ! $user->isConfirmed( $input ) )
@ -147,7 +148,7 @@ class UserController extends BaseController {
*/
else
{
$err_msg = Lang::get('confide::confide.alerts.wrong_credentials');
$err_msg = trans('texts.confide.wrong_credentials');
}
return Redirect::action('UserController@login')
@ -165,15 +166,13 @@ class UserController extends BaseController {
{
if ( Confide::confirm( $code ) )
{
$notice_msg = Lang::get('confide::confide.alerts.confirmation');
return Redirect::action('UserController@login')
->with( 'notice', $notice_msg );
$notice_msg = trans('texts.confide.confirmation');
return Redirect::action('UserController@login')->with( 'message', $notice_msg );
}
else
{
$error_msg = Lang::get('confide::confide.alerts.wrong_confirmation');
return Redirect::action('UserController@login')
->with( 'error', $error_msg );
$error_msg = trans('texts.confide.wrong_confirmation');
return Redirect::action('UserController@login')->with( 'error', $error_msg );
}
}
@ -194,9 +193,9 @@ class UserController extends BaseController {
{
Confide::forgotPassword( Input::get( 'email' ) );
$notice_msg = Lang::get('confide::confide.alerts.password_forgot');
return Redirect::action('UserController@login')
->with( 'notice', $notice_msg );
$notice_msg = trans('texts.confide.password_forgot');
return Redirect::action('UserController@login')
->with( 'notice', $notice_msg );
/*
@ -241,15 +240,15 @@ class UserController extends BaseController {
// By passing an array with the token, password and confirmation
if( Confide::resetPassword( $input ) )
{
$notice_msg = Lang::get('confide::confide.alerts.password_reset');
return Redirect::action('UserController@login')
->with( 'notice', $notice_msg );
$notice_msg = trans('texts.confide.password_reset');
return Redirect::action('UserController@login')
->with( 'notice', $notice_msg );
}
else
{
$error_msg = Lang::get('confide::confide.alerts.wrong_password_reset');
return Redirect::action('UserController@reset_password', array('token'=>$input['token']))
->withInput()
$error_msg = trans('texts.confide.wrong_password_reset');
return Redirect::action('UserController@reset_password', array('token'=>$input['token']))
->withInput()
->with( 'error', $error_msg );
}
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddProPlan extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('accounts', function($table)
{
$table->date('pro_plan_paid');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('accounts', function($table)
{
$table->dropColumn('pro_plan_paid');
});
}
}

View File

@ -21,9 +21,14 @@ App::before(function($request)
}
}
if (Auth::check())
{
App::setLocale(Auth::user()->getLocale());
if (Input::has('lang'))
{
App::setLocale(Input::get('lang'));
}
else if (Auth::check())
{
$locale = Session::get(SESSION_LOCALE, DEFUALT_LOCALE);
App::setLocale($locale);
}
});

View File

@ -1,54 +0,0 @@
<?php
return array(
// client
'organization' => 'Organisation',
'name' => 'Name',
'website' => 'Webseite',
'work_phone' => 'Telefon',
'address' => 'Adresse',
'address1' => 'Straße',
'address2' => 'Adresszusatz',
'city' => 'Stadt',
'state' => 'Bundesland',
'postal_code' => 'Postleitzahl',
'country_id' => 'Land',
'contacts' => 'Kontakte',
'first_name' => 'Vorname',
'last_name' => 'Nachname',
'phone' => 'Telefon',
'email' => 'Email',
'additional_info' => 'Zusätzliche Info',
'payment_terms' => 'Zahlungsbedingungen',
'currency_id' => 'Währung',
'size_id' => 'Größe',
'industry_id' => 'Kategorie',
'private_notes' => 'Notizen',
// invoice
'invoice' => 'Rechnung',
'client' => 'Kunde',
'invoice_date' => 'Rechnungsdatum',
'due_date' => 'Fällig am',
'invoice_number' => 'Rechungsnummer',
'invoice_number_short' => 'Rechnung #',
'po_number' => 'Bestell Nummer',
'po_number_short' => 'BN #',
'frequency_id' => 'Wie oft',
'dicount' => 'Rabatt',
'taxes' => 'Steuern',
'tax' => 'Steuer',
'item' => 'Artikel',
'description' => 'Beschreibung',
'unit_cost' => 'Kosten pro Einheit',
'quantity' => 'Menge',
'line_total' => 'Summe',
'subtotal' => 'Zwischensumme',
'paid_to_date' => 'Zahlungsdatum',
'balance_due' => 'Rechnungsbetrag',
'invoice_design_id' => 'Design',
'terms' => 'Bedingungen',
'your_invoice' => 'Ihre Rechnung',
);

View File

@ -20,7 +20,7 @@ return array(
'phone' => 'Telefon',
'email' => 'Email',
'additional_info' => 'Zusätzliche Info',
'payment_terms' => 'Payment Terms',
'payment_terms' => 'Zahlungsbedingungen',
'currency_id' => 'Währung',
'size_id' => 'Größe',
'industry_id' => 'Kategorie',
@ -33,7 +33,7 @@ return array(
'due_date' => 'Fällig am',
'invoice_number' => 'Rechungsnummer',
'invoice_number_short' => 'Rechnung #',
'po_number' => 'Bestell Nummer',
'po_number' => 'Bestellnummer',
'po_number_short' => 'BN #',
'frequency_id' => 'Wie oft',
'dicount' => 'Rabatt',
@ -51,4 +51,247 @@ return array(
'terms' => 'Bedingungen',
'your_invoice' => 'Ihre Rechnung',
'remove_contact' => 'Kontakt löschen',
'add_contact' => 'Kontakt hinzufügen',
'create_new_client' => 'Einen neuen Kunden erstellen',
'edit_client_details' => 'Kundendetails bearbeiten',
'enable' => 'Aktivieren',
'learn_more' => 'Mehr erfahren',
'manage_rates' => 'Steuersätze verwalten',
'note_to_client' => 'Notiz an den Kunden',
'invoice_terms' => 'Zahlungsbedingungen',
'save_as_default_terms' => 'Als Standardbedingungen speichern',
'download_pdf' => 'PDF herunterladen',
'pay_now' => 'Jetzt bezahlen',
'save_invoice' => 'Rechnung speichern',
'clone_invoice' => 'Rechnung duplizieren',
'archive_invoice' => 'Rechnung archivieren',
'delete_invoice' => 'Rechnung löschen',
'email_invoice' => 'Rechnung versenden',
'enter_payment' => 'Zahlung eingeben',
'tax_rates' => 'Steuersätze',
'rate' => 'Satz',
'settings' => 'Einstellungen',
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>',
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>',
// navigation
'dashboard' => 'Dashboard',
'clients' => 'Kunden',
'invoices' => 'Rechnungen',
'payments' => 'Zahlungen',
'credits' => 'Guthaben',
'history' => 'Verlauf',
'search' => 'Suche',
'sign_up' => 'Anmeldung',
'guest' => 'Gast',
'company_details' => 'Firmendaten',
'online_payments' => 'Online-Zahlungen',
'notifications' => 'Benachrichtigungen',
'import_export' => 'Import/Export',
'done' => 'Erledigt',
'save' => 'Speichern',
'create' => 'Erstellen',
'upload' => 'Hochladen',
'import' => 'Importieren',
'download' => 'Downloaden',
'cancel' => 'Abbrechen',
'provide_email' => 'Bitte gebe eine gültige E-Mail Adresse an',
'powered_by' => 'Powered by',
'no_items' => 'Keine Objekte',
// recurring invoices
'recurring_invoices' => 'Wiederkehrende Rechnungen',
'recurring_help' => '<p>Sende deinen Kunden automatisch die selbe Rechnung wöchentlich, zwei-monatlich, monatlich, vierteljährlich oder jährlich.</p>
<p>Benutze :MONTH, :QUARTER oder :YEAR für ein dynamisches Datum. Grundlegende Mathematik funktioniert genauso gut, zum Beispiel :MONTH-1.</p>
<p>Beispiel zu dynamischen Rechnungs-Variabeln:</p>
<ul>
<li>"Fitnessstudio Mitgliedschaft für den Monat :MONTH" => "Fitnessstudio Mitgliedschaft für den Monat Juli"</li>
<li>":YEAR+1 Jahresbeitrag" => "2015 Jahresbeitrag"</li>
<li>"Vorschusszahlung für :QUARTER+1" => "Vorschusszahlung für Q2"</li>
</ul>',
// dashboard
'in_total_revenue' => 'Gesamtumsatz',
'billed_client' => 'abgerechneter Kunde',
'billed_clients' => 'abgerechnete Kunden',
'active_client' => 'aktive Kunden',
'active_clients' => 'aktive Kunden',
'invoices_past_due' => 'Fällige Rechnungen',
'upcoming_invoices' => 'Kommende Rechnungen',
'average_invoice' => 'Durchschnittlicher Rechnungsbetrag',
// list pages
'archive' => 'archivieren',
'delete' => 'löschen',
'archive_client' => 'Kunde archivieren',
'delete_client' => 'Kunde löschen',
'archive_payment' => 'Zahlung archivieren',
'delete_payment' => 'Zahlung löschen',
'archive_credit' => 'Guthaben archivieren',
'delete_credit' => 'Guthaben löschen',
'show_archived_deleted' => 'Zeige archivierte/gelöschte',
'filter' => 'Filter',
'new_client' => 'Neuer Kunde',
'new_invoice' => 'Neue Rechnung',
'new_payment' => 'Neue Zahlung',
'new_credit' => 'Neues Guthaben',
'contact' => 'Kontakt',
'date_created' => 'Erstellungsdatum',
'last_login' => 'Letzter Login',
'balance' => 'Saldo',
'action' => 'Aktion',
'status' => 'Status',
'invoice_total' => 'Rechnungsbetrag',
'frequency' => 'Häufigkeit',
'start_date' => 'Startdatum',
'end_date' => 'Enddatum',
'transaction_reference' => 'Abwicklungsreferenz',
'method' => 'Verfahren',
'payment_amount' => 'Zahlungsbetrag',
'payment_date' => 'Zahlungsdatum',
'credit_amount' => 'Guthabenbetrag',
'credit_balance' => 'Guthabenstand',
'credit_date' => 'Guthabendatum',
'empty_table' => 'Es sind keine Daten vorhanden',
'select' => 'Wählen',
'edit_client' => 'Kunde bearbeiten',
'edit_invoice' => 'Rechnung bearbeiten',
// client view page
'create_invoice' => 'Rechnung bearbeiten',
'enter_credit' => 'Guthaben eingeben',
'last_logged_in' => 'Zuletzt eingeloggt',
'details' => 'Details',
'standing' => 'Aktueller Stand',
'credit' => 'Guthaben',
'activity' => 'Aktivität',
'date' => 'Datum',
'message' => 'Nachricht',
'adjustment' => 'Anpassung',
'are_you_sure' => 'Bist du dir sicher?',
// payment pages
'payment_type_id' => 'Zahlungsart',
'amount' => 'Betrag',
// account/company pages
'work_email' => 'E-Mail',
'language_id' => 'Sprache',
'timezone_id' => 'Zeitzone',
'date_format_id' => 'Datumsformat',
'datetime_format_id' => 'Datums-/Zeitformat',
'users' => 'Benutzer',
'localization' => 'Lokalisierung',
'remove_logo' => 'Logo entfernen',
'logo_help' => 'Unterstützt: JPEG, GIF und PNG. Empfohlene Höhe: 120px',
'payment_gateway' => 'Zahlungseingang',
'gateway_id' => 'Provider',
'email_notifications' => 'E-Mail Benachrichtigungen',
'email_sent' => 'Benachrichtigen, wenn eine Rechnung <strong>versendet</strong> wurde',
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung <strong>betrachtet</strong> wurde',
'email_paid' => 'Benachrichtigen, wenn eine Rechnung <strong>bezahlt</strong> wurde',
'site_updates' => 'Seiten Updates',
'custom_messages' => 'Benutzerdefinierte Nachrichten',
'default_invoice_terms' => 'Standard Rechnungsbedingungen',
'default_email_footer' => 'Standard E-Mail Signatur',
'import_clients' => 'Importiere Kundendaten',
'csv_file' => 'Wähle CSV Datei',
'export_clients' => 'Exportiere Kundendaten',
'select_file' => 'Bitte wähle eine Datei',
'first_row_headers' => 'Benutze erste Zeile als Kopfzeile',
'column' => 'Spalte',
'sample' => 'Beispiel',
'import_to' => 'Importieren nach',
'client_will_create' => 'Kunde wird erstellt',
'clients_will_create' => 'Kunden werden erstellt',
// application messages
'created_client' => 'Kunde erfolgreich angelegt',
'created_clients' => ':count Kunden erfolgreich angelegt',
'updated_settings' => 'Einstellungen erfolgreich aktualisiert',
'removed_logo' => 'Logo erfolgreich entfernt',
'sent_message' => 'Nachricht erfolgreich versendet',
'invoice_error' => 'Bitte stelle sicher, dass ein Kunde ausgewählt und alle Fehler behoben wurden',
'limit_clients' => 'Entschuldige, das überschreitet das Limit von :count Kunden',
'payment_error' => 'Es ist ein Fehler während der Zahlung aufgetreten. Bitte versuche es später noch einmal.',
'registration_required' => 'Bitte melde dich an um eine Rechnung zu versenden',
'confirmation_required' => 'Bitte bestätige deine E-Mail Adresse',
'updated_client' => 'Kunde erfolgreich aktualisiert',
'created_client' => 'Kunde erfolgreich erstellt',
'archived_client' => 'Kunde erfolgreich archiviert',
'archived_clients' => ':count Kunden erfolgreich archiviert',
'deleted_client' => 'Kunde erfolgreich gelöscht',
'deleted_clients' => ':count Kunden erfolgreich gelöscht',
'updated_invoice' => 'Rechnung erfolgreich aktualisiert',
'created_invoice' => 'Rechnung erfolgreich erstellt',
'cloned_invoice' => 'Rechnung erfolgreich dupliziert',
'emailed_invoice' => 'Rechnung erfolgreich versendet',
'and_created_client' => 'und Kunde erstellt',
'archived_invoice' => 'Guthaben erfolgreich archiviert',
'archived_invoices' => ':count Guthaben erfolgreich archiviert',
'deleted_invoice' => 'Guthaben erfolgreich gelöscht',
'deleted_invoices' => ':count Guthaben erfolgreich gelöscht',
'created_payment' => 'Zahlung erfolgreich erstellt',
'archived_payment' => 'Zahlung erfolgreich archiviert',
'archived_payments' => ':count Zahlungen erfolgreich archiviert',
'deleted_payment' => 'Zahlung erfolgreich gelöscht',
'deleted_payments' => ':count Zahlungen erfolgreich gelöscht',
'applied_payment' => 'Zahlung erfolgreich angewandt',
'created_credit' => 'Guthaben erfolgreich erstellt',
'archived_credit' => 'Guthaben erfolgreich archiviert',
'archived_credits' => ':count Guthaben erfolgreich archiviert',
'deleted_credit' => 'Guthaben erfolgreich gelöscht',
'deleted_credits' => ':count Guthaben erfolgreich gelöscht',
// Emails
'confirmation_subject' => 'Invoice Ninja Konto Bestätigung',
'confirmation_header' => 'Konto Bestätigung',
'confirmation_message' => 'Bitte klicke auf den folgenden Link um dein Konto zu bestätigen.',
'invoice_subject' => 'Neue Rechnung :invoice',
'invoice_message' => 'Um Ihre Rechnung über :amount einzusehen, klicken Sie bitte auf den folgenden Link.',
'payment_subject' => 'Zahlungseingang :invoice',
'payment_message' => 'Vielen Dank für Ihre Zahlung von :amount.',
'email_salutation' => 'Sehr geehrte/r :name,',
'email_signature' => 'Freundliche Grüße,',
'email_from' => 'Das InvoiceNinja Team',
'user_email_footer' => 'Um deine E-Mail Benachrichtigungen anzupassen besuche bitte http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'Um deine Kundenrechnung anzuschauen, klicke auf den folgenden Link:',
'notification_paid_subject' => 'Die Rechnung :invoice wurde von :client bezahlt',
'notification_sent_subject' => 'Die Rechnung :invoice wurde an :client versendet',
'notification_viewed_subject' => 'Die Rechnung :invoice wurde von :client angeschaut',
'notification_paid' => 'Eine Zahlung von :amount wurde von :client bezüglich Rechnung :invoice getätigt.',
'notification_sent' => 'Dem folgenden Kunden :client wurde die Rechnung :invoice über :amount zugesendet.',
'notification_viewed' => 'Der folgende Kunde :client hat sich Rechnung :invoice über :amount angesehen.',
'reset_password' => 'Du kannst dein Passwort zurücksetzen indem du auf den folgenden Link klickst:',
'reset_password_footer' => 'Wenn du das Zurücksetzen des Passworts nicht beantragt hast benachrichtige bitte unseren Support: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Sichere Zahlung',
'card_number' => 'Kartennummer',
'expiration_month' => 'Ablaufmonat',
'expiration_year' => 'Ablaufjahr',
'cvv' => 'Kartenprüfziffer',
// Security alerts
'confide' => array(
'too_many_attempts' => 'Zu viele versuche. Bitte versuche es in ein paar Minuten erneut.',
'wrong_credentials' => 'Falsche E-Mail Adresse oder falsches Passwort.',
'confirmation' => 'Dein Konto wurde bestätigt!',
'wrong_confirmation' => 'Falscher Bestätigungscode.',
'password_forgot' => 'Weitere Informationen um das Passwort zurückzusetzen wurden dir per E-Mail zugeschickt.',
'password_reset' => 'Dein Passwort wurde erfolgreich geändert.',
'wrong_password_reset' => 'Ungültiges Passwort. Versuche es erneut',
),
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -62,6 +62,7 @@ return array(
'invoice_terms' => 'Invoice terms',
'save_as_default_terms' => 'Save as default terms',
'download_pdf' => 'Download PDF',
'pay_now' => 'Pay Now',
'save_invoice' => 'Save Invoice',
'clone_invoice' => 'Clone Invoice',
'archive_invoice' => 'Archive Invoice',
@ -89,6 +90,11 @@ return array(
'notifications' => 'Notifications',
'import_export' => 'Import/Export',
'done' => 'Done',
'save' => 'Save',
'create' => 'Create',
'upload' => 'Upload',
'import' => 'Import',
'download' => 'Download',
'cancel' => 'Cancel',
'provide_email' => 'Please provide a valid email address',
'powered_by' => 'Powered by',
@ -151,4 +157,141 @@ return array(
'select' => 'Select',
'edit_client' => 'Edit Client',
'edit_invoice' => 'Edit Invoice',
// client view page
'create_invoice' => 'Create Invoice',
'enter_credit' => 'Enter Credit',
'last_logged_in' => 'Last logged in',
'details' => 'Details',
'standing' => 'Standing',
'credit' => 'Credit',
'activity' => 'Activity',
'date' => 'Date',
'message' => 'Message',
'adjustment' => 'Adjustment',
'are_you_sure' => 'Are you sure?',
// payment pages
'payment_type_id' => 'Payment type',
'amount' => 'Amount',
// account/company pages
'work_email' => 'Email',
'language_id' => 'Language',
'timezone_id' => 'Timezone',
'date_format_id' => 'Date format',
'datetime_format_id' => 'Date/Time Format',
'users' => 'Users',
'localization' => 'Localization',
'remove_logo' => 'Remove logo',
'logo_help' => 'Supported: JPEG, GIF and PNG. Recommended height: 120px',
'payment_gateway' => 'Payment Gateway',
'gateway_id' => 'Provider',
'email_notifications' => 'Email Notifications',
'email_sent' => 'Email me when an invoice is <b>sent</b>',
'email_viewed' => 'Email me when an invoice is <b>viewed</b>',
'email_paid' => 'Email me when an invoice is <b>paid</b>',
'site_updates' => 'Site Updates',
'custom_messages' => 'Custom Messages',
'default_invoice_terms' => 'Set default invoice terms',
'default_email_footer' => 'Set default email signature',
'import_clients' => 'Import Client Data',
'csv_file' => 'Select CSV file',
'export_clients' => 'Export Client Data',
'select_file' => 'Please select a file',
'first_row_headers' => 'Use first row as headers',
'column' => 'Column',
'sample' => 'Sample',
'import_to' => 'Import to',
'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created',
// application messages
'created_client' => 'Successfully created client',
'created_clients' => 'Successfully created :count clients',
'updated_settings' => 'Successfully updated settings',
'removed_logo' => 'Successfully removed logo',
'sent_message' => 'Successfully sent message',
'invoice_error' => 'Please make sure to select a client and correct any errors',
'limit_clients' => 'Sorry, this will exceed the limit of :count clients',
'payment_error' => 'There was an error processing your payment. Please try again later.',
'registration_required' => 'Please sign up to email an invoice',
'confirmation_required' => 'Please confirm your email address',
'updated_client' => 'Successfully updated client',
'created_client' => 'Successfully created client',
'archived_client' => 'Successfully archived client',
'archived_clients' => 'Successfully archived :count clients',
'deleted_client' => 'Successfully deleted client',
'deleted_clients' => 'Successfully deleted :count clients',
'updated_invoice' => 'Successfully updated invoice',
'created_invoice' => 'Successfully created invoice',
'cloned_invoice' => 'Successfully cloned invoice',
'emailed_invoice' => 'Successfully emailed invoice',
'and_created_client' => 'and created client',
'archived_invoice' => 'Successfully archived credit',
'archived_invoices' => 'Successfully archived :count credits',
'deleted_invoice' => 'Successfully deleted credit',
'deleted_invoices' => 'Successfully deleted :count credits',
'created_payment' => 'Successfully created payment',
'archived_payment' => 'Successfully archived payment',
'archived_payments' => 'Successfully archived :count payments',
'deleted_payment' => 'Successfully deleted payment',
'deleted_payments' => 'Successfully deleted :count payments',
'applied_payment' => 'Successfully applied payment',
'created_credit' => 'Successfully created credit',
'archived_credit' => 'Successfully archived credit',
'archived_credits' => 'Successfully archived :count credits',
'deleted_credit' => 'Successfully deleted credit',
'deleted_credits' => 'Successfully deleted :count credits',
// Emails
'confirmation_subject' => 'Invoice Ninja Account Confirmation',
'confirmation_header' => 'Account Confirmation',
'confirmation_message' => 'Please access the link below to confirm your account.',
'invoice_subject' => 'New invoice :invoice',
'invoice_message' => 'To view your invoice for :amount, click the link below.',
'payment_subject' => 'Payment Received :invoice',
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'user_email_footer' => 'To adjust your email notification settings please visit http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_sent_subject' => 'Invoice :invoice was sent to :client',
'notification_viewed_subject' => 'Invoice :invoice was viewed by :client',
'notification_paid' => 'A payment of :amount was made by client :client towards Invoice :invoice.',
'notification_sent' => 'The following client :client was emailed Invoice :invoice for :amount.',
'notification_viewed' => 'The following client :client viewed Invoice :invoice for :amount.',
'reset_password' => 'You can reset your account password by clicking the following link:',
'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Secure Payment',
'card_number' => 'Card number',
'expiration_month' => 'Expiration month',
'expiration_year' => 'Expiration year',
'cvv' => 'CVV',
// Security alerts
'confide' => [
'too_many_attempts' => 'Too many attempts. Try again in few minutes.',
'wrong_credentials' => 'Incorrect email or password.',
'confirmation' => 'Your account has been confirmed!',
'wrong_confirmation' => 'Wrong confirmation code.',
'password_forgot' => 'The information regarding password reset was sent to your email.',
'password_reset' => 'Your password has been changed successfully.',
'wrong_password_reset' => 'Invalid password. Try again',
],
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -1,52 +0,0 @@
<?php
return array(
// client
'organization' => 'Organización',
'name' => 'Nombre',
'website' => 'Página Web',
'work_phone' => 'Teléfono',
'address' => 'Dirección',
'address1' => 'Calle',
'address2' => 'Bloq/Pta',
'city' => 'Ciudad',
'state' => 'Región/Provincia',
'postal_code' => 'Código Postal',
'country_id' => 'País',
'contacts' => 'Contactos',
'first_name' => 'Nombre',
'last_name' => 'Apellidos',
'phone' => 'Teléfono',
'email' => 'Email',
'additional_info' => 'Información extra',
'payment_terms' => 'Términos de pago',
'currency_id' => 'Divisa',
'size_id' => 'Tamaño',
'industry_id' => 'Industria',
'private_notes' => 'Notas Privadas',
// invoice
'invoice' => 'Factura',
'client' => 'Clienta',
'invoice_date' => 'Fecha de factura',
'due_date' => 'Fecha de pago',
'invoice_number' => 'Número de Factura',
'invoice_number_short' => 'Nº de Factura',
'po_number' => 'Apartado de correos',
'po_number_short' => 'Apdo.',
'frequency_id' => 'Fracuencia',
'discount' => 'Descuento',
'taxes' => 'Impuestos',
'tax' => 'Impuesto',
'item' => 'Elemento',
'description' => 'Descripción',
'unit_cost' => 'Coste unitario',
'quantity' => 'Cantidad',
'line_total' => 'Total línea',
'subtotal' => 'Subtotal',
'paid_to_date' => 'Pagado',
'balance_due' => 'Pendiente',
'invoice_design_id' => 'Diseño',
'terms' => 'Términos',
'your_invoice' => 'Tu factura',
);

297
app/lang/es/texts.php Normal file
View File

@ -0,0 +1,297 @@
<?php
return array(
// client
'organization' => 'Organización',
'name' => 'Nombre',
'website' => 'Página Web',
'work_phone' => 'Teléfono',
'address' => 'Dirección',
'address1' => 'Calle',
'address2' => 'Bloq/Pta',
'city' => 'Ciudad',
'state' => 'Región/Provincia',
'postal_code' => 'Código Postal',
'country_id' => 'País',
'contacts' => 'Contactos',
'first_name' => 'Nombre',
'last_name' => 'Apellidos',
'phone' => 'Teléfono',
'email' => 'Email',
'additional_info' => 'Información extra',
'payment_terms' => 'Términos de pago',
'currency_id' => 'Divisa',
'size_id' => 'Tamaño',
'industry_id' => 'Industria',
'private_notes' => 'Notas Privadas',
// invoice
'invoice' => 'Factura',
'client' => 'Clienta',
'invoice_date' => 'Fecha de factura',
'due_date' => 'Fecha de pago',
'invoice_number' => 'Número de Factura',
'invoice_number_short' => 'Nº de Factura',
'po_number' => 'Apartado de correos',
'po_number_short' => 'Apdo.',
'frequency_id' => 'Fracuencia',
'discount' => 'Descuento',
'taxes' => 'Impuestos',
'tax' => 'Impuesto',
'item' => 'Elemento',
'description' => 'Descripción',
'unit_cost' => 'Coste unitario',
'quantity' => 'Cantidad',
'line_total' => 'Total línea',
'subtotal' => 'Subtotal',
'paid_to_date' => 'Pagado',
'balance_due' => 'Pendiente',
'invoice_design_id' => 'Diseño',
'terms' => 'Términos',
'your_invoice' => 'Tu factura',
'remove_contact' => 'Remove contact',
'add_contact' => 'Add contact',
'create_new_client' => 'Create new client',
'edit_client_details' => 'Edit client details',
'enable' => 'Enable',
'learn_more' => 'Learn more',
'manage_rates' => 'Manage rates',
'note_to_client' => 'Note to client',
'invoice_terms' => 'Invoice terms',
'save_as_default_terms' => 'Save as default terms',
'download_pdf' => 'Download PDF',
'pay_now' => 'Pay Now',
'save_invoice' => 'Save Invoice',
'clone_invoice' => 'Clone Invoice',
'archive_invoice' => 'Archive Invoice',
'delete_invoice' => 'Delete Invoice',
'email_invoice' => 'Email Invoice',
'enter_payment' => 'Enter Payment',
'tax_rates' => 'Tax Rates',
'rate' => 'Rate',
'settings' => 'Settings',
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>',
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>',
// navigation
'dashboard' => 'Dashboard',
'clients' => 'Clients',
'invoices' => 'Invoices',
'payments' => 'Payments',
'credits' => 'Credits',
'history' => 'History',
'search' => 'Search',
'sign_up' => 'Sign Up',
'guest' => 'Guest',
'company_details' => 'Company Details',
'online_payments' => 'Online Payments',
'notifications' => 'Notifications',
'import_export' => 'Import/Export',
'done' => 'Done',
'save' => 'Save',
'create' => 'Create',
'upload' => 'Upload',
'import' => 'Import',
'download' => 'Download',
'cancel' => 'Cancel',
'provide_email' => 'Please provide a valid email address',
'powered_by' => 'Powered by',
'no_items' => 'No items',
// recurring invoices
'recurring_invoices' => 'Recurring Invoices',
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p>
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p>
<p>Examples of dynamic invoice variables:</p>
<ul>
<li>"Gym membership for the month of :MONTH" => "Gym membership for the month of July"</li>
<li>":YEAR+1 yearly subscription" => "2015 Yearly Subscription"</li>
<li>"Retainer payment for :QUARTER+1" => "Retainer payment for Q2"</li>
</ul>',
// dashboard
'in_total_revenue' => 'in total revenue',
'billed_client' => 'billed client',
'billed_clients' => 'billed clients',
'active_client' => 'active client',
'active_clients' => 'active clients',
'invoices_past_due' => 'Invoices Past Due',
'upcoming_invoices' => 'Upcoming invoices',
'average_invoice' => 'Average invoice',
// list pages
'archive' => 'Archive',
'delete' => 'Delete',
'archive_client' => 'Archive client',
'delete_client' => 'Delete client',
'archive_payment' => 'Archive payment',
'delete_payment' => 'Delete payment',
'archive_credit' => 'Archive credit',
'delete_credit' => 'Delete credit',
'show_archived_deleted' => 'Show archived/deleted',
'filter' => 'Filter',
'new_client' => 'New Client',
'new_invoice' => 'New Invoice',
'new_payment' => 'New Payment',
'new_credit' => 'New Credit',
'contact' => 'Contact',
'date_created' => 'Date Created',
'last_login' => 'Last Login',
'balance' => 'Balance',
'action' => 'Action',
'status' => 'Status',
'invoice_total' => 'Invoice Total',
'frequency' => 'Frequency',
'start_date' => 'Start Date',
'end_date' => 'End Date',
'transaction_reference' => 'Transaction Reference',
'method' => 'Method',
'payment_amount' => 'Payment Amount',
'payment_date' => 'Payment Date',
'credit_amount' => 'Credit Amount',
'credit_balance' => 'Credit Balance',
'credit_date' => 'Credit Date',
'empty_table' => 'No data available in table',
'select' => 'Select',
'edit_client' => 'Edit Client',
'edit_invoice' => 'Edit Invoice',
// client view page
'create_invoice' => 'Create Invoice',
'enter_credit' => 'Enter Credit',
'last_logged_in' => 'Last logged in',
'details' => 'Details',
'standing' => 'Standing',
'credit' => 'Credit',
'activity' => 'Activity',
'date' => 'Date',
'message' => 'Message',
'adjustment' => 'Adjustment',
'are_you_sure' => 'Are you sure?',
// payment pages
'payment_type_id' => 'Payment type',
'amount' => 'Amount',
// account/company pages
'work_email' => 'Email',
'language_id' => 'Language',
'timezone_id' => 'Timezone',
'date_format_id' => 'Date format',
'datetime_format_id' => 'Date/Time Format',
'users' => 'Users',
'localization' => 'Localization',
'remove_logo' => 'Remove logo',
'logo_help' => 'Supported: JPEG, GIF and PNG. Recommended height: 120px',
'payment_gateway' => 'Payment Gateway',
'gateway_id' => 'Provider',
'email_notifications' => 'Email Notifications',
'email_sent' => 'Email me when an invoice is <b>sent</b>',
'email_viewed' => 'Email me when an invoice is <b>viewed</b>',
'email_paid' => 'Email me when an invoice is <b>paid</b>',
'site_updates' => 'Site Updates',
'custom_messages' => 'Custom Messages',
'default_invoice_terms' => 'Set default invoice terms',
'default_email_footer' => 'Set default email signature',
'import_clients' => 'Import Client Data',
'csv_file' => 'Select CSV file',
'export_clients' => 'Export Client Data',
'select_file' => 'Please select a file',
'first_row_headers' => 'Use first row as headers',
'column' => 'Column',
'sample' => 'Sample',
'import_to' => 'Import to',
'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created',
// application messages
'created_client' => 'Successfully created client',
'created_clients' => 'Successfully created :count clients',
'updated_settings' => 'Successfully updated settings',
'removed_logo' => 'Successfully removed logo',
'sent_message' => 'Successfully sent message',
'invoice_error' => 'Please make sure to select a client and correct any errors',
'limit_clients' => 'Sorry, this will exceed the limit of :count clients',
'payment_error' => 'There was an error processing your payment. Please try again later.',
'registration_required' => 'Please sign up to email an invoice',
'confirmation_required' => 'Please confirm your email address',
'updated_client' => 'Successfully updated client',
'created_client' => 'Successfully created client',
'archived_client' => 'Successfully archived client',
'archived_clients' => 'Successfully archived :count clients',
'deleted_client' => 'Successfully deleted client',
'deleted_clients' => 'Successfully deleted :count clients',
'updated_invoice' => 'Successfully updated invoice',
'created_invoice' => 'Successfully created invoice',
'cloned_invoice' => 'Successfully cloned invoice',
'emailed_invoice' => 'Successfully emailed invoice',
'and_created_client' => 'and created client',
'archived_invoice' => 'Successfully archived credit',
'archived_invoices' => 'Successfully archived :count credits',
'deleted_invoice' => 'Successfully deleted credit',
'deleted_invoices' => 'Successfully deleted :count credits',
'created_payment' => 'Successfully created payment',
'archived_payment' => 'Successfully archived payment',
'archived_payments' => 'Successfully archived :count payments',
'deleted_payment' => 'Successfully deleted payment',
'deleted_payments' => 'Successfully deleted :count payments',
'applied_payment' => 'Successfully applied payment',
'created_credit' => 'Successfully created credit',
'archived_credit' => 'Successfully archived credit',
'archived_credits' => 'Successfully archived :count credits',
'deleted_credit' => 'Successfully deleted credit',
'deleted_credits' => 'Successfully deleted :count credits',
// Emails
'confirmation_subject' => 'Invoice Ninja Account Confirmation',
'confirmation_header' => 'Account Confirmation',
'confirmation_message' => 'Please access the link below to confirm your account.',
'invoice_subject' => 'New invoice :invoice',
'invoice_message' => 'To view your invoice for :amount, click the link below.',
'payment_subject' => 'Payment Received :invoice',
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'user_email_footer' => 'To adjust your email notification settings please visit http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_sent_subject' => 'Invoice :invoice was sent to :client',
'notification_viewed_subject' => 'Invoice :invoice was viewed by :client',
'notification_paid' => 'A payment of :amount was made by client :client towards Invoice :invoice.',
'notification_sent' => 'The following client :client was emailed Invoice :invoice for :amount.',
'notification_viewed' => 'The following client :client viewed Invoice :invoice for :amount.',
'reset_password' => 'You can reset your account password by clicking the following link:',
'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Secure Payment',
'card_number' => 'Card number',
'expiration_month' => 'Expiration month',
'expiration_year' => 'Expiration year',
'cvv' => 'CVV',
// Security alerts
'confide' => array(
'too_many_attempts' => 'Too many attempts. Try again in few minutes.',
'wrong_credentials' => 'Incorrect email or password.',
'confirmation' => 'Your account has been confirmed!',
'wrong_confirmation' => 'Wrong confirmation code.',
'password_forgot' => 'The information regarding password reset was sent to your email.',
'password_reset' => 'Your password has been changed successfully.',
'wrong_password_reset' => 'Invalid password. Try again',
),
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -50,5 +50,249 @@ return array(
'invoice_design_id' => 'Design', //if you speak about invoice's design -> "Modèle"
'terms' => 'Conditions',
'your_invoice' => 'Votre Facture',
'remove_contact' => 'Remove contact',
'add_contact' => 'Add contact',
'create_new_client' => 'Create new client',
'edit_client_details' => 'Edit client details',
'enable' => 'Enable',
'learn_more' => 'Learn more',
'manage_rates' => 'Manage rates',
'note_to_client' => 'Note to client',
'invoice_terms' => 'Invoice terms',
'save_as_default_terms' => 'Save as default terms',
'download_pdf' => 'Download PDF',
'pay_now' => 'Pay Now',
'save_invoice' => 'Save Invoice',
'clone_invoice' => 'Clone Invoice',
'archive_invoice' => 'Archive Invoice',
'delete_invoice' => 'Delete Invoice',
'email_invoice' => 'Email Invoice',
'enter_payment' => 'Enter Payment',
'tax_rates' => 'Tax Rates',
'rate' => 'Rate',
'settings' => 'Settings',
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>',
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>',
// navigation
'dashboard' => 'Dashboard',
'clients' => 'Clients',
'invoices' => 'Invoices',
'payments' => 'Payments',
'credits' => 'Credits',
'history' => 'History',
'search' => 'Search',
'sign_up' => 'Sign Up',
'guest' => 'Guest',
'company_details' => 'Company Details',
'online_payments' => 'Online Payments',
'notifications' => 'Notifications',
'import_export' => 'Import/Export',
'done' => 'Done',
'save' => 'Save',
'create' => 'Create',
'upload' => 'Upload',
'import' => 'Import',
'download' => 'Download',
'cancel' => 'Cancel',
'provide_email' => 'Please provide a valid email address',
'powered_by' => 'Powered by',
'no_items' => 'No items',
// recurring invoices
'recurring_invoices' => 'Recurring Invoices',
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p>
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p>
<p>Examples of dynamic invoice variables:</p>
<ul>
<li>"Gym membership for the month of :MONTH" => "Gym membership for the month of July"</li>
<li>":YEAR+1 yearly subscription" => "2015 Yearly Subscription"</li>
<li>"Retainer payment for :QUARTER+1" => "Retainer payment for Q2"</li>
</ul>',
// dashboard
'in_total_revenue' => 'in total revenue',
'billed_client' => 'billed client',
'billed_clients' => 'billed clients',
'active_client' => 'active client',
'active_clients' => 'active clients',
'invoices_past_due' => 'Invoices Past Due',
'upcoming_invoices' => 'Upcoming invoices',
'average_invoice' => 'Average invoice',
// list pages
'archive' => 'Archive',
'delete' => 'Delete',
'archive_client' => 'Archive client',
'delete_client' => 'Delete client',
'archive_payment' => 'Archive payment',
'delete_payment' => 'Delete payment',
'archive_credit' => 'Archive credit',
'delete_credit' => 'Delete credit',
'show_archived_deleted' => 'Show archived/deleted',
'filter' => 'Filter',
'new_client' => 'New Client',
'new_invoice' => 'New Invoice',
'new_payment' => 'New Payment',
'new_credit' => 'New Credit',
'contact' => 'Contact',
'date_created' => 'Date Created',
'last_login' => 'Last Login',
'balance' => 'Balance',
'action' => 'Action',
'status' => 'Status',
'invoice_total' => 'Invoice Total',
'frequency' => 'Frequency',
'start_date' => 'Start Date',
'end_date' => 'End Date',
'transaction_reference' => 'Transaction Reference',
'method' => 'Method',
'payment_amount' => 'Payment Amount',
'payment_date' => 'Payment Date',
'credit_amount' => 'Credit Amount',
'credit_balance' => 'Credit Balance',
'credit_date' => 'Credit Date',
'empty_table' => 'No data available in table',
'select' => 'Select',
'edit_client' => 'Edit Client',
'edit_invoice' => 'Edit Invoice',
// client view page
'create_invoice' => 'Create Invoice',
'enter_credit' => 'Enter Credit',
'last_logged_in' => 'Last logged in',
'details' => 'Details',
'standing' => 'Standing',
'credit' => 'Credit',
'activity' => 'Activity',
'date' => 'Date',
'message' => 'Message',
'adjustment' => 'Adjustment',
'are_you_sure' => 'Are you sure?',
// payment pages
'payment_type_id' => 'Payment type',
'amount' => 'Amount',
// account/company pages
'work_email' => 'Email',
'language_id' => 'Language',
'timezone_id' => 'Timezone',
'date_format_id' => 'Date format',
'datetime_format_id' => 'Date/Time Format',
'users' => 'Users',
'localization' => 'Localization',
'remove_logo' => 'Remove logo',
'logo_help' => 'Supported: JPEG, GIF and PNG. Recommended height: 120px',
'payment_gateway' => 'Payment Gateway',
'gateway_id' => 'Provider',
'email_notifications' => 'Email Notifications',
'email_sent' => 'Email me when an invoice is <b>sent</b>',
'email_viewed' => 'Email me when an invoice is <b>viewed</b>',
'email_paid' => 'Email me when an invoice is <b>paid</b>',
'site_updates' => 'Site Updates',
'custom_messages' => 'Custom Messages',
'default_invoice_terms' => 'Set default invoice terms',
'default_email_footer' => 'Set default email signature',
'import_clients' => 'Import Client Data',
'csv_file' => 'Select CSV file',
'export_clients' => 'Export Client Data',
'select_file' => 'Please select a file',
'first_row_headers' => 'Use first row as headers',
'column' => 'Column',
'sample' => 'Sample',
'import_to' => 'Import to',
'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created',
// application messages
'created_client' => 'Successfully created client',
'created_clients' => 'Successfully created :count clients',
'updated_settings' => 'Successfully updated settings',
'removed_logo' => 'Successfully removed logo',
'sent_message' => 'Successfully sent message',
'invoice_error' => 'Please make sure to select a client and correct any errors',
'limit_clients' => 'Sorry, this will exceed the limit of :count clients',
'payment_error' => 'There was an error processing your payment. Please try again later.',
'registration_required' => 'Please sign up to email an invoice',
'confirmation_required' => 'Please confirm your email address',
'updated_client' => 'Successfully updated client',
'created_client' => 'Successfully created client',
'archived_client' => 'Successfully archived client',
'archived_clients' => 'Successfully archived :count clients',
'deleted_client' => 'Successfully deleted client',
'deleted_clients' => 'Successfully deleted :count clients',
'updated_invoice' => 'Successfully updated invoice',
'created_invoice' => 'Successfully created invoice',
'cloned_invoice' => 'Successfully cloned invoice',
'emailed_invoice' => 'Successfully emailed invoice',
'and_created_client' => 'and created client',
'archived_invoice' => 'Successfully archived credit',
'archived_invoices' => 'Successfully archived :count credits',
'deleted_invoice' => 'Successfully deleted credit',
'deleted_invoices' => 'Successfully deleted :count credits',
'created_payment' => 'Successfully created payment',
'archived_payment' => 'Successfully archived payment',
'archived_payments' => 'Successfully archived :count payments',
'deleted_payment' => 'Successfully deleted payment',
'deleted_payments' => 'Successfully deleted :count payments',
'applied_payment' => 'Successfully applied payment',
'created_credit' => 'Successfully created credit',
'archived_credit' => 'Successfully archived credit',
'archived_credits' => 'Successfully archived :count credits',
'deleted_credit' => 'Successfully deleted credit',
'deleted_credits' => 'Successfully deleted :count credits',
// Emails
'confirmation_subject' => 'Invoice Ninja Account Confirmation',
'confirmation_header' => 'Account Confirmation',
'confirmation_message' => 'Please access the link below to confirm your account.',
'invoice_subject' => 'New invoice :invoice',
'invoice_message' => 'To view your invoice for :amount, click the link below.',
'payment_subject' => 'Payment Received :invoice',
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'user_email_footer' => 'To adjust your email notification settings please visit http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_sent_subject' => 'Invoice :invoice was sent to :client',
'notification_viewed_subject' => 'Invoice :invoice was viewed by :client',
'notification_paid' => 'A payment of :amount was made by client :client towards Invoice :invoice.',
'notification_sent' => 'The following client :client was emailed Invoice :invoice for :amount.',
'notification_viewed' => 'The following client :client viewed Invoice :invoice for :amount.',
'reset_password' => 'You can reset your account password by clicking the following link:',
'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Secure Payment',
'card_number' => 'Card number',
'expiration_month' => 'Expiration month',
'expiration_year' => 'Expiration year',
'cvv' => 'CVV',
// Security alerts
'confide' => array(
'too_many_attempts' => 'Too many attempts. Try again in few minutes.',
'wrong_credentials' => 'Incorrect email or password.',
'confirmation' => 'Your account has been confirmed!',
'wrong_confirmation' => 'Wrong confirmation code.',
'password_forgot' => 'The information regarding password reset was sent to your email.',
'password_reset' => 'Your password has been changed successfully.',
'wrong_password_reset' => 'Invalid password. Try again',
),
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -50,5 +50,250 @@ return array(
'invoice_design_id' => 'Design',
'terms' => 'Terms',
'your_invoice' => 'Your Invoice',
'remove_contact' => 'Remove contact',
'add_contact' => 'Add contact',
'create_new_client' => 'Create new client',
'edit_client_details' => 'Edit client details',
'enable' => 'Enable',
'learn_more' => 'Learn more',
'manage_rates' => 'Manage rates',
'note_to_client' => 'Note to client',
'invoice_terms' => 'Invoice terms',
'save_as_default_terms' => 'Save as default terms',
'download_pdf' => 'Download PDF',
'pay_now' => 'Pay Now',
'save_invoice' => 'Save Invoice',
'clone_invoice' => 'Clone Invoice',
'archive_invoice' => 'Archive Invoice',
'delete_invoice' => 'Delete Invoice',
'email_invoice' => 'Email Invoice',
'enter_payment' => 'Enter Payment',
'tax_rates' => 'Tax Rates',
'rate' => 'Rate',
'settings' => 'Settings',
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>',
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>',
// navigation
'dashboard' => 'Dashboard',
'clients' => 'Clients',
'invoices' => 'Invoices',
'payments' => 'Payments',
'credits' => 'Credits',
'history' => 'History',
'search' => 'Search',
'sign_up' => 'Sign Up',
'guest' => 'Guest',
'company_details' => 'Company Details',
'online_payments' => 'Online Payments',
'notifications' => 'Notifications',
'import_export' => 'Import/Export',
'done' => 'Done',
'save' => 'Save',
'create' => 'Create',
'upload' => 'Upload',
'import' => 'Import',
'download' => 'Download',
'cancel' => 'Cancel',
'provide_email' => 'Please provide a valid email address',
'powered_by' => 'Powered by',
'no_items' => 'No items',
// recurring invoices
'recurring_invoices' => 'Recurring Invoices',
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p>
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p>
<p>Examples of dynamic invoice variables:</p>
<ul>
<li>"Gym membership for the month of :MONTH" => "Gym membership for the month of July"</li>
<li>":YEAR+1 yearly subscription" => "2015 Yearly Subscription"</li>
<li>"Retainer payment for :QUARTER+1" => "Retainer payment for Q2"</li>
</ul>',
// dashboard
'in_total_revenue' => 'in total revenue',
'billed_client' => 'billed client',
'billed_clients' => 'billed clients',
'active_client' => 'active client',
'active_clients' => 'active clients',
'invoices_past_due' => 'Invoices Past Due',
'upcoming_invoices' => 'Upcoming invoices',
'average_invoice' => 'Average invoice',
// list pages
'archive' => 'Archive',
'delete' => 'Delete',
'archive_client' => 'Archive client',
'delete_client' => 'Delete client',
'archive_payment' => 'Archive payment',
'delete_payment' => 'Delete payment',
'archive_credit' => 'Archive credit',
'delete_credit' => 'Delete credit',
'show_archived_deleted' => 'Show archived/deleted',
'filter' => 'Filter',
'new_client' => 'New Client',
'new_invoice' => 'New Invoice',
'new_payment' => 'New Payment',
'new_credit' => 'New Credit',
'contact' => 'Contact',
'date_created' => 'Date Created',
'last_login' => 'Last Login',
'balance' => 'Balance',
'action' => 'Action',
'status' => 'Status',
'invoice_total' => 'Invoice Total',
'frequency' => 'Frequency',
'start_date' => 'Start Date',
'end_date' => 'End Date',
'transaction_reference' => 'Transaction Reference',
'method' => 'Method',
'payment_amount' => 'Payment Amount',
'payment_date' => 'Payment Date',
'credit_amount' => 'Credit Amount',
'credit_balance' => 'Credit Balance',
'credit_date' => 'Credit Date',
'empty_table' => 'No data available in table',
'select' => 'Select',
'edit_client' => 'Edit Client',
'edit_invoice' => 'Edit Invoice',
// client view page
'create_invoice' => 'Create Invoice',
'enter_credit' => 'Enter Credit',
'last_logged_in' => 'Last logged in',
'details' => 'Details',
'standing' => 'Standing',
'credit' => 'Credit',
'activity' => 'Activity',
'date' => 'Date',
'message' => 'Message',
'adjustment' => 'Adjustment',
'are_you_sure' => 'Are you sure?',
// payment pages
'payment_type_id' => 'Payment type',
'amount' => 'Amount',
// account/company pages
'work_email' => 'Email',
'language_id' => 'Language',
'timezone_id' => 'Timezone',
'date_format_id' => 'Date format',
'datetime_format_id' => 'Date/Time Format',
'users' => 'Users',
'localization' => 'Localization',
'remove_logo' => 'Remove logo',
'logo_help' => 'Supported: JPEG, GIF and PNG. Recommended height: 120px',
'payment_gateway' => 'Payment Gateway',
'gateway_id' => 'Provider',
'email_notifications' => 'Email Notifications',
'email_sent' => 'Email me when an invoice is <b>sent</b>',
'email_viewed' => 'Email me when an invoice is <b>viewed</b>',
'email_paid' => 'Email me when an invoice is <b>paid</b>',
'site_updates' => 'Site Updates',
'custom_messages' => 'Custom Messages',
'default_invoice_terms' => 'Set default invoice terms',
'default_email_footer' => 'Set default email signature',
'import_clients' => 'Import Client Data',
'csv_file' => 'Select CSV file',
'export_clients' => 'Export Client Data',
'select_file' => 'Please select a file',
'first_row_headers' => 'Use first row as headers',
'column' => 'Column',
'sample' => 'Sample',
'import_to' => 'Import to',
'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created',
// application messages
'created_client' => 'Successfully created client',
'created_clients' => 'Successfully created :count clients',
'updated_settings' => 'Successfully updated settings',
'removed_logo' => 'Successfully removed logo',
'sent_message' => 'Successfully sent message',
'invoice_error' => 'Please make sure to select a client and correct any errors',
'limit_clients' => 'Sorry, this will exceed the limit of :count clients',
'payment_error' => 'There was an error processing your payment. Please try again later.',
'registration_required' => 'Please sign up to email an invoice',
'confirmation_required' => 'Please confirm your email address',
'updated_client' => 'Successfully updated client',
'created_client' => 'Successfully created client',
'archived_client' => 'Successfully archived client',
'archived_clients' => 'Successfully archived :count clients',
'deleted_client' => 'Successfully deleted client',
'deleted_clients' => 'Successfully deleted :count clients',
'updated_invoice' => 'Successfully updated invoice',
'created_invoice' => 'Successfully created invoice',
'cloned_invoice' => 'Successfully cloned invoice',
'emailed_invoice' => 'Successfully emailed invoice',
'and_created_client' => 'and created client',
'archived_invoice' => 'Successfully archived credit',
'archived_invoices' => 'Successfully archived :count credits',
'deleted_invoice' => 'Successfully deleted credit',
'deleted_invoices' => 'Successfully deleted :count credits',
'created_payment' => 'Successfully created payment',
'archived_payment' => 'Successfully archived payment',
'archived_payments' => 'Successfully archived :count payments',
'deleted_payment' => 'Successfully deleted payment',
'deleted_payments' => 'Successfully deleted :count payments',
'applied_payment' => 'Successfully applied payment',
'created_credit' => 'Successfully created credit',
'archived_credit' => 'Successfully archived credit',
'archived_credits' => 'Successfully archived :count credits',
'deleted_credit' => 'Successfully deleted credit',
'deleted_credits' => 'Successfully deleted :count credits',
// Emails
'confirmation_subject' => 'Invoice Ninja Account Confirmation',
'confirmation_header' => 'Account Confirmation',
'confirmation_message' => 'Please access the link below to confirm your account.',
'invoice_subject' => 'New invoice :invoice',
'invoice_message' => 'To view your invoice for :amount, click the link below.',
'payment_subject' => 'Payment Received :invoice',
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'user_email_footer' => 'To adjust your email notification settings please visit http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_paid_subject' => 'Invoice :invoice was paid by :client',
'notification_sent_subject' => 'Invoice :invoice was sent to :client',
'notification_viewed_subject' => 'Invoice :invoice was viewed by :client',
'notification_paid' => 'A payment of :amount was made by client :client towards Invoice :invoice.',
'notification_sent' => 'The following client :client was emailed Invoice :invoice for :amount.',
'notification_viewed' => 'The following client :client viewed Invoice :invoice for :amount.',
'reset_password' => 'You can reset your account password by clicking the following link:',
'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Secure Payment',
'card_number' => 'Card number',
'expiration_month' => 'Expiration month',
'expiration_year' => 'Expiration year',
'cvv' => 'CVV',
// Security alerts
'confide' => array(
'too_many_attempts' => 'Too many attempts. Try again in few minutes.',
'wrong_credentials' => 'Incorrect email or password.',
'confirmation' => 'Your account has been confirmed!',
'wrong_confirmation' => 'Wrong confirmation code.',
'password_forgot' => 'The information regarding password reset was sent to your email.',
'password_reset' => 'Your password has been changed successfully.',
'wrong_password_reset' => 'Invalid password. Try again',
),
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -26,28 +26,261 @@ return array(
'private_notes' => 'Notas Privadas',
// invoice
'invoice' => 'Invoice',
'client' => 'Client',
'invoice_date' => 'Invoice Date',
'due_date' => 'Due Date',
'invoice_number' => 'Invoice Number',
'invoice_number_short' => 'Invoice #',
'po_number' => 'PO Number',
'po_number_short' => 'PO #',
'frequency_id' => 'How often',
'discount' => 'Discount',
'taxes' => 'Taxes',
'tax' => 'Tax',
'invoice' => 'Fatura',
'client' => 'Cliente',
'invoice_date' => 'Data da Fatura',
'due_date' => 'Data de Vencimento',
'invoice_number' => 'Número da Fatura',
'invoice_number_short' => 'Fatura #',
'po_number' => 'Núm. Ordem de Compra',
'po_number_short' => 'OC #',
'frequency_id' => 'Quantas vezes',
'discount' => 'Desconto',
'taxes' => 'Taxas',
'tax' => 'Taxa',
'item' => 'Item',
'description' => 'Description',
'unit_cost' => 'Unit Cost',
'quantity' => 'Quantity',
'line_total' => 'Line Total',
'description' => 'Descrição',
'unit_cost' => 'Custo Unitário',
'quantity' => 'Quantidade',
'line_total' => 'Linha Total',
'subtotal' => 'Subtotal',
'paid_to_date' => 'Paid to Date',
'balance_due' => 'Balance Due',
'paid_to_date' => 'Pagamento até',
'balance_due' => 'Saldo Devedor',
'invoice_design_id' => 'Design',
'terms' => 'Terms',
'your_invoice' => 'Your Invoice',
'terms' => 'Termos',
'your_invoice' => 'Sua Fatura',
'remove_contact' => 'Remover contato',
'add_contact' => 'Adicionar contato',
'create_new_client' => 'Criar novo cliente',
'edit_client_details' => 'Editar detalhes do cliente',
'enable' => 'Habilitar',
'learn_more' => 'Aprender mais',
'manage_rates' => 'Gerenciar impostos',
'note_to_client' => 'Nota para o cliente',
'invoice_terms' => 'Termos da Fatura',
'save_as_default_terms' => 'Salvar como termo padrão',
'download_pdf' => 'Baixar PDF',
'pay_now' => 'Pagar agora',
'save_invoice' => 'Salvar Fatura',
'clone_invoice' => 'Clonar Fatura',
'archive_invoice' => 'Arquivar Fatura',
'delete_invoice' => 'Apagar Fatura',
'email_invoice' => 'Enviar Fatura',
'enter_payment' => 'Entre com o Pagamento',
'tax_rates' => 'Taxas de Impostos',
'rate' => 'Imposto',
'settings' => 'Configurações',
'enable_invoice_tax' => 'Permitir especificar a <b>taxa da fatura</b>',
'enable_line_item_tax' => 'Permitir especificar o <b>item da linha de taxas</b>',
// navigation
'dashboard' => 'Painel de Controle',
'clients' => 'Clientes',
'invoices' => 'Faturas',
'payments' => 'Pagamentos',
'credits' => 'Créditos',
'history' => 'Histórico',
'search' => 'Pesquisa',
'sign_up' => 'Cadastrar',
'guest' => 'Convidado',
'company_details' => 'Detalhes da Empresa',
'online_payments' => 'Pagamentos Online',
'notifications' => 'Notificações',
'import_export' => 'Importar/Exportar',
'done' => 'Feito',
'save' => 'Salvar',
'create' => 'Criar',
'upload' => 'Upload',
'import' => 'Importar',
'download' => 'Download',
'cancel' => 'Cancelar',
'provide_email' => 'Favor fornecer um endereço de e-mail válido',
'powered_by' => 'Powered by',
'no_items' => 'Sem itens',
// recurring invoices
'recurring_invoices' => 'Faturas Recorrentes',
'recurring_help' => '<p>Enviar automaticamente aos clientes as mesmas faturas semanalmente, mensalmente, bimenstralmente, trimestralmente ou anualmente. </p>
<p>Use :MONTH, :QUARTER ou :YEAR para datas dinâmicas. Matemática básica também funciona, por exemplo :MONTH-1.</p>
<p>Exemplo de variáveis de uma fatura dinâmica:</p>
<ul>
<li>"Mensalidade da academia para o mês de :MONTH" => "Mensalidade da academia para o mês de Julho"</li>
<li>"Plano anual de :YEAR+1" => "Plano anual de 2015"</li>
<li>"Pagamento retido para :QUARTER+1" => "Pagamento retido para Q2"</li>
</ul>',
// dashboard
'in_total_revenue' => 'no total de rendimento',
'billed_client' => 'cliente faturado',
'billed_clients' => 'clientes faturados',
'active_client' => 'cliente ativo',
'active_clients' => 'clientes ativos',
'invoices_past_due' => 'Faturas Vencidas',
'upcoming_invoices' => 'Próximas Faturas',
'average_invoice' => 'Média da fatura',
// list pages
'archive' => 'Arquivos',
'delete' => 'Apagar',
'archive_client' => 'Arquivar cliente',
'delete_client' => 'Apagar cliente',
'archive_payment' => 'Arquivar pagamento',
'delete_payment' => 'Apagar pagamento',
'archive_credit' => 'Arquivar crédito',
'delete_credit' => 'Apagar crédito',
'show_archived_deleted' => 'Mostrar arquivados/apagados',
'filter' => 'Filtrar',
'new_client' => 'Novo Cliente',
'new_invoice' => 'Nova Fatura',
'new_payment' => 'Novo Pagamento',
'new_credit' => 'Novo Crédito',
'contact' => 'Contato',
'date_created' => 'Data de Criação',
'last_login' => 'Último Login',
'balance' => 'Balanço',
'action' => 'Ação',
'status' => 'Status',
'invoice_total' => 'Total da Fatura',
'frequency' => 'Frequência',
'start_date' => 'Data Inicial',
'end_date' => 'Data Final',
'transaction_reference' => 'Referência da Transação',
'method' => 'Método',
'payment_amount' => 'Qtde do Pagamento',
'payment_date' => 'Data do Pagamento',
'credit_amount' => 'Qtde do Crédito',
'credit_balance' => 'Balanço do Crédito',
'credit_date' => 'Data do Crédito',
'empty_table' => 'Sem data disponível na tabela',
'select' => 'Selecionar',
'edit_client' => 'Editar Cliente',
'edit_invoice' => 'Editar Fatura',
// client view page
'create_invoice' => 'Criar Fatura',
'enter_credit' => 'Digitar Crédito',
'last_logged_in' => 'Último login em',
'details' => 'Detalhes',
'standing' => 'Constante',
'credit' => 'Crédito',
'activity' => 'Atividade',
'date' => 'Data',
'message' => 'Mensagem',
'adjustment' => 'Ajustes',
'are_you_sure' => 'Você tem certeza?',
// payment pages
'payment_type_id' => 'Tipo de pagamento',
'amount' => 'Quantidade',
// account/company pages
'work_email' => 'Email',
'language_id' => 'Idioma',
'timezone_id' => 'Fuso Horário',
'date_format_id' => 'Formato da Data',
'datetime_format_id' => 'Formato da Data/Hora',
'users' => 'Usuários',
'localization' => 'Localização',
'remove_logo' => 'Remover logo',
'logo_help' => 'Suportados: JPEG, GIF and PNG. Altura recomendada: 120px',
'payment_gateway' => 'Provedor de Pagamento',
'gateway_id' => 'Provedor',
'email_notifications' => 'Notificações por Email',
'email_sent' => 'Me avise por email quando a fatura for <b>enviada</b>',
'email_viewed' => 'Me avise por email quando a fatura for <b>visualizada</b>',
'email_paid' => 'Me avise por email quando a fatura for <b>paga</b>',
'site_updates' => 'Atualizações do Site',
'custom_messages' => 'Mensagens Customizadas',
'default_invoice_terms' => 'Definir termos padrões da fatura',
'default_email_footer' => 'Definir assinatura de email padrão',
'import_clients' => 'Importar Dados do Cliente',
'csv_file' => 'Selecionar arquivo CSV',
'export_clients' => 'Exportar Dados do Cliente',
'select_file' => 'Favor selecionar um arquivo',
'first_row_headers' => 'Usar as primeiras linhas como cabeçalho',
'column' => 'Coluna',
'sample' => 'Exemplo',
'import_to' => 'Importar para',
'client_will_create' => 'cliente será criado',
'clients_will_create' => 'clientes serão criados',
// application messages
'created_client' => 'Cliente criado com sucesso',
'created_clients' => ':count clientes criados com sucesso',
'updated_settings' => 'Configurações atualizadas com sucesso',
'removed_logo' => 'Logo removida com sucesso',
'sent_message' => 'Mensagem enviada com sucesso',
'invoice_error' => 'Verifique se você selecionou algum cliente e que não há nenhum outro erro',
'limit_clients' => 'Desculpe, isto irá exceder o limite de :count clientes',
'payment_error' => 'Ocorreu um erro ao processar o pagamento. Por favor tente novamente mais tarde.',
'registration_required' => 'Favor logar-se para enviar uma fatura por email',
'confirmation_required' => 'Favor confirmar o seu endereço de email',
'updated_client' => 'Cliente atualizado com sucesso',
'created_client' => 'Cliente criado com sucesso',
'archived_client' => 'Cliente arquivado com sucesso',
'archived_clients' => ':count clientes arquivados com sucesso',
'deleted_client' => 'Clientes removidos com sucesso',
'deleted_clients' => ':count clientes removidos com sucesso',
'updated_invoice' => 'Fatura atualizado com sucesso',
'created_invoice' => 'Fatura criada com sucesso',
'cloned_invoice' => 'Fatura clonada com sucesso',
'emailed_invoice' => 'Fatura enviada por email com sucesso',
'and_created_client' => 'e o cliente foi criado',
'archived_invoice' => 'Crédito arquivado com sucesso',
'archived_invoices' => ':count créditos arquivados com sucesso',
'deleted_invoice' => 'Créditos apagados com sucesso',
'deleted_invoices' => ':count créditos apagados com sucesso',
'created_payment' => 'Pagamento criado com sucesso',
'archived_payment' => 'Pagamento arquivado com sucesso',
'archived_payments' => ':count pagamentos arquivados com sucesso',
'deleted_payment' => 'Pagamento apagado com sucesso',
'deleted_payments' => ':count pagamentos apagados com sucesso',
'applied_payment' => 'Pagamentos aplicados com sucesso',
'created_credit' => 'Crédito criado com sucesso',
'archived_credit' => 'Crédito arquivado com sucesso',
'archived_credits' => ':count créditos arquivados com sucesso',
'deleted_credit' => 'Crédito apagado com sucesso',
'deleted_credits' => ':count créditos apagados com sucesso',
// Emails
'confirmation_subject' => 'Confirmação de Conta do Invoice Ninja',
'confirmation_header' => 'Confirmação de Conta',
'confirmation_message' => 'Favor acessar o link abaixo para confirmar a sua conta.',
'invoice_subject' => 'Nova fatura :invoice',
'invoice_message' => 'Para visualizar a sua fatura de :amount, clique no link abaixo.',
'payment_subject' => 'Recebido Pagamento de :invoice',
'payment_message' => 'Obrigado pelo seu pagamento de :amount.',
'email_salutation' => 'Caro :name,',
'email_signature' => 'Até mais,',
'email_from' => 'Equipe InvoiceNinja',
'user_email_footer' => 'Para ajustar suas configurações de notificações de email acesse http://www.invoiceninja.com/company/notifications',
'invoice_link_message' => 'Para visualizar a fatura do seu cliente clique no link abaixo:',
'notification_paid_subject' => 'Fatura :invoice foi pago por :client',
'notification_sent_subject' => 'Fatura :invoice foi enviado por :client',
'notification_viewed_subject' => 'Fatura :invoice foi visualizada por :client',
'notification_paid' => 'Um pagamento de :amount foi realizado pelo cliente :client através da fatura :invoice.',
'notification_sent' => 'O cliente :client foi notificado por email referente à fatura :invoice de :amount.',
'notification_viewed' => 'O cliente :client visualizou a fatura :invoice de :amount.',
'reset_password' => 'Você pode redefinir a sua senha clicando no seguinte link:',
'reset_password_footer' => 'Se você não solicitou a redefinição de sua senha por favor envie um email para o nosso suporte: ' . CONTACT_EMAIL,
// Payment page
'secure_payment' => 'Pagamento Seguro',
'card_number' => 'Número do cartão',
'expiration_month' => 'Mês de expiração',
'expiration_year' => 'Ano de expiração',
'cvv' => 'CVV',
// Pro Plan
'pro_plan' => [
'remove_logo' => ':link to remove the Invoice Ninja logo by joining the pro plan',
'remove_logo_link' => 'Click here',
],
);

View File

@ -5,6 +5,11 @@ class Utils
public static function isProd()
{
return App::environment() == ENV_PRODUCTION;
}
public static function isNinjaProd()
{
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
}
public static function basePath()
@ -35,7 +40,7 @@ class Utils
{
if (!$message)
{
$message = "An error occurred, please try again later";
$message = "An error occurred, please try again later.";
}
static::logError($message . ' ' . $exception);
@ -122,9 +127,9 @@ class Utils
public static function pluralize($string, $count)
{
$string = str_replace('?', $count, $string);
$field = $count == 1 ? $string : $string . 's';
return trans("texts.$field");
$field = $count == 1 ? $string : $string . 's';
$string = trans("texts.$field", ['count' => $count]);
return $string;
}
public static function toArray($data)

View File

@ -39,6 +39,11 @@ class Account extends Eloquent
return $this->belongsTo('Timezone');
}
public function language()
{
return $this->belongsTo('Language');
}
public function date_format()
{
return $this->belongsTo('DateFormat');
@ -158,15 +163,22 @@ class Account extends Eloquent
}
}
public function getLocale()
{
$language = Language::remember(DEFAULT_QUERY_CACHE)->where('id', '=', $this->account->language_id)->first();
return $language->locale;
}
public function loadLocalizationSettings()
{
$this->load('timezone', 'date_format', 'datetime_format');
$this->load('timezone', 'date_format', 'datetime_format', 'language');
Session::put(SESSION_TIMEZONE, $this->timezone ? $this->timezone->name : DEFAULT_TIMEZONE);
Session::put(SESSION_DATE_FORMAT, $this->date_format ? $this->date_format->format : DEFAULT_DATE_FORMAT);
Session::put(SESSION_DATE_PICKER_FORMAT, $this->date_format ? $this->date_format->picker_format : DEFAULT_DATE_PICKER_FORMAT);
Session::put(SESSION_DATETIME_FORMAT, $this->datetime_format ? $this->datetime_format->format : DEFAULT_DATETIME_FORMAT);
Session::put(SESSION_CURRENCY, $this->currency_id ? $this->currency_id : DEFAULT_CURRENCY);
Session::put(SESSION_LOCALE, $this->language_id ? $this->language->locale : DEFUALT_LOCALE);
}
public function getInvoiceLabels()

View File

@ -423,7 +423,7 @@ class Activity extends Eloquent
}
$activity = Activity::getBlank();
$activity->client_id = $client->id;
$activity->client_id = $credit->client_id;
$activity->credit_id = $credit->id;
$activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_CREDIT;
$activity->message = Utils::encodeActivity(Auth::user(), 'archived ' . Utils::formatMoney($credit->balance, $credit->client->currency_id) . ' credit');

View File

@ -104,10 +104,25 @@ class User extends ConfideUser implements UserInterface, RemindableInterface
}
}
public function getLocale()
public function isPro()
{
$language = Language::remember(DEFAULT_QUERY_CACHE)->where('id', '=', $this->account->language_id)->first();
return $language->locale;
if (!Auth::check())
{
return false;
}
$datePaid = $this->account->pro_plan_paid;
if (!$datePaid || $datePaid == '0000-00-00')
{
return false;
}
$today = new DateTime('now');
$datePaid = DateTime::createFromFormat('Y-m-d', $datePaid);
$interval = $today->diff($datePaid);
return $interval->y == 0;
}
public function showGreyBackground()

View File

@ -14,7 +14,7 @@ class ContactMailer extends Mailer {
public function sendInvoice(Invoice $invoice)
{
$view = 'invoice';
$subject = 'New invoice ' . $invoice->invoice_number;
$subject = trans('texts.invoice_subject', ['invoice' => $invoice->invoice_number]);
$invoice->load('invitations', 'client', 'account');
@ -57,7 +57,7 @@ class ContactMailer extends Mailer {
public function sendPaymentConfirmation(Payment $payment)
{
$view = 'payment_confirmation';
$subject = 'Payment Received ' . $payment->invoice->invoice_number;
$subject = trans('texts.payment_subject', ['invoice' => $payment->invoice->invoice_number]);
$data = [
'accountName' => $payment->account->getDisplayName(),

View File

@ -16,7 +16,7 @@ class UserMailer extends Mailer {
}
$view = 'confirm';
$subject = 'Invoice Ninja Account Confirmation';
$subject = trans('texts.confirmation_subject');
$data = [
'user' => $user
@ -48,20 +48,7 @@ class UserMailer extends Mailer {
$data['paymentAmount'] = Utils::formatMoney($payment->amount, $invoice->client->currency_id);
}
if ($type == 'paid')
{
$action = 'paid by';
}
else if ($type == 'sent')
{
$action = 'sent to';
}
else
{
$action = 'viewed by';
}
$subject = "Invoice {$invoice->invoice_number} was $action {$invoice->client->getDisplayName()}";
$subject = trans('texts.notification_'.$type.'_subject', ['invoice'=>$invoice->invoice_number, 'client'=>$invoice->client->getDisplayName()]);
$this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data);
}

View File

@ -176,8 +176,16 @@ class InvoiceRepository
$total += $total * $invoice->tax_rate / 100;
$invoice->amount = $total;
$invoice->balance = $total;
if ($publicId)
{
$invoice->balance = $total - ($invoice->amount - $invoice->balance);
}
else
{
$invoice->balance = $total;
}
$invoice->amount = $total;
$invoice->save();
$invoice->invoice_items()->forceDelete();

View File

@ -1,6 +1,5 @@
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
@ -29,6 +28,8 @@ Route::get('/about', 'HomeController@showAboutUs');
Route::get('/terms', 'HomeController@showTerms');
Route::get('/contact', 'HomeController@showContactUs');
Route::post('/contact', 'HomeController@doContactUs');
Route::get('/faq', 'HomeController@showFaq');
Route::get('/features', 'HomeController@showFeatures');
Route::get('log_error', 'HomeController@logError');
Route::post('get_started', 'AccountController@getStarted');
@ -59,6 +60,7 @@ Route::group(array('before' => 'auth'), function()
Route::get('force_inline_pdf', 'UserController@forcePDFJS');
Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData'));
Route::get('account/enable_pro_plan', 'AccountController@enableProPlan');
Route::get('company/{section?}', 'AccountController@showSection');
Route::post('company/{section?}', 'AccountController@doSection');
Route::post('user/setTheme', 'UserController@setTheme');
@ -159,7 +161,7 @@ HTML::macro('breadcrumbs', function() {
$crumb = trim($crumbs[$i]);
if (!$crumb) continue;
if ($crumb == 'company') return '';
$name = ucwords($crumb);
$name = trans("texts.$crumb");
if ($i==count($crumbs)-1)
{
$str .= "<li class='active'>$name</li>";
@ -226,6 +228,7 @@ define('SESSION_DATE_FORMAT', 'dateFormat');
define('SESSION_DATE_PICKER_FORMAT', 'datePickerFormat');
define('SESSION_DATETIME_FORMAT', 'datetimeFormat');
define('SESSION_COUNTER', 'sessionCounter');
define('SESSION_LOCALE', 'sessionLocale');
define('DEFAULT_TIMEZONE', 'US/Eastern');
define('DEFAULT_CURRENCY', 1); // US Dollar
@ -233,8 +236,10 @@ define('DEFAULT_DATE_FORMAT', 'M j, Y');
define('DEFAULT_DATE_PICKER_FORMAT', 'M d, yyyy');
define('DEFAULT_DATETIME_FORMAT', 'F j, Y, g:i a');
define('DEFAULT_QUERY_CACHE', 120); // minutes
define('DEFUALT_LOCALE', 'en');
define('GATEWAY_PAYPAL_EXPRESS', 17);
define('NINJA_ACCOUNT_KEY', 'zg4ylmzDkdkPOT8yoKQw9LTWaoZJx79h');
if (Auth::check() && !Session::has(SESSION_TIMEZONE))

View File

@ -25,53 +25,53 @@
<div class="row">
<div class="col-md-5">
{{ Former::legend('Details') }}
{{ Former::legend('details') }}
{{ Former::text('name') }}
{{ Former::text('work_email')->label('Email') }}
{{ Former::text('work_phone')->label('Phone') }}
{{ Former::file('logo')->max(2, 'MB')->accept('image')->inlineHelp('Supported: JPEG, GIF and PNG. Recommended height: 120px') }}
{{ Former::text('work_email') }}
{{ Former::text('work_phone') }}
{{ Former::file('logo')->max(2, 'MB')->accept('image')->inlineHelp(trans('texts.logo_help')) }}
@if (file_exists($account->getLogoPath()))
<center>
{{ HTML::image($account->getLogoPath(), "Logo") }} &nbsp;
<a href="#" onclick="deleteLogo()">Remove logo</a>
<a href="#" onclick="deleteLogo()">{{ trans('texts.remove_logo') }}</a>
</center><br/>
@endif
{{ Former::select('size_id')->addOption('','')->label('Size')
{{ Former::select('size_id')->addOption('','')
->fromQuery($sizes, 'name', 'id') }}
{{ Former::select('industry_id')->addOption('','')->label('Industry')
{{ Former::select('industry_id')->addOption('','')
->fromQuery($industries, 'name', 'id') }}
{{ Former::legend('Address') }}
{{ Former::text('address1')->label('Street') }}
{{ Former::text('address2')->label('Apt/Suite') }}
{{ Former::legend('address') }}
{{ Former::text('address1') }}
{{ Former::text('address2') }}
{{ Former::text('city') }}
{{ Former::text('state')->label('State/Province') }}
{{ Former::text('state') }}
{{ Former::text('postal_code') }}
{{ Former::select('country_id')->addOption('','')->label('Country')
{{ Former::select('country_id')->addOption('','')
->fromQuery($countries, 'name', 'id') }}
</div>
<div class="col-md-5 col-md-offset-1">
{{ Former::legend('Users') }}
{{ Former::legend('users') }}
{{ Former::text('first_name') }}
{{ Former::text('last_name') }}
{{ Former::text('email') }}
{{ Former::text('phone') }}
{{ Former::legend('Localization') }}
{{ Former::select('language_id')->addOption('','')->label('Language')
{{ Former::legend('localization') }}
{{ Former::select('language_id')->addOption('','')
->fromQuery($languages, 'name', 'id') }}
{{ Former::select('currency_id')->addOption('','')->label('Currency')
{{ Former::select('currency_id')->addOption('','')
->fromQuery($currencies, 'name', 'id') }}
{{ Former::select('timezone_id')->addOption('','')->label('Timezone')
{{ Former::select('timezone_id')->addOption('','')
->fromQuery($timezones, 'location', 'id') }}
{{ Former::select('date_format_id')->addOption('','')->label('Date Format')
{{ Former::select('date_format_id')->addOption('','')
->fromQuery($dateFormats, 'label', 'id') }}
{{ Former::select('datetime_format_id')->addOption('','')->label('Date/Time Format')
{{ Former::select('datetime_format_id')->addOption('','')
->fromQuery($datetimeFormats, 'label', 'id') }}
@ -79,7 +79,7 @@
</div>
<center>
{{ Button::lg_success_submit('Save')->append_with_icon('floppy-disk') }}
{{ Button::lg_success_submit(trans('texts.save'))->append_with_icon('floppy-disk') }}
</center>
{{ Former::close() }}
@ -95,7 +95,7 @@
});
function deleteLogo() {
if (confirm('Are you sure?')) {
if (confirm("{{ trans('texts.are_you_sure') }}")) {
$('.removeLogoForm').submit();
}
}

View File

@ -4,14 +4,14 @@
@parent
{{ Former::open_for_files('company/import_map')->addClass('col-md-9 col-md-offset-1') }}
{{ Former::legend('Import Client Data') }}
{{ Former::file('file')->label('Select CSV file') }}
{{ Former::actions( Button::lg_info_submit('Upload')->append_with_icon('open') ) }}
{{ Former::legend('import_clients') }}
{{ Former::file('file')->label(trans('texts.csv_file')) }}
{{ Former::actions( Button::lg_info_submit(trans('texts.upload'))->append_with_icon('open') ) }}
{{ Former::close() }}
{{ Former::open('company/export')->addClass('col-md-9 col-md-offset-1') }}
{{ Former::legend('Export Client Data') }}
{{ Former::actions( Button::lg_primary_submit('Download')->append_with_icon('download-alt') ) }}
{{ Former::legend('export_clients') }}
{{ Former::actions( Button::lg_primary_submit(trans('texts.download'))->append_with_icon('download-alt') ) }}
{{ Former::close() }}
@stop

View File

@ -4,20 +4,20 @@
@parent
{{ Former::open('company/import_export') }}
{{ Former::legend('Import Clients') }}
{{ Former::legend('import_clients') }}
@if ($headers)
<label for="header_checkbox">
<input type="checkbox" name="header_checkbox" id="header_checkbox" {{ $hasHeaders ? 'CHECKED' : '' }}> Use first row as headers
<input type="checkbox" name="header_checkbox" id="header_checkbox" {{ $hasHeaders ? 'CHECKED' : '' }}> {{ trans('texts.first_row_headers') }}
</label>
<table class="table">
<thead>
<tr>
<th>Column</th>
<th class="col_sample">Sample</th>
<th>Import To</th>
<th>{{ trans('texts.column') }}</th>
<th class="col_sample">{{ trans('texts.sample') }}</th>
<th>{{ trans('texts.import_to') }}</th>
</tr>
</thead>
@for ($i=0; $i<count($headers); $i++)
@ -33,7 +33,7 @@
@endif
{{ Former::actions( Button::lg_primary_submit('Import'), '&nbsp;|&nbsp;', link_to('company/import', 'Cancel') ) }}
{{ Former::actions( Button::lg_primary_submit(trans('texts.import')), '&nbsp;|&nbsp;', link_to('company/import', trans('texts.cancel')) ) }}
{{ Former::close() }}
<script type="text/javascript">
@ -55,11 +55,11 @@
{
if (num == 1)
{
$('#numClients').html('1 client will be created');
$('#numClients').html("1 {{ trans('texts.client_will_create') }}");
}
else
{
$('#numClients').html(num + ' clients will be created');
$('#numClients').html(num + " {{ trans('texts.clients_will_create') }}");
}
}

View File

@ -9,12 +9,12 @@
{{ Former::populateField('notify_viewed', intval(Auth::user()->notify_viewed)) }}
{{ Former::populateField('notify_paid', intval(Auth::user()->notify_paid)) }}
{{ Former::legend('Email Notifications') }}
{{ Former::checkbox('notify_sent')->label('&nbsp;')->text('Email me when an invoice is <b>sent</b>') }}
{{ Former::checkbox('notify_viewed')->label('&nbsp;')->text('Email me when an invoice is <b>viewed</b>') }}
{{ Former::checkbox('notify_paid')->label('&nbsp;')->text('Email me when an invoice is <b>paid</b>') }}
{{ Former::legend('email_notifications') }}
{{ Former::checkbox('notify_sent')->label('&nbsp;')->text(trans('texts.email_sent')) }}
{{ Former::checkbox('notify_viewed')->label('&nbsp;')->text(trans('texts.email_viewed')) }}
{{ Former::checkbox('notify_paid')->label('&nbsp;')->text(trans('texts.email_paid')) }}
{{ Former::legend('Site Updates') }}
{{ Former::legend('site_updates') }}
<div class="form-group">
<label for="invoice_terms" class="control-label col-lg-4 col-sm-4"></label>
@ -36,11 +36,11 @@
</div></div>
{{ Former::legend('Custom Messages') }}
{{ Former::textarea('invoice_terms')->label('Set default invoice terms') }}
{{ Former::textarea('email_footer')->label('Set default email signature') }}
{{ Former::legend('custom_messages') }}
{{ Former::textarea('invoice_terms')->label(trans('texts.default_invoice_terms')) }}
{{ Former::textarea('email_footer')->label(trans('texts.default_email_footer')) }}
{{ Former::actions( Button::lg_success_submit('Save')->append_with_icon('floppy-disk') ) }}
{{ Former::actions( Button::lg_success_submit(trans('texts.save'))->append_with_icon('floppy-disk') ) }}
{{ Former::close() }}
@stop

View File

@ -8,7 +8,7 @@
@section('content')
<div class="row">
<!--<h3>{{ $title }} Client</h3>-->
{{ Former::open($url)->addClass('col-md-12 main_form')->method($method)->rules(array(
'email' => 'email|required'
)); }}
@ -25,8 +25,8 @@
{{ Former::text('name')->data_bind("attr { placeholder: placeholderName }") }}
{{ Former::text('website') }}
{{ Former::text('work_phone') }}
{{ Former::legend('address') }}
{{ Former::text('address1') }}
{{ Former::text('address2') }}

View File

@ -11,13 +11,13 @@
{{ Former::text('id')->value($client->public_id) }}
</div>
{{ DropdownButton::normal('Edit Client',
{{ DropdownButton::normal(trans('texts.edit_client'),
Navigation::links(
[
['Edit Client', URL::to('clients/' . $client->public_id . '/edit')],
[trans('texts.edit_client'), URL::to('clients/' . $client->public_id . '/edit')],
[Navigation::DIVIDER],
['Archive Client', "javascript:onArchiveClick()"],
['Delete Client', "javascript:onDeleteClick()"],
[trans('texts.archive_client'), "javascript:onArchiveClick()"],
[trans('texts.delete_client'), "javascript:onDeleteClick()"],
]
)
, ['id'=>'normalDropDown'])->split(); }}
@ -25,9 +25,9 @@
{{ DropdownButton::primary('Create Invoice',
Navigation::links(
[
['Create Invoice', URL::to('invoices/create/' . $client->public_id )],
['Enter Payment', URL::to('payments/create/' . $client->public_id )],
['Enter Credit', URL::to('credits/create/' . $client->public_id )],
[trans('texts.create_invoice'), URL::to('invoices/create/' . $client->public_id )],
[trans('texts.enter_payment'), URL::to('payments/create/' . $client->public_id )],
[trans('texts.enter_credit'), URL::to('credits/create/' . $client->public_id )],
]
)
, ['id'=>'primaryDropDown'])->split(); }}
@ -39,43 +39,43 @@
<h2>{{ $client->getDisplayName() }}</h2>
@if ($client->last_login > 0)
<h3 style="margin-top:0px"><small>
Last logged in {{ Utils::timestampToDateTimeString(strtotime($client->last_login)); }}
{{ trans('texts.last_logged_in') }} {{ Utils::timestampToDateTimeString(strtotime($client->last_login)); }}
</small></h3>
@endif
<div class="row">
<div class="col-md-3">
<h3>Details</h3>
<h3>{{ trans('texts.details') }}</h3>
<p>{{ $client->getAddress() }}</p>
<p>{{ $client->getPhone() }}</p>
<p>{{ $client->getNotes() }}</p>
<p>{{ $client->getIndustry() }}</p>
<p>{{ $client->getWebsite() }}</p>
<p>{{ $client->payment_terms ? "Payment terms: Net " . $client->payment_terms : '' }}</p>
<p>{{ $client->payment_terms ? trans('texts.payment_terms') . ": Net " . $client->payment_terms : '' }}</p>
</div>
<div class="col-md-3">
<h3>Contacts</h3>
<h3>{{ trans('texts.contacts') }}</h3>
@foreach ($client->contacts as $contact)
{{ $contact->getDetails() }}
@endforeach
</div>
<div class="col-md-6">
<h3>Standing
<h3>{{ trans('texts.standing') }}
<table class="table" style="width:300px">
<tr>
<td><small>Paid to Date</small></td>
<td><small>{{ trans('texts.paid_to_date') }}</small></td>
<td style="text-align: right">{{ Utils::formatMoney($client->paid_to_date, $client->currency_id); }}</td>
</tr>
<tr>
<td><small>Balance</small></td>
<td><small>{{ trans('texts.balance') }}</small></td>
<td style="text-align: right">{{ Utils::formatMoney($client->balance, $client->currency_id); }}</td>
</tr>
@if ($credit > 0)
<tr>
<td><small>Credit</small></td>
<td><small>{{ trans('texts.credit') }}</small></td>
<td style="text-align: right">{{ Utils::formatMoney($credit, $client->currency_id); }}</td>
</tr>
@endif
@ -88,10 +88,10 @@
<p>&nbsp;</p>
<ul class="nav nav-tabs nav-justified">
{{ HTML::tab_link('#activity', 'Activity', true) }}
{{ HTML::tab_link('#invoices', 'Invoices') }}
{{ HTML::tab_link('#payments', 'Payments') }}
{{ HTML::tab_link('#credits', 'Credits') }}
{{ HTML::tab_link('#activity', trans('texts.activity'), true) }}
{{ HTML::tab_link('#invoices', trans('texts.invoices')) }}
{{ HTML::tab_link('#payments', trans('texts.payments')) }}
{{ HTML::tab_link('#credits', trans('texts.credits')) }}
</ul>
<div class="tab-content">
@ -99,7 +99,11 @@
<div class="tab-pane active" id="activity">
{{ Datatable::table()
->addColumn('Date', 'Message', 'Balance', 'Adjustment')
->addColumn(
trans('texts.date'),
trans('texts.message'),
trans('texts.balance'),
trans('texts.adjustment'))
->setUrl(url('api/activities/'. $client->public_id))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
@ -112,7 +116,11 @@
@if ($hasRecurringInvoices)
{{ Datatable::table()
->addColumn('How Often', 'Start Date', 'End Date', 'Invoice Total')
->addColumn(
trans('texts.frequency_id'),
trans('texts.start_date'),
trans('texts.end_date'),
trans('texts.invoice_total'))
->setUrl(url('api/recurring_invoices/' . $client->public_id))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
@ -121,7 +129,13 @@
@endif
{{ Datatable::table()
->addColumn('Invoice Number', 'Invoice Date', 'Invoice Total', 'Balance Due', 'Due Date', 'Status')
->addColumn(
trans('texts.invoice_number'),
trans('texts.invoice_date'),
trans('texts.invoice_total'),
trans('texts.balance_due'),
trans('texts.due_date'),
trans('texts.status'))
->setUrl(url('api/invoices/' . $client->public_id))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
@ -132,7 +146,12 @@
<div class="tab-pane" id="payments">
{{ Datatable::table()
->addColumn('Invoice', 'Transaction Reference', 'Method', 'Payment Amount', 'Payment Date')
->addColumn(
trans('texts.invoice'),
trans('texts.transaction_reference'),
trans('texts.method'),
trans('texts.payment_amount'),
trans('texts.payment_date'))
->setUrl(url('api/payments/' . $client->public_id))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
@ -143,7 +162,11 @@
<div class="tab-pane" id="credits">
{{ Datatable::table()
->addColumn('Credit Amount', 'Credit Balance', 'Credit Date', 'Private Notes')
->addColumn(
trans('texts.credit_amount'),
trans('texts.credit_balance'),
trans('texts.credit_date'),
trans('texts.private_notes'))
->setUrl(url('api/credits/' . $client->public_id))
->setOptions('sPaginationType', 'bootstrap')
->setOptions('bFilter', false)
@ -170,7 +193,7 @@
}
function onDeleteClick() {
if (confirm('Are you sure you want to delete this client?')) {
if (confirm("{{ trans('texts.are_you_sure') }}")) {
$('#action').val('delete');
$('.mainForm').submit();
}

View File

@ -19,7 +19,7 @@
{{ Former::select('client')->addOption('', '')->addGroupClass('client-select') }}
{{ Former::text('amount') }}
{{ Former::text('credit_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))->append('<i class="glyphicon glyphicon-calendar"></i>') }}
{{-- Former::select('currency_id')->addOption('','')->label('Currency')
{{-- Former::select('currency_id')->addOption('','')
->fromQuery($currencies, 'name', 'id')->select(Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY)) --}}
{{ Former::textarea('private_notes') }}
@ -29,8 +29,8 @@
</div>
</div>
<center class="buttons">
{{ Button::lg_primary_submit_success('Save')->append_with_icon('floppy-disk') }}
{{ Button::lg_default_link('credits/' . ($credit ? $credit->public_id : ''), 'Cancel')->append_with_icon('remove-circle'); }}
{{ Button::lg_primary_submit_success(trans('texts.save'))->append_with_icon('floppy-disk') }}
{{ Button::lg_default_link('credits/' . ($credit ? $credit->public_id : ''), trans('texts.cancel'))->append_with_icon('remove-circle'); }}
</center>
{{ Former::close() }}
@ -54,10 +54,7 @@
$clientSelect.combobox();
$('#currency_id').combobox();
$('#credit_date').datepicker('update', new Date({{ strtotime(Utils::today()) * 1000 }}));
});

View File

@ -1,8 +1,9 @@
<h1>{{ Lang::get('confide::confide.email.account_confirmation.subject') }}</h1>
<h1>{{ trans('texts.confirmation_header') }}</h1>
<p>{{ Lang::get('confide::confide.email.account_confirmation.body') }}</p>
{{ trans('texts.confirmation_message') }}<p/>
<a href='{{{ URL::to("user/confirm/{$user->confirmation_code}") }}}'>
{{{ URL::to("user/confirm/{$user->confirmation_code}") }}}
</a>
</a><p/>
<p>{{ Lang::get('confide::confide.email.account_confirmation.farewell') }}</p>
{{ trans('texts.email_signature') }}<br/>
{{ trans('texts.email_from') }}

View File

@ -1,6 +1,7 @@
{{ Lang::get('confide::confide.email.account_confirmation.subject') }}
{{ trans('texts.confirmation_header') }}
{{ Lang::get('confide::confide.email.account_confirmation.body') }}
{{ trans('texts.confirmation_message') }}
{{{ URL::to("user/confirm/{$user->confirmation_code}") }}}
{{ Lang::get('confide::confide.email.account_confirmation.farewell') }}
{{ trans('texts.email_signature') }}
{{ trans('texts.email_from') }}

View File

@ -1,3 +1,3 @@
Name: {{ $name }}<br/>
Email: {{ $email }}<p/>
Message: {{ $text }}
Message: {{ nl2br($text) }}

View File

@ -1,4 +1,4 @@
Name: {{ $name }}
Email: {{ $email }}
Message: {{ $text }}
Message: {{ $text }}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en-US">
<html>
<head>
<meta charset="utf-8">
</head>
@ -7,14 +7,13 @@
{{ $clientName }},<p/>
To view your invoice for {{ $invoiceAmount }}, click the link below:<p/>
{{ trans('texts.invoice_message', ['amount' => $invoiceAmount]) }}<p/>
{{ $link }}<p/>
@if ($emailFooter)
{{ nl2br($emailFooter) }}
@else
Best regards,<br/>
{{ trans('texts.email_signature') }}<br/>
{{ $accountName }}
@endif

View File

@ -1,22 +1,21 @@
<!DOCTYPE html>
<html lang="en-US">
<html>
<head>
<meta charset="utf-8">
</head>
<body>
Dear {{ $userName }}, <p/>
{{ trans('texts.email_salutation', ['name' => $userName]) }} <p/>
A payment of {{ $paymentAmount }} was made by client {{ $clientName }} towards invoice {{ $invoiceNumber }}. <p/>
{{ trans('texts.notification_paid', ['amount' => $paymentAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }} <p/>
To view your client invoice click the link below: <br/>
{{ trans('texts.invoice_link_message') }} <br/>
{{ $invoiceLink }} <p/>
To adjust your email notification settings please <a href="http://www.invoiceninja.com/company/notifications">click here</a>.
Regards, <p/>
The InvoiceNinja Team
{{ trans('texts.email_signature') }} <br/>
{{ trans('texts.email_from') }} <p/>
{{ trans('texts.user_email_footer') }} <p/>
</body>
</html>

View File

@ -1,9 +1,11 @@
Dear {{ $userName }},
{{ trans('texts.email_salutation', ['name' => $userName]) }}
A payment of {{ $paymentAmount }} was made by client {{ $clientName }} towards invoice {{ $invoiceNumber }}.
{{ trans('texts.notification_paid', ['amount' => $paymentAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }}
To view your client invoice click the link below:
{{ trans('texts.invoice_link_message') }}
{{ $invoiceLink }}
To adjust your email notification settings please visit http://www.invoiceninja.com/company/notifications
{{ trans('texts.email_signature') }}
{{ trans('texts.email_from') }}
{{ trans('texts.user_email_footer') }}

View File

@ -1,19 +1,18 @@
<!DOCTYPE html>
<html lang="en-US">
<html>
<head>
<meta charset="utf-8">
</head>
<body>
Dear {{ $userName }},<p/>
{{ trans('texts.email_salutation', ['name' => $userName]) }} <p/>
The following client {{ $clientName }} was emailed Invoice {{ $invoiceNumber }} for {{ $invoiceAmount}}.<p/>
{{ trans('texts.notification_sent', ['amount' => $invoiceAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }} <p/>
Regards, <p/>
The InvoiceNinja Team <p/>
To adjust your email notification settings please <a href="http://www.invoiceninja.com/company/notifications">click here</a>.<p/>
{{ trans('texts.email_signature') }} <br/>
{{ trans('texts.email_from') }} <p/>
{{ trans('texts.user_email_footer') }} <p/>
</body>
</html>

View File

@ -1,5 +1,8 @@
Dear {{ $userName }},
{{ trans('texts.email_salutation', ['name' => $userName]) }}
The following client {{ $clientName }} was emailed Invoice {{ $invoiceNumber }} for {{ $invoiceAmount}}.
{{ trans('texts.notification_sent', ['amount' => $invoiceAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }}
To adjust your email notification settings visit this link http://www.invoiceninja.com/company/notifications
{{ trans('texts.email_signature') }}
{{ trans('texts.email_from') }}
{{ trans('texts.user_email_footer') }}

View File

@ -1,12 +1,11 @@
{{ $clientName }},
To view your invoice for {{ $invoiceAmount }}, click the link below:
{{ trans('texts.invoice_message', ['amount' => $invoiceAmount]) }}
{{ $link }}
@if ($emailFooter)
{{ $emailFooter }}
@else
Best regards,
{{ trans('texts.email_signature') }}
{{ $accountName }}
@endif

View File

@ -5,15 +5,14 @@
</head>
<body>
Dear {{ $userName }},<p/>
{{ trans('texts.email_salutation', ['name' => $userName]) }} <p/>
The following client {{ $clientName }} viewed Invoice {{ $invoiceNumber }} for {{ $invoiceAmount}}.<p/>
{{ trans('texts.notification_viewed', ['amount' => $invoiceAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }} <p/>
Regards,<p/>
The InvoiceNinja Team<p/>
To adjust your email notification settings please <a href="http://www.invoiceninja.com/company/notifications">click here</a>.<p/>
{{ trans('texts.email_signature') }} <br/>
{{ trans('texts.email_from') }} <p/>
{{ trans('texts.user_email_footer') }} <p/>
</body>
</html>

View File

@ -1,9 +1,8 @@
Dear {{ $userName }},
{{ trans('texts.email_salutation', ['name' => $userName]) }}
The following client {{ $clientName }} viewed Invoice {{ $invoiceNumber }} for {{ $invoiceAmount }}.
{{ trans('texts.notification_viewed', ['amount' => $invoiceAmount, 'client' => $clientName, 'invoice' => $invoiceNumber]) }}
Regards,
{{ trans('texts.email_signature') }}
{{ trans('texts.email_from') }}
The InvoiceNinja Team
To adjust your email notification settings visit this link http://www.invoiceninja.com/company/notifications
{{ trans('texts.user_email_footer') }}

View File

@ -1,8 +1,9 @@
Hi there! {{ $user->username }}<p/>
{{ trans('texts.email_salutation', ['name' => $user->username]) }} <p/>
You can reset your account password by clicking the following link {{{ (Confide::checkAction('UserController@reset_password', array($token))) ? : URL::to('user/reset/'.$token) }}}<p/>
{{ trans('texts.reset_password') }} <br/>
{{{ (Confide::checkAction('UserController@reset_password', array($token))) ? : URL::to('user/reset/'.$token) }}}<p/>
Regards, <br/>
The InvoiceNinja Team <p/>
{{ trans('texts.email_signature') }} <br/>
{{ trans('texts.email_from') }} <p/>
If you did not request this password reset please email our support: admin@invoiceninja.com <p/>
{{ trans('texts.reset_password_footer') }} <p/>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en-US">
<html>
<head>
<meta charset="utf-8">
</head>
@ -7,12 +7,12 @@
{{ $clientName }},<p/>
Thank you for your payment of {{ $paymentAmount }}.<p/>
{{ trans('texts.payment_message', ['amount' => $paymentAmount]) }}<p/>
@if ($emailFooter)
{{ nl2br($emailFooter) }}
@else
Best regards,<br/>
{{ trans('texts.email_signature') }}<br/>
{{ $accountName }}
@endif

View File

@ -1,10 +1,10 @@
{{ $clientName }},
Thank you for your payment of {{ $paymentAmount }}.
{{ trans('texts.payment_message', ['amount' => $paymentAmount]) }}
@if ($emailFooter)
{{ $emailFooter }}
@else
Best regards,
{{ trans('texts.email_signature') }}
{{ $accountName }}
@endif

View File

@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
</head>
<body>
<h2>Welcome</h2>
</body>
</html>

View File

@ -1 +0,0 @@
Welcome

View File

@ -3,507 +3,502 @@
@section('head')
<meta name="csrf-token" content="<?= csrf_token() ?>">
<meta name="csrf-token" content="<?= csrf_token() ?>">
<script src="{{ asset('vendor/jquery-ui/ui/minified/jquery-ui.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/bootstrap/dist/js/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/datatables/media/js/jquery.dataTables.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/datatables-bootstrap3/BS3/assets/js/datatables.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout.js/knockout.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout-mapping/build/output/knockout.mapping-latest.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout-sortable/build/knockout-sortable.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/underscore/underscore-min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/bootstrap-datepicker/js/bootstrap-datepicker.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/typeahead.js/dist/typeahead.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/accounting/accounting.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/bootstrap-combobox.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/jspdf.source.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/jspdf.plugin.split_text_to_size.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/jquery-ui/ui/minified/jquery-ui.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/bootstrap/dist/js/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/datatables/media/js/jquery.dataTables.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/datatables-bootstrap3/BS3/assets/js/datatables.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout.js/knockout.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout-mapping/build/output/knockout.mapping-latest.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/knockout-sortable/build/knockout-sortable.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/underscore/underscore-min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/bootstrap-datepicker/js/bootstrap-datepicker.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/typeahead.js/dist/typeahead.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('vendor/accounting/accounting.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/bootstrap-combobox.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/jspdf.source.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/jspdf.plugin.split_text_to_size.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
<link href="{{ asset('vendor/bootstrap/dist/css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('vendor/datatables/media/css/jquery.dataTables.css') }}" rel="stylesheet" type="text/css">
<link href="{{ asset('vendor/datatables-bootstrap3/BS3/assets/css/datatables.css') }}" rel="stylesheet" type="text/css">
<link href="{{ asset('vendor/font-awesome/css/font-awesome.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('vendor/bootstrap-datepicker/css/datepicker.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/bootstrap-combobox.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/typeahead.js-bootstrap.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/style.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('vendor/bootstrap/dist/css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('vendor/datatables/media/css/jquery.dataTables.css') }}" rel="stylesheet" type="text/css">
<link href="{{ asset('vendor/datatables-bootstrap3/BS3/assets/css/datatables.css') }}" rel="stylesheet" type="text/css">
<link href="{{ asset('vendor/font-awesome/css/font-awesome.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('vendor/bootstrap-datepicker/css/datepicker.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/bootstrap-combobox.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/typeahead.js-bootstrap.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/style.css') }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
/* background-color: #F6F6F6; */
background-color: #EEEEEE;
}
<style type="text/css">
</style>
body {
/* background-color: #F6F6F6; */
background-color: #EEEEEE;
}
<script type="text/javascript">
</style>
var currencies = {{ Currency::remember(120)->get(); }};
var currencyMap = {};
for (var i=0; i<currencies.length; i++) {
var currency = currencies[i];
currencyMap[currency.id] = currency;
}
var NINJA = {};
NINJA.parseFloat = function(str) {
if (!str) return '';
str = (str+'').replace(/[^0-9\.\-]/g, '');
return window.parseFloat(str);
<script type="text/javascript">
var currencies = {{ Currency::remember(120)->get(); }};
var currencyMap = {};
for (var i=0; i<currencies.length; i++) {
var currency = currencies[i];
currencyMap[currency.id] = currency;
}
var NINJA = {};
NINJA.parseFloat = function(str) {
if (!str) return '';
str = (str+'').replace(/[^0-9\.\-]/g, '');
return window.parseFloat(str);
}
function formatMoney(value, currency_id, hide_symbol) {
value = NINJA.parseFloat(value);
if (!currency_id) currency_id = {{ Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY); }};
var currency = currencyMap[currency_id];
return accounting.formatMoney(value, hide_symbol ? '' : currency.symbol, currency.precision, currency.thousand_separator, currency.decimal_separator);
}
/* Set the defaults for DataTables initialisation */
$.extend( true, $.fn.dataTable.defaults, {
"sDom": "t<'row-fluid'<'span6'i><'span6'p>>",
"sPaginationType": "bootstrap",
"bInfo": true,
"oLanguage": {
'sEmptyTable': "{{ trans('texts.empty_table') }}",
'sLengthMenu': '_MENU_',
'sSearch': ''
}
function formatMoney(value, currency_id, hide_symbol) {
value = NINJA.parseFloat(value);
if (!currency_id) currency_id = {{ Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY); }};
var currency = currencyMap[currency_id];
return accounting.formatMoney(value, hide_symbol ? '' : currency.symbol, currency.precision, currency.thousand_separator, currency.decimal_separator);
}
} );
/* Set the defaults for DataTables initialisation */
$.extend( true, $.fn.dataTable.defaults, {
"sDom": "t<'row-fluid'<'span6'i><'span6'p>>",
"sPaginationType": "bootstrap",
"bInfo": true,
"oLanguage": {
'sEmptyTable': "{{ trans('texts.empty_table') }}",
'sLengthMenu': '_MENU_',
'sSearch': ''
}
} );
</script>
</script>
@stop
@section('body')
<p>&nbsp;</p>
<p>&nbsp;</p>
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<p>&nbsp;</p>
<p>&nbsp;</p>
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="{{ URL::to('/') }}" class='navbar-brand'>
<img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:18px;width:auto"/>
</a>
</div>
</div>
<div class="collapse navbar-collapse" id="navbar-collapse-1">
<ul class="nav navbar-nav" style="font-weight: bold">
{{ HTML::nav_link('dashboard', 'dashboard') }}
{{ HTML::menu_link('client') }}
{{ HTML::menu_link('invoice') }}
{{ HTML::menu_link('payment') }}
{{ HTML::menu_link('credit') }}
{{-- HTML::nav_link('reports', 'Reports') --}}
</ul>
<div class="navbar-form navbar-right">
@if (Auth::check() && !Auth::user()->registered)
{{ Button::sm_success_primary('Sign up', array('id' => 'signUpButton', 'data-toggle'=>'modal', 'data-target'=>'#signUpModal')) }} &nbsp;
@if (Auth::check())
<div class="collapse navbar-collapse" id="navbar-collapse-1">
<ul class="nav navbar-nav" style="font-weight: bold">
{{ HTML::nav_link('dashboard', 'dashboard') }}
{{ HTML::menu_link('client') }}
{{ HTML::menu_link('invoice') }}
{{ HTML::menu_link('payment') }}
{{ HTML::menu_link('credit') }}
{{-- HTML::nav_link('reports', 'Reports') --}}
</ul>
<div class="navbar-form navbar-right">
@if (Auth::check() && !Auth::user()->registered)
{{ Button::sm_success_primary('Sign up', array('id' => 'signUpButton', 'data-toggle'=>'modal', 'data-target'=>'#signUpModal')) }} &nbsp;
@if (Auth::check() && Auth::user()->showSignUpPopOver())
<button id="signUpPopOver" type="button" class="btn btn-default" data-toggle="popover" data-placement="bottom" data-content="Sign up to save your work" data-html="true" style="display:none">
Sign Up
</button>
<button id="signUpPopOver" type="button" class="btn btn-default" data-toggle="popover" data-placement="bottom" data-content="Sign up to save your work" data-html="true" style="display:none">
Sign Up
</button>
<script>
$(function() {
$('#signUpPopOver').show().popover('show').hide();
$('body').click(function() {
$('#signUpPopOver').popover('hide');
});
});
</script>
<script>
$(function() {
$('#signUpPopOver').show().popover('show').hide();
$('body').click(function() {
$('#signUpPopOver').popover('hide');
});
});
</script>
@endif
@endif
@if (Auth::check())
<div class="btn-group">
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
<span id="myAccountButton">
@if (Auth::check() && Auth::user()->registered)
{{ Auth::user()->getFullName() }}
@else
Guest
@endif
</span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li>{{ link_to('company/details', 'Company Details') }}</li>
<li>{{ link_to('company/payments', 'Online Payments') }}</li>
<li>{{ link_to('company/notifications', 'Notifications') }}</li>
<li>{{ link_to('company/import_export', 'Import/Export') }}</li>
<li class="divider"></li>
<li>{{ link_to('#', 'Logout', array('onclick'=>'logout()')) }}</li>
</ul>
</div>
@endif
</div>
<form class="navbar-form navbar-right" role="search">
<div class="form-group">
<input type="text" id="search" class="form-control" placeholder="{{ trans('texts.search') }}">
</div>
</form>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ trans('texts.history') }} <b class="caret"></b></a>
<ul class="dropdown-menu">
@if (count(Session::get(RECENTLY_VIEWED)) == 0)
<li><a href="#">{{ trans('texts.no_items') }}</a></li>
@else
@foreach (Session::get(RECENTLY_VIEWED) as $link)
<li><a href="{{ $link->url }}">{{ $link->name }}</a></li>
@endforeach
@endif
</ul>
</li>
</ul>
@endif
<div class="btn-group">
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
<span id="myAccountButton">
@if (Auth::user()->registered)
{{ Auth::user()->getFullName() }}
@else
Guest
@endif
</span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li>{{ link_to('company/details', 'Company Details') }}</li>
<li>{{ link_to('company/payments', 'Online Payments') }}</li>
<li>{{ link_to('company/notifications', 'Notifications') }}</li>
<li>{{ link_to('company/import_export', 'Import/Export') }}</li>
<li class="divider"></li>
<li>{{ link_to('#', 'Logout', array('onclick'=>'logout()')) }}</li>
</ul>
</div>
</div>
<form class="navbar-form navbar-right" role="search">
<div class="form-group">
<input type="text" id="search" class="form-control" placeholder="{{ trans('texts.search') }}">
</div>
</form>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ trans('texts.history') }} <b class="caret"></b></a>
<ul class="dropdown-menu">
@if (count(Session::get(RECENTLY_VIEWED)) == 0)
<li><a href="#">{{ trans('texts.no_items') }}</a></li>
@else
@foreach (Session::get(RECENTLY_VIEWED) as $link)
<li><a href="{{ $link->url }}">{{ $link->name }}</a></li>
@endforeach
@endif
</ul>
</li>
</ul>
@endif
</div><!-- /.navbar-collapse -->
</div>
</nav>
</div><!-- /.navbar-collapse -->
</div>
</nav>
<br/>
<div class="container">
<br/>
<div class="container">
@if (!isset($showBreadcrumbs) || $showBreadcrumbs)
{{ HTML::breadcrumbs() }}
{{ HTML::breadcrumbs() }}
@endif
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
@yield('content')
@yield('content')
</div>
<div class="container">
<div class="footer" style="padding-top: 32px">
@if (false)
<div class="pull-right">
{{ Former::open('user/setTheme')->addClass('themeForm') }}
<div style="display:none">
{{ Former::text('theme_id') }}
{{ Former::text('path')->value(Request::url()) }}
</div>
<div class="btn-group tr-action dropup">
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
Site Theme <span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#" onclick="setTheme(0)">Default</a></li>
@foreach (Theme::remember(DEFAULT_QUERY_CACHE)->get() as $theme)
<li><a href="#" onclick="setTheme({{ $theme->id }})">{{ ucwords($theme->name) }}</a></li>
@endforeach
</ul>
</div>
{{ Former::close() }}
</div>
@endif
</div>
<div class="container">
<div class="footer" style="padding-top: 32px">
@if (false)
<div class="pull-right">
{{ Former::open('user/setTheme')->addClass('themeForm') }}
<div style="display:none">
{{ Former::text('theme_id') }}
{{ Former::text('path')->value(Request::url()) }}
</div>
<div class="btn-group tr-action dropup">
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
Site Theme <span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#" onclick="setTheme(0)">Default</a></li>
@foreach (Theme::remember(DEFAULT_QUERY_CACHE)->get() as $theme)
<li><a href="#" onclick="setTheme({{ $theme->id }})">{{ ucwords($theme->name) }}</a></li>
@endforeach
</ul>
</div>
{{ Former::close() }}
</div>
@endif
<!--
Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice-ninja', 'open source', array('target'=>'_blank')) }}, email us at {{ link_to('mailto:contact@invoiceninja.com', 'contact@invoiceninja.com') }}.
-->
</div>
</div>
</div>
<!--
Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice-ninja', 'open source', array('target'=>'_blank')) }}, email us at {{ link_to('mailto:contact@invoiceninja.com', 'contact@invoiceninja.com') }}.
-->
</div>
</div>
</div>
@if (!Auth::check() || !Auth::user()->registered)
<div class="modal fade" id="signUpModal" tabindex="-1" role="dialog" aria-labelledby="signUpModalLabel" 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="myModalLabel">Sign up</h4>
</div>
@if (!Auth::check() || !Auth::user()->registered)
<div class="modal fade" id="signUpModal" tabindex="-1" role="dialog" aria-labelledby="signUpModalLabel" 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="myModalLabel">Sign up</h4>
</div>
<div style="background-color: #fff; padding-right:20px" id="signUpDiv" onkeyup="validateSignUp()" onclick="validateSignUp()" onkeydown="checkForEnter(event)">
<br/>
{{ Former::open('signup/submit')->addClass('signUpForm') }}
<div style="background-color: #fff; padding-right:20px" id="signUpDiv" onkeyup="validateSignUp()" onclick="validateSignUp()" onkeydown="checkForEnter(event)">
<br/>
@if (Auth::check())
{{ Former::populateField('new_first_name', Auth::user()->first_name); }}
{{ Former::populateField('new_last_name', Auth::user()->last_name); }}
{{ Former::populateField('new_email', Auth::user()->email); }}
@endif
{{ Former::open('signup/submit')->addClass('signUpForm') }}
{{ Former::hidden('path')->value(Request::path()) }}
{{ Former::text('new_first_name')->label('First name') }}
{{ Former::text('new_last_name')->label('Last name') }}
{{ Former::text('new_email')->label('Email') }}
{{ Former::password('new_password')->label('Password') }}
@if (Auth::check())
{{ Former::populateField('new_first_name', Auth::user()->first_name); }}
{{ Former::populateField('new_last_name', Auth::user()->last_name); }}
{{ Former::populateField('new_email', Auth::user()->email); }}
@endif
{{ Former::hidden('path')->value(Request::path()) }}
{{ Former::text('new_first_name')->label('First name') }}
{{ Former::text('new_last_name')->label('Last name') }}
{{ Former::text('new_email')->label('Email') }}
{{ Former::password('new_password')->label('Password') }}
{{ Former::checkbox('terms_checkbox')->label(' ')->text('I agree to the Invoice Ninja <a href="'.URL::to('terms').'" target="_blank">Terms of Service</a>') }}
{{ Former::close() }}
{{ Former::close() }}
<center><div id="errorTaken" style="display:none">&nbsp;<br/>The email address is already regiestered</div></center>
<br/>
<center><div id="errorTaken" style="display:none">&nbsp;<br/>The email address is already regiestered</div></center>
<br/>
</div>
</div>
<div style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="working">
<h3>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 style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="working">
<h3>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="signUpSuccessDiv">
<br/>
<h3>Success</h3>
You have succesfully registered. Please visit the link in the account confirmation email to verify your email address.
<br/>&nbsp;
<br/>
<h3>Success</h3>
You have succesfully registered. Please visit the link in the account confirmation email to verify your email address.
<br/>&nbsp;
</div>
<div class="modal-footer" id="signUpFooter" style="margin-top: 0px">
<button type="button" class="btn btn-default" data-dismiss="modal">Close <i class="glyphicon glyphicon-remove-circle"></i></button>
<button type="button" class="btn btn-primary" id="saveSignUpButton" onclick="validateServerSignUp()" disabled>Save <i class="glyphicon glyphicon-floppy-disk"></i></button>
</div>
</div>
</div>
</div>
<div class="modal-footer" id="signUpFooter" style="margin-top: 0px">
<button type="button" class="btn btn-default" data-dismiss="modal">Close <i class="glyphicon glyphicon-remove-circle"></i></button>
<button type="button" class="btn btn-primary" id="saveSignUpButton" onclick="validateServerSignUp()" disabled>Save <i class="glyphicon glyphicon-floppy-disk"></i></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="logoutModalLabel" 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="myModalLabel">Logout</h4>
</div>
<div class="container">
<h3>Are you sure?</h3>
<p>This will permanently erase your data.</p>
</div>
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="logoutModalLabel" 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="myModalLabel">Logout</h4>
</div>
<div class="modal-footer" id="signUpFooter">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" onclick="logout(true)">Logout</button>
</div>
</div>
</div>
</div>
@endif
@if ($_SERVER['SERVER_NAME'] != 'www.invoiceninja.com')
<div class="container">{{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/" target="_blank">InvoiceNinja.com</a></div>
<div class="container">
<h3>Are you sure?</h3>
<p>This will permanently erase your data.</p>
</div>
<div class="modal-footer" id="signUpFooter">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" onclick="logout(true)">Logout</button>
</div>
</div>
</div>
</div>
@endif
@if (!Utils::isNinjaProd())
<div class="container">{{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/" target="_blank">InvoiceNinja.com</a></div>
@endif
<p>&nbsp;</p>
</body>
<script type="text/javascript">
function setTheme(id)
{
$('#theme_id').val(id);
$('form.themeForm').submit();
}
@if (!Auth::check() || !Auth::user()->registered)
function validateSignUp(showError)
{
var isFormValid = true;
$(['first_name','last_name','email','password']).each(function(i, field) {
var $input = $('form.signUpForm #new_'+field),
val = $.trim($input.val());
var isValid = val && val.length >= (field == 'password' ? 6 : 1);
if (isValid && field == 'email') {
isValid = isValidEmailAddress(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');
}
}
});
if (!$('#terms_checkbox').is(':checked')) {
isFormValid = false;
}
$('#saveSignUpButton').prop('disabled', !isFormValid);
return isFormValid;
}
function validateServerSignUp()
{
if (!validateSignUp(true)) {
return;
}
$('#signUpDiv, #signUpFooter').hide();
$('#working').show();
$.ajax({
type: 'POST',
url: '{{ URL::to('signup/validate') }}',
data: 'email=' + $('form.signUpForm #new_email').val(),
success: function(result) {
if (result == 'available') {
submitSignUp();
} else {
$('#errorTaken').show();
$('form.signUpForm #new_email').closest('div.form-group').removeClass('has-success').addClass('has-error');
$('#signUpDiv, #signUpFooter').show();
$('#working').hide();
}
}
});
}
function submitSignUp() {
$.ajax({
type: 'POST',
url: '{{ URL::to('signup/submit') }}',
data: 'new_email=' + encodeURIComponent($('form.signUpForm #new_email').val()) +
'&new_password=' + encodeURIComponent($('form.signUpForm #new_password').val()) +
'&new_first_name=' + encodeURIComponent($('form.signUpForm #new_first_name').val()) +
'&new_last_name=' + encodeURIComponent($('form.signUpForm #new_last_name').val()),
success: function(result) {
if (result) {
localStorage.setItem('guest_key', '');
isRegistered = true;
$('#signUpButton').hide();
$('#myAccountButton').html(result);
}
$('#signUpSuccessDiv, #signUpFooter').show();
$('#working, #saveSignUpButton').hide();
}
});
}
function checkForEnter(event)
{
if (event.keyCode === 13){
event.preventDefault();
validateServerSignUp();
return false;
}
}
@endif
<p>&nbsp;</p>
window.isRegistered = {{ Auth::check() && Auth::user()->registered ? 'true' : 'false' }};
function logout(force)
{
if (force || isRegistered) {
window.location = '{{ URL::to('logout') }}';
} else {
$('#logoutModal').modal('show');
}
}
</body>
<script type="text/javascript">
function setTheme(id)
{
$('#theme_id').val(id);
$('form.themeForm').submit();
}
@if (!Auth::check() || !Auth::user()->registered)
function validateSignUp(showError)
{
var isFormValid = true;
$(['first_name','last_name','email','password']).each(function(i, field) {
var $input = $('form.signUpForm #new_'+field),
val = $.trim($input.val());
var isValid = val && val.length >= (field == 'password' ? 6 : 1);
if (isValid && field == 'email') {
isValid = isValidEmailAddress(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');
}
}
});
if (!$('#terms_checkbox').is(':checked')) {
isFormValid = false;
}
$('#saveSignUpButton').prop('disabled', !isFormValid);
return isFormValid;
}
function validateServerSignUp()
{
if (!validateSignUp(true)) {
return;
}
$('#signUpDiv, #signUpFooter').hide();
$('#working').show();
$.ajax({
type: 'POST',
url: '{{ URL::to('signup/validate') }}',
data: 'email=' + $('form.signUpForm #new_email').val(),
success: function(result) {
if (result == 'available') {
submitSignUp();
} else {
$('#errorTaken').show();
$('form.signUpForm #new_email').closest('div.form-group').removeClass('has-success').addClass('has-error');
$('#signUpDiv, #signUpFooter').show();
$('#working').hide();
}
}
});
}
function submitSignUp() {
$.ajax({
type: 'POST',
url: '{{ URL::to('signup/submit') }}',
data: 'new_email=' + encodeURIComponent($('form.signUpForm #new_email').val()) +
'&new_password=' + encodeURIComponent($('form.signUpForm #new_password').val()) +
'&new_first_name=' + encodeURIComponent($('form.signUpForm #new_first_name').val()) +
'&new_last_name=' + encodeURIComponent($('form.signUpForm #new_last_name').val()),
success: function(result) {
if (result) {
localStorage.setItem('guest_key', '');
isRegistered = true;
$('#signUpButton').hide();
$('#myAccountButton').html(result);
}
$('#signUpSuccessDiv, #signUpFooter').show();
$('#working, #saveSignUpButton').hide();
$(function()
{
$('#search').focus(function(){
if (!window.hasOwnProperty('searchData')) {
$.get('{{ URL::route('getSearchData') }}', function(data) {
window.searchData = true;
var datasets = [];
for (var type in data)
{
if (!data.hasOwnProperty(type)) continue;
datasets.push({
name: type,
header: '&nbsp;<b>' + type + '</b>',
local: data[type]
});
}
});
}
if (datasets.length == 0) {
return;
}
$('#search').typeahead(datasets).on('typeahead:selected', function(element, datum, name) {
var type = name == 'Contacts' ? 'clients' : name.toLowerCase();
window.location = '{{ URL::to('/') }}' + '/' + type + '/' + datum.public_id;
}).focus().typeahead('setQuery', $('#search').val());
});
}
});
function checkForEnter(event)
{
if (event.keyCode === 13){
event.preventDefault();
validateServerSignUp();
return false;
}
if (isStorageSupported()) {
@if (Auth::check() && !Auth::user()->registered)
localStorage.setItem('guest_key', '{{ Auth::user()->password }}');
@endif
}
@if (!Auth::check() || !Auth::user()->registered)
validateSignUp();
$('#signUpModal').on('shown.bs.modal', function () {
$(['first_name','last_name','email','password']).each(function(i, field) {
var $input = $('form.signUpForm #new_'+field);
if (!$input.val()) {
$input.focus();
return false;
}
@endif
});
})
window.isRegistered = {{ Auth::check() && Auth::user()->registered ? 'true' : 'false' }};
function logout(force)
{
if (force || isRegistered) {
window.location = '{{ URL::to('logout') }}';
} else {
$('#logoutModal').modal('show');
}
}
/*
$(window).on('beforeunload', function() {
return true;
});
$('form').submit(function() { $(window).off('beforeunload') });
$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
*/
@endif
$(function()
{
$('#search').focus(function(){
if (!window.hasOwnProperty('searchData')) {
$.get('{{ URL::route('getSearchData') }}', function(data) {
window.searchData = true;
var datasets = [];
for (var type in data)
{
if (!data.hasOwnProperty(type)) continue;
datasets.push({
name: type,
header: '&nbsp;<b>' + type + '</b>',
local: data[type]
});
}
if (datasets.length == 0) {
return;
}
$('#search').typeahead(datasets).on('typeahead:selected', function(element, datum, name) {
var type = name == 'Contacts' ? 'clients' : name.toLowerCase();
window.location = '{{ URL::to('/') }}' + '/' + type + '/' + datum.public_id;
}).focus().typeahead('setQuery', $('#search').val());
});
}
});
@if (false && Session::has('message'))
setTimeout(function() {
$('.alert-info').fadeOut();
}, 3000);
@endif
if (isStorageSupported()) {
@if (Auth::check() && !Auth::user()->registered)
localStorage.setItem('guest_key', '{{ Auth::user()->password }}');
@endif
}
@if (!Auth::check() || !Auth::user()->registered)
validateSignUp();
@yield('onReady')
});
$('#signUpModal').on('shown.bs.modal', function () {
$(['first_name','last_name','email','password']).each(function(i, field) {
var $input = $('form.signUpForm #new_'+field);
if (!$input.val()) {
$input.focus();
return false;
}
});
})
/*
$(window).on('beforeunload', function() {
return true;
});
$('form').submit(function() { $(window).off('beforeunload') });
$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
*/
@endif
@if (false && Session::has('message'))
setTimeout(function() {
$('.alert-info').fadeOut();
}, 3000);
@endif
@yield('onReady')
});
</script>
</script>
@stop

View File

@ -274,6 +274,9 @@
<iframe id="theFrame" style="display:none" frameborder="1" width="100%" height="1180"></iframe>
<canvas id="theCanvas" style="display:none;width:100%;border:solid 1px #CCCCCC;"></canvas>
@if (!Auth::user()->isPro())
{{ trans('texts.pro_plan.remove_logo', ['link'=>link_to('account/enable_pro_plan', trans('texts.pro_plan.remove_logo_link'))]) }}
@endif
<div class="modal fade" id="clientModal" tabindex="-1" role="dialog" aria-labelledby="clientModalLabel" aria-hidden="true">
<div class="modal-dialog" style="min-width:1000px">
@ -471,6 +474,12 @@
$('input[name=client]').val({{ $client->public_id }});
@endif
/*
if (clients.length == 0) {
$('.client_select input.form-control').prop('disabled', true);
}
*/
var $input = $('select#client');
$input.combobox().on('change', function(e) {
var clientId = parseInt($('input[name=client]').val(), 10);
@ -481,7 +490,7 @@
model.invoice().client().country = false;
}
refreshPDF();
}); //.trigger('change');
}); //.trigger('change');
$('#terms, #public_notes, #invoice_number, #invoice_date, #due_date, #po_number, #discount, #currency_id, #invoice_design_id').change(function() {
refreshPDF();

View File

@ -11,8 +11,8 @@
@if ($invoice->client->account->isGatewayConfigured())
<div class="pull-right" style="width:270px">
{{ Button::normal('Download PDF', array('onclick' => 'onDownloadClick()', 'class' => 'btn-lg')) }}
{{ Button::primary_link(URL::to('payment/' . $invitation->invitation_key), 'Pay Now', array('class' => 'btn-lg pull-right')) }}
{{ Button::normal(trans('texts.download_pdf'), array('onclick' => 'onDownloadClick()', 'class' => 'btn-lg')) }}
{{ Button::primary_link(URL::to('payment/' . $invitation->invitation_key), trans('texts.pay_now'), array('class' => 'btn-lg pull-right')) }}
</div>
@else
<div class="pull-right">

View File

@ -20,10 +20,10 @@
{{ Former::select('client')->addOption('', '')->addGroupClass('client-select') }}
{{ Former::select('invoice')->addOption('', '')->addGroupClass('invoice-select') }}
{{ Former::text('amount') }}
{{ Former::select('payment_type_id')->addOption('','')->label('Payment type')
{{ Former::select('payment_type_id')->addOption('','')
->fromQuery($paymentTypes, 'name', 'id') }}
{{ Former::text('payment_date')->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT))->append('<i class="glyphicon glyphicon-calendar"></i>') }}
{{-- Former::select('currency_id')->addOption('','')->label('Currency')
{{-- Former::select('currency_id')->addOption('','')
->fromQuery($currencies, 'name', 'id')->select(Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY)) --}}
</div>
@ -33,8 +33,8 @@
</div>
<center class="buttons">
{{ Button::lg_primary_submit_success('Save')->append_with_icon('floppy-disk') }}
{{ Button::lg_default_link('payments/' . ($payment ? $payment->public_id : ''), 'Cancel')->append_with_icon('remove-circle'); }}
{{ Button::lg_primary_submit_success(trans('texts.save'))->append_with_icon('floppy-disk') }}
{{ Button::lg_default_link('payments/' . ($payment ? $payment->public_id : ''), trans('texts.cancel'))->append_with_icon('remove-circle'); }}
</center>
{{ Former::close() }}
@ -49,7 +49,6 @@
populateInvoiceComboboxes({{ $clientPublicId }}, {{ $invoicePublicId }});
$('#payment_type_id').combobox();
$('#payment_date').datepicker('update', new Date({{ strtotime(Utils::today()) * 1000 }}));
});

View File

@ -32,10 +32,12 @@
<div class="row">
<div class="col-md-6 col-md-offset-2">
{{ Former::legend('Secure Payment') }}
{{ Former::legend('secure_payment') }}
{{ Former::text('first_name') }}
{{ Former::text('last_name') }}
<p>&nbsp;<p/>
{{ Former::text('card_number') }}
{{ Former::select('expiration_month')->addOption('','')
->addOption('01 - January', '1')
@ -61,8 +63,10 @@
->addOption('2020', '2020')
}}
{{ Former::text('cvv')->label('CVV') }}
{{ Former::text('cvv') }}
<p>&nbsp;<p/>
{{ Former::text('address1')->label('Street') }}
{{ Former::text('address2')->label('Apt/Suite') }}
{{ Former::text('city') }}
@ -77,7 +81,7 @@
<?php } ?>
<?php echo($gateway->name); ?>
{{ Former::actions( Button::primary_submit_lg('Pay Now - ' . Utils::formatMoney($invoice->amount, $client->currency_id) )) }}
{{ Former::actions( Button::primary_submit_lg(trans('texts.pay_now') . ' - ' . Utils::formatMoney($invoice->amount, $client->currency_id) )) }}
</div>
</div>

View File

@ -55,14 +55,20 @@ var contactForm = {
</script>
<section class="hero4" data-speed="2" data-type="background">
@section('content')
<section class="hero background hero4" data-speed="2" data-type="background">
<div class="caption-side"></div>
<div class="container">
<div class="caption">
<h1>Contact us
</h1>
</div>
</div>
</section>
<div class="row" style="margin:0;">
<div class="caption-wrap">
<div class="caption">
<h1>Contact<span style="color:#ecd816"> us</span></h1>
</div>
</div>
</div>
</div>
</section>
<section class="about contact">
<div class="container">

View File

@ -0,0 +1,203 @@
@extends('public.header')
@section('content')
<section class="hero background hero5" data-speed="2" data-type="background">
<div class="caption-side"></div>
<div class="container">
<div class="row" style="margin:0;">
<div class="caption-wrap">
<div class="caption">
<h1>THE <span style="color:#2299c0">Faq's</span>
</div>
</div>
</div>
</div>
</section>
<section class="faq">
<div class="container">
<div class="row">
<div class="col-md-7">
<div class="question">
<a class="expander" href="#">I know it isnt standard
ninja practice to reveal too many identity details, but
who are you guys exactly?</a>
<div class="content">
<p>Were a small team of highly skilled digital
journeymen based in Israel. We love open source, we
love disrupting the big business status quo, and we
love building helpful tools that are easy to use.
We believe that everyone elses web-based cash flow
tools are unnecessarily expensive, clunky and
complicated - and were bent on proving these
beliefs with Invoice Ninja.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">How do I get started using
Invoice Ninja?</a>
<div class="content">
<p>Just click on the big, yellow “Invoice Now”
button on our homepage!</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">Do you offer customer
support?</a>
<div class="content">
<p>We sure do. Support is super important to us.
Feel free to email us at <a href=
"mailto:support@invoiceninja.com">support@invoiceninja.com</a>
with any questions you might have. We almost always
reply within one business day.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">Is Invoice Ninja really
free? For how long?</a>
<div class="content">
<p>Yes, it is 100% free. Forever and ever. For
real.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">How is Invoice Ninja able
to offer this all for free? How are you making any
money?</a>
<div class="content">
<p>Were mostly in this line of work because we
believe its high time that a good electronic
invoicing tools be available for free. There isnt
much money in it - yet. When our users open up new
accounts with payment processor gateways by
clicking on links from our site, we make modest
commissions as a gateway affiliate. So if zillions
of freelancers and small businesses start running
credit card charges through Invoice Ninja, theres
a decent chance we might recover our investment.
Maybe not.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">Really? So does that mean
youre not collecting information about me so you can
sell me stuff or so that some other company can spam me
according to my interests?</a>
<div class="content">
<p>No way. Were not mining your data, and were
not selling you out. That wouldnt be very ninja of
us, would it?</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">But dont you have access
to my merchant and banking accounts?</a>
<div class="content">
<p>Actually, we dont. When you link an account at
a third party financial institution with your
Invoice Ninja account, youre essentially giving
our app permission to send money to you and nothing
more. This is all managed by the tech teams at your
financial service providers, who go to great
lengths to ensure their integrations cant be
exploited or abused.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">Given that Invoice Ninja
is an open source app, how can I be sure that my
financial information is safe with you?</a>
<div class="content">
<p>Theres a big difference between “open source”
and “open data. Anyone who wants to use the code
that drives Invoice Ninja to create their own
products or to make improvements to ours can do so.
Its available for anyone who wants to download and
work with. But thats just the source code -
totally separate from what happens with that code
on the Invoice Ninja servers. Youre the only one
who has full access to what you're doing with our
product. For more details on the security of our
servers and how we handle our users information,
please read the next question.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">So just how secure is this
app?</a>
<div class="content">
<p>Extremely. Data uploaded by our users runs
through connections with 256-bit encryption, which
is twice as many encryption bits that most bank
websites use. We use the TLS 1.0 cryptographic
protocol, AES_256_CBC string encryption, SHA1
message authentication and DHE_RSA key exchanges.
Its fancy stuff that we put in place to make sure
no one can gain access to your information except
you.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">Im interested in removing
the small "Created by Invoice Ninja” image from the
bottom of my invoices. Will you one day offer a
premium, non-branded or otherwise white label-able
version of Invoice Ninja?</a>
<div class="content">
<p>We are considering one day exploring optional
features like this and will be happy to hear from
you with any suggestions.</p>
</div>
</div>
<div class="question">
<a class="expander" href="#">My question wasnt covered
by any of the content on this FAQ page. How can I get
in touch with you?</a>
<div class="content">
<p>Please email us at <a href=
"mailto:contact@invoiceninja.com">contact@invoiceninja.com</a>
with any questions or comments you have. We love
hearing from the people who use our app! Well do
our best to reply to your email within the business
day.</p>
</div>
</div>
</div>
<div class="col-md-4 col-md-offset-1">
<div class="contact-box">
<h2>Did we miss something?</h2>
<p>Please email us at <a href=
"mailto:contact@invoiceninja.com" style=
"font-weight: bold">contact@invoiceninja.com</a> with
any questions or comments you have. We love hearing
from the people who use our app! Well do our best to
reply to your email within the business day.</p>
</div>
</div>
</div>
</div>
</section>@stop

View File

@ -0,0 +1,118 @@
@extends('public.header')
@section('content')
<section class="hero background hero5" data-speed="2" data-type="background">
<div class="caption-side"></div>
<div class="container">
<div class="row" style="margin:0;">
<div class="caption-wrap">
<div class="caption">
<h1>THE <span style="color:#ecd816">FEATURES</span>
</div>
</div>
</div>
</div>
</section>
<section class="about center">
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h2>Open Source Platform</h2>
<p>Set the code free! Here at Invoice Ninja, were all about being non-evil, and providing full code transparency is a central manifestation of this value. Our users started seeing the benefits of open source within days of our launch, when we rolled out v1.0.2, which included some key code improvements that our friends on GitHub sent our way.</p>
<p>We firmly believe that being an open source product helps everyone involved. Were looking forward to seeing what the developers out there can do to take Invoice Ninja into new realms of usefulness.</p>
</div>
</div>
</div>
</section>
<section class="about white-bg">
<div class="container">
<div class="row">
<div class="col-md-5">
<div class="screendump">
<img src="images/features1.jpg">
</div>
</div>
<div class="col-md-7">
<h2>Free Forever</h2>
<p>Yeah, you read that correctly. You dont have to pay us a cent to use our tools. We know how tough it is to make ends meet as a web-based business, and were bent on providing a top-notch product that will do everything you need it to do, without any subscription or opt-in fees.
</p>
<p>
Try Invoice Ninja out. You literally have nothing to lose. Were confident that youll find the experience so positive that youll never need to turn elsewhere.
</p>
</div>
</div>
</div>
</section>
<section class="about">
<div class="container">
<div class="row">
<div class="col-md-7">
<h2>Secure and Private</h2>
<p>Invoice Ninja has been built from the ground up to keep your data safe. Only you have access to your login and accounting details, and we will never share your transaction data to any third party.</p>
<p>
Our website operates with <span class="blue-text">256-bit encryption</span>, which is even more secure than most banking websites. Invoice Ninja uses the <span class="blue-text">TLS 1.0 cryptographic protocol</span>, <span class="blue-text">AES_256_CBC string encryption</span>, <span class="blue-text">SHA1 message authentication</span> and <span class="blue-text">DHE_RSA key exchanges</span>. We feel safe here and have invested heavily in measures to ensure that you do too.
</p>
</div>
<div class="col-md-5">
<div class="screendump">
<img src="images/features2.jpg">
</div>
</div>
</div>
</div>
</section>
<section class="about white-bg">
<div class="container">
<div class="row">
<div class="col-md-5">
<div class="screendump">
<img src="images/features3.jpg">
</div>
</div>
<div class="col-md-7">
<h2>Live PDF Creation</h2>
<p>With Invoice Ninja, weve done away with the need for cumbersome multi-click invoice previewing after each save. When you enter the details of your customer and/or invoice in our editor, you can instantly see the results in the pdf preview pane below. Want to see what your invoice would look like in a different layout style? The live pdf can show you four beautiful preset styles in real time too.
</p>
<p>
Just create, save, send, and youre done!
</p>
</div>
</div>
</div>
</section>
<section class="about">
<div class="container">
<div class="row">
<div class="col-md-7">
<h2>Online Payments</h2>
<p>Invoice Ninja seamlessly integrates with all of the top internet payment processors and gateways so you can get paid for your work quickly and easily. Invoices crated with our tools arent just for bookkeeping purposes - they bring in the Benjamins.</p>
<p>
We also make it super easy to choose the right gateway for the specific needs of your business and are happy to help you to get started working with the gateway of your choice. Whats more, were constantly working on rolling out additional gateway integrations, so if you dont see the one you use here, just let us know, and theres a good chance well add it for you.
</p>
</div>
<div class="col-md-5">
<div class="screendump">
<img src="images/features4.jpg">
</div>
</div>
</div>
</div>
</section>
<section class="upper-footer white-bg">
<div class="container">
<div class="row">
<div class="col-md-3 center-block">
<a href="#">
<div class="cta">
<h2 onclick="return getStarted()">Invoice Now <span>+</span></h2>
</div>
</a>
</div>
</div>
</div>
</section>
@stop

View File

@ -7,11 +7,13 @@
<link href="{{ asset('images/apple-touch-icon-114x114-precomposed.png') }}" rel="apple-touch-icon-precomposed" sizes="114x114">
<link href="{{ asset('images/apple-touch-icon-72x72-precomposed.png') }}" rel="apple-touch-icon-precomposed" sizes="72x72">
<link href="{{ asset('images/apple-touch-icon-57x57-precomposed.png') }}" rel="apple-touch-icon-precomposed">
<script src="{{ asset('js/simpleexpand.js') }}" type="text/javascript"></script>
@stop
@section('body')
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
@ -62,7 +64,8 @@
<a class="brand" href="/"><img src=
"images/invoiceninja-logo.png"></a>
<ul class="navbar-list">
<li>{{ link_to('about', 'About Us' ) }}</li>
<li>{{ link_to('features', 'Features' ) }}</li>
<li>{{ link_to('faq', 'FAQ' ) }}</li>
<li>{{ link_to('contact', 'Contact Us' ) }}</li>
<li>{{ link_to('login', Auth::check() ? 'My Account' : 'Login' ) }}</li>
</ul>
@ -118,7 +121,8 @@
<div class="navbar-inner">
<ul class="navbar-list">
<li>{{ link_to('about', 'About Us' ) }}</li>
<li>{{ link_to('features', 'Features' ) }}</li>
<li>{{ link_to('faq', 'FAQ' ) }}</li>
<li>{{ link_to('contact', 'Contact Us' ) }}</li>
<li>{{ link_to('login', Auth::check() ? 'My Account' : 'Login' ) }}</li>
</ul>
@ -135,6 +139,9 @@
</div>
</div>
</footer><script src="{{ asset('/js/retina-1.1.0.min.js') }}" type="text/javascript"></script>
<script type="text/javascript">
$('.expander').simpleexpand();
</script>

View File

@ -3,7 +3,7 @@
@section('content')
<section class="hero background" data-speed="2" data-type="background">
<section class="hero background hero1" data-speed="2" data-type="background">
<div class="caption-side"></div>
<div class="container">

View File

@ -3,48 +3,50 @@
@section('head')
<link href="{{ asset('vendor/bootstrap/dist/css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/style.css') }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #eee !important;
}
.form-signin {
max-width: 330px;
padding: 15px;
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
font-size: 16px;
height: auto;
padding: 10px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="text"] {
margin-bottom: -1px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
</style>
@stop
@ -53,8 +55,10 @@
<div class="container">
{{ Former::open('login')->addClass('form-signin') }}
<h2 class="form-signin-heading">Please sign in</h2>
<div class="modal-header">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja Account Login</h4></div>
<div class="inner">
<p>
{{ $errors->first('login_email') }}
{{ $errors->first('login_password') }}
@ -65,9 +69,10 @@
{{ Form::password('login_password', array('placeholder' => 'Password')) }}
</p>
<p>{{ Button::primary_submit('Sign In', array('class' => 'btn-lg'))->block() }}</p>
{{ link_to('forgot_password', 'Recover your password') }}
<p>{{ Button::success_submit('Lets go', array('class' => 'btn-lg'))->block() }}</p>
<p class="link">
{{ link_to('forgot_password', 'Forgot your password?') }}
</p>
<!-- if there are login errors, show them here -->
@if ( Session::get('error') )
@ -77,7 +82,7 @@
@if ( Session::get('notice') )
<div class="alert">{{{ Session::get('notice') }}}</div>
@endif
</div>
{{ Former::close() }}

File diff suppressed because it is too large Load Diff

Binary file not shown.

BIN
public/images/features1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/images/features2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
public/images/features3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
public/images/features4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -93,7 +93,7 @@ function GetReportTemplate4(doc, invoice, layout, checkMath) {
doc.setFontType("bold");
doc.text(layout.footerLeft, y, 'Balance Due');
total = formatMoney(invoice.balance_amount, currencyId)
total = formatMoney(invoice.balance_amount, currencyId);
var totalX = layout.headerRight - (doc.getStringUnitWidth(total) * doc.internal.getFontSize());
doc.text(totalX, y, total);
@ -470,24 +470,25 @@ function wordWrapText(value, width)
doc.setFontSize(10);
var lines = value.split("\n");
for (var i = 0; i < lines.length; i++) {
var numLines = doc.splitTextToSize(lines[i], width).length;
if (numLines <= 1) continue;
var j = 0; space = lines[i].length;
while (j++ < lines[i].length) {
if (lines[i].charAt(j) === " ") space = j;
}
lines[i + 1] = lines[i].substring(space + 1) + ' ' + (lines[i + 1] || "");
lines[i] = lines[i].substring(0, space);
for (var i = 0; i < lines.length; i++) {
var numLines = doc.splitTextToSize(lines[i], width).length;
if (numLines <= 1) continue;
var j = 0; space = lines[i].length;
while (j++ < lines[i].length) {
if (lines[i].charAt(j) === ' ') space = j;
}
var newValue = (lines.join("\n")).trim();
if (space == lines[i].length) space = width/6;
lines[i + 1] = lines[i].substring(space + 1) + ' ' + (lines[i + 1] || '');
lines[i] = lines[i].substring(0, space);
}
var newValue = (lines.join("\n")).trim();
if (value == newValue) {
return newValue;
} else {
return wordWrapText(newValue, width);
}
if (value == newValue) {
return newValue;
} else {
return wordWrapText(newValue, width);
}
}

View File

@ -0,0 +1,4 @@
/* Copyright (C) 2012 Sylvain Hamel
Project: https://github.com/redhotsly/simple-expand
MIT Licence: https://raw.github.com/redhotsly/simple-expand/master/licence-mit.txt */
(function($){"use strict";function SimpleExpand(){var that=this;that.defaults={hideMode:"fadeToggle",defaultSearchMode:"parent",defaultTarget:".content",throwOnMissingTarget:true,keepStateInCookie:false,cookieName:"simple-expand"};that.settings={};$.extend(that.settings,that.defaults);that.findLevelOneDeep=function(parent,filterSelector,stopAtSelector){return parent.find(filterSelector).filter(function(){return!$(this).parentsUntil(parent,stopAtSelector).length})};that.setInitialState=function(expander,targets){var isExpanded=that.readState(expander);if(isExpanded){expander.removeClass("collapsed").addClass("expanded");that.show(targets)}else{expander.removeClass("expanded").addClass("collapsed");that.hide(targets)}};that.hide=function(targets){if(that.settings.hideMode==="fadeToggle"){targets.hide()}else if(that.settings.hideMode==="basic"){targets.hide()}};that.show=function(targets){if(that.settings.hideMode==="fadeToggle"){targets.show()}else if(that.settings.hideMode==="basic"){targets.show()}};that.checkKeepStateInCookiePreconditions=function(){if(that.settings.keepStateInCookie&&$.cookie===undefined){throw new Error("simple-expand: keepStateInCookie option requires $.cookie to be defined.")}};that.readCookie=function(){var jsonString=$.cookie(that.settings.cookieName);if(jsonString===null||jsonString===""){return{}}else{return JSON.parse(jsonString)}};that.readState=function(expander){if(!that.settings.keepStateInCookie){return expander.hasClass("expanded")}var id=expander.attr("Id");if(id===undefined){return}var cookie=that.readCookie();var cookieValue=cookie[id];if(typeof cookieValue!=="undefined"){return cookie[id]===true}else{return expander.hasClass("expanded")}};that.saveState=function(expander,isExpanded){if(!that.settings.keepStateInCookie){return}var id=expander.attr("Id");if(id===undefined){return}var cookie=that.readCookie();cookie[id]=isExpanded;$.cookie(that.settings.cookieName,JSON.stringify(cookie),{raw:true,path:window.location.pathname})};that.toggle=function(expander,targets){var isExpanded=that.toggleCss(expander);if(that.settings.hideMode==="fadeToggle"){targets.fadeToggle(150)}else if(that.settings.hideMode==="basic"){targets.toggle()}else if($.isFunction(that.settings.hideMode)){that.settings.hideMode(expander,targets,isExpanded)}that.saveState(expander,isExpanded);return false};that.toggleCss=function(expander){if(expander.hasClass("expanded")){expander.toggleClass("collapsed expanded");return false}else{expander.toggleClass("expanded collapsed");return true}};that.findTargets=function(expander,searchMode,targetSelector){var targets=[];if(searchMode==="absolute"){targets=$(targetSelector)}else if(searchMode==="relative"){targets=that.findLevelOneDeep(expander,targetSelector,targetSelector)}else if(searchMode==="parent"){var parent=expander.parent();do{targets=that.findLevelOneDeep(parent,targetSelector,targetSelector);if(targets.length===0){parent=parent.parent()}}while(targets.length===0&&parent.length!==0)}return targets};that.activate=function(jquery,options){$.extend(that.settings,options);that.checkKeepStateInCookiePreconditions();jquery.each(function(){var expander=$(this);var targetSelector=expander.attr("data-expander-target")||that.settings.defaultTarget;var searchMode=expander.attr("data-expander-target-search")||that.settings.defaultSearchMode;var targets=that.findTargets(expander,searchMode,targetSelector);if(targets.length===0){if(that.settings.throwOnMissingTarget){throw"simple-expand: Targets not found"}return this}that.setInitialState(expander,targets);expander.click(function(){return that.toggle(expander,targets)})})}}window.SimpleExpand=SimpleExpand;$.fn.simpleexpand=function(options){var instance=new SimpleExpand;instance.activate(this,options);return this}})(jQuery);

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB